From patchwork Tue Jul 16 14:54:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vasu Dasari X-Patchwork-Id: 1132810 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="C26lA0i4"; 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 45p3Mx0dQyz9sNC for ; Wed, 17 Jul 2019 00:54:51 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 9BB6BC75; Tue, 16 Jul 2019 14:54:48 +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 A29388D7 for ; Tue, 16 Jul 2019 14:54:46 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id DC08F887 for ; Tue, 16 Jul 2019 14:54:45 +0000 (UTC) Received: by mail-qk1-f193.google.com with SMTP id w190so14806098qkc.6 for ; Tue, 16 Jul 2019 07:54:45 -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=hqFazz3OiOmWy/ZUgG5JFh/HkcoP1Kxic42+atqjtKk=; b=C26lA0i4qLjn7K/4RJSCPKfgg0lEiY4aihzZihg73tEeEAImSAxERwl043fMFhd2Qn ZN+ulHlGolXYYsHLaRi68CwisYZiUJKs1b4qaraQs7rPQ8vh3LHEoXTsOGM3sKLvKEIR vrI2r7HOycvAyyGVMIS//fUTU/61ezcg+0DHmS84WIjKX6Lg3kT9TRFN4e+j0lMYoc83 LrPXtKwYZAdQdYcMmAFJ7KiwYgNN9+n/L6NYBRn9Cm2AlAEU/MiHklp37d/rvxVcxddg mYd4KOHzxz+BjuBvbKlbW+lXwm8fj+ZiJlEQPVAHm2aysHXWNACyQB0qKOQQYAR1rCfN Mwjg== 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=hqFazz3OiOmWy/ZUgG5JFh/HkcoP1Kxic42+atqjtKk=; b=orjhexVjFA/z9ufc75byNCcUeT/9TQHRXyBU3AHNPPTKydC9WPB8YxAhJueVPN8w0X eH154Ai3UqdlDaspu/dWTznD1WrCa3Gr7SFD4hshUtEVEccxHX45hPhc0vTVKnlpH04p X5Cm5e1oRVy1tsHC77GeJU3fGiQNouC5J9A6Y7U3sFIIbgx7EmRGOt+43HYDKHLbMDKF 9Lz8WtBCe74UAQ0kjmn2kNPe9x217Y5ZNj1JptK9TZo/2sxZ7B1x2anyAR9ufjgbUfZv n8vbMx/MjaqwR6c6Oc2tGphycpkKfOpitnzgLcROybnfQhtkOfoHtOW6NQfEc7mi0R+z B3cQ== X-Gm-Message-State: APjAAAVXPcbq0DNCdqShZHhzToYJQ1CFePZ/tkhbV7F1k7sle4o1ZSjM E8bWH9Qn3hhmWTheKWRVv6ygEHLJ9Ko= X-Google-Smtp-Source: APXvYqwy8M3H/aVyv2k6LRM12p/ujAJZvv1q4RyvcSGU6+A2+SFv03gu23sqKDo7pqVzzjmqsqpD5w== X-Received: by 2002:a37:a692:: with SMTP id p140mr21058389qke.432.1563288884546; Tue, 16 Jul 2019 07:54:44 -0700 (PDT) Received: from localhost.localdomain ([73.61.23.212]) by smtp.gmail.com with ESMTPSA id z19sm9463755qkg.28.2019.07.16.07.54.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 16 Jul 2019 07:54:43 -0700 (PDT) From: Vasu Dasari To: dev@openvswitch.org Date: Tue, 16 Jul 2019 10:54:31 -0400 Message-Id: <20190716145431.1617-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 Cc: fbl@sysclose.org Subject: [ovs-dev] [PATCH v4] 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 Reviewed-by: Flavio Fernandes Reviewed-by: Ben Pfaff --- --- v1 -> v2: Incorporate robot comments. Verified the commit with utilities/checkpatch.py -1 v2 -> v3: Incorporate review comments from Flavio and Ben. Discussions at: https://mail.openvswitch.org/pipermail/ovs-dev/2019-July/360318.html https://mail.openvswitch.org/pipermail/ovs-dev/2019-July/360424.html v3 -> v4: Reworded Acked-by to Reviewed-by in commit description. --- lib/tnl-neigh-cache.c | 20 +++++++++++++++ lib/tnl-neigh-cache.h | 1 + ofproto/ofproto-dpif-xlate.c | 3 +++ tests/tunnel.at | 47 ++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+) diff --git a/lib/tnl-neigh-cache.c b/lib/tnl-neigh-cache.c index b28f9f1bb..5bda4af7e 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[IFNAMSIZ]) +{ + struct tnl_neigh_entry *neigh; + bool changed = false; + + ovs_mutex_lock(&mutex); + CMAP_FOR_EACH (neigh, cmap_node, &table) { + if (!strcmp(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..fc6f87936 100644 --- a/tests/tunnel.at +++ b/tests/tunnel.at @@ -920,3 +920,50 @@ 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 p1 10.0.0.2 00:00:10:00:00:02 + 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 br0 10.0.2.2 00:00:10:00:02:02 + 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.0.2 00:00:10:00:00:02 p1 +10.0.1.1 00:00:10:00:01:01 p2 +10.0.2.1 00:00:10:00:02:01 br0 +10.0.2.2 00:00:10:00:02:02 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