0
傳輸層協議(如tcp或udp)如何將其數據發送到內核中的IP(網絡)層。這是通過使用套接字還是其他類型的IPC機制來實現的?內核中傳輸層和網絡層之間的通信
傳輸層協議(如tcp或udp)如何將其數據發送到內核中的IP(網絡)層。這是通過使用套接字還是其他類型的IPC機制來實現的?內核中傳輸層和網絡層之間的通信
至於用於在套接字和傳輸層之間傳遞數據的數據結構,它是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");
}
這是沒有在任何標準中定義? AFAIK,堆棧開發人員可以自由使用任何可行的方法:)我可能會將TPDU對象引用推送到網絡層輸入隊列中。 –