2011-07-12 5 views

答えて

2

ユニキャストフィルタリングをサポートしていないデバイスが複数のユニキャストアドレスをリスンする必要がある場合、プロキシミスモードになります(dev->uc_countおよびdev->uc_promisc)。 __dev_set_rx_mode()機能を確認してください。

多くのデバイスはndo_set_rx_mode()を実装し、ユニキャスト(およびマルチキャスト)フィルタをndo_set_rx_mode()で設定します。これを実装していないデバイスでは、Linuxはデバイスをプロミスキャスモードに設定し、その事実をdev->uc_promiscで追跡します。

だから無差別モードにはいくつかのフラグがあります

  • dev->flags & IFF_PROMISCは、デバイスが無差別モードであることを意味します。
  • dev->gflags & IFF_PROMISCは、ユーザがプロミスキャスモードを要求したことを意味します。
  • dev->uc_promiscは、ndo_set_rx_mode()を実装していないデバイスで追加のユニキャストアドレスをリッスンする必要があるため、プロミスキャスモードが有効になっていることを示します(実際には参照カウントが増加しています)。
+0

返信のためにninjaljに感謝します。したがって、 'uc_promisc'フィールドが0でない場合、インターフェースも' dev-> uc'リスト内のすべてのアドレスをリッスンすることを意味しますか?そうであれば 'IFF_PROMISC'フラグを設定する必要がありますか?私は、スレーブデバイスが関連付けられたマスターデバイスを持っていて、スレーブデバイスの 'open'メソッドにはマスターデバイスのための' dev_uc_add'呼び出しがあります。これはマスターをプロミスキャストモードにするが、 'ndo_change_rx_flags'が' NULL'であるためフラグ 'IFF_PROMISC'が設定されていない。これが正しいと思いますか? – MirkoBanchi

+0

@MirkoBanchi:デバイスが 'ndo_set_rx_mode()'をサポートしている場合、デバイスはそれを使用し、 'dev-> uc_promisc'には触れません。 'uc_promisc!= 0'の場合、デバイスはプロミスキャスモードになり、' dev-> uc'のすべてのアドレスを聞くことができます。デバイスがプロミスキャスモードになっているとき、 'dev-> flags&IFF_PROMISC'は真ですが、userspaceは' dev-> gflags&IFF_PROMISC'しか見ることができません。フラグは 'ndo_change_rx_flags()'がそれを見るか否かにかかわらず設定され、 'ndo_change_rx_flags()'はフラグを変更せず、フラグをデバイスに通知します。 – ninjalj

+0

ドライバは 'ndo_change_rx_flags()'を実装せず、 'ndo_set_rx_mode()'(eg:e1000)を介して 'IFF_PROMISC'と' IFF_ALLMULTI'への変更を見ることができます 'ndo_change_rx_flags()'は、 ://git.kernel.org/?p = linux/kernel/git/torvalds/linux-2.6.git; a =コミット; h = 24023451c8df726692e2f52288a20870d13b501f) – ninjalj

0

デバイス上でpromiscuous modeの有効化/無効化のステータスを有効にする(または有効化/無効化のステータスを追跡する)方法があるようです。

+0

IFF_PROMISCには特定のフラグがあります。あなたはコマンドがSIOCGIFFLAGSのioctl呼び出しによってプロミスモードであるかどうかを調べることができます...そのフィールドの存在の理由を理解することはできません... – MirkoBanchi

関連する問題