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