2016-04-28 123 views
1

從取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指針及其用法?

非常感謝。

回答

1

該字段是正確的,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