免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 新手学习网络子系统 每天一帖 网桥处理疑惑 [复制链接]

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-11 21:13 |只看该作者 |倒序浏览
bridge转发流程:
int br_handle_frame_finish(struct sk_buff *skb)
{
        const unsigned char *dest = eth_hdr(skb)->h_dest;
        struct net_bridge_port *p = rcu_dereference(skb->dev->br_port);
        struct net_bridge *br;
        struct net_bridge_fdb_entry *dst;
        struct sk_buff *skb2;

        if (!p || p->state == BR_STATE_DISABLED)
                goto drop;

        /* insert into forwarding database after filtering to avoid spoofing */
        br = p->br;
        /*相当于二层mac地址的学习*/
        br_fdb_update(br, p, eth_hdr(skb)->h_source);

        if (p->state == BR_STATE_LEARNING)
                goto drop;

        /* The packet skb2 goes to the local host (NULL to skip). */
        skb2 = NULL;

        if (br->dev->flags & IFF_PROMISC)
                skb2 = skb;

        dst = NULL;

        if (is_multicast_ether_addr(dest)) {
                br->statistics.multicast++;
                skb2 = skb;
        } else if ((dst = __br_fdb_get(br, dest)) && dst->is_local) {
                skb2 = skb;
                /* Do not forward the packet since it's local. */
                skb = NULL;
        }

        if (skb2 == skb)
                skb2 = skb_clone(skb, GFP_ATOMIC);

        if (skb2)
                br_pass_frame_up(br, skb2);

        if (skb) {
                if (dst)
                        br_forward(dst->dst, skb);
                else
                       
                                     br_flood_forward(br, skb);
        }

out:
        return 0;
drop:
        kfree_skb(skb);
        goto out;
}

对应网桥设备为混杂模式,以及收到数据包为多播目的mac以及目的mac地址为本地的目的mac的都要通过br_pass_frame_up(br,skb2)发送到上层协议,但是在跟踪br_pass_frame_up(br,skb2)的时候,发现实质又是调用了
indev = skb->dev;skb->dev = br->dev;
NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,netif_receive_skb);再次送到上层协议的,在此调用netif_receive_skb的时候,会不会还要存在循环处理该数据包呢


在没有找到目的出接口转发的时候,会在整个网桥中泛出去。在泛和时候发现调用br_flood(br, skb, __br_forward);时候,在br_flood函数中遍历整个bridge网桥的设备端口时候,为什么会出现两个struct net_bridge_port *p;struct net_bridge_port *prev;?何不使用一个指针遍历整个链表,若不为空,就从该网桥端口发送出去。不太明白内核那样做是不是还有什么其他的考虑,会不会是多余的一步啊  或者是我哪里理解错了

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
2 [报告]
发表于 2013-07-13 23:08 |只看该作者
问题2。比较有意思的代码,当某port不能发送的时候,使用上一个有效的port发送一分,即便是重复发送。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP