ECMP group IDs were assigned while building ECMP policy logical flows. This commit moves the assignment into en-route-policies.
This will assist with the upcoming commits that will add incremental processing for routing policies. Signed-off-by: Mark Michelson <[email protected]> --- northd/en-route-policies.c | 6 ++++++ northd/en-route-policies.h | 4 ++++ northd/northd.c | 18 ++++++------------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/northd/en-route-policies.c b/northd/en-route-policies.c index 0cdfb511d..dc33edb53 100644 --- a/northd/en-route-policies.c +++ b/northd/en-route-policies.c @@ -195,6 +195,7 @@ build_route_policies(struct ovn_datapath *od, } size_t hash = uuid_hash(&od->key); + uint16_t ecmp_group_id = 1; for (int i = 0; i < od->nbr->n_policies; i++) { const struct nbrec_logical_router_policy *rule = od->nbr->policies[i]; @@ -323,12 +324,17 @@ build_route_policies(struct ovn_datapath *od, } } + uint16_t group = 0; + if (vector_len(&valid_nexthops) > 1) { + group = ecmp_group_id++; + } struct route_policy *new_rp = xmalloc(sizeof *new_rp); *new_rp = (struct route_policy) { .rule = rule, .valid_nexthops = vector_steal(&valid_nexthops), .chain_id = chain_id, .jump_chain_id = jump_chain_id, + .ecmp_group_id = group, }; hmap_insert(route_policies, &new_rp->key_node, hash); } diff --git a/northd/en-route-policies.h b/northd/en-route-policies.h index 490ba09e7..dba0fc2b6 100644 --- a/northd/en-route-policies.h +++ b/northd/en-route-policies.h @@ -43,6 +43,10 @@ struct route_policy { struct vector valid_nexthops; /* struct route_policy_nexthop */ uint32_t chain_id; uint32_t jump_chain_id; + /* If the policy is ECMP, then this is the group ID for the policy. + * If the policy is not ECMP, then this is 0. + */ + uint32_t ecmp_group_id; }; /* Global route policy data exported by en-route-policies. */ diff --git a/northd/northd.c b/northd/northd.c index d3f80f898..15921d525 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -12272,7 +12272,6 @@ static void build_ecmp_routing_policy_flows(struct lflow_table *lflows, struct ovn_datapath *od, struct route_policy *rp, - uint16_t ecmp_group_id, struct lflow_ref *lflow_ref) { const struct nbrec_logical_router_policy *rule = rp->rule; @@ -12317,9 +12316,9 @@ build_ecmp_routing_policy_flows(struct lflow_table *lflows, is_ipv4); ds_clear(&match); - ds_put_format(&match, REG_ECMP_GROUP_ID" == %"PRIu16" && " + ds_put_format(&match, REG_ECMP_GROUP_ID" == %"PRIu32" && " REG_ECMP_MEMBER_ID" == %"PRIuSIZE, - ecmp_group_id, i + 1); + rp->ecmp_group_id, i + 1); ovn_lflow_add(lflows, od, S_ROUTER_IN_POLICY_ECMP, 100, ds_cstr(&match), ds_cstr(&actions), lflow_ref, WITH_HINT(&rule->header_)); @@ -12327,8 +12326,8 @@ build_ecmp_routing_policy_flows(struct lflow_table *lflows, } ds_clear(&actions); - ds_put_format(&actions, "%s = %"PRIu16 - "; %s = select(", REG_ECMP_GROUP_ID, ecmp_group_id, + ds_put_format(&actions, "%s = %"PRIu32 + "; %s = select(", REG_ECMP_GROUP_ID, rp->ecmp_group_id, REG_ECMP_MEMBER_ID); i = 0; @@ -15686,19 +15685,14 @@ build_ingress_policy_flows_for_lrouter( lflow_ref); /* Convert routing policies to flows. */ - uint16_t ecmp_group_id = 1; struct route_policy *rp; HMAP_FOR_EACH_WITH_HASH (rp, key_node, uuid_hash(&od->key), route_policies) { const struct nbrec_logical_router_policy *rule = rp->rule; - bool is_ecmp_reroute = - (!strcmp(rule->action, "reroute") && - vector_len(&rp->valid_nexthops) > 1); + bool is_ecmp_reroute = rp->ecmp_group_id != 0; if (is_ecmp_reroute) { - build_ecmp_routing_policy_flows(lflows, od, rp, ecmp_group_id, - lflow_ref); - ecmp_group_id++; + build_ecmp_routing_policy_flows(lflows, od, rp, lflow_ref); } else { build_routing_policy_flow(lflows, od, rp, &rule->header_, lflow_ref); -- 2.55.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
