2013-06-01 46 views
0

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

+1

这是没有在任何标准中定义? AFAIK,堆栈开发人员可以自由使用任何可行的方法:)我可能会将TPDU对象引用推送到网络层输入队列中。 –

回答

2

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

网络子系统可以动态注册协议。您可以使用struct proto来为您的网络层接口定义传输层接口,并使用struct proto

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); 

当最后,创建通过其create函数指针一个新的插座,在其中您可以将您的协议创建套接字时struct net_proto_family被称为您的模块已初始化:

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"); 
}