免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2990 | 回复: 2
打印 上一主题 下一主题

RE:探讨 Linux bridge 对802.1q包的处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-23 11:11 |只看该作者 |倒序浏览
本帖最后由 hi.stao 于 2011-12-23 11:16 编辑

本人的配置:
  1. eth1      Link encap:Ethernet  HWaddr 00:0C:29:85:2B:A6
  2.           inet addr:192.168.80.102  Bcast:192.168.80.255  Mask:255.255.255.0
  3.           inet6 addr: fe80::20c:29ff:fe85:2ba6/64 Scope:Link
  4.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
  5.           RX packets:1032 errors:0 dropped:0 overruns:0 frame:0
  6.           TX packets:675 errors:0 dropped:0 overruns:0 carrier:0
  7.           collisions:0 txqueuelen:1000
  8.           RX bytes:100087 (97.7 KiB)  TX bytes:98901 (96.5 KiB)
  9.           Interrupt:19 Base address:0x2024

  10. eth1.33   Link encap:Ethernet  HWaddr 00:0C:29:85:2B:A6
  11.           inet6 addr: fe80::20c:29ff:fe85:2ba6/64 Scope:Link
  12.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
  13.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  14.           TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
  15.           collisions:0 txqueuelen:0
  16.           RX bytes:0 (0.0 b)  TX bytes:768 (768.0 b)

  17. eth1.34   Link encap:Ethernet  HWaddr 00:0C:29:85:2B:A6
  18.           inet6 addr: fe80::20c:29ff:fe85:2ba6/64 Scope:Link
  19.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
  20.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  21.           TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
  22.           collisions:0 txqueuelen:0
  23.           RX bytes:0 (0.0 b)  TX bytes:492 (492.0 b)

  24. [root@localhost ipv4]# brctl show
  25. bridge name     bridge id               STP enabled     interfaces
  26. br0             8000.000c29852ba6       no              eth1.33
  27.                                                         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
  1. if ((*pskb)->pkt_type == PACKET_LOOPBACK ||
  2.             (port = rcu_dereference((*pskb)->dev->br_port)) == NULL)
  3.                 return 0;
复制代码
交给下面的deliver_skb处理,然后进入到vlan处理部分
  1. type = skb->protocol;
  2.         list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
  3.                 if (ptype->type == type &&
  4.                     (!ptype->dev || ptype->dev == skb->dev)) {
  5.                         if (pt_prev)
  6.                                 ret = deliver_skb(skb, pt_prev, orig_dev);
  7.                         pt_prev = ptype;
  8.                 }
  9.         }
复制代码
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?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2011-12-23 22:13 |只看该作者
我还有一个疑问,在vlan处理中,最后调用netif_rx函数,为什么?为什么不是直接调用netif_receive_skb?

这是一个规范问题。网络层向上层提供的数据包接收函数是netif_rx,那么就应该调用它。当然直接调用netif_receive_skb也可以,但是这样不规范,扩展性不好,因为接收数据包也是有队列,有先后顺序的,如果做了输入流控,那么就会跳过输入流控了。
就行发送数据包的时候,在网络层应该调用ip_queue_xmit来通过QOS来发送数据包,但是你也可以直接调用hard_start_xmit来发送数据包,但是这样就绕过了QOS处理了。

论坛徽章:
0
3 [报告]
发表于 2011-12-24 12:09 |只看该作者
感谢回复

linux 的vlan处理确实有很多冗余,对性能会有影响
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP