无法从内核模块

时间:2016-04-28 14:39:35

标签: c linux macos kernel

这是我的钩子功能

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);

输出

Apr 28 19:56:21 node2 kernel:[466.344567] Mac Addr =

Apr 28 19:56:21 node2 kernel:[466.344568] Broadcast Addr =▒▒▒▒▒▒

请注意,我在节点2上运行我的模块,它将ping从node1路由到node3。因此,所有数据包都被转发。我只是读取数据包的字段并打印它,无论如何都不进行调整。 ping,ping是成功的。

另外,有人可以告诉我什么是okfn fn指针及其用法吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

该字段是正确的,dev_addr是硬件地址,broadcast包含硬件广播地址,但您不能像字符串一样打印它们!它们是一个无符号字符数组,其中每个字符都包含一个mac地址的八位字节。请改为使用专为mac地址设计的printk的特定修饰符:

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