2011-07-12 33 views

回答

2

當不支持單播過濾的設備必須偵聽幾個單播地址時,根據dev->uc_countdev->uc_promisc,它將處於promiscous模式。檢查__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'?我有一個主設備與一個從設備關聯,並且在'開放'方法的從設備中,我爲主設備調用了'dev_uc_add'。這使得master處於promisc模式,但是由於'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'爲真,但用戶空間只能看到'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()'是一個較新的加法,以避免競爭條件(請參閱http ://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git; a = commit; h = 24023451c8df726692e2f52288a20870d13b501f) – ninjalj

0

聽起來這可能是在設備上啓用(或跟蹤promiscuous mode的啓用/禁用狀態)的一種方式。

+0

有一個特定的標誌:IFF_PROMISC。你可以通過命令SIOCGIFFLAGS通過ioctl調用來檢查接口是否處於promisc模式...我找不到該字段存在的原因... – MirkoBanchi