歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Linux網卡驅動中對於組播MAC地址的獲取

對於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循環。

Copyright © Linux教程網 All Rights Reserved