免费注册 查看新帖 |

Chinaunix

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

[内核入门] br_handle_frame为什么要求是leaning状态才转发? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-11 10:07 |只看该作者 |倒序浏览
    小弟在看网桥的代码,看到br_handle_frame函数的时候觉得有点奇怪。
   内核版本是2.6.32.

    其中br_handle_frame函数在forward流程处理的时候是如下代码:

   forward:
        switch (p->state) {
        case BR_STATE_FORWARDING:
                rhook = rcu_dereference(br_should_route_hook);
                if (rhook != NULL) {
                        if (rhook(skb))
                                return skb;
                        dest = eth_hdr(skb)->h_dest;
                }
                /* fall through */
        case BR_STATE_LEARNING:                if (!compare_ether_addr(p->br->dev->dev_addr, dest))
                        skb->pkt_type = PACKET_HOST;

                NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
                        br_handle_frame_finish);
                break;
        default:

    我觉得如果该端口状态是forward状态,那才应该做转发呀。结果是走到三层转发。
   而端口是learning状态的时候,居然直到br_handle_frame_finish的通知链做二层转发去了。

   我一直觉得,learning状态是一个不稳定的状态啊。。。。。。。。求大神指点我上面的逻辑或者理解错误。
   

论坛徽章:
0
2 [报告]
发表于 2012-07-11 18:31 |只看该作者
仔细看代码

论坛徽章:
0
3 [报告]
发表于 2012-07-11 19:42 |只看该作者
第一个case后面没有break哦。

论坛徽章:
0
4 [报告]
发表于 2012-07-12 08:42 |只看该作者
多谢楼上两位兄弟。。。。。。

呵呵,粗心啊粗心,自责。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP