c - 无法从内核模块中的 net_device 获取 mac 地址

标签 c linux macos kernel

这是我的钩子(Hook)函数

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指针及其用法?

非常感谢。

最佳答案

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

关于c - 无法从内核模块中的 net_device 获取 mac 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36917950/

相关文章:

objective-c - 有没有关于如何使用 Cocoa 在 Objective-C 中为 Mac OS X 编写全屏应用程序的示例?

c - 如何使用单独的进程但不 fork 地读取/写入 Linux 伪终端?

c - 在 tic tac toe 中进行随机移动 - C 语言

c - 在一定时间内运行循环的最佳方法

php - 安装 Zend Framework 和使用 zf 脚本时出现问题

linux - 如何保证read()每次都从真实设备读取数据?

linux - 终止一系列进程的最可靠方法

python - 来自 wxPython 的 NSView*

objective-c - 如何加快 Mac 应用程序处理 5000 个独立任务的速度?

c# - native C 字符串列表对 C# 的弱引用