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]>

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

Reply via email to