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; } } |