2013-02-27 104 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()时需要更加小心,因为在钩子中出现错误条件的情况下,它可能会丢失很多数据包。

相关问题