0

tcp 或 udp 等传输层协议如何将其数据发送到内核中的 IP(网络)层。这是通过使用套接字或任何其他类型的 IPC 机制来实现的吗?

4

1 回答 1

2

至于用于在套接字和传输层之间传递数据的数据结构,它是struct sk_buff.

网络子系统使得动态注册协议成为可能。您可以使用struct proto来定义您的传输层接口,以及struct proto用于您的网络层接口。最后,struct net_proto_family在通过其函数指针创建新套接字时调用create,您可以在其中将协议附加到创建的套接字:

static struct net_proto_family myproto_family = {
    .family = PF_MYPROTO,
    .create = myproto_create,
    .owner = THIS_MODULE,
};

myproto_create()做这样的事情:

struct sock *sk;

/* E.g. if you only support datagrams */
if (sock->type != SOCK_DGRAM)
    return -EPROTOTYPE;

sock->state = SS_UNCONNECTED;
sock->ops = &my_proto_ops;

if ((sk = sk_alloc(net, PF_MYPROTO, gfp_any(), &my_proto)) == NULL)
    return -ENOMEM;

sock_init_data(sock, sk);

初始化模块时:

if (proto_register(&my_proto, 1)) {
    printk("failed to register protocol\n");
    return -1;
}

if (sock_register(&my_proto_family)) {
    proto_unregister(&my_proto);
    printk("sock_register() failed\n");
    return -1;
} else {
    printk("socket ops has been registered\n");
}
于 2013-06-02T12:04:28.490 回答