From patchwork Thu Jun 16 22:31:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Bianconi X-Patchwork-Id: 1644619 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.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=gRSLkDOm; dkim-atps=neutral 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=) 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 (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LPH3Q2h0Qz9sFk for ; Fri, 17 Jun 2022 08:32:00 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 657158430D; Thu, 16 Jun 2022 22:31:56 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 657158430D Authentication-Results: smtp1.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=gRSLkDOm 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 cmsxI3IeTHq4; Thu, 16 Jun 2022 22:31:55 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp1.osuosl.org (Postfix) with ESMTPS id 4268D83DFD; Thu, 16 Jun 2022 22:31:54 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 4268D83DFD Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 03FC5C0039; Thu, 16 Jun 2022 22:31:54 +0000 (UTC) X-Original-To: ovs-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 356E6C002D for ; Thu, 16 Jun 2022 22:31:52 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id EF5C9409A6 for ; Thu, 16 Jun 2022 22:31:51 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org EF5C9409A6 Authentication-Results: smtp4.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=gRSLkDOm 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 4d4t0WzF6yIW for ; Thu, 16 Jun 2022 22:31:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 323A740340 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id 323A740340 for ; Thu, 16 Jun 2022 22:31:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655418708; 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; bh=y0aAQuYohDTNQZ/f4Iv5Bk/lAvz/ZEVhSMSaDRILfS8=; b=gRSLkDOm3dS1T7+irBZbCqEQU2mUE71i0QGhT9t8gaQGX4tCCQT9GzKmNh2wSBoDhxE5wQ jJiRuvpjCa21PmTPh+ZmRcbLT9qLCTdZ7n0eS3J5YMfMBC2ibxBu6lbITMF/niHQXCpw/j vmJ/qc9yC9lCRRPQen+N+qadusktkZ0= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-583-oheRQB45MBmcyiz-QmaWMA-1; Thu, 16 Jun 2022 18:31:47 -0400 X-MC-Unique: oheRQB45MBmcyiz-QmaWMA-1 Received: by mail-wm1-f70.google.com with SMTP id l3-20020a05600c1d0300b0039c7efa2526so1431097wms.3 for ; Thu, 16 Jun 2022 15:31:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=y0aAQuYohDTNQZ/f4Iv5Bk/lAvz/ZEVhSMSaDRILfS8=; b=W5x85VIVxsLzBcbzqKMem/0o+3tJNmw8pYYw20EHv1rgurI3zRgmrm5/YDZH61jGVo j7HaIkU1LjWFmM96YeohUeUP3KMMLHNFjzps/96mqth/i/ATZKH4/+w6FzljBzfEP/AG oxY102XIfEYubKnb5IlOz+324nem2iwMhuh4QICbSSXDbWoHOZNtDYuODznbMVuWLvb5 ZCRglTDYhinUlm7PH5o5FBNdnDEEnSGpi1OTTjABeIlfnmxU30UQcA6TVCsFL2ErG4uU H8vz2lBB40DKmF1qUz9eb4OcbqjcSAGFXakhf3Ysg5ahVy5uFxcyb4I2r9O1aisJLMfx RTAQ== X-Gm-Message-State: AJIora87Erql7obdA4SDc42VYBz4gLxE0HkbqMgIFCwmyz551/twMvmB kYVXlYu56S53biGRq/EmlmgDyKMJ7JjKahCDPB98gAloG3qSB3cKRWY1HOHoioKlRZaWfDZE3VB s2U8q0tAji/fxrpMCoF+Z1LHjusf6Mb+uKlkC2IXQFinPMzI6U9g2kXq0t9ki7aBm0bjCExS/hz 5Eu5mQ X-Received: by 2002:a05:6000:16c2:b0:213:bb0e:383b with SMTP id h2-20020a05600016c200b00213bb0e383bmr6385767wrf.276.1655418706466; Thu, 16 Jun 2022 15:31:46 -0700 (PDT) X-Google-Smtp-Source: AGRyM1v2dl2SuiGl3yPadwlrZUm5Jd089Y3+IDm05ZvlBphIbANtFV/cAIDWgQ9A6lC7J91Mxd5fuA== X-Received: by 2002:a05:6000:16c2:b0:213:bb0e:383b with SMTP id h2-20020a05600016c200b00213bb0e383bmr6385754wrf.276.1655418706099; Thu, 16 Jun 2022 15:31:46 -0700 (PDT) Received: from lore-desk.redhat.com (net-93-71-56-156.cust.vodafonedsl.it. [93.71.56.156]) by smtp.gmail.com with ESMTPSA id h20-20020a05600c351400b00397342bcfb7sm3892339wmq.46.2022.06.16.15.31.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Jun 2022 15:31:45 -0700 (PDT) From: Lorenzo Bianconi To: ovs-dev@openvswitch.org Date: Fri, 17 Jun 2022 00:31:39 +0200 Message-Id: <27d1debf2f781d67e600e49b9c4eb9f6b3c04291.1655418594.git.lorenzo.bianconi@redhat.com> X-Mailer: git-send-email 2.36.1 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 Subject: [ovs-dev] [RFC ovn] controller: send GARPs for LSPs in vlan-backed network scenario 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 using VLAN backed networks and OVN routers leveraging the 'ovn-chassis-mac-mappings' option, the eth.src field is replaced by the chassis mac address in order to not expose the router mac address from different nodes and confuse the TOR switch. However doing so the TOR switch is not able to learn the port/mac bindings for routed E/W traffic and it is force to always flood it. Fix this issue adding the capability to send GARP traffic for logical switch ports if the corresponding logical switch has the ovn-lsp-garp parameter set to true in the option column. More into about the issue can be found here [0]. [0] https://mail.openvswitch.org/pipermail/ovs-discuss/2020-September/050678.html Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2087779 Signed-off-by: Lorenzo Bianconi --- controller/pinctrl.c | 85 +++++++++++++++++++++++++++++--------------- northd/northd.c | 29 +++++++++++++++ 2 files changed, 85 insertions(+), 29 deletions(-) diff --git a/controller/pinctrl.c b/controller/pinctrl.c index 9a1a0faa1..eb5739bfc 100644 --- a/controller/pinctrl.c +++ b/controller/pinctrl.c @@ -4533,7 +4533,8 @@ send_garp_rarp(struct rconn *swconn, struct garp_rarp_data *garp_rarp, garp_rarp->backoff *= 2; garp_rarp->announce_time = current_time + garp_rarp->backoff * 1000; } else { - garp_rarp->announce_time = LLONG_MAX; + /* Default timeout is 180s. */ + garp_rarp->announce_time = current_time + 180 * 1000; } return garp_rarp->announce_time; } @@ -5510,14 +5511,15 @@ ip_mcast_querier_wait(long long int query_time) /* Get localnet vifs, local l3gw ports and ofport for localnet patch ports. */ static void -get_localnet_vifs_l3gwports( +get_local_vifs_l3gwports( struct ovsdb_idl_index *sbrec_port_binding_by_datapath, struct ovsdb_idl_index *sbrec_port_binding_by_name, const struct ovsrec_bridge *br_int, const struct sbrec_chassis *chassis, const struct hmap *local_datapaths, struct sset *localnet_vifs, - struct sset *local_l3gw_ports) + struct sset *local_l3gw_ports, + struct sset *local_vifs) { for (int i = 0; i < br_int->n_ports; i++) { const struct ovsrec_port *port_rec = br_int->ports[i]; @@ -5574,7 +5576,8 @@ get_localnet_vifs_l3gwports( /* Get l3gw ports. Consider port bindings with type "l3gateway" * that connect to gateway routers (if local), and consider port * bindings of type "patch" since they might connect to - * distributed gateway ports with NAT addresses. */ + * distributed gateway ports with NAT addresses. + * Get LSP ports if requested by CMS. */ sbrec_port_binding_index_set_datapath(target, ld->datapath); SBREC_PORT_BINDING_FOR_EACH_EQUAL (pb, target, @@ -5583,6 +5586,11 @@ get_localnet_vifs_l3gwports( || !strcmp(pb->type, "patch")) { sset_add(local_l3gw_ports, pb->logical_port); } + /* GARP packets for lsp ports. */ + if (pb->chassis == chassis && + smap_get_bool(&pb->options, "ovn-lsp-garp", false)) { + sset_add(local_vifs, pb->logical_port); + } } } sbrec_port_binding_index_destroy_row(target); @@ -5761,6 +5769,26 @@ send_garp_rarp_run(struct rconn *swconn, long long int *send_garp_rarp_time) } } +static void +send_garp_rarp_update_for_pb_set( + struct ovsdb_idl_txn *ovnsb_idl_txn, + struct ovsdb_idl_index *sbrec_mac_binding_by_lport_ip, + struct ovsdb_idl_index *sbrec_port_binding_by_name, + struct sset *vif_set, const struct hmap *local_datapaths, + struct shash *nat_addresses) +{ + const char *iface_id; + SSET_FOR_EACH (iface_id, vif_set) { + const struct sbrec_port_binding *pb = lport_lookup_by_name( + sbrec_port_binding_by_name, iface_id); + if (pb) { + send_garp_rarp_update(ovnsb_idl_txn, + sbrec_mac_binding_by_lport_ip, + local_datapaths, pb, nat_addresses); + } + } +} + /* Called by pinctrl_run(). Runs with in the main ovn-controller * thread context. */ static void @@ -5776,15 +5804,17 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn, { struct sset localnet_vifs = SSET_INITIALIZER(&localnet_vifs); struct sset local_l3gw_ports = SSET_INITIALIZER(&local_l3gw_ports); + struct sset local_vifs = SSET_INITIALIZER(&local_vifs); struct sset nat_ip_keys = SSET_INITIALIZER(&nat_ip_keys); struct shash nat_addresses; shash_init(&nat_addresses); - get_localnet_vifs_l3gwports(sbrec_port_binding_by_datapath, - sbrec_port_binding_by_name, - br_int, chassis, local_datapaths, - &localnet_vifs, &local_l3gw_ports); + get_local_vifs_l3gwports(sbrec_port_binding_by_datapath, + sbrec_port_binding_by_name, + br_int, chassis, local_datapaths, + &localnet_vifs, &local_l3gw_ports, + &local_vifs); get_nat_addresses_and_keys(sbrec_port_binding_by_name, &nat_ip_keys, &local_l3gw_ports, @@ -5795,36 +5825,33 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn, struct shash_node *iter; SHASH_FOR_EACH_SAFE (iter, &send_garp_rarp_data) { if (!sset_contains(&localnet_vifs, iter->name) && - !sset_contains(&nat_ip_keys, iter->name)) { + !sset_contains(&nat_ip_keys, iter->name) && + !sset_contains(&local_vifs, iter->name)) { send_garp_rarp_delete(iter->name); } } /* Update send_garp_rarp_data. */ - const char *iface_id; - SSET_FOR_EACH (iface_id, &localnet_vifs) { - const struct sbrec_port_binding *pb = lport_lookup_by_name( - sbrec_port_binding_by_name, iface_id); - if (pb) { - send_garp_rarp_update(ovnsb_idl_txn, - sbrec_mac_binding_by_lport_ip, - local_datapaths, pb, &nat_addresses); - } - } - + send_garp_rarp_update_for_pb_set(ovnsb_idl_txn, + sbrec_mac_binding_by_lport_ip, + sbrec_port_binding_by_name, + &localnet_vifs, local_datapaths, + &nat_addresses); + send_garp_rarp_update_for_pb_set(ovnsb_idl_txn, + sbrec_mac_binding_by_lport_ip, + sbrec_port_binding_by_name, + &local_vifs, local_datapaths, + &nat_addresses); /* Update send_garp_rarp_data for nat-addresses. */ - const char *gw_port; - SSET_FOR_EACH (gw_port, &local_l3gw_ports) { - const struct sbrec_port_binding *pb - = lport_lookup_by_name(sbrec_port_binding_by_name, gw_port); - if (pb) { - send_garp_rarp_update(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip, - local_datapaths, pb, &nat_addresses); - } - } + send_garp_rarp_update_for_pb_set(ovnsb_idl_txn, + sbrec_mac_binding_by_lport_ip, + sbrec_port_binding_by_name, + &local_l3gw_ports, local_datapaths, + &nat_addresses); /* pinctrl_handler thread will send the GARPs. */ + sset_destroy(&local_vifs); sset_destroy(&localnet_vifs); sset_destroy(&local_l3gw_ports); diff --git a/northd/northd.c b/northd/northd.c index 0d6ebccde..9a4a880a7 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -6446,6 +6446,34 @@ ovn_update_ipv6_options(struct hmap *ports) } } +static void +ovn_update_lsp_garp_options(struct hmap *ports) +{ + struct ovn_port *op; + HMAP_FOR_EACH (op, key_node, ports) { + if (!op->nbsp) { + continue; + } + if (op->nbsp->type[0] || op->nbsp->parent_name) { + continue; + } + + struct ovn_datapath *od = op->od; + if (!od || !od->nbs) { + continue; + } + + struct smap options; + smap_clone(&options, &op->sb->options); + + bool ovn_lsp_garp = smap_get_bool(&od->nbs->other_config, + "ovn-lsp-garp", false); + smap_add(&options, "ovn-lsp-garp", ovn_lsp_garp ? "true" : "false"); + sbrec_port_binding_set_options(op->sb, &options); + smap_destroy(&options); + } +} + static void build_port_group_lswitches(struct northd_input *input_data, struct hmap *pgs, @@ -15381,6 +15409,7 @@ ovnnb_db_run(struct northd_input *input_data, stopwatch_start(CLEAR_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); ovn_update_ipv6_options(&data->ports); ovn_update_ipv6_prefix(&data->ports); + ovn_update_lsp_garp_options(&data->ports); sync_lbs(input_data, ovnsb_txn, &data->datapaths, &data->lbs); sync_address_sets(input_data, ovnsb_txn, &data->datapaths);