1

イーサネット スイッチ チップのポートが CPU のネットワーク コントローラに接続されているネットワーク デバイスがあります。スイッチ チップは、入力ポートなどの情報を含む特別なヘッダーを (MAC ヘッダーの前に) 追加して、他のポートから CPU ポートにパケットを転送します。

ネットワークコントローラードライバーでパケットを受信するときにヘッダーを削除できるため、Linux ネットワークスタックは通常の方法でスイッチと通信できます。ただし、私の目標は、特別なヘッダーの一部の情報をユーザー空間のレイヤー 2 制御プロトコル スイートに渡すことです。

私の場合、レイヤ 2 制御プロトコルは通常、生のソケットを使用して制御フレームを受信します。たとえば、スパニング ツリー プロトコルは、パケットがどのスイッチ ポートから来たかを識別できなければなりません。

また、http、telnet サーバーなどのサービスは、同じネットワーク インターフェイスを使用できる必要があります。

そのような情報をドライバーからユーザー空間ネットワークサーバー/クライアントに配信するための Linux 組み込み手段はありますか? そうでない場合、これを実装するための提案はありますか?

単純な ioctl 呼び出しを実装して、読み取った最後のパケットのヘッダー情報についてドライバーに問い合わせることができました。recv()ただし、デバイスがとの間の他のプロセスによって使用されていないという保証はありませんioctl()

4

1 に答える 1

1

sk_buffこれを実装する最善の方法は、特別な L2 ヘッダーを格納するフィールドを追加することだと思います。私が正しく理解していればsk_buff、あるレイヤーから別のレイヤーに s を渡すときにヘッダーを保持する必要がありますが、 にコードを追加する必要があるかもしれませんskb_clone

この時点に到達すると、この値をユーザー空間に送信することは、あなたの想像力によってのみ制限されます。たとえば、次のことができます。

  1. 値をソケット構造に格納し、後で;sockを使用して返します。ioctl
  2. recvfromの値をsrc_addr直接返す

この助けを願っています。

于 2012-06-08T11:32:15.823 に答える