传输层协议(如tcp或udp)如何将其数据发送到内核中的IP(网络)层。这是通过使用套接字还是任何其他类型的IPC机制来实现的?
答案 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");
}