From patchwork Thu Jun 20 15:11:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vasu Dasari X-Patchwork-Id: 1119514 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=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="MfdZPVua"; dkim-atps=neutral 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 45V4z74sK4z9s9y for ; Fri, 21 Jun 2019 01:11:31 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 0CC97C6A; Thu, 20 Jun 2019 15:11:28 +0000 (UTC) X-Original-To: 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 25B9EB3E for ; Thu, 20 Jun 2019 15:11:27 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-qt1-f196.google.com (mail-qt1-f196.google.com [209.85.160.196]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 64858E6 for ; Thu, 20 Jun 2019 15:11:26 +0000 (UTC) Received: by mail-qt1-f196.google.com with SMTP id d17so3495968qtj.8 for ; Thu, 20 Jun 2019 08:11:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=ZbHKZp9f1rCfOssAsvlTdqfCQcQnCEQiIaJOXSYhMjY=; b=MfdZPVuapGWRzuBhq84dgTUx4k/YmaIaq0vzwT01VfzT4PmP8vUa1IqbRssYRY78by 8Rv2dvlZIsXkyI2vJK68qg487QB6Ti1spu4GEtDudOpoFzIX4LFuHAELuKXSrqiIoo/h MC8zndPvmV81R2ZxqMO5pv09NH1NBkw5ci6BQ4j+K1q+w/OSd+AoV7J8+5R5CYONlL7p yqrLl6h4x/rzV8ukE/l40QfgeyzOKkWl7iIc7gh1u8uSClarj/bxBXgJwXFMcQi8zFMc WRUcfpt5KcwyLauEbqUQY7nTmqmP1R22ogvRTsSbxnkpcpAu60IJRdCYU+ckVInVcwWq 9vYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=ZbHKZp9f1rCfOssAsvlTdqfCQcQnCEQiIaJOXSYhMjY=; b=C/72h3ihW1XHl2PNzs8kartJ6KhUjuyW5Fd7s0byChximmMXoHFE52xCrhesEm1yty Fz8Xyl0eMKxkFjThfFRfhqCUU+xmjeslnT45zRzHfV13NCDlqfDwxdo1anCnGvXboBdT 9GWVxEbn06yQNAh6gTsWuHprzXDnCFefxgXxDsPrui7PckQt9uZrioLLgqJJ+dPIuisZ MKgid4WsBWmQpWFC+i8DrUSi9uLGWDGqmqM4VqIGF9Z89WA/pRbhEuIz40vjBWRyT1t/ fgDUfK2X3ty66HMf8Wx/CmHEx/yivqStr3U8V+JnvvxP8LElmVWh3EIofkxWj2rFHVzr tfqA== X-Gm-Message-State: APjAAAX0Z7qvx1hiVf2DOWjlrM0BW0HLcJadF/4Rw1f5x7jOTAAkc/U2 17nogKgbmM4sfyL1M+DADjOq06+cxYk= X-Google-Smtp-Source: APXvYqyWjoNn8UAxOaUsVGDEAi8wdWGpkf38rEdLvUtBCXnbMdkmHbn1KrgvmiWtkPAkEF71KRFz1w== X-Received: by 2002:a0c:f9c1:: with SMTP id j1mr39590798qvo.235.1561043485070; Thu, 20 Jun 2019 08:11:25 -0700 (PDT) Received: from vdasari-mac.plexxi.com (50-207-21-254-static.hfc.comcastbusiness.net. [50.207.21.254]) by smtp.gmail.com with ESMTPSA id u7sm7213750qtc.25.2019.06.20.08.11.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 20 Jun 2019 08:11:24 -0700 (PDT) From: Vasu Dasari To: dev@openvswitch.org Date: Thu, 20 Jun 2019 11:11:23 -0400 Message-Id: <20190620151123.23127-1-vdasari@gmail.com> X-Mailer: git-send-email 2.17.2 (Apple Git-113) X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE 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 v2] tnl-neigh-cache: Purge learnt neighbors when port/bridge is deleted 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 Say an ARP entry is learnt on a OVS port and when such a port is deleted, learnt entry should be removed from the port. It would have be aged out after ARP ageout time. This code will clean up immediately. Added test case(tunnel - neighbor entry add and deletion) in tunnel.at, to verify neighbors are added and removed on deletion of a ports and bridges. Discussion for this addition is at: https://mail.openvswitch.org/pipermail/ovs-discuss/2019-June/048754.html Signed-off-by: Vasu Dasari --- v1 -> v2: Incorporate robot comments. Verified the commit with utilities/checkpatch.py -1 --- lib/tnl-neigh-cache.c | 20 +++++++++++++++++ lib/tnl-neigh-cache.h | 1 + ofproto/ofproto-dpif-xlate.c | 3 +++ tests/tunnel.at | 43 ++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+) diff --git a/lib/tnl-neigh-cache.c b/lib/tnl-neigh-cache.c index b28f9f1bb..daa54432a 100644 --- a/lib/tnl-neigh-cache.c +++ b/lib/tnl-neigh-cache.c @@ -220,6 +220,26 @@ tnl_neigh_cache_run(void) } } +void +tnl_neigh_flush(const char br_name[]) +{ + struct tnl_neigh_entry *neigh; + bool changed = false; + + ovs_mutex_lock(&mutex); + CMAP_FOR_EACH (neigh, cmap_node, &table) { + if (nullable_string_is_equal(neigh->br_name, br_name)) { + tnl_neigh_delete(neigh); + changed = true; + } + } + ovs_mutex_unlock(&mutex); + + if (changed) { + seq_change(tnl_conf_seq); + } +} + static void tnl_neigh_cache_flush(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) diff --git a/lib/tnl-neigh-cache.h b/lib/tnl-neigh-cache.h index fee8e6a6f..ded9c2f86 100644 --- a/lib/tnl-neigh-cache.h +++ b/lib/tnl-neigh-cache.h @@ -37,5 +37,6 @@ int tnl_neigh_lookup(const char dev_name[], const struct in6_addr *dst, struct eth_addr *mac); void tnl_neigh_cache_init(void); void tnl_neigh_cache_run(void); +void tnl_neigh_flush(const char dev_name[]); #endif diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 73966a4e8..28a7fdd84 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -1481,6 +1481,9 @@ xlate_ofport_remove(struct ofport_dpif *ofport) ovs_assert(new_xcfg); xport = xport_lookup(new_xcfg, ofport); + if (xport) { + tnl_neigh_flush(netdev_get_name(xport->netdev)); + } xlate_xport_remove(new_xcfg, xport); } diff --git a/tests/tunnel.at b/tests/tunnel.at index 035c54f67..6d7550724 100644 --- a/tests/tunnel.at +++ b/tests/tunnel.at @@ -920,3 +920,46 @@ dnl which is not correct OVS_VSWITCHD_STOP AT_CLEANUP + +AT_SETUP([tunnel - neighbor entry add and deletion]) +OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=gre \ + options:remote_ip=1.1.1.1 options:local_ip=2.2.2.2 \ + options:key=5 ofport_request=1 \ + -- add-port br0 p2 -- set Interface p2 type=gre \ + options:local_ip=3.3.3.3 options:remote_ip=4.4.4.4 \ + ofport_request=2]) +AT_CHECK([ovs-vsctl add-br br1 -- set bridge br1 datapath_type=dummy], [0]) + +dnl Populate tunnel neighbor cache table +AT_CHECK([ + ovs-appctl tnl/arp/set p1 10.0.0.1 00:00:10:00:00:01 + ovs-appctl tnl/arp/set p2 10.0.1.1 00:00:10:00:01:01 + ovs-appctl tnl/arp/set br0 10.0.2.1 00:00:10:00:02:01 + ovs-appctl tnl/arp/set br1 20.0.0.1 00:00:20:00:00:01 +], [0], [stdout]) + +AT_CHECK([ovs-appctl tnl/neigh/show | tail -n+3 | sort], [0], [dnl +10.0.0.1 00:00:10:00:00:01 p1 +10.0.1.1 00:00:10:00:01:01 p2 +10.0.2.1 00:00:10:00:02:01 br0 +20.0.0.1 00:00:20:00:00:01 br1 +]) + +dnl neighbor table after deleting port p1 +AT_CHECK([ovs-vsctl del-port br0 p1],[0], [stdout]) +AT_CHECK([ovs-appctl tnl/neigh/show | tail -n+3 | grep -w p1 | sort], [0], [dnl +]) + +dnl neighbor table after deleting bridge br0 +AT_CHECK([ovs-vsctl del-br br0],[0], [stdout]) +AT_CHECK([ovs-appctl tnl/neigh/show | tail -n+3 | sort], [0], [dnl +20.0.0.1 00:00:20:00:00:01 br1 +]) + +dnl neighbor table after deleting bridge br1 +AT_CHECK([ovs-vsctl del-br br1],[0], [stdout]) +AT_CHECK([ovs-appctl tnl/neigh/show | tail -n+3 | sort], [0], [dnl +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP