内核中传输层和网络层之间的通信

时间:2013-06-01 19:13:04

标签: sockets networking linux-kernel

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

1 个答案:

答案 0 :(得分: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");
}