Message ID | 20241203110853.201377-2-amusil@redhat.com |
---|---|
State | Accepted |
Headers | show |
Series | Introduce the concept of transit router. | expand |
Context | Check | Description |
---|---|---|
ovsrobot/apply-robot | success | apply and check: success |
ovsrobot/github-robot-_Build_and_Test | success | github build: passed |
ovsrobot/github-robot-_ovn-kubernetes | fail | github build: failed |
ovsrobot/github-robot-_Build_and_Test | success | github build: passed |
ovsrobot/github-robot-_ovn-kubernetes | fail | github build: failed |
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 <amusil@redhat.com> Acked-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> > --- > 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 > dev@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev >
> A lot of the arguments fo certain functions were getting out of hand, Just a typo here 'for'. Lorenzo > 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 <amusil@redhat.com> > --- > 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 > dev@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev >
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 <amusil@redhat.com> > > Acked-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> 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 >> dev@openvswitch.org >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >> >> >> _______________________________________________ >> dev mailing list >> dev@openvswitch.org >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
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.
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 <amusil@redhat.com> --- controller/physical.c | 242 +++++++++++++++--------------------------- 1 file changed, 87 insertions(+), 155 deletions(-)