从sk_buff访问MAC地址

时间:2012-04-12 16:32:25

标签: linux

我正在编写一个内核模块,用于从存储在sk_buff中的数据包中获取MAC地址。我使用以下代码打印源和目标的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地址。

3 个答案:

答案 0 :(得分:5)

你在内核中究竟在做什么?

a8:c0看起来很可疑。它转换为十进制的168.192,这让我怀疑你实际上是在查看IPv4标头而不是以太网标头。

答案 1 :(得分:3)

如果skb实际具有 MAC标头,则使用eth_hdr才有意义。如果没有,则skb的MAC头指针将仅指向数据包中的其他数据。

答案 2 :(得分:0)

您需要在第2层处理数据包才能访问以太网标头。如果你的linux内核模块在第3层(Netfilter挂钩)获取数据包,那么数据包中不存在MAC地址。