2012-04-12 134 views
4

我正在編寫一個內核模塊來從存儲在sk_buff中的數據包中獲取MAC地址。我用下面的代碼來打印源和目的地的MAC地址:從sk_buff訪問MAC地址

struct ethhdr *mh = eth_hdr(skb); 
printk(KERN_EMERG "Source MAC=%x:%x:%x:%x:%x:%x\n",mh->h_source[0],mh->h_source[1],mh->h_source[2],mh->h_source[3],mh->h_source[4],mh->h_source[5]); 

目的地址可以使用h_dest地質儲量h_source進行訪問。
我的問題是,源MAC地址始終是a8:c0:0:0:a8:c0和目標MAC地址始終是一些垃圾值,而不是我自己的MAC地址。
任何人都可以幫我解決這個問題嗎?我想獲得正確的MAC地址。

+0

您可以使用%pM使用printk打印mac地址。 – mcr 2015-11-07 01:30:22

回答

3

使用eth_hdr只有在skb實際上有 MAC頭時纔有意義。如果沒有,skb的MAC頭指針將指向數據包中的其他數據。

5

你究竟在做什麼?

a8:c0看起來相當可疑。它轉換爲十進制的168.192,這讓我懷疑你實際上正在查看IPv4標頭而不是以太網標頭。

0

您需要在第2層處理數據包才能訪問以太網報頭。如果你的linux內核模塊在第3層(Netfilter掛鉤)獲取數據包,所以數據包中不存在MAC地址。