2

Linux カーネルに netdevice (net_device) を実装しようとしています。これは単純な net_device であり、ユーザー空間からカーネル空間にコマンド/データを渡します。これがこの単純な net_device の目標です。ユーザー空間からカーネル空間にコマンド/データを渡すためにソケットを使用しています。グーグルで調べた後、net_device の登録に成功し、/sys/class/net/abc0 (デバイス名) で自分のデバイスを確認できましたが、ファイル操作を行ったときにフローが明確にわかりません。

 struct net_device_ops
 {   
   .ndo_open  =open,

   .ndo_close = close,

   .ndo_start_xmit = start_xmit   
 }
  • ソケットで書き込みを発行すると、データ リンク層で start_xmit が呼び出されます。

  • open メソッドを呼び出したい場合、ソケットを使用して呼び出す方法

  • ソケットを使用して start_xmit を呼び出す方法

  • 受信バッファにデータパケットがあり、それをユーザー空間に渡す方法を見つけます。

シンプルな net_device (イーサネットを除く) に関する明確なフロー/情報はありません。リンク/pdf を提案できます。

open,close,start_xmitをテストする簡単なソケットプログラムを書いてみました。ソケットの読み取り/書き込みが open,close,star_xmit を呼び出していない場合。 開発した net_device をテストする方法はありますか?

ありがとうございました

4

2 に答える 2

1

SIOCSIFFLAGS, -> IFF_UP ネットデバイス abc0 に対して ioctl を実行中に、実際に設定または設定解除できます。

まず、dgram ソケットを作成する必要があります。

次に、net/if.h で定義された ifreq 構造を使用します

インターフェイスと iff_flags を埋める

iff_flags は、IFF_UP で設定するか、同じ IFF_UP で無効にしてインターフェイスをダウンさせることができます。

そしてソケットを閉じます。

#include <net/if.h>

....

sock = socket(AF_INET, SOCK_DGRAM, 0);

if (sock < 0) {

   goto fail;

}

struct ifreq ifreq;

strcpy(ifreq.ifr_name, "abcd0");

ifreq.iff_flags |= IFF_UP;

if (ioctl(sock, &ifreq, sizeof(ifreq) < 0) {

    perror("ioctl setting interface up");

}

ifreq.iff_flags ~= IFF_UP;

if (ioctl(sock, &ifreq, sizeof(ifreq) < 0) {

    perror("ioctl setting interface down");

}

close(sock);

オフトピック:

あなたのコードを教えてください。あなたのネットワークデバイスについても理解できます:)

于 2013-03-14T11:02:44.910 に答える
1

オープン、クローズ機能をテストする方法を見つけました。

  • type : ifconfig abc0(デバイス名) up は open メソッドを呼び出します

  • type : ifconfig abc0(デバイス名) down は close メソッドを呼び出します

これらのメソッドをソケットでテストする方法を教えてください。

于 2012-10-31T07:03:55.030 に答える