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

2021-07-11 15:41:52 字數 1297 閱讀 2088

對於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全多播路由...