From patchwork Mon Feb 12 08:17:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guoshuai Li X-Patchwork-Id: 871917 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zfz7l0C5Jz9sRm for ; Mon, 12 Feb 2018 19:18:09 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 56337F9F; Mon, 12 Feb 2018 08:18:06 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id F3F2FF6E for ; Mon, 12 Feb 2018 08:18:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from smtp2203-239.mail.aliyun.com (smtp2203-239.mail.aliyun.com [121.197.203.239]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id B407012D for ; Mon, 12 Feb 2018 08:18:02 +0000 (UTC) X-Alimail-AntiSpam: AC=CONTINUE; BC=0.09995187|-1; CH=green; FP=0|0|0|0|0|-1|-1|-1; HT=e02c03296; MF=ligs@dtdream.com; NM=1; PH=DS; RN=2; RT=2; SR=0; TI=SMTPD_---.Ato..n6_1518423477; Received: from localhost.localdomain(mailfrom:ligs@dtdream.com fp:222.128.6.212) by smtp.aliyun-inc.com(10.147.41.138); Mon, 12 Feb 2018 16:17:58 +0800 From: Guoshuai Li To: ovs-dev@openvswitch.org Date: Mon, 12 Feb 2018 16:17:47 +0800 Message-Id: <20180212081747.1404-1-ligs@dtdream.com> X-Mailer: git-send-email 2.13.2.windows.1 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH] ovn-controller: Fix crash when sending GARP when openflow disconnection. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org This is call stack: Program received signal SIGABRT, Aborted. 1 0x00007ffff6a4f8e8 in __GI_abort () at abort.c:90 2 0x00000000004765d6 in ofputil_protocol_to_ofp_version (protocol=) at lib/ofp-util.c:769 3 0x000000000047c19e in ofputil_encode_packet_out (po=po@entry=0x7fffffffa0e0, protocol=) at lib/ofp-util.c:7060 4 0x0000000000410870 in send_garp (garp=0x83cfe0, current_time=current_time@entry=1200375400) at ovn/controller/pinctrl.c:1738 5 0x000000000041430f in send_garp_run (active_tunnels=, local_datapaths=0x7fffffffc0a0, chassis_index=, chassis=0x8194d0, br_int=, ctx=0x7fffffffc080) at ovn/controller/pinctrl.c:2069 Signed-off-by: Guoshuai Li Acked-by: Mark Michelson --- ovn/controller/pinctrl.c | 40 ++++++++++++++++++++++------------------ tests/ovn.at | 14 ++++++++++++++ 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c index 14c95ff54..9537735cf 100644 --- a/ovn/controller/pinctrl.c +++ b/ovn/controller/pinctrl.c @@ -1071,27 +1071,31 @@ pinctrl_run(struct controller_ctx *ctx, rconn_run(swconn); - if (rconn_is_connected(swconn)) { - if (conn_seq_no != rconn_get_connection_seqno(swconn)) { - pinctrl_setup(swconn); - conn_seq_no = rconn_get_connection_seqno(swconn); - flush_put_mac_bindings(); - } - - /* Process a limited number of messages per call. */ - for (int i = 0; i < 50; i++) { - struct ofpbuf *msg = rconn_recv(swconn); - if (!msg) { - break; - } + if (!rconn_is_connected(swconn)) { + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); + VLOG_WARN_RL(&rl, "%s is not connected.", rconn_get_target(swconn)); + return; + } - const struct ofp_header *oh = msg->data; - enum ofptype type; + if (conn_seq_no != rconn_get_connection_seqno(swconn)) { + pinctrl_setup(swconn); + conn_seq_no = rconn_get_connection_seqno(swconn); + flush_put_mac_bindings(); + } - ofptype_decode(&type, oh); - pinctrl_recv(oh, type, ctx); - ofpbuf_delete(msg); + /* Process a limited number of messages per call. */ + for (int i = 0; i < 50; i++) { + struct ofpbuf *msg = rconn_recv(swconn); + if (!msg) { + break; } + + const struct ofp_header *oh = msg->data; + enum ofptype type; + + ofptype_decode(&type, oh); + pinctrl_recv(oh, type, ctx); + ofpbuf_delete(msg); } run_put_mac_bindings(ctx); diff --git a/tests/ovn.at b/tests/ovn.at index 00d26e757..67df0a8df 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -3566,6 +3566,20 @@ AT_CHECK([ovs-vsctl add-port br-int localvif1 -- set Interface localvif1 externa echo "fffffffffffff0000000000108060001080006040001f00000000001c0a80102000000000000c0a80102" > expected OVN_CHECK_PACKETS([hv/snoopvif-tx.pcap], [expected]) +# delete openflow connection. +as hv +OVS_APP_EXIT_AND_WAIT([ovs-vswitchd]) + +# Wait for send Garp. +sleep 3 + +# check ovn-controller status. +as hv +AT_CHECK([ovs-appctl -t ovn-controller version | wc -l], [0], [1 +]) + +start_daemon ovs-vswitchd --enable-dummy=system -vvconn -vofproto_dpif -vunixctl + # Delete the localnet ports. AT_CHECK([ovs-vsctl del-port localvif1]) AT_CHECK([ovn-nbctl lsp-del ln_port])