无法从内核模块中的 net_device 获取 mac 地址
unable to fetch mac address from net_device in kernel module
这是我的钩子函数
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。所以,所有的数据包都是 forwarded.I 我只是读取数据包的字段并打印它而不以任何方式进行回火。所以,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
这是我的钩子函数
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。所以,所有的数据包都是 forwarded.I 我只是读取数据包的字段并打印它而不以任何方式进行回火。所以,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