From: Ihar Hrachyshka <ihrac...@redhat.com> This function will later be used to handle port binding updates for postponed (throttled) bindings.
Conflicts: controller/binding.c Signed-off-by: Ihar Hrachyshka <ihrac...@redhat.com> Acked-by: Mark Michelson <mmich...@redhat.com> Signed-off-by: Numan Siddique <num...@ovn.org> (cherry picked from commit 3103487e087b27b1b3577afba016403fd1ac3093) (cherry picked from commit 79cba201419cfbfa00876404dc9021b6d135f6da) Signed-off-by: Mark Michelson <mmich...@redhat.com> (cherry picked from commit 3af319c8ef5e732f4d1159ca23c276e0846b9003) --- controller/binding.c | 248 ++++++++++++++++++++++--------------------- 1 file changed, 129 insertions(+), 119 deletions(-) diff --git a/controller/binding.c b/controller/binding.c index 28edde26c..eb9de261c 100644 --- a/controller/binding.c +++ b/controller/binding.c @@ -2272,6 +2272,134 @@ consider_patch_port_for_local_datapaths(const struct sbrec_port_binding *pb, } } +static bool +handle_updated_port(struct binding_ctx_in *b_ctx_in, + struct binding_ctx_out *b_ctx_out, + const struct sbrec_port_binding *pb, + struct hmap *qos_map_ptr) +{ + /* Loop to handle create and update changes only. */ + if (sbrec_port_binding_is_deleted(pb)) { + return true; + } + + update_active_pb_ras_pd(pb, b_ctx_out->local_datapaths, + b_ctx_out->local_active_ports_ipv6_pd, + "ipv6_prefix_delegation"); + + update_active_pb_ras_pd(pb, b_ctx_out->local_datapaths, + b_ctx_out->local_active_ports_ras, + "ipv6_ra_send_periodic"); + + enum en_lport_type lport_type = get_lport_type(pb); + + struct binding_lport *b_lport = + binding_lport_find(&b_ctx_out->lbinding_data->lports, + pb->logical_port); + if (b_lport) { + ovs_assert(b_lport->pb == pb); + + if (b_lport->type != lport_type) { + b_lport->type = lport_type; + } + + if (b_lport->lbinding) { + if (!local_binding_handle_stale_binding_lports( + b_lport->lbinding, b_ctx_in, b_ctx_out, qos_map_ptr)) { + return false; + } + } + } + + bool handled = true; + + switch (lport_type) { + case LP_VIF: + case LP_CONTAINER: + case LP_VIRTUAL: + handled = handle_updated_vif_lport(pb, lport_type, b_ctx_in, + b_ctx_out, qos_map_ptr); + break; + + case LP_LOCALPORT: + handled = consider_localport(pb, b_ctx_in, b_ctx_out); + break; + + case LP_PATCH: + update_related_lport(pb, b_ctx_out); + consider_patch_port_for_local_datapaths(pb, b_ctx_in, b_ctx_out); + break; + + case LP_VTEP: + update_related_lport(pb, b_ctx_out); + /* VTEP lports are claimed/released by ovn-controller-vteps. + * We are not sure what changed. */ + b_ctx_out->non_vif_ports_changed = true; + break; + + case LP_L2GATEWAY: + handled = consider_l2gw_lport(pb, b_ctx_in, b_ctx_out); + break; + + case LP_L3GATEWAY: + handled = consider_l3gw_lport(pb, b_ctx_in, b_ctx_out); + break; + + case LP_CHASSISREDIRECT: + handled = consider_cr_lport(pb, b_ctx_in, b_ctx_out); + if (!handled) { + break; + } + const char *distributed_port = smap_get(&pb->options, + "distributed-port"); + if (!distributed_port) { + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); + VLOG_WARN_RL(&rl, "No distributed-port option set for " + "chassisredirect port %s", pb->logical_port); + break; + } + const struct sbrec_port_binding *distributed_pb + = lport_lookup_by_name(b_ctx_in->sbrec_port_binding_by_name, + distributed_port); + if (!distributed_pb) { + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); + VLOG_WARN_RL(&rl, "No port binding record for distributed " + "port %s referred by chassisredirect port %s", + distributed_port, pb->logical_port); + break; + } + consider_patch_port_for_local_datapaths(distributed_pb, b_ctx_in, + b_ctx_out); + break; + + case LP_EXTERNAL: + handled = consider_external_lport(pb, b_ctx_in, b_ctx_out); + update_ld_external_ports(pb, b_ctx_out->local_datapaths); + break; + + case LP_LOCALNET: { + consider_localnet_lport(pb, b_ctx_in, b_ctx_out, qos_map_ptr); + + struct shash bridge_mappings = + SHASH_INITIALIZER(&bridge_mappings); + add_ovs_bridge_mappings(b_ctx_in->ovs_table, + b_ctx_in->bridge_table, + &bridge_mappings); + update_ld_localnet_port(pb, &bridge_mappings, + b_ctx_out->egress_ifaces, + b_ctx_out->local_datapaths); + shash_destroy(&bridge_mappings); + break; + } + + case LP_REMOTE: + case LP_UNKNOWN: + break; + } + + return handled; +} + /* Returns true if the port binding changes resulted in local binding * updates, false otherwise. */ @@ -2397,125 +2525,7 @@ delete_done: SBREC_PORT_BINDING_TABLE_FOR_EACH_TRACKED (pb, b_ctx_in->port_binding_table) { - /* Loop to handle create and update changes only. */ - if (sbrec_port_binding_is_deleted(pb)) { - continue; - } - - update_active_pb_ras_pd(pb, b_ctx_out->local_datapaths, - b_ctx_out->local_active_ports_ipv6_pd, - "ipv6_prefix_delegation"); - - update_active_pb_ras_pd(pb, b_ctx_out->local_datapaths, - b_ctx_out->local_active_ports_ras, - "ipv6_ra_send_periodic"); - - enum en_lport_type lport_type = get_lport_type(pb); - - struct binding_lport *b_lport = - binding_lport_find(&b_ctx_out->lbinding_data->lports, - pb->logical_port); - if (b_lport) { - ovs_assert(b_lport->pb == pb); - - if (b_lport->type != lport_type) { - b_lport->type = lport_type; - } - - if (b_lport->lbinding) { - handled = local_binding_handle_stale_binding_lports( - b_lport->lbinding, b_ctx_in, b_ctx_out, qos_map_ptr); - if (!handled) { - /* Backout from the handling. */ - break; - } - } - } - - switch (lport_type) { - case LP_VIF: - case LP_CONTAINER: - case LP_VIRTUAL: - handled = handle_updated_vif_lport(pb, lport_type, b_ctx_in, - b_ctx_out, qos_map_ptr); - break; - - case LP_LOCALPORT: - handled = consider_localport(pb, b_ctx_in, b_ctx_out); - break; - - case LP_PATCH: - update_related_lport(pb, b_ctx_out); - consider_patch_port_for_local_datapaths(pb, b_ctx_in, b_ctx_out); - break; - - case LP_VTEP: - update_related_lport(pb, b_ctx_out); - /* VTEP lports are claimed/released by ovn-controller-vteps. - * We are not sure what changed. */ - b_ctx_out->non_vif_ports_changed = true; - break; - - case LP_L2GATEWAY: - handled = consider_l2gw_lport(pb, b_ctx_in, b_ctx_out); - break; - - case LP_L3GATEWAY: - handled = consider_l3gw_lport(pb, b_ctx_in, b_ctx_out); - break; - - case LP_CHASSISREDIRECT: - handled = consider_cr_lport(pb, b_ctx_in, b_ctx_out); - if (!handled) { - break; - } - const char *distributed_port = smap_get(&pb->options, - "distributed-port"); - if (!distributed_port) { - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); - VLOG_WARN_RL(&rl, "No distributed-port option set for " - "chassisredirect port %s", pb->logical_port); - break; - } - const struct sbrec_port_binding *distributed_pb - = lport_lookup_by_name(b_ctx_in->sbrec_port_binding_by_name, - distributed_port); - if (!distributed_pb) { - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); - VLOG_WARN_RL(&rl, "No port binding record for distributed " - "port %s referred by chassisredirect port %s", - distributed_port, pb->logical_port); - break; - } - consider_patch_port_for_local_datapaths(distributed_pb, b_ctx_in, - b_ctx_out); - break; - - case LP_EXTERNAL: - handled = consider_external_lport(pb, b_ctx_in, b_ctx_out); - update_ld_external_ports(pb, b_ctx_out->local_datapaths); - break; - - case LP_LOCALNET: { - consider_localnet_lport(pb, b_ctx_in, b_ctx_out, qos_map_ptr); - - struct shash bridge_mappings = - SHASH_INITIALIZER(&bridge_mappings); - add_ovs_bridge_mappings(b_ctx_in->ovs_table, - b_ctx_in->bridge_table, - &bridge_mappings); - update_ld_localnet_port(pb, &bridge_mappings, - b_ctx_out->egress_ifaces, - b_ctx_out->local_datapaths); - shash_destroy(&bridge_mappings); - break; - } - - case LP_REMOTE: - case LP_UNKNOWN: - break; - } - + handled = handle_updated_port(b_ctx_in, b_ctx_out, pb, qos_map_ptr); if (!handled) { break; } -- 2.41.0 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev