From patchwork Sun Mar 24 05:36:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cheng Li X-Patchwork-Id: 1915270 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4V2Q7j6jf3z1yXy for ; Sun, 24 Mar 2024 16:47:29 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id B23FD405E2; Sun, 24 Mar 2024 05:47:27 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id mEE0Sn2ImnwO; Sun, 24 Mar 2024 05:47:25 +0000 (UTC) X-Comment: SPF check N/A for local connections - client-ip=140.211.9.56; helo=lists.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver= DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 3C9E240127 Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id 3C9E240127; Sun, 24 Mar 2024 05:47:25 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D5E87C0072; Sun, 24 Mar 2024 05:47:24 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 07A6EC0037 for ; Sun, 24 Mar 2024 05:47:24 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id D70198216C for ; Sun, 24 Mar 2024 05:47:23 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id dZQyPN5x1oAg for ; Sun, 24 Mar 2024 05:47:22 +0000 (UTC) X-Greylist: delayed 653 seconds by postgrey-1.37 at util1.osuosl.org; Sun, 24 Mar 2024 05:47:21 UTC DMARC-Filter: OpenDMARC Filter v1.4.2 smtp1.osuosl.org 9CCFE81DF3 Authentication-Results: smtp1.osuosl.org; dmarc=none (p=none dis=none) header.from=chinatelecom.cn DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 9CCFE81DF3 Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=182.42.154.78; helo=chinatelecom.cn; envelope-from=lic121@chinatelecom.cn; receiver= Received: from chinatelecom.cn (smtpnm6-02.21cn.com [182.42.154.78]) by smtp1.osuosl.org (Postfix) with ESMTP id 9CCFE81DF3 for ; Sun, 24 Mar 2024 05:47:21 +0000 (UTC) HMM_SOURCE_IP: 192.168.138.117:46790.1852253836 HMM_ATTACHE_NUM: 0000 HMM_SOURCE_TYPE: SMTP Received: from clientip-125.69.9.194 (unknown [192.168.138.117]) by chinatelecom.cn (HERMES) with SMTP id 3F1B812000086; Sun, 24 Mar 2024 13:36:19 +0800 (CST) X-189-SAVE-TO-SEND: +lic121@chinatelecom.cn Received: from ([125.69.9.194]) by gateway-ssl-dep-77bc75f6c8-5v5w7 with ESMTP id 6ff5bb340179489da019f85eb277e58a for dev@openvswitch.org; Sun, 24 Mar 2024 13:36:23 CST X-Transaction-ID: 6ff5bb340179489da019f85eb277e58a X-Real-From: lic121@chinatelecom.cn X-Receive-IP: 125.69.9.194 X-MEDUSA-Status: 0 From: Cheng Li To: dev@openvswitch.org, i.maximets@ovn.org Date: Sun, 24 Mar 2024 05:36:07 +0000 Message-Id: <20240324053607.467859-1-lic121@chinatelecom.cn> X-Mailer: git-send-email 2.39.3 MIME-Version: 1.0 Subject: [ovs-dev] [PATCH] route-table: Filter route changes by interface. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" When ovs host is also a kubernets node, pod creation/deletion may trigger route changes. As a result, ovs run route_table_reset(). As ovs do not care the kubernetes pod routes, route_table_reset() is not neccessary. Signed-off-by: Cheng Li --- lib/route-table.c | 39 +++++++++++++++++++++++++++++++-- lib/route-table.h | 1 + tests/system-route.at | 51 +++++++++++++++++++++++++++++++++++++++++++ vswitchd/bridge.c | 3 +++ vswitchd/vswitch.xml | 10 +++++++++ 5 files changed, 102 insertions(+), 2 deletions(-) diff --git a/lib/route-table.c b/lib/route-table.c index f1fe32714..ec8783923 100644 --- a/lib/route-table.c +++ b/lib/route-table.c @@ -33,6 +33,7 @@ #include "netlink-notifier.h" #include "netlink-socket.h" #include "openvswitch/ofpbuf.h" +#include "lib/sset.h" #include "ovs-router.h" #include "packets.h" #include "rtnetlink.h" @@ -82,6 +83,7 @@ static struct nln_notifier *route6_notifier = NULL; static struct nln_notifier *name_notifier = NULL; static bool route_table_valid = false; +static struct sset disabled_ifaces = SSET_INITIALIZER(&disabled_ifaces); static void route_table_reset(void); static void route_table_handle_msg(const struct route_table_msg *); @@ -92,6 +94,32 @@ static void route_map_clear(void); static void name_table_init(void); static void name_table_change(const struct rtnetlink_change *, void *); +void +disable_notify_on_interfaces(const char *ifaces) +{ + struct sset tmp_ifaces; + + if (ifaces) { + sset_from_delimited_string(&tmp_ifaces, ifaces, ", "); + } else { + sset_init(&tmp_ifaces); + } + if (! sset_equals(&disabled_ifaces, &tmp_ifaces)) { + const char *iface; + struct ds ds = DS_EMPTY_INITIALIZER; + + sset_swap(&disabled_ifaces, &tmp_ifaces); + SSET_FOR_EACH (iface, &disabled_ifaces) { + ds_put_format(&ds, " %s", iface); + } + VLOG_DBG_RL(&rl, "route notify disabled interfaces: [%s]", + ds_cstr(&ds)); + ds_destroy(&ds); + } + sset_destroy(&tmp_ifaces); + +} + uint64_t route_table_get_change_seq(void) { @@ -358,9 +386,16 @@ static void route_table_change(const struct route_table_msg *change OVS_UNUSED, void *aux OVS_UNUSED) { - if (!change || change->relevant) { - route_table_valid = false; + if (change) { + if (!change->relevant) { + return; + } + if (change->rd.ifname[0] != '\0' && + sset_contains(&disabled_ifaces, change->rd.ifname)) { + return; + } } + route_table_valid = false; } static void diff --git a/lib/route-table.h b/lib/route-table.h index 3a02d737a..716e5bae0 100644 --- a/lib/route-table.h +++ b/lib/route-table.h @@ -33,4 +33,5 @@ void route_table_wait(void); bool route_table_fallback_lookup(const struct in6_addr *ip6_dst, char name[], struct in6_addr *gw6); +void disable_notify_on_interfaces(const char *ifaces); #endif /* route-table.h */ diff --git a/tests/system-route.at b/tests/system-route.at index c0ecad6cf..039255df7 100644 --- a/tests/system-route.at +++ b/tests/system-route.at @@ -128,3 +128,54 @@ OVS_WAIT_UNTIL([test $(ovs-appctl ovs/route/show | grep -c 'p1-route') -eq 0 ]) OVS_TRAFFIC_VSWITCHD_STOP AT_CLEANUP + + +dnl Checks that disabled interface doesn't trigger route table refresh. +AT_SETUP([ovs-route - filter by interface]) +AT_KEYWORDS([route]) +OVS_TRAFFIC_VSWITCHD_START() + +dnl Create tap port. +on_exit 'ip link del p1-route; ip link del p2-route' +AT_CHECK([ip tuntap add name p1-route mode tap]) +AT_CHECK([ip tuntap add name p2-route mode tap]) +AT_CHECK([ip link set p1-route up]) +AT_CHECK([ip link set p2-route up]) + +dnl Add ip address. +AT_CHECK([ip addr add 10.0.0.17/24 dev p1-route], [0], [stdout]) +AT_CHECK([ip addr add 10.0.1.17/24 dev p2-route], [0], [stdout]) + +dnl Check that OVS catches route updates. +OVS_WAIT_UNTIL_EQUAL([ovs-appctl ovs/route/show | grep -P 'p(1|2)-route' | sort], [dnl +Cached: 10.0.0.0/24 dev p1-route SRC 10.0.0.17 +Cached: 10.0.0.17/32 dev p1-route SRC 10.0.0.17 local +Cached: 10.0.1.0/24 dev p2-route SRC 10.0.1.17 +Cached: 10.0.1.17/32 dev p2-route SRC 10.0.1.17 local]) + +dnl Set disabled interface +AT_CHECK([ovs-appctl vlog/set 'route_table,dbg']) +get_log_next_line_num +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:route-notify-disabled-interfaces="p2-route"]) +dnl expected log line: "route_table|DBG|route notify disabled interfaces: [ p2-route]" +OVS_WAIT_UNTIL([tail -n +$LINENUM ovs-vswitchd.log | grep -P "notify disabled interfaces: . p2-route"]) + +dnl Add a route with interface p1-route. +AT_CHECK([ip route add 10.0.0.18/32 dev p1-route]) +OVS_WAIT_UNTIL_EQUAL([ovs-appctl ovs/route/show | grep 'p1-route' | sort], [dnl +Cached: 10.0.0.0/24 dev p1-route SRC 10.0.0.17 +Cached: 10.0.0.17/32 dev p1-route SRC 10.0.0.17 local +Cached: 10.0.0.18/32 dev p1-route SRC 10.0.0.17]) + +dnl Add a route with disabled interface p2-route. +AT_CHECK([ip route add 10.0.1.18/32 dev p2-route]) +dnl Give the main thread a chance to act. +AT_CHECK([ovs-appctl revalidator/wait]) +dnl Check that OVS didn't refresh route table. +AT_CHECK([ovs-appctl ovs/route/show | grep 'p2-route' | sort], [0], [dnl +Cached: 10.0.1.0/24 dev p2-route SRC 10.0.1.17 +Cached: 10.0.1.17/32 dev p2-route SRC 10.0.1.17 local +]) + +OVS_TRAFFIC_VSWITCHD_STOP +AT_CLEANUP diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 95a65fcdc..217f5b3cf 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -71,6 +71,7 @@ #include "unixctl.h" #include "lib/vswitch-idl.h" #include "vlan-bitmap.h" +#include "route-table.h" VLOG_DEFINE_THIS_MODULE(bridge); @@ -888,6 +889,8 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg) ofproto_set_threads( smap_get_int(&ovs_cfg->other_config, "n-handler-threads", 0), smap_get_int(&ovs_cfg->other_config, "n-revalidator-threads", 0)); + disable_notify_on_interfaces(smap_get(&ovs_cfg->other_config, + "route-notify-disabled-interfaces")); /* Destroy "struct bridge"s, "struct port"s, and "struct iface"s according * to 'ovs_cfg', with only very minimal configuration otherwise. diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index 8a1b607d7..ee2ca05fd 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -869,6 +869,16 @@ The feature is considered experimental.

+ +

+ Ignore route changes of specified interfaces. One of the usage + scenarios is to prevent kubernets from triggering ovs route table + refresh on pod create/destroy. +

+

+ The format is interface names joined by ','. i.e. "eth1,eth2" +

+