2013-02-27 94 views
5

我有一個關於如何綁定驅動程序從服務器接口接收數據包的問題。我發現綁定使用dev_add_pack()爲LACPDU和ARP數據包設置處理程序,但我沒有找到其他處理程序(用於其他數據包類型)。綁定驅動程序如何從服務器接口接收RX數據包

你能幫我解決這個問題嗎?

+1

+1,我希望我可以幫你在那裏。 – 2013-02-27 18:12:33

+0

好的,謝謝,似乎我找到了答案,我想我會在這裏添加它,但稍後 – 2013-02-28 11:45:22

回答

2

綁定驅動程序註冊自己的Rx處理程序,當從接口受制於債券主,在bond_enslave(),你可以看到:

res = netdev_rx_handler_register(slave_dev, bond_handle_frame, 
           new_slave); 
在bond_handle_frame(),它會劫持收到的數據包

所以由奴隸接口,以便債券主將接收數據包,而不是:

static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb) 
{ 
     struct sk_buff *skb = *pskb; 
     struct slave *slave; 
     struct bonding *bond; 
     int (*recv_probe)(const struct sk_buff *, struct bonding *, 
          struct slave *); 
     int ret = RX_HANDLER_ANOTHER; 

     skb = skb_share_check(skb, GFP_ATOMIC); 
     if (unlikely(!skb)) 
       return RX_HANDLER_CONSUMED; 

     *pskb = skb; 

     slave = bond_slave_get_rcu(skb->dev); 
     bond = slave->bond; 

     if (bond->params.arp_interval) 
       slave->dev->last_rx = jiffies; 

     recv_probe = ACCESS_ONCE(bond->recv_probe); 
     if (recv_probe) { 
       ret = recv_probe(skb, bond, slave); 
       if (ret == RX_HANDLER_CONSUMED) { 
         consume_skb(skb); 
         return ret; 
       } 
     } 

     if (bond_should_deliver_exact_match(skb, slave, bond)) { 
       return RX_HANDLER_EXACT; 
     } 

     skb->dev = bond->dev; 

     if (bond->params.mode == BOND_MODE_ALB && 
      bond->dev->priv_flags & IFF_BRIDGE_PORT && 
      skb->pkt_type == PACKET_HOST) { 

       if (unlikely(skb_cow_head(skb, 
              skb->data - skb_mac_header(skb)))) { 
         kfree_skb(skb); 
         return RX_HANDLER_CONSUMED; 
       } 
       memcpy(eth_hdr(skb)->h_dest, bond->dev->dev_addr, ETH_ALEN); 
     } 

     return ret; 
} 
+0

謝謝,似乎我被檢查過舊的綁定版本,從kernel.org更新後,我發現有關你的代碼上面寫道 – 2013-03-01 19:17:51

1

我檢查了綁定代碼,發現當驅動程序在這些模式下工作時,驅動程序沒有在沒有某些類型(LACPDU,ARP)的情況下檢查傳入的RX數據包。驅動程序使用dev_add_pack()函數爲此數據包設置處理程序。

爲了在實踐中設置全局鉤子,您可以使用nf_register_hook(),它爲攔截數據包提供設置自己的網絡過濾器過程的接口。 似乎nf_register_hook()比dev_add_pack()更強大,但我認爲在使用nf_register_hook()時需要更加小心,因爲在鉤子中出現錯誤條件的情況下,它可能會丟失很多數據包。

相關問題