0

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

4

1 に答える 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 に答える