- 论坛徽章:
- 0
|
本帖最后由 hi.stao 于 2011-12-23 11:16 编辑
本人的配置:- eth1 Link encap:Ethernet HWaddr 00:0C:29:85:2B:A6
- inet addr:192.168.80.102 Bcast:192.168.80.255 Mask:255.255.255.0
- inet6 addr: fe80::20c:29ff:fe85:2ba6/64 Scope:Link
- UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
- RX packets:1032 errors:0 dropped:0 overruns:0 frame:0
- TX packets:675 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:1000
- RX bytes:100087 (97.7 KiB) TX bytes:98901 (96.5 KiB)
- Interrupt:19 Base address:0x2024
- eth1.33 Link encap:Ethernet HWaddr 00:0C:29:85:2B:A6
- inet6 addr: fe80::20c:29ff:fe85:2ba6/64 Scope:Link
- UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
- RX packets:0 errors:0 dropped:0 overruns:0 frame:0
- TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:0
- RX bytes:0 (0.0 b) TX bytes:768 (768.0 b)
- eth1.34 Link encap:Ethernet HWaddr 00:0C:29:85:2B:A6
- inet6 addr: fe80::20c:29ff:fe85:2ba6/64 Scope:Link
- UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
- RX packets:0 errors:0 dropped:0 overruns:0 frame:0
- TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:0
- RX bytes:0 (0.0 b) TX bytes:492 (492.0 b)
- [root@localhost ipv4]# brctl show
- bridge name bridge id STP enabled interfaces
- br0 8000.000c29852ba6 no eth1.33
- eth1.34
复制代码 1:首先网卡收到包,触发中断,进入到netif_rx,然后进行到netif_receive_skb函数中。
这时skb->dev是eth1,带有vlan,协议是8100-----关于从netif_rx到netif_receive_skb的过程,有太多的文章,我大概看了但还是不甚了了!
2:在netif_receive_skb里顺序执行到handle_bridge的时候,由于eth1不在br0中,所以退出handle_bridge- if ((*pskb)->pkt_type == PACKET_LOOPBACK ||
- (port = rcu_dereference((*pskb)->dev->br_port)) == NULL)
- return 0;
复制代码 交给下面的deliver_skb处理,然后进入到vlan处理部分- type = skb->protocol;
- list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
- if (ptype->type == type &&
- (!ptype->dev || ptype->dev == skb->dev)) {
- if (pt_prev)
- ret = deliver_skb(skb, pt_prev, orig_dev);
- pt_prev = ptype;
- }
- }
复制代码 3:vlan部分注册了协议函数,vlan_skb_recv函数:
通过skb->dev = __find_vlan_dev(dev, vid),根据vlan值33查找eth1.33。
也就是说如果没有找到eth1.33,会释放掉skb退出,如果找到了,继续:
调用vlan_check_reorder_header剥离vlan,并且把protocol设置为下一层的协议,例如0800(IP)
然后调用netif_rx
4:netif_rx会再次执行到netif_receive_skb,这时skb->dev已经变成了eth1.33,并且报文已经没有vlan了。
再次进入到handle_bridge的时候,由于eth1.33在br0中,所以会进入到br处理
然后就是查找mac地址,如果找不到,则洪泛。找到了,则转发(待分析)
如果是洪泛,则需要向br0本身复制一份,最终会调用br_pass_frame_up,该函数最终调用netif_receive_skb,再次越过handle_bridge进入到上层协议(例如IP,arp等等)
上面是读了帖子http://bbs.chinaunix.net/thread-3566835-1-1.html之后我的析,供大家指正。
我还有一个疑问,在vlan处理中,最后调用netif_rx函数,为什么?为什么不是直接调用netif_receive_skb? |
|