网络设备之uc_promisc

如果设备不支持单播过滤,并且要监听多个单播地址时,就要使用net_device->uc_count和net_device->uc_promisc来设置混杂模式,具体见__dev_set_rx_mode函数。

多数设备实现了ndo_set_rx_mode,并且通过该函数设置了单播过滤,没有实现这个函数的设备,由系统决定是否开启混杂模式,并且将值保存在net_device->uc_promisc中。

以下几个flags来标记混杂模式:

1. net_device->flags & IFF_PROMISC 表示设备开启混杂模式;

2. net_device->gflags & IFF_PROMISC 表示用户请求设置混杂模式;

3. net_device->uc_promisc 表示设备需要监听多个单播地址,但没有实现ndo_set_rx_mode函数,需要用此字段表示混杂模式开启状态;

 

如果设备支持ndo_set_rx_mode,就不会用到net_device->uc_promisc。

如果net_device->uc_promisc != 0,则设备处于混杂模式,用于监听net_device->uc列表中的地址。

当设备处于混杂模式时,net_device->flags & IFF_PROMISC为真,但是用户空间只能看见net_device->gflags & IFF_PROMISC,所以不要相信用户空间。

 

关于该问题,请参考StackOverflow中的讨论:

https://stackoverflow.com/questions/6666257/what-is-the-purpose-of-net-device-uc-promisc-field

本文链接:网络设备之uc_promisc

转载声明:转载请注明来源:Linux TCP/IP Stack,谢谢!


发表评论

电子邮件地址不会被公开。 必填项已用*标注