skb_bond函數會判斷skb是否屬于bond。如果是,那么函數要確保skb來自bond上的一個活躍設備。這個檢查是為了防止高層協議為某個bond重復進行配置分配。如果skb通過了這些檢查,skb的dev指針會被賦值為指向bond的設備指針,同時netif_receive_skb函數會返回原設備指針。
從概念上理解,你可以把上述代碼等價于如下偽代碼:
起始狀態:
1
2
3
4
5
6
7
|
orig_dev = NULL skb->dev = "eth0" orig_dev = skb->dev if skb->dev 是bond的一部分: if skb->dev 是bond上的活躍設備 skb->dev = bond |
結束狀態:
1
2
|
orig_dev = "eth0" skb->dev = bond |
因此,看上去skb消息被當成發自一個bond中的設備而不是物理設備。
如果我們繼續跟蹤netif_receive_skb函數,我們會看到代碼將skb轉給了pcap處理:
1
2
3
4
5
6
7
8
|
list_for_each_entry_rcu(ptype, &ptype_all, list) { if (!ptype->dev || ptype->dev == skb->dev) { if (pt_prev) ret = deliver_skb(skb, pt_prev, orig_dev); pt_prev = ptype; } } |
原文轉自:http://www.anti-gravitydesign.com