對於2.6的核心,net_device內部存在乙個結構體指標,
struct dev_mc_list *dev->mc_list
通過對它的訪問,可以迴圈獲取所有的組播mac位址。
但是,在新的核心中(至少在3.10中)發生了變化,取而代之的是
struct netdev_hw_addr_list mc;
我們可以通過直接對mc進行訪問來獲取相應的資料,也可以利用linux核心提供的巨集。
#define netdev_mc_count(dev) netdev_hw_addr_list_count(&(dev)->mc)
netdev_for_each_mc_addr
提供了乙個迴圈的方式來獲取所有的組播mac
具體的巨集定義如下:
#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位址
下面是其中的一部分**
struct netdev_hw_addr
list_head是linux在核心實現的乙個雙向鍊錶,而netdev_hw_addr_list_for_each
就是對這樣乙個鍊錶的訪問。
我們可以具體的看一下netdev_hw_addr_list_for_each
#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迴圈。
ip位址與MAC位址 中的 組播
mac位址分成三類,分別是廣播位址 組播位址和單播位址。首先,ff ff ff ff ff ff毫無疑問是廣播位址。每個網絡卡出廠時被分配唯一乙個單播位址,頭24位是裝置製造廠商的編號,由ieee 電氣與電子工程師協會 分配,後24位是裝置廠商為網絡卡制定的唯一編號。例如08 00 20 0a 8c...
linux網絡卡驅動中mac位址隨機數變化
mac位址在一般情況下是從網絡卡的eeprom中讀取的,一般廠商會在出廠的時候固化在eeprom中,在有些時候,廠商為了省錢不會去買乙個固定的唯一的mac,而是始終用乙個固定的mac位址,這樣就會在後續使用者使用的時候造成mac位址衝突。define qf9700 automac ifdef qf9...
組播IP位址和MAC位址的對映關係
ip組播位址用於標識乙個ip組播組。iana把d類位址空間分配給ip組播,範圍從224.0.0.0到239.255.255.255,ip組播位址前四位均為1110.從224.0.0.0至224.0.0.255被iana保留為網路協議使用。例如 244.0.0.1全主機組 244.0.0.2全多播路由...