2013-06-01 82 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"); 
}