tcp や udp などのトランスポート層プロトコルは、そのデータをカーネルの IP (ネットワーク) 層にどのように送信しますか。これは、ソケットまたはその他のタイプの IPC メカニズムを使用して実現されていますか?
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 に答える