Chinaunix

标题: open-vswitch的 gre vport导致内核崩溃 [打印本页]

作者: asuka2001    时间: 2014-03-20 16:53
标题: open-vswitch的 gre vport导致内核崩溃
如果第一次使用 gre vport,open-vswitch注册了一个 gre_cisco_protocol,但是没有提供 err_handler。

见 gre_init()@net/openvswitch/vport-gre.c

static struct gre_cisco_protocol gre_protocol = {
        .handler        = gre_rcv,
        .priority       = 1,
};

static int gre_init(void)
{
        int err;

        gre_ports++;
        if (gre_ports > 1)
                return 0;

        err = gre_cisco_register(&gre_protocol);
        if (err)
                pr_warn("cannot register gre protocol handler\n");

        return err;
}


而 gre的错误处理流程中,不会检查 err_handler是否为空指针。然后内核就杯具了!

net/ipv4/gre_demux.c

static void gre_cisco_err(struct sk_buff *skb, u32 info)
{
......
        for (i = 0; i < GRE_IP_PROTO_MAX; i++) {
                struct gre_cisco_protocol *proto;

                proto = rcu_dereference(gre_cisco_proto_list);
                if (!proto)
                        continue;

                if (proto->err_handler(skb, info, &tpi) == PACKET_RCVD)
                        goto out;

        }
......
}


想请教的是 gre_cisco_protocol要求必须提供 err_handler?
作者: asuka2001    时间: 2014-03-20 16:54
这 BUG从 3.11到 3.13都存在!居然没有人报!
作者: humjb_1983    时间: 2014-03-20 17:20
呵呵,你可以commit一个~~
作者: asuka2001    时间: 2014-03-20 19:39
本帖最后由 asuka2001 于 2014-03-20 19:39 编辑

回复 3# humjb_1983

我比较奇怪的是,这个 BUG是 100%复现,但是居然没有人报这个 BUG。难道大家都不用 gre vport么?

因为这个 BUG,直接把用户生产环境的机器搞崩溃了。残念个先!
作者: humjb_1983    时间: 2014-03-21 08:46
呵呵,这个反正我们没用过,你的环境没有特殊性,可能新功能磨合期,问题比较多,整个patch提交吧~,到时你的疑问就有maintainer给你解答了。
作者: lonelyair    时间: 2014-03-21 09:18
这是不是说明 linux gre vport的应用太少啊,open-vswitch的发展还有太多不确定性
作者: asuka2001    时间: 2014-03-25 16:15
David Miller回复说:

Rather, openvswitch should provide an appropriate ->err_handler() that
returns PACKET_RCVD or PACKET_REJECT.


看来是 openvswitch的问题!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2