From patchwork Tue Dec 3 11:08:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ales Musil X-Patchwork-Id: 2017703 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.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=FN+1sM7X; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.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 4Y2dFn5hpMz1yQZ for ; Tue, 3 Dec 2024 22:09:17 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 6817440976; Tue, 3 Dec 2024 11:09:15 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id Zcnme4twi4i0; Tue, 3 Dec 2024 11:09:10 +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 CB7AB40A44 Authentication-Results: smtp2.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=FN+1sM7X Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id CB7AB40A44; Tue, 3 Dec 2024 11:09:09 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 56118C08AA; Tue, 3 Dec 2024 11:09:09 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 68A52C087D for ; Tue, 3 Dec 2024 11:09:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 4F8BF40A18 for ; Tue, 3 Dec 2024 11:09:06 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id FsuBVMSJm5oE for ; Tue, 3 Dec 2024 11:09:03 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=170.10.129.124; helo=us-smtp-delivery-124.mimecast.com; envelope-from=amusil@redhat.com; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp2.osuosl.org 83509409B5 Authentication-Results: smtp2.osuosl.org; dmarc=pass (p=none dis=none) header.from=redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 83509409B5 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp2.osuosl.org (Postfix) with ESMTPS id 83509409B5 for ; Tue, 3 Dec 2024 11:09:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1733224142; 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=Km94y+Na/9eyRGGYNadUCIX39jXZLme9lvcbt7yOZvw=; b=FN+1sM7XiI+HEWx+DFCcL54GHxFiSTrO5NFmFq3QHXtTmLM5GdqmReMp+t1bEgRmXAg/6N 5BU+9ExJvvzSimOAW9MBhhsW/1Rr9fUPNJlXgtwKqz79EPxroX6OK8J2XhAE2JOA4YF4Su LGVaWVItgITxvuUR0dWju/6YnpoBznQ= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-187-Yav_pqEeO4CTtsM6AMKXgA-1; Tue, 03 Dec 2024 06:09:00 -0500 X-MC-Unique: Yav_pqEeO4CTtsM6AMKXgA-1 X-Mimecast-MFC-AGG-ID: Yav_pqEeO4CTtsM6AMKXgA Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (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 mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 9F3821955F3E for ; Tue, 3 Dec 2024 11:08:57 +0000 (UTC) Received: from amusil.brq.redhat.com (unknown [10.43.17.32]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 85B861956054; Tue, 3 Dec 2024 11:08:56 +0000 (UTC) From: Ales Musil To: dev@openvswitch.org Date: Tue, 3 Dec 2024 12:08:43 +0100 Message-ID: <20241203110853.201377-2-amusil@redhat.com> In-Reply-To: <20241203110853.201377-1-amusil@redhat.com> References: <20241203110853.201377-1-amusil@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: WORRvHFPCn0RdHfmJ6KaMcLlByB2O7dDHIf35xQf9Vg_1733224137 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [PATCH ovn 1/6] physical: Use struct physical_ctx instead of passing args one by one. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" A lot of the arguments fo certain functions were getting out of hand, pass struct physical_ctx instead of fields from that struct. This has the added benefit of having available anything that is in struct physical_ctx without adding additional arguments. Signed-off-by: Ales Musil Acked-by: Lorenzo Bianconi --- controller/physical.c | 242 +++++++++++++++--------------------------- 1 file changed, 87 insertions(+), 155 deletions(-) diff --git a/controller/physical.c b/controller/physical.c index 3ca4e0783..b3da527ae 100644 --- a/controller/physical.c +++ b/controller/physical.c @@ -332,8 +332,7 @@ find_additional_encap_for_chassis(const struct sbrec_port_binding *pb, static struct ovs_list * get_remote_tunnels(const struct sbrec_port_binding *binding, - const struct sbrec_chassis *chassis, - const struct hmap *chassis_tunnels, + const struct physical_ctx *ctx, const char *local_encap_ip) { const struct chassis_tunnel *tun; @@ -341,9 +340,9 @@ get_remote_tunnels(const struct sbrec_port_binding *binding, struct ovs_list *tunnels = xmalloc(sizeof *tunnels); ovs_list_init(tunnels); - if (binding->chassis && binding->chassis != chassis) { + if (binding->chassis && binding->chassis != ctx->chassis) { tun = get_port_binding_tun(binding->encap, binding->chassis, - chassis_tunnels, local_encap_ip); + ctx->chassis_tunnels, local_encap_ip); if (!tun) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1); VLOG_WARN_RL( @@ -358,14 +357,15 @@ get_remote_tunnels(const struct sbrec_port_binding *binding, } for (size_t i = 0; i < binding->n_additional_chassis; i++) { - if (binding->additional_chassis[i] == chassis) { + if (binding->additional_chassis[i] == ctx->chassis) { continue; } const struct sbrec_encap *additional_encap; - additional_encap = find_additional_encap_for_chassis(binding, chassis); + additional_encap = find_additional_encap_for_chassis(binding, + ctx->chassis); tun = get_port_binding_tun(additional_encap, binding->additional_chassis[i], - chassis_tunnels, local_encap_ip); + ctx->chassis_tunnels, local_encap_ip); if (!tun) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1); VLOG_WARN_RL( @@ -383,25 +383,20 @@ get_remote_tunnels(const struct sbrec_port_binding *binding, static void put_remote_port_redirect_overlay(const struct sbrec_port_binding *binding, - enum mf_field_id mff_ovn_geneve, + const struct physical_ctx *ctx, uint32_t port_key, struct match *match, struct ofpbuf *ofpacts_p, - const struct sbrec_chassis *chassis, - const struct hmap *chassis_tunnels, - size_t n_encap_ips, - const char **encap_ips, struct ovn_desired_flow_table *flow_table) { /* Setup encapsulation */ - for (size_t i = 0; i < n_encap_ips; i++) { + for (size_t i = 0; i < ctx->n_encap_ips; i++) { + const char *encap_ip = ctx->encap_ips[i]; struct ofpbuf *ofpacts_clone = ofpbuf_clone(ofpacts_p); match_set_reg_masked(match, MFF_LOG_ENCAP_ID - MFF_REG0, i << 16, (uint32_t) 0xFFFF << 16); - struct ovs_list *tuns = get_remote_tunnels(binding, chassis, - chassis_tunnels, - encap_ips[i]); + struct ovs_list *tuns = get_remote_tunnels(binding, ctx, encap_ip); if (!ovs_list_is_empty(tuns)) { bool is_vtep_port = !strcmp(binding->type, "vtep"); /* rewrite MFF_IN_PORT to bypass OpenFlow loopback check for ARP/ND @@ -413,7 +408,7 @@ put_remote_port_redirect_overlay(const struct sbrec_port_binding *binding, struct tunnel *tun; LIST_FOR_EACH (tun, list_node, tuns) { - put_encapsulation(mff_ovn_geneve, tun->tun, + put_encapsulation(ctx->mff_ovn_geneve, tun->tun, binding->datapath, port_key, is_vtep_port, ofpacts_clone); ofpact_put_OUTPUT(ofpacts_clone)->port = tun->tun->ofport; @@ -763,18 +758,14 @@ ofpact_put_push_vlan(struct ofpbuf *ofpacts, const struct smap *options, int tag } static void -put_replace_router_port_mac_flows(struct ovsdb_idl_index - *sbrec_port_binding_by_name, +put_replace_router_port_mac_flows(const struct physical_ctx *ctx, const struct sbrec_port_binding *localnet_port, - const struct sbrec_chassis *chassis, - const struct sset *active_tunnels, - const struct hmap *local_datapaths, struct ofpbuf *ofpacts_p, ofp_port_t ofport, struct ovn_desired_flow_table *flow_table) { - struct local_datapath *ld = get_local_datapath(local_datapaths, + struct local_datapath *ld = get_local_datapath(ctx->local_datapaths, localnet_port->datapath-> tunnel_key); ovs_assert(ld); @@ -794,7 +785,7 @@ put_replace_router_port_mac_flows(struct ovsdb_idl_index } /* Get chassis mac */ - if (!chassis_get_mac(chassis, network, &chassis_mac)) { + if (!chassis_get_mac(ctx->chassis, network, &chassis_mac)) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); /* Keeping the log level low for backward compatibility. * Chassis mac is a new configuration. @@ -810,8 +801,8 @@ put_replace_router_port_mac_flows(struct ovsdb_idl_index struct match match; struct ofpact_mac *replace_mac; char *cr_peer_name = xasprintf("cr-%s", rport_binding->logical_port); - if (lport_is_chassis_resident(sbrec_port_binding_by_name, - chassis, active_tunnels, + if (lport_is_chassis_resident(ctx->sbrec_port_binding_by_name, + ctx->chassis, ctx->active_tunnels, cr_peer_name)) { /* If a router port's chassisredirect port is * resident on this chassis, then we need not do mac replace. */ @@ -1421,18 +1412,14 @@ static void enforce_tunneling_for_multichassis_ports( struct local_datapath *ld, const struct sbrec_port_binding *binding, - const struct sbrec_chassis *chassis, - const struct hmap *chassis_tunnels, - enum mf_field_id mff_ovn_geneve, - struct ovn_desired_flow_table *flow_table, - const struct if_status_mgr *if_mgr) + const struct physical_ctx *ctx, + struct ovn_desired_flow_table *flow_table) { if (shash_is_empty(&ld->multichassis_ports)) { return; } - struct ovs_list *tuns = get_remote_tunnels(binding, chassis, - chassis_tunnels, NULL); + struct ovs_list *tuns = get_remote_tunnels(binding, ctx, NULL); if (ovs_list_is_empty(tuns)) { free(tuns); return; @@ -1461,7 +1448,7 @@ enforce_tunneling_for_multichassis_ports( struct tunnel *tun; LIST_FOR_EACH (tun, list_node, tuns) { - put_encapsulation(mff_ovn_geneve, tun->tun, + put_encapsulation(ctx->mff_ovn_geneve, tun->tun, binding->datapath, port_key, is_vtep_port, &ofpacts); ofpact_put_OUTPUT(&ofpacts)->port = tun->tun->ofport; @@ -1471,7 +1458,7 @@ enforce_tunneling_for_multichassis_ports( &binding->header_.uuid); ofpbuf_uninit(&ofpacts); - handle_pkt_too_big(flow_table, tuns, binding, mcp, if_mgr); + handle_pkt_too_big(flow_table, tuns, binding, mcp, ctx->if_mgr); } struct tunnel *tun_elem; @@ -1482,28 +1469,15 @@ enforce_tunneling_for_multichassis_ports( } static void -consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, - enum mf_field_id mff_ovn_geneve, - const struct shash *ct_zones, - const struct sset *active_tunnels, - const struct hmap *local_datapaths, - const struct shash *local_bindings, - const struct simap *patch_ofports, - const struct hmap *chassis_tunnels, +consider_port_binding(const struct physical_ctx *ctx, const struct sbrec_port_binding *binding, - const struct sbrec_chassis *chassis, - const struct physical_debug *debug, - const struct if_status_mgr *if_mgr, - size_t n_encap_ips, - const char **encap_ips, - bool always_tunnel, struct ovn_desired_flow_table *flow_table, struct ofpbuf *ofpacts_p) { uint32_t dp_key = binding->datapath->tunnel_key; uint32_t port_key = binding->tunnel_key; struct local_datapath *ld; - if (!(ld = get_local_datapath(local_datapaths, dp_key))) { + if (!(ld = get_local_datapath(ctx->local_datapaths, dp_key))) { return; } @@ -1517,7 +1491,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, match_set_metadata(&match, htonll(dp_key)); match_set_reg(&match, MFF_LOG_INPORT - MFF_REG0, port_key); - struct zone_ids icmp_zone_ids = get_zone_ids(binding, ct_zones); + struct zone_ids icmp_zone_ids = get_zone_ids(binding, ctx->ct_zones); ofpbuf_clear(ofpacts_p); put_zones_ofpacts(&icmp_zone_ids, ofpacts_p); put_resubmit(OFTABLE_LOG_INGRESS_PIPELINE, ofpacts_p); @@ -1530,17 +1504,17 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, struct match match; if (!strcmp(binding->type, "patch") || (!strcmp(binding->type, "l3gateway") - && binding->chassis == chassis)) { + && binding->chassis == ctx->chassis)) { const struct sbrec_port_binding *peer = get_binding_peer( - sbrec_port_binding_by_name, binding); + ctx->sbrec_port_binding_by_name, binding); if (!peer) { return; } - struct zone_ids binding_zones = get_zone_ids(binding, ct_zones); + struct zone_ids binding_zones = get_zone_ids(binding, ctx->ct_zones); put_local_common_flows(dp_key, binding, NULL, &binding_zones, - debug, ofpacts_p, flow_table); + &ctx->debug, ofpacts_p, flow_table); ofpbuf_clear(ofpacts_p); match_outport_dp_and_port_keys(&match, dp_key, port_key); @@ -1551,9 +1525,9 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, put_load(0, MFF_LOG_DNAT_ZONE, 0, 32, ofpacts_p); put_load(0, MFF_LOG_SNAT_ZONE, 0, 32, ofpacts_p); put_load(0, MFF_LOG_CT_ZONE, 0, 16, ofpacts_p); - struct zone_ids peer_zones = get_zone_ids(peer, ct_zones); - load_logical_ingress_metadata(peer, &peer_zones, n_encap_ips, - encap_ips, ofpacts_p, false); + struct zone_ids peer_zones = get_zone_ids(peer, ctx->ct_zones); + load_logical_ingress_metadata(peer, &peer_zones, ctx->n_encap_ips, + ctx->encap_ips, ofpacts_p, false); put_load(0, MFF_LOG_FLAGS, 0, 32, ofpacts_p); put_load(0, MFF_LOG_OUTPORT, 0, 32, ofpacts_p); for (int i = 0; i < MFF_N_LOG_REGS; i++) { @@ -1570,9 +1544,9 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, return; } if (!strcmp(binding->type, "chassisredirect") - && (binding->chassis == chassis - || ha_chassis_group_is_active(binding->ha_chassis_group, - active_tunnels, chassis))) { + && (binding->chassis == ctx->chassis || + ha_chassis_group_is_active(binding->ha_chassis_group, + ctx->active_tunnels, ctx->chassis))) { /* Table 40, priority 100. * ======================= @@ -1589,7 +1563,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, const char *distributed_port = smap_get_def(&binding->options, "distributed-port", ""); const struct sbrec_port_binding *distributed_binding - = lport_lookup_by_name(sbrec_port_binding_by_name, + = lport_lookup_by_name(ctx->sbrec_port_binding_by_name, distributed_port); if (!distributed_binding) { @@ -1613,7 +1587,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, MFF_LOG_OUTPORT, 0, 32, ofpacts_p); struct zone_ids zone_ids = get_zone_ids(distributed_binding, - ct_zones); + ctx->ct_zones); put_zones_ofpacts(&zone_ids, ofpacts_p); /* Clear the MFF_INPORT. Its possible that the same packet may @@ -1655,16 +1629,16 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, if (!binding->tag) { return; } - ofport = local_binding_get_lport_ofport(local_bindings, + ofport = local_binding_get_lport_ofport(ctx->local_bindings, binding->parent_port); if (ofport) { tag = *binding->tag; nested_container = true; parent_port = lport_lookup_by_name( - sbrec_port_binding_by_name, binding->parent_port); + ctx->sbrec_port_binding_by_name, binding->parent_port); if (parent_port - && (lport_can_bind_on_this_chassis(chassis, + && (lport_can_bind_on_this_chassis(ctx->chassis, parent_port) != CAN_BIND_AS_MAIN)) { /* Even though there is an ofport for this container * parent port, it is requested on different chassis ignore @@ -1676,15 +1650,15 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, } else if (!strcmp(binding->type, "localnet") || !strcmp(binding->type, "l2gateway")) { - ofport = u16_to_ofp(simap_get(patch_ofports, + ofport = u16_to_ofp(simap_get(ctx->patch_ofports, binding->logical_port)); if (ofport && binding->tag) { tag = *binding->tag; } } else { - ofport = local_binding_get_lport_ofport(local_bindings, + ofport = local_binding_get_lport_ofport(ctx->local_bindings, binding->logical_port); - if (ofport && !lport_can_bind_on_this_chassis(chassis, binding)) { + if (ofport && !lport_can_bind_on_this_chassis(ctx->chassis, binding)) { /* Even though there is an ofport for this port_binding, it is * requested on different chassis. So ignore this ofport. */ @@ -1693,7 +1667,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, } const struct sbrec_port_binding *localnet_port = - get_localnet_port(local_datapaths, dp_key); + get_localnet_port(ctx->local_datapaths, dp_key); struct ha_chassis_ordered *ha_ch_ordered; ha_ch_ordered = ha_chassis_get_ordered(binding->ha_chassis_group); @@ -1704,7 +1678,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, /* Enforce tunneling while we clone packets to additional chassis b/c * otherwise upstream switch won't flood the packet to both chassis. */ if (localnet_port && !binding->additional_chassis) { - ofport = u16_to_ofp(simap_get(patch_ofports, + ofport = u16_to_ofp(simap_get(ctx->patch_ofports, localnet_port->logical_port)); if (!ofport) { goto out; @@ -1727,11 +1701,11 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, * arrive from containers have a tag (vlan) associated with them. */ - struct zone_ids zone_ids = get_zone_ids(binding, ct_zones); + struct zone_ids zone_ids = get_zone_ids(binding, ctx->ct_zones); /* Pass the parent port binding if the port is a nested * container. */ put_local_common_flows(dp_key, binding, parent_port, &zone_ids, - debug, ofpacts_p, flow_table); + &ctx->debug, ofpacts_p, flow_table); /* Table 0, Priority 150 and 100. * ============================== @@ -1776,15 +1750,15 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, } } - setup_activation_strategy(binding, chassis, dp_key, port_key, + setup_activation_strategy(binding, ctx->chassis, dp_key, port_key, ofport, &zone_ids, flow_table); /* Remember the size with just strip vlan added so far, * as we're going to remove this with ofpbuf_pull() later. */ uint32_t ofpacts_orig_size = ofpacts_p->size; - load_logical_ingress_metadata(binding, &zone_ids, n_encap_ips, - encap_ips, ofpacts_p, true); + load_logical_ingress_metadata(binding, &zone_ids, ctx->n_encap_ips, + ctx->encap_ips, ofpacts_p, true); if (!strcmp(binding->type, "localport")) { /* mark the packet as incoming from a localport */ @@ -1811,8 +1785,9 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, } if (!strcmp(binding->type, "localnet")) { - put_replace_chassis_mac_flows(ct_zones, binding, local_datapaths, - ofpacts_p, ofport, flow_table); + put_replace_chassis_mac_flows(ctx->ct_zones, binding, + ctx->local_datapaths, ofpacts_p, + ofport, flow_table); } /* Table 65, Priority 100. @@ -1841,9 +1816,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, &match, ofpacts_p, &binding->header_.uuid); if (!strcmp(binding->type, "localnet")) { - put_replace_router_port_mac_flows(sbrec_port_binding_by_name, - binding, chassis, active_tunnels, - local_datapaths, ofpacts_p, + put_replace_router_port_mac_flows(ctx, binding, ofpacts_p, ofport, flow_table); } @@ -1855,7 +1828,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, if (!strcmp(binding->type, "localnet")) { /* do not forward traffic from localport to localnet port */ ofpbuf_clear(ofpacts_p); - put_drop(debug, OFTABLE_CHECK_LOOPBACK, ofpacts_p); + put_drop(&ctx->debug, OFTABLE_CHECK_LOOPBACK, ofpacts_p); match_outport_dp_and_port_keys(&match, dp_key, port_key); match_set_reg_masked(&match, MFF_LOG_FLAGS - MFF_REG0, MLF_LOCALPORT, MLF_LOCALPORT); @@ -1865,7 +1838,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, /* Drop LOCAL_ONLY traffic leaking through localnet ports. */ ofpbuf_clear(ofpacts_p); - put_drop(debug, OFTABLE_CHECK_LOOPBACK, ofpacts_p); + put_drop(&ctx->debug, OFTABLE_CHECK_LOOPBACK, ofpacts_p); match_outport_dp_and_port_keys(&match, dp_key, port_key); match_set_reg_masked(&match, MFF_LOG_FLAGS - MFF_REG0, MLF_LOCAL_ONLY, MLF_LOCAL_ONLY); @@ -1882,7 +1855,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, if (!pb->chassis) { continue; } - if (strcmp(pb->chassis->name, chassis->name)) { + if (strcmp(pb->chassis->name, ctx->chassis->name)) { continue; } @@ -1935,7 +1908,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, binding->header_.uuid.parts[0], &match, ofpacts_p, &binding->header_.uuid); } - } else if (access_type == PORT_LOCALNET && !always_tunnel) { + } else if (access_type == PORT_LOCALNET && !ctx->always_tunnel) { /* Remote port connected by localnet port */ /* Table 40, priority 100. * ======================= @@ -1963,10 +1936,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, binding->header_.uuid.parts[0], &match, ofpacts_p, &binding->header_.uuid); - enforce_tunneling_for_multichassis_ports(ld, binding, chassis, - chassis_tunnels, - mff_ovn_geneve, flow_table, - if_mgr); + enforce_tunneling_for_multichassis_ports(ld, binding, ctx, flow_table); /* No more tunneling to set up. */ goto out; @@ -1988,15 +1958,14 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name, if (redirect_type && !strcasecmp(redirect_type, "bridged")) { put_remote_port_redirect_bridged( - binding, local_datapaths, ld, &match, ofpacts_p, flow_table); + binding, ctx->local_datapaths, ld, &match, ofpacts_p, flow_table); } else if (access_type == PORT_HA_REMOTE) { put_remote_port_redirect_overlay_ha_remote( - binding, ha_ch_ordered, mff_ovn_geneve, port_key, - &match, ofpacts_p, chassis_tunnels, flow_table); + binding, ha_ch_ordered, ctx->mff_ovn_geneve, port_key, + &match, ofpacts_p, ctx->chassis_tunnels, flow_table); } else { put_remote_port_redirect_overlay( - binding, mff_ovn_geneve, port_key, &match, ofpacts_p, - chassis, chassis_tunnels, n_encap_ips, encap_ips, flow_table); + binding, ctx, port_key, &match, ofpacts_p, flow_table); } out: if (ha_ch_ordered) { @@ -2126,19 +2095,13 @@ mc_ofctrl_add_flow(const struct sbrec_multicast_group *mc, } static void -consider_mc_group(struct ovsdb_idl_index *sbrec_port_binding_by_name, - enum mf_field_id mff_ovn_geneve, - const struct shash *ct_zones, - const struct hmap *local_datapaths, - struct shash *local_bindings, - struct simap *patch_ofports, - const struct sbrec_chassis *chassis, +consider_mc_group(const struct physical_ctx *ctx, const struct sbrec_multicast_group *mc, - const struct hmap *chassis_tunnels, struct ovn_desired_flow_table *flow_table) { uint32_t dp_key = mc->datapath->tunnel_key; - struct local_datapath *ldp = get_local_datapath(local_datapaths, dp_key); + struct local_datapath *ldp = get_local_datapath(ctx->local_datapaths, + dp_key); if (!ldp) { return; } @@ -2192,7 +2155,7 @@ consider_mc_group(struct ovsdb_idl_index *sbrec_port_binding_by_name, continue; } - int zone_id = ct_zone_find_zone(ct_zones, port->logical_port); + int zone_id = ct_zone_find_zone(ctx->ct_zones, port->logical_port); if (zone_id) { put_load(zone_id, MFF_LOG_CT_ZONE, 0, 16, &ofpacts); } @@ -2213,27 +2176,28 @@ consider_mc_group(struct ovsdb_idl_index *sbrec_port_binding_by_name, } } else if (!strcmp(port->type, "localport")) { remote_ports = true; - } else if ((port->chassis == chassis - || is_additional_chassis(port, chassis)) - && (local_binding_get_primary_pb(local_bindings, lport_name) + } else if ((port->chassis == ctx->chassis + || is_additional_chassis(port, ctx->chassis)) + && (local_binding_get_primary_pb(ctx->local_bindings, + lport_name) || !strcmp(port->type, "l3gateway"))) { local_output_pb(port->tunnel_key, &ofpacts); - } else if (simap_contains(patch_ofports, port->logical_port)) { + } else if (simap_contains(ctx->patch_ofports, port->logical_port)) { local_output_pb(port->tunnel_key, &ofpacts); } else if (!strcmp(port->type, "chassisredirect") - && port->chassis == chassis) { + && port->chassis == ctx->chassis) { const char *distributed_port = smap_get(&port->options, "distributed-port"); if (distributed_port) { const struct sbrec_port_binding *distributed_binding - = lport_lookup_by_name(sbrec_port_binding_by_name, + = lport_lookup_by_name(ctx->sbrec_port_binding_by_name, distributed_port); if (distributed_binding && port->datapath == distributed_binding->datapath) { local_output_pb(distributed_binding->tunnel_key, &ofpacts); } } - } else if (!get_localnet_port(local_datapaths, + } else if (!get_localnet_port(ctx->local_datapaths, mc->datapath->tunnel_key)) { /* Add remote chassis only when localnet port not exist, * otherwise multicast will reach remote ports through localnet @@ -2274,9 +2238,10 @@ consider_mc_group(struct ovsdb_idl_index *sbrec_port_binding_by_name, put_load(mc->tunnel_key, MFF_LOG_OUTPORT, 0, 32, &ofpacts_last); } - fanout_to_chassis(mff_ovn_geneve, &remote_chassis, chassis_tunnels, - mc->datapath, mc->tunnel_key, false, &ofpacts_last); - fanout_to_chassis(mff_ovn_geneve, &vtep_chassis, chassis_tunnels, + fanout_to_chassis(ctx->mff_ovn_geneve, &remote_chassis, + ctx->chassis_tunnels, mc->datapath, mc->tunnel_key, + false, &ofpacts_last); + fanout_to_chassis(ctx->mff_ovn_geneve, &vtep_chassis, ctx->chassis_tunnels, mc->datapath, mc->tunnel_key, true, &ofpacts_last); remote_ports |= (ofpacts_last.size > 0); @@ -2284,7 +2249,8 @@ consider_mc_group(struct ovsdb_idl_index *sbrec_port_binding_by_name, put_resubmit(OFTABLE_LOCAL_OUTPUT, &ofpacts_last); } - bool has_vtep = get_vtep_port(local_datapaths, mc->datapath->tunnel_key); + bool has_vtep = get_vtep_port(ctx->local_datapaths, + mc->datapath->tunnel_key); uint32_t reverse_ramp_flow_index = MC_BUF_START_ID; flow_index = MC_BUF_START_ID; @@ -2314,8 +2280,8 @@ consider_mc_group(struct ovsdb_idl_index *sbrec_port_binding_by_name, if (port->chassis) { put_load(port->tunnel_key, MFF_LOG_OUTPORT, 0, 32, &remote_ofpacts); - tunnel_to_chassis(mff_ovn_geneve, port->chassis->name, - chassis_tunnels, mc->datapath, + tunnel_to_chassis(ctx->mff_ovn_geneve, port->chassis->name, + ctx->chassis_tunnels, mc->datapath, port->tunnel_key, &remote_ofpacts); } } else if (!strcmp(port->type, "localport")) { @@ -2362,19 +2328,7 @@ physical_eval_port_binding(struct physical_ctx *p_ctx, { struct ofpbuf ofpacts; ofpbuf_init(&ofpacts, 0); - consider_port_binding(p_ctx->sbrec_port_binding_by_name, - p_ctx->mff_ovn_geneve, p_ctx->ct_zones, - p_ctx->active_tunnels, - p_ctx->local_datapaths, - p_ctx->local_bindings, - p_ctx->patch_ofports, - p_ctx->chassis_tunnels, - pb, p_ctx->chassis, &p_ctx->debug, - p_ctx->if_mgr, - p_ctx->n_encap_ips, - p_ctx->encap_ips, - p_ctx->always_tunnel, - flow_table, &ofpacts); + consider_port_binding(p_ctx, pb, flow_table, &ofpacts); ofpbuf_uninit(&ofpacts); } @@ -2454,13 +2408,7 @@ physical_handle_mc_group_changes(struct physical_ctx *p_ctx, if (!sbrec_multicast_group_is_new(mc)) { ofctrl_remove_flows(flow_table, &mc->header_.uuid); } - consider_mc_group(p_ctx->sbrec_port_binding_by_name, - p_ctx->mff_ovn_geneve, p_ctx->ct_zones, - p_ctx->local_datapaths, p_ctx->local_bindings, - p_ctx->patch_ofports, - p_ctx->chassis, mc, - p_ctx->chassis_tunnels, - flow_table); + consider_mc_group(p_ctx, mc, flow_table); } } } @@ -2486,18 +2434,7 @@ physical_run(struct physical_ctx *p_ctx, * 64 for logical-to-physical translation. */ const struct sbrec_port_binding *binding; SBREC_PORT_BINDING_TABLE_FOR_EACH (binding, p_ctx->port_binding_table) { - consider_port_binding(p_ctx->sbrec_port_binding_by_name, - p_ctx->mff_ovn_geneve, p_ctx->ct_zones, - p_ctx->active_tunnels, p_ctx->local_datapaths, - p_ctx->local_bindings, - p_ctx->patch_ofports, - p_ctx->chassis_tunnels, binding, - p_ctx->chassis, &p_ctx->debug, - p_ctx->if_mgr, - p_ctx->n_encap_ips, - p_ctx->encap_ips, - p_ctx->always_tunnel, - flow_table, &ofpacts); + consider_port_binding(p_ctx, binding, flow_table, &ofpacts); } /* Default flow for CT_ZONE_LOOKUP Table. */ @@ -2511,12 +2448,7 @@ physical_run(struct physical_ctx *p_ctx, /* Handle output to multicast groups, in tables 40 and 41. */ const struct sbrec_multicast_group *mc; SBREC_MULTICAST_GROUP_TABLE_FOR_EACH (mc, p_ctx->mc_group_table) { - consider_mc_group(p_ctx->sbrec_port_binding_by_name, - p_ctx->mff_ovn_geneve, p_ctx->ct_zones, - p_ctx->local_datapaths, p_ctx->local_bindings, - p_ctx->patch_ofports, p_ctx->chassis, - mc, p_ctx->chassis_tunnels, - flow_table); + consider_mc_group(p_ctx, mc, flow_table); } /* Table 0, priority 100.