ユーザー空間からプロトコルへの通信を処理するには、プロトコルをカーネル ソケット API に登録します。これにより、ユーザー空間から通常のソケットを作成できます。
関連するコード サンプルについては、bluetooth/RFCOM ソケットの実装を参照してください。
static const struct proto_ops rfcomm_sock_ops = {
.family = PF_BLUETOOTH,
.owner = THIS_MODULE,
.bind = rfcomm_sock_bind,
.connect = rfcomm_sock_connect,
.listen = rfcomm_sock_listen,
.
.
.
.accept = rfcomm_sock_accept,
};
static const struct net_proto_family rfcomm_sock_family_ops = {
.family = PF_BLUETOOTH,
.owner = THIS_MODULE,
.create = rfcomm_sock_create
};
プロトコルを登録するには、proto_ops 構造体を埋める必要があります。この構造は、カーネル内の他の場所で見られるオブジェクト指向パターンに従います。この構造体は、独自のソケット インターフェイスを実装する開発者が従うべきインターフェイスを定義します。
インターフェイスが定義する関数 (バインド、接続、リッスンなど) を実装し、関数ポインターを構造体エントリに割り当てます。操作インターフェースでカバーされていない機能の ioctl を定義します。
最終的には、作成関数から返されるソケット構造体に後で埋め込む構造体になります。
構造体 net_proto_family は、新しいプロトコル ファミリを定義します。この構造には、関数の実装が proto_ops 構造体で満たされたソケット構造体を設定する必要がある create 関数が含まれています。
その後、sock_register でファミリを登録します。問題がなければ、ユーザー空間から適切なソケットを作成できるはずです。
内部的には、ネットワーク デバイスと通信するために、プロトコルはおそらく skbuffs (こことここを参照) を使用する必要があります。
skbuffs は、Linux カーネルでネットワーク パケットを処理する一般的な方法です。パケットはネットワーク カードによって受信され、いくつかの skbuff に入れられ、ネットワーク スタックに渡されます。ネットワーク スタックは常に skbuff を使用します。
これは、Linux カーネル内にネットワーク プロトコルを実装するための基本的なデータ構造と io パスです。
この手順を最初から最後まで説明しているドキュメントは知りません。ソースはこのドキュメントにあります。