2016-04-28 90 views
1

从取net_device中的MAC地址这是我的钩子函数无法内核模块

unsigned int 
my_packet_pass_through_hook(const struct nf_hook_ops *ops, 
       struct sk_buff *skb, 
       const struct net_device *in, 
       const struct net_device *out, 
       int (*okfn)(struct sk_buff*)){ 
我在PREROUTING和POSTROUTING阶段已注册

。我只是在这个函数中转储net_device信息。 在PREROUTING阶段,我倾销const struct net_device *在而在POSTROUTING阶段我倾销const struct net_device * out net_devoce结构。

在这两种情况下,我都无法打印设备的MAC地址。

printk(KERN_ALERT "    Mac Addr    = %s\n", iif->dev_addr); 
printk(KERN_ALERT "    Broadcast Addr  = %s\n", iif->broadcast); 

输出

04月28日19时56分21秒节点2的内核:[466.344567] MAC ADDR =

04月28日19时56分21秒节点2的内核:[466.344568]广播ADDR = ▒▒▒▒▒▒

请注意,我在节点2上运行我的模块,该节点将ping从node1路由到node3。所以,所有的数据包都会被转发。我只是在阅读数据包的字段并且打印它时没有反过来调整它。所以,ping是成功的。

另外,有谁能告诉我什么是okfn fn指针及其用法?

非常感谢。

回答

1

该字段是正确的,dev_addr是硬件地址,broadcast包含硬件广播地址,但不能像字符串那样打印它们!它们是一个无符号字符数组,其中每个char都保存着mac地址的八位位组。使用的printk专为MAC地址,而不是具体的修改:

printk(KERN_ALERT " Mac Addr   = %pMF\n", iif->dev_addr); 
printk(KERN_ALERT " Broadcast Addr = %pMF\n", iif->broadcast); 

你可以找到其他格式的文档printk

http://lxr.free-electrons.com/source/Documentation/printk-formats.txt#L136