對於2.6的內核,net_device內部存在一個結構體指針,
struct dev_mc_list *dev->mc_list通過對它的訪問,可以循環獲取所有的組播MAC地址。但是,在新的內核中(至少在3.10中)發生了變化,取而代之的是
struct netdev_hw_addr_list mc;我們可以通過直接對mc進行訪問來獲取相應的數據,也可以利用Linux內核提供的宏。
netdev_mc_count(dev)這個宏可以獲取當前一共存在多少個組播MAC地址,具體的宏定義見下:
[code]#define netdev_mc_count(dev) netdev_hw_addr_list_count(&(dev)->mc)
netdev_for_each_mc_addr提供了一個循環的方式來獲取所有的組播MAC 具體的宏定義如下:
[code]#define netdev_for_each_mc_addr(ha, dev)netdev_hw_addr_list_for_each(ha, &(dev)->mc)ha是一個
netdev_hw_addr的結構體,內部有一個
unsigned char addr[MAX_ADDR_LEN];的數組用來存儲MAC地址
下面是其中的一部分代碼
[code] struct netdev_hw_addr { struct list_head list; unsigned char addr[MAX_ADDR_LEN]; unsigned char type; }list_head是Linux在內核實現的一個雙向鏈表,而
netdev_hw_addr_list_for_each就是對這樣一個鏈表的訪問。
我們可以具體的看一下
netdev_hw_addr_list_for_each
[code] #define netdev_hw_addr_list_for_each(ha, l) list_for_each_entry(ha, &(l)->list, list)
而
list_for_each_entry
#define list_for_each_entry(pos, list, member) \ for (pos = list_head(list, typeof(*pos), member); \ &pos->member != (list); \ pos = list_next(pos, member))
所以說
netdev_for_each_mc_addr的本質就是一個for循環。