From patchwork Tue Jul 13 12:53:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Bianconi X-Patchwork-Id: 1504590 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=IDn/uPsa; dkim-atps=neutral Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4GPLDK2mFdz9sWd for ; Tue, 13 Jul 2021 22:53:53 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id E4D0283AB5; Tue, 13 Jul 2021 12:53:48 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with UTF8SMTP id iu2ORyLpRG-G; Tue, 13 Jul 2021 12:53:47 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp1.osuosl.org (Postfix) with ESMTPS id D730D83438; Tue, 13 Jul 2021 12:53:46 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id BC720C001A; Tue, 13 Jul 2021 12:53:46 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0F13DC001A for ; Tue, 13 Jul 2021 12:53:46 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id F219C83934 for ; Tue, 13 Jul 2021 12:53:45 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id duIASkMitdA6 for ; Tue, 13 Jul 2021 12:53:43 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp1.osuosl.org (Postfix) with ESMTPS id D2D3083438 for ; Tue, 13 Jul 2021 12:53:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1626180821; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Gp84iUh+ZN0Zwq74d3kLwAtWvPXHAqxD24xkmNKK18U=; b=IDn/uPsatMRm94V31p17+sdD3w4EnSU4e/d43iu85pL6DcPCMI/xXp39vkn8eBoSM3dxKB pBNkJCfuPB2KXMej1B7JPBXjf+eFjTxl2NvjzM0CxGy2CJnwidJ8mQomGGAMyGBWSdsa5K AwzU6EYUI/R7J8Ok2lvP3GIKC8R/1qM= Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-314-__kcRmCGMFK1p2TWxgxNIA-1; Tue, 13 Jul 2021 08:53:41 -0400 X-MC-Unique: __kcRmCGMFK1p2TWxgxNIA-1 Received: by mail-ej1-f71.google.com with SMTP id bl17-20020a170906c251b029052292d7c3b4so1674601ejb.9 for ; Tue, 13 Jul 2021 05:53:40 -0700 (PDT) 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=Gp84iUh+ZN0Zwq74d3kLwAtWvPXHAqxD24xkmNKK18U=; b=WwotvSEHi39Dd+Owu9SIpR5U6t534BJ+3lJj/ICzmb0mbizCVlLhL9szeu82eZ1ZKJ NJiNLn+XDPF1vC9G99g/LuWR3c+V23jAdh+0BXLrKY17rU9B3E0RHZFGLf2KXgp7MwFA MSYzI/Gl6jw0KjwmMje+QUQN/XDAoFFTwappiJ1aKgTKK/jqI5Sd/pBwPEwspJhftKCB OlZp0+OrNk+hpKroPawfsrQ+av7Fc655oLXYDWtW++jFlqYhpxSQfneTKMohWBL+IvlP EwIZ0LAvpLVkhRSSmjq0uEI2aoSg7h10Pyc/GDmzfcL3MtN6RvGMSmL3a+39t1LK54M/ zByw== X-Gm-Message-State: AOAM532tg9sKNo4+RBS/Xn59I3iKGYvAYGchSiuACmH+m2w54hsPwm/z MwiQ15r6jLeVsPbgX5S54wXYwAHG3ve9cyS4bCgObMJhAojkO4625tQzxfAxtqTi60IRCyVGUFa Itkm9is12icqbds2NrVgFrwwdJKRJUukbmlvGkpnq9f5NvBeOpDpJnUD2shxSAsRmhTbmSYh6Ow E= X-Received: by 2002:aa7:da49:: with SMTP id w9mr5561082eds.47.1626180819481; Tue, 13 Jul 2021 05:53:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwflZYKoqrBgpW4KPXImpDc6eI3z5MDqKMYAiwv1YdiVNz7JTCTdDvSaoXspisEILwTdOyGrw== X-Received: by 2002:aa7:da49:: with SMTP id w9mr5561059eds.47.1626180819120; Tue, 13 Jul 2021 05:53:39 -0700 (PDT) Received: from localhost.localdomain (net-188-216-29-9.cust.vodafonedsl.it. [188.216.29.9]) by smtp.gmail.com with ESMTPSA id s16sm2774114eju.57.2021.07.13.05.53.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jul 2021 05:53:38 -0700 (PDT) From: Lorenzo Bianconi To: dev@openvswitch.org Date: Tue, 13 Jul 2021 14:53:19 +0200 Message-Id: <886e6cc83ae8078c452cd049ac3b33f193489be0.1626180720.git.lorenzo.bianconi@redhat.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: References: MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lorenzo.bianconi@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: dceara@redhat.com Subject: [ovs-dev] [PATCH v4 ovn 1/2] controller: incrementally create ipv6 prefix delegation port_binding list 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" Incrementally manage local_active_ports_ipv6_pd map for interfaces where IPv6 prefix-delegation has been enabled. This patch allows to avoid looping over all local interfaces to check if prefix-delegation is running on the current port binding. Acked-by: Mark Michelson Signed-off-by: Lorenzo Bianconi --- controller/binding.c | 34 ++++++++++++ controller/binding.h | 1 + controller/ovn-controller.c | 11 +++- controller/ovn-controller.h | 6 ++ controller/pinctrl.c | 107 +++++++++++++++++------------------- controller/pinctrl.h | 4 +- 6 files changed, 105 insertions(+), 58 deletions(-) diff --git a/controller/binding.c b/controller/binding.c index 594babc98..1ce337cdf 100644 --- a/controller/binding.c +++ b/controller/binding.c @@ -574,6 +574,32 @@ remove_related_lport(const struct sbrec_port_binding *pb, } } +static void +update_active_pb_ras_pd(const struct sbrec_port_binding *pb, + struct hmap *local_datapaths, + struct shash *map, const char *conf) +{ + bool ras_pd_conf = smap_get_bool(&pb->options, conf, false); + struct shash_node *iter = shash_find(map, pb->logical_port); + struct pb_ld_binding *ras_pd = iter ? iter->data : NULL; + + if (iter && !ras_pd_conf) { + shash_delete(map, iter); + free(ras_pd); + return; + } + if (ras_pd_conf) { + if (!ras_pd) { + ras_pd = xzalloc(sizeof *ras_pd); + ras_pd->pb = pb; + shash_add(map, pb->logical_port, ras_pd); + } + ovs_assert(ras_pd); + ras_pd->ld = get_local_datapath(local_datapaths, + pb->datapath->tunnel_key); + } +} + /* Corresponds to each Port_Binding.type. */ enum en_lport_type { LP_UNKNOWN, @@ -1645,6 +1671,10 @@ binding_run(struct binding_ctx_in *b_ctx_in, struct binding_ctx_out *b_ctx_out) const struct sbrec_port_binding *pb; SBREC_PORT_BINDING_TABLE_FOR_EACH (pb, b_ctx_in->port_binding_table) { + update_active_pb_ras_pd(pb, b_ctx_out->local_datapaths, + b_ctx_out->local_active_ports_ipv6_pd, + "ipv6_prefix_delegation"); + enum en_lport_type lport_type = get_lport_type(pb); switch (lport_type) { @@ -2482,6 +2512,10 @@ delete_done: continue; } + update_active_pb_ras_pd(pb, b_ctx_out->local_datapaths, + b_ctx_out->local_active_ports_ipv6_pd, + "ipv6_prefix_delegation"); + enum en_lport_type lport_type = get_lport_type(pb); struct binding_lport *b_lport = diff --git a/controller/binding.h b/controller/binding.h index a08011ae2..60ad49da0 100644 --- a/controller/binding.h +++ b/controller/binding.h @@ -72,6 +72,7 @@ void related_lports_destroy(struct related_lports *); struct binding_ctx_out { struct hmap *local_datapaths; + struct shash *local_active_ports_ipv6_pd; struct local_binding_data *lbinding_data; /* sset of (potential) local lports. */ diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c index 3a2319b41..c8bc9a56d 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -1045,6 +1045,8 @@ struct ed_type_runtime_data { bool tracked; bool local_lports_changed; struct hmap tracked_dp_bindings; + + struct shash local_active_ports_ipv6_pd; }; /* struct ed_type_runtime_data has the below members for tracking the @@ -1132,6 +1134,7 @@ en_runtime_data_init(struct engine_node *node OVS_UNUSED, sset_init(&data->egress_ifaces); smap_init(&data->local_iface_ids); local_binding_data_init(&data->lbinding_data); + shash_init(&data->local_active_ports_ipv6_pd); /* Init the tracked data. */ hmap_init(&data->tracked_dp_bindings); @@ -1157,6 +1160,7 @@ en_runtime_data_cleanup(void *data) free(cur_node); } hmap_destroy(&rt_data->local_datapaths); + shash_destroy_free_data(&rt_data->local_active_ports_ipv6_pd); local_binding_data_destroy(&rt_data->lbinding_data); } @@ -1235,6 +1239,8 @@ init_binding_ctx(struct engine_node *node, b_ctx_in->ovs_table = ovs_table; b_ctx_out->local_datapaths = &rt_data->local_datapaths; + b_ctx_out->local_active_ports_ipv6_pd = + &rt_data->local_active_ports_ipv6_pd; b_ctx_out->local_lports = &rt_data->local_lports; b_ctx_out->local_lports_changed = false; b_ctx_out->related_lports = &rt_data->related_lports; @@ -1252,6 +1258,7 @@ en_runtime_data_run(struct engine_node *node, void *data) { struct ed_type_runtime_data *rt_data = data; struct hmap *local_datapaths = &rt_data->local_datapaths; + struct shash *local_active_ipv6_pd = &rt_data->local_active_ports_ipv6_pd; struct sset *local_lports = &rt_data->local_lports; struct sset *active_tunnels = &rt_data->active_tunnels; @@ -1267,6 +1274,7 @@ en_runtime_data_run(struct engine_node *node, void *data) free(cur_node); } hmap_clear(local_datapaths); + shash_clear_free_data(local_active_ipv6_pd); local_binding_data_destroy(&rt_data->lbinding_data); sset_destroy(local_lports); related_lports_destroy(&rt_data->related_lports); @@ -3282,7 +3290,8 @@ main(int argc, char *argv[]) sbrec_bfd_table_get(ovnsb_idl_loop.idl), br_int, chassis, &runtime_data->local_datapaths, - &runtime_data->active_tunnels); + &runtime_data->active_tunnels, + &runtime_data->local_active_ports_ipv6_pd); /* Updating monitor conditions if runtime data or * logical datapath goups changed. */ if (engine_node_changed(&en_runtime_data) diff --git a/controller/ovn-controller.h b/controller/ovn-controller.h index 5d9466880..417c7aacb 100644 --- a/controller/ovn-controller.h +++ b/controller/ovn-controller.h @@ -87,4 +87,10 @@ enum chassis_tunnel_type { uint32_t get_tunnel_type(const char *name); +struct pb_ld_binding { + const struct sbrec_port_binding *pb; + const struct local_datapath *ld; + struct hmap_node hmap_node; +}; + #endif /* controller/ovn-controller.h */ diff --git a/controller/pinctrl.c b/controller/pinctrl.c index 78ecfed84..5f3eca4a0 100644 --- a/controller/pinctrl.c +++ b/controller/pinctrl.c @@ -1249,83 +1249,76 @@ fill_ipv6_prefix_state(struct ovsdb_idl_txn *ovnsb_idl_txn, static void prepare_ipv6_prefixd(struct ovsdb_idl_txn *ovnsb_idl_txn, struct ovsdb_idl_index *sbrec_port_binding_by_name, - const struct hmap *local_datapaths, + const struct shash *local_active_ports_ipv6_pd, const struct sbrec_chassis *chassis, const struct sset *active_tunnels) OVS_REQUIRES(pinctrl_mutex) { - const struct local_datapath *ld; bool changed = false; - HMAP_FOR_EACH (ld, hmap_node, local_datapaths) { - if (datapath_is_switch(ld->datapath)) { - /* logical switch */ + struct shash_node *iter; + SHASH_FOR_EACH (iter, local_active_ports_ipv6_pd) { + const struct pb_ld_binding *pb_ipv6 = iter->data; + const struct sbrec_port_binding *pb = pb_ipv6->pb; + int j; + + if (!pb_ipv6->ld) { continue; } - for (size_t i = 0; i < ld->n_peer_ports; i++) { - const struct sbrec_port_binding *pb = ld->peer_ports[i].local; - int j; + const char *peer_s = smap_get(&pb->options, "peer"); + if (!peer_s) { + continue; + } - if (!smap_get_bool(&pb->options, "ipv6_prefix_delegation", - false)) { - continue; - } + const struct sbrec_port_binding *peer + = lport_lookup_by_name(sbrec_port_binding_by_name, peer_s); + if (!peer) { + continue; + } - const char *peer_s = smap_get(&pb->options, "peer"); - if (!peer_s) { - continue; - } + char *redirect_name = xasprintf("cr-%s", pb->logical_port); + bool resident = lport_is_chassis_resident( + sbrec_port_binding_by_name, chassis, active_tunnels, + redirect_name); + free(redirect_name); + if (!resident && strcmp(pb->type, "l3gateway")) { + continue; + } - const struct sbrec_port_binding *peer - = lport_lookup_by_name(sbrec_port_binding_by_name, peer_s); - if (!peer) { - continue; - } + struct in6_addr ip6_addr; + struct eth_addr ea = eth_addr_zero; + for (j = 0; j < pb->n_mac; j++) { + struct lport_addresses laddrs; - char *redirect_name = xasprintf("cr-%s", pb->logical_port); - bool resident = lport_is_chassis_resident( - sbrec_port_binding_by_name, chassis, active_tunnels, - redirect_name); - free(redirect_name); - if (!resident && strcmp(pb->type, "l3gateway")) { + if (!extract_lsp_addresses(pb->mac[j], &laddrs)) { continue; } - struct in6_addr ip6_addr; - struct eth_addr ea = eth_addr_zero; - for (j = 0; j < pb->n_mac; j++) { - struct lport_addresses laddrs; - - if (!extract_lsp_addresses(pb->mac[j], &laddrs)) { - continue; - } - - ea = laddrs.ea; - if (laddrs.n_ipv6_addrs > 0) { - ip6_addr = laddrs.ipv6_addrs[0].addr; - destroy_lport_addresses(&laddrs); - break; - } + ea = laddrs.ea; + if (laddrs.n_ipv6_addrs > 0) { + ip6_addr = laddrs.ipv6_addrs[0].addr; destroy_lport_addresses(&laddrs); + break; } + destroy_lport_addresses(&laddrs); + } - if (eth_addr_is_zero(ea)) { - continue; - } - - if (j == pb->n_mac) { - in6_generate_lla(ea, &ip6_addr); - } + if (eth_addr_is_zero(ea)) { + continue; + } - changed |= fill_ipv6_prefix_state(ovnsb_idl_txn, ld, - ea, ip6_addr, - peer->tunnel_key, - peer->datapath->tunnel_key); + if (j == pb->n_mac) { + in6_generate_lla(ea, &ip6_addr); } + + changed |= fill_ipv6_prefix_state(ovnsb_idl_txn, pb_ipv6->ld, + ea, ip6_addr, + peer->tunnel_key, + peer->datapath->tunnel_key); } - struct shash_node *iter, *next; + struct shash_node *next; SHASH_FOR_EACH_SAFE (iter, next, &ipv6_prefixd) { struct ipv6_prefixd_state *pfd = iter->data; if (pfd->last_used + IPV6_PREFIXD_STALE_TIMEOUT < time_msec()) { @@ -3411,7 +3404,8 @@ pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, const struct ovsrec_bridge *br_int, const struct sbrec_chassis *chassis, const struct hmap *local_datapaths, - const struct sset *active_tunnels) + const struct sset *active_tunnels, + const struct shash *local_active_ports_ipv6_pd) { ovs_mutex_lock(&pinctrl_mutex); pinctrl_set_br_int_name_(br_int->name); @@ -3426,7 +3420,8 @@ pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, local_datapaths, active_tunnels); prepare_ipv6_ras(local_datapaths); prepare_ipv6_prefixd(ovnsb_idl_txn, sbrec_port_binding_by_name, - local_datapaths, chassis, active_tunnels); + local_active_ports_ipv6_pd, chassis, + active_tunnels); sync_dns_cache(dns_table); controller_event_run(ovnsb_idl_txn, ce_table, chassis); ip_mcast_sync(ovnsb_idl_txn, chassis, local_datapaths, diff --git a/controller/pinctrl.h b/controller/pinctrl.h index cc0a51984..0b9a57bdd 100644 --- a/controller/pinctrl.h +++ b/controller/pinctrl.h @@ -23,6 +23,7 @@ #include "openvswitch/meta-flow.h" struct hmap; +struct shash; struct lport_index; struct ovsdb_idl_index; struct ovsdb_idl_txn; @@ -49,7 +50,8 @@ void pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, const struct sbrec_bfd_table *, const struct ovsrec_bridge *, const struct sbrec_chassis *, const struct hmap *local_datapaths, - const struct sset *active_tunnels); + const struct sset *active_tunnels, + const struct shash *local_active_ports_ipv6_pd); void pinctrl_wait(struct ovsdb_idl_txn *ovnsb_idl_txn); void pinctrl_destroy(void); void pinctrl_set_br_int_name(char *br_int_name); From patchwork Tue Jul 13 12:53:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Bianconi X-Patchwork-Id: 1504591 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=E4DEXhGC; dkim-atps=neutral Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4GPLDP1CSMz9sWd for ; Tue, 13 Jul 2021 22:53:56 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id D811040645; Tue, 13 Jul 2021 12:53:54 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 39z0rWFx6mXc; Tue, 13 Jul 2021 12:53:53 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id EC83D40629; Tue, 13 Jul 2021 12:53:51 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id C21BFC001A; Tue, 13 Jul 2021 12:53:51 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2517AC001D for ; Tue, 13 Jul 2021 12:53:49 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 2E07C4039F for ; Tue, 13 Jul 2021 12:53:48 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id lt4f4ENooL1A for ; Tue, 13 Jul 2021 12:53:46 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id C0B10405C8 for ; Tue, 13 Jul 2021 12:53:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1626180824; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=r0wJMCaHPzk/4avgxgQyC6mKCSGWRykt+GyKtO0moRs=; b=E4DEXhGCsqsuwRZ2OQcrDq2oSMSHptXhkr8DhPYtWjmbk651X8+E3VDxo8DGsocC6VJdz6 4XjGtl4siiIGh6DS+3SIWumAcH1+tqys8/XPu6qz2IwAD4ZeMVMBU0NeTYBbjvz5BZtEUw AgsK+is0hhMUTYyddITJDsc204uTu9s= Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-165-cDKB8uuFPD2nRJEpf0fTJw-1; Tue, 13 Jul 2021 08:53:42 -0400 X-MC-Unique: cDKB8uuFPD2nRJEpf0fTJw-1 Received: by mail-ej1-f72.google.com with SMTP id ia10-20020a170907a06ab02904baf8000951so6566294ejc.10 for ; Tue, 13 Jul 2021 05:53:42 -0700 (PDT) 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=r0wJMCaHPzk/4avgxgQyC6mKCSGWRykt+GyKtO0moRs=; b=XqnfgWqiBOHHyKiFx5Jnkek47/XgYDIf2V3Dn0ISFPuw3C18nrcio66VoK491Rt3co K/8r4XG/7x2sRb28tMYRYMrCpQoFgfzLgEzq8BHnOhKwKShfh7Wnc7+4qHejTFVjjiv5 IzZ2MxRj+91UClxtwEW2zr0vUFddUbgHXQNeyLjl/4MSvokvHHQGIyu66twk7US/wvhh Ke7LpqEcSmpp2R3cQteNhIX2/z+vfhfdf1iwahjQXdDwAqVTDlnRTyTIrCZe+AVFJbD+ +wlR9VrNaBZnrX2TV/pnjmlu49ktxPZE621WbRuOrdq2MLLh+3fB2PYsD4xZPUB/1Eka H+Tg== X-Gm-Message-State: AOAM530kOK3cIXjfkTSUAoFuArCBk85PNPKfI3ebscXkCUODpwMhjrwZ 37HVs4KPs+Ky7UhNK5qp7nrTM6VL/aC5H1AszGqEe10WSekewoRu9My41RdDWU1Z6FwwtUQkZRX 1FpSikO88SL4CC29cgSFJpa2sNSYgUrzNxxZdzo1h0PNSpvxll9BnCdtpXHeRWv4ZhiK0qQUCco M= X-Received: by 2002:a50:9fc4:: with SMTP id c62mr5535192edf.346.1626180821102; Tue, 13 Jul 2021 05:53:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxy2SSlU/lZeRYrU4MeaQosEFWxJDapZCAINuGl2FqMzKjXxH6rFzTePVWgaJF4lks6pY1ziw== X-Received: by 2002:a50:9fc4:: with SMTP id c62mr5535166edf.346.1626180820869; Tue, 13 Jul 2021 05:53:40 -0700 (PDT) Received: from localhost.localdomain (net-188-216-29-9.cust.vodafonedsl.it. [188.216.29.9]) by smtp.gmail.com with ESMTPSA id s16sm2774114eju.57.2021.07.13.05.53.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jul 2021 05:53:40 -0700 (PDT) From: Lorenzo Bianconi To: dev@openvswitch.org Date: Tue, 13 Jul 2021 14:53:20 +0200 Message-Id: <8cf35842e57473da7b7e51e231cdc52622dd9cb0.1626180720.git.lorenzo.bianconi@redhat.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: References: MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lorenzo.bianconi@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: dceara@redhat.com Subject: [ovs-dev] [PATCH v4 ovn 2/2] controller: incrementally create ras port_binding list 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" Incrementally manage local_active_ports_ras map for interfaces where periodic router advertisement has been enabled. This patch allows to avoid looping over all local interfaces to check if periodic RA is running on the current port binding. Acked-by: Mark Michelson Signed-off-by: Lorenzo Bianconi --- controller/binding.c | 7 +++ controller/binding.h | 1 + controller/ovn-controller.c | 10 +++- controller/pinctrl.c | 93 ++++++++++++++++++++----------------- controller/pinctrl.h | 3 +- 5 files changed, 69 insertions(+), 45 deletions(-) diff --git a/controller/binding.c b/controller/binding.c index 1ce337cdf..70bf13390 100644 --- a/controller/binding.c +++ b/controller/binding.c @@ -1674,6 +1674,9 @@ binding_run(struct binding_ctx_in *b_ctx_in, struct binding_ctx_out *b_ctx_out) update_active_pb_ras_pd(pb, b_ctx_out->local_datapaths, b_ctx_out->local_active_ports_ipv6_pd, "ipv6_prefix_delegation"); + update_active_pb_ras_pd(pb, b_ctx_out->local_datapaths, + b_ctx_out->local_active_ports_ras, + "ipv6_ra_send_periodic"); enum en_lport_type lport_type = get_lport_type(pb); @@ -2516,6 +2519,10 @@ delete_done: b_ctx_out->local_active_ports_ipv6_pd, "ipv6_prefix_delegation"); + update_active_pb_ras_pd(pb, b_ctx_out->local_datapaths, + b_ctx_out->local_active_ports_ras, + "ipv6_ra_send_periodic"); + enum en_lport_type lport_type = get_lport_type(pb); struct binding_lport *b_lport = diff --git a/controller/binding.h b/controller/binding.h index 60ad49da0..77197e742 100644 --- a/controller/binding.h +++ b/controller/binding.h @@ -73,6 +73,7 @@ void related_lports_destroy(struct related_lports *); struct binding_ctx_out { struct hmap *local_datapaths; struct shash *local_active_ports_ipv6_pd; + struct shash *local_active_ports_ras; struct local_binding_data *lbinding_data; /* sset of (potential) local lports. */ diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c index c8bc9a56d..684e9cdd4 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -1047,6 +1047,7 @@ struct ed_type_runtime_data { struct hmap tracked_dp_bindings; struct shash local_active_ports_ipv6_pd; + struct shash local_active_ports_ras; }; /* struct ed_type_runtime_data has the below members for tracking the @@ -1135,6 +1136,7 @@ en_runtime_data_init(struct engine_node *node OVS_UNUSED, smap_init(&data->local_iface_ids); local_binding_data_init(&data->lbinding_data); shash_init(&data->local_active_ports_ipv6_pd); + shash_init(&data->local_active_ports_ras); /* Init the tracked data. */ hmap_init(&data->tracked_dp_bindings); @@ -1161,6 +1163,7 @@ en_runtime_data_cleanup(void *data) } hmap_destroy(&rt_data->local_datapaths); shash_destroy_free_data(&rt_data->local_active_ports_ipv6_pd); + shash_destroy_free_data(&rt_data->local_active_ports_ras); local_binding_data_destroy(&rt_data->lbinding_data); } @@ -1241,6 +1244,8 @@ init_binding_ctx(struct engine_node *node, b_ctx_out->local_datapaths = &rt_data->local_datapaths; b_ctx_out->local_active_ports_ipv6_pd = &rt_data->local_active_ports_ipv6_pd; + b_ctx_out->local_active_ports_ras = + &rt_data->local_active_ports_ras; b_ctx_out->local_lports = &rt_data->local_lports; b_ctx_out->local_lports_changed = false; b_ctx_out->related_lports = &rt_data->related_lports; @@ -1259,6 +1264,7 @@ en_runtime_data_run(struct engine_node *node, void *data) struct ed_type_runtime_data *rt_data = data; struct hmap *local_datapaths = &rt_data->local_datapaths; struct shash *local_active_ipv6_pd = &rt_data->local_active_ports_ipv6_pd; + struct shash *local_active_ras = &rt_data->local_active_ports_ras; struct sset *local_lports = &rt_data->local_lports; struct sset *active_tunnels = &rt_data->active_tunnels; @@ -1275,6 +1281,7 @@ en_runtime_data_run(struct engine_node *node, void *data) } hmap_clear(local_datapaths); shash_clear_free_data(local_active_ipv6_pd); + shash_clear_free_data(local_active_ras); local_binding_data_destroy(&rt_data->lbinding_data); sset_destroy(local_lports); related_lports_destroy(&rt_data->related_lports); @@ -3291,7 +3298,8 @@ main(int argc, char *argv[]) br_int, chassis, &runtime_data->local_datapaths, &runtime_data->active_tunnels, - &runtime_data->local_active_ports_ipv6_pd); + &runtime_data->local_active_ports_ipv6_pd, + &runtime_data->local_active_ports_ras); /* Updating monitor conditions if runtime data or * logical datapath goups changed. */ if (engine_node_changed(&en_runtime_data) diff --git a/controller/pinctrl.c b/controller/pinctrl.c index 5f3eca4a0..8e4c4d18c 100644 --- a/controller/pinctrl.c +++ b/controller/pinctrl.c @@ -243,7 +243,9 @@ static void wait_controller_event(struct ovsdb_idl_txn *ovnsb_idl_txn); static void init_ipv6_ras(void); static void destroy_ipv6_ras(void); static void ipv6_ra_wait(long long int send_ipv6_ra_time); -static void prepare_ipv6_ras(const struct hmap *local_datapaths) +static void prepare_ipv6_ras( + const struct shash *local_active_ports_ras, + struct ovsdb_idl_index *sbrec_port_binding_by_name) OVS_REQUIRES(pinctrl_mutex); static void send_ipv6_ras(struct rconn *swconn, long long int *send_ipv6_ra_time) @@ -3405,7 +3407,8 @@ pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, const struct sbrec_chassis *chassis, const struct hmap *local_datapaths, const struct sset *active_tunnels, - const struct shash *local_active_ports_ipv6_pd) + const struct shash *local_active_ports_ipv6_pd, + const struct shash *local_active_ports_ras) { ovs_mutex_lock(&pinctrl_mutex); pinctrl_set_br_int_name_(br_int->name); @@ -3418,7 +3421,7 @@ pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, sbrec_port_binding_by_name, sbrec_mac_binding_by_lport_ip, br_int, chassis, local_datapaths, active_tunnels); - prepare_ipv6_ras(local_datapaths); + prepare_ipv6_ras(local_active_ports_ras, sbrec_port_binding_by_name); prepare_ipv6_prefixd(ovnsb_idl_txn, sbrec_port_binding_by_name, local_active_ports_ipv6_pd, chassis, active_tunnels); @@ -3875,7 +3878,8 @@ send_ipv6_ras(struct rconn *swconn, long long int *send_ipv6_ra_time) /* Called by pinctrl_run(). Runs with in the main ovn-controller * thread context. */ static void -prepare_ipv6_ras(const struct hmap *local_datapaths) +prepare_ipv6_ras(const struct shash *local_active_ports_ras, + struct ovsdb_idl_index *sbrec_port_binding_by_name) OVS_REQUIRES(pinctrl_mutex) { struct shash_node *iter, *iter_next; @@ -3886,52 +3890,55 @@ prepare_ipv6_ras(const struct hmap *local_datapaths) } bool changed = false; - const struct local_datapath *ld; - HMAP_FOR_EACH (ld, hmap_node, local_datapaths) { + SHASH_FOR_EACH (iter, local_active_ports_ras) { + const struct pb_ld_binding *ras = iter->data; + const struct sbrec_port_binding *pb = ras->pb; - for (size_t i = 0; i < ld->n_peer_ports; i++) { - const struct sbrec_port_binding *peer = ld->peer_ports[i].remote; - const struct sbrec_port_binding *pb = ld->peer_ports[i].local; + const char *peer_s = smap_get(&pb->options, "peer"); + if (!peer_s) { + continue; + } - if (!smap_get_bool(&pb->options, "ipv6_ra_send_periodic", false)) { - continue; - } + const struct sbrec_port_binding *peer + = lport_lookup_by_name(sbrec_port_binding_by_name, peer_s); + if (!peer) { + continue; + } - struct ipv6_ra_config *config = ipv6_ra_update_config(pb); - if (!config) { - continue; - } + struct ipv6_ra_config *config = ipv6_ra_update_config(pb); + if (!config) { + continue; + } - struct ipv6_ra_state *ra - = shash_find_data(&ipv6_ras, pb->logical_port); - if (!ra) { - ra = xzalloc(sizeof *ra); - ra->config = config; + struct ipv6_ra_state *ra + = shash_find_data(&ipv6_ras, pb->logical_port); + if (!ra) { + ra = xzalloc(sizeof *ra); + ra->config = config; + ra->next_announce = ipv6_ra_calc_next_announce( + ra->config->min_interval, + ra->config->max_interval); + shash_add(&ipv6_ras, pb->logical_port, ra); + changed = true; + } else { + if (config->min_interval != ra->config->min_interval || + config->max_interval != ra->config->max_interval) ra->next_announce = ipv6_ra_calc_next_announce( - ra->config->min_interval, - ra->config->max_interval); - shash_add(&ipv6_ras, pb->logical_port, ra); - changed = true; - } else { - if (config->min_interval != ra->config->min_interval || - config->max_interval != ra->config->max_interval) - ra->next_announce = ipv6_ra_calc_next_announce( - config->min_interval, - config->max_interval); - ipv6_ra_config_delete(ra->config); - ra->config = config; - } + config->min_interval, + config->max_interval); + ipv6_ra_config_delete(ra->config); + ra->config = config; + } - /* Peer is the logical switch port that the logical - * router port is connected to. The RA is injected - * into that logical switch port. - */ - ra->port_key = peer->tunnel_key; - ra->metadata = peer->datapath->tunnel_key; - ra->delete_me = false; + /* Peer is the logical switch port that the logical + * router port is connected to. The RA is injected + * into that logical switch port. + */ + ra->port_key = peer->tunnel_key; + ra->metadata = peer->datapath->tunnel_key; + ra->delete_me = false; - /* pinctrl_handler thread will send the IPv6 RAs. */ - } + /* pinctrl_handler thread will send the IPv6 RAs. */ } /* Remove those that are no longer in the SB database */ diff --git a/controller/pinctrl.h b/controller/pinctrl.h index 0b9a57bdd..88f18e983 100644 --- a/controller/pinctrl.h +++ b/controller/pinctrl.h @@ -51,7 +51,8 @@ void pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, const struct ovsrec_bridge *, const struct sbrec_chassis *, const struct hmap *local_datapaths, const struct sset *active_tunnels, - const struct shash *local_active_ports_ipv6_pd); + const struct shash *local_active_ports_ipv6_pd, + const struct shash *local_active_ports_ras); void pinctrl_wait(struct ovsdb_idl_txn *ovnsb_idl_txn); void pinctrl_destroy(void); void pinctrl_set_br_int_name(char *br_int_name);