无法内核模块
问题描述:
从取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指针及其用法?
非常感谢。
答
该字段是正确的,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