On 1/16/25 12:18, Lorenzo Bianconi wrote:
On Dec 03, Ales Musil wrote:
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 <[email protected]>

Acked-by: Lorenzo Bianconi <[email protected]>

Thanks Lorenzo and Ales. I merged this to main.


---
  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.
--
2.47.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to