【问题标题】:unable to fetch mac address from net_device in kernel module无法从内核模块中的 net_device 获取 mac 地址
【发布时间】:2016-08-23 09:52:33
【问题描述】:

这是我的钩子函数

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 *in 而在 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);

输出

4 月 28 日 19:56:21 node2 内核:[466.344567] Mac 地址 =

4月28日19:56:21 node2内核:[466.344568]广播地址=▒▒▒▒▒▒

请注意,我在节点 2 上运行我的模块,它将 ping 从节点 1 路由到节点 3。所以,所有的数据包都被转发了。我只是读取数据包的字段并打印它,而不用任何方式调整它。所以,ping 成功了。

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

非常感谢。

【问题讨论】:

    标签: c linux macos kernel


    【解决方案1】:

    字段是对的,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

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 2015-01-04
      • 2012-05-28
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      相关资源
      最近更新 更多