2013-02-27 103 views
5

मेरे पास एक सवाल है कि बॉन्डिंग ड्राइवर को गुलाम गुलामों से आरएक्स पैकेट कैसे लेते हैं। मैंने पाया कि बंधन LACPDU और एआरपी पैकेट के लिए हैंडलर सेट करने के लिए dev_add_pack() का उपयोग करते हैं, लेकिन मुझे अन्य हैंडलर नहीं मिला (अन्य पैकेट प्रकारों के लिए)।कैसे बंधन चालक enslave इंटरफेस से आरएक्स पैकेट लेता है

क्या आप इस प्रश्न को हल करने में मेरी मदद कर सकते हैं?

+1

+1, काश मैं वहां आपकी सहायता कर सकता हूं। –

+0

ठीक है, धन्यवाद, ऐसा लगता है कि मुझे जवाब मिला, मुझे लगता है कि मैं इसे यहां जोड़ूंगा, लेकिन बाद में –

उत्तर

2

बंधन ड्राइवरों, अपने स्वयं के आरएक्स हैंडलर पंजीकृत करता है जब एक गुलाम इंटरफ़ेस 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

धन्यवाद, ऐसा लगता है कि मुझे कर्नेल.org के अपडेट के बाद बहुत पुराना बंधन संस्करण चेक किया गया था, मुझे कोड मिला जिसके बारे में आप ऊपर लिखा है –

1

मैंने बॉन्डिंग के कोड की जांच की और पाया कि चालक इन तरीकों में काम करता है, जब मामलों में कुछ प्रकार (एलएसीपीडीयू, एआरपी) के बिना आने वाले आरएक्स पैकेट का निरीक्षण नहीं करता है। Dev_add_pack() फ़ंक्शन के उपयोग के साथ इस पैकेट के लिए ड्राइवर सेट हैंडलर।

व्यावहारिक रूप से सेट ग्लोबल हुक के लिए आप nf_register_hook() का उपयोग कर सकते हैं, जो इंटरसेप्ट पैकेट के लिए सेटअप स्वयं नेट फ़िल्टर प्रक्रिया के लिए इंटरफेस प्रदान करता है। लगता है कि nf_register_hook() dev_add_pack() से अधिक शक्तिशाली है, लेकिन मुझे लगता है कि nf_register_hook() काम करते समय अधिक देखभाल की आवश्यकता है, क्योंकि यह हुक में गलत स्थितियों के मामले में बहुत से पैकेट छोड़ सकता है।