Hi Alexandra, At a high level, I noticed that a lot of the helper functions you have added in this patch have the "inline" keyword. This seems unnecessary since this typically is used in functions defined in header files to avoid compiler errors due to multiple definitions. I think this can be removed from all of the functions you've added/modified in this patch.
I may have misread the code, but I think there could be an issue here with regards to incremental processing of logical switch ports. When checking if a logical switch port can be incrementally processed, we check if the switch port is in the svc_monitor_lsps sset. If it is, then we do not incrementally process the change, and we end up rebuilding all service monitors. With this change, if a logical switch port is not currently in the svc_monitor_lsps sset, and we add a health check to the logical switch port, then we will incrementally process the logical switch port. Incremental processing of logical switch ports will not create the corresponding SB service monitor. I think that lsp_can_be_inc_processed() needs to be updated so that it returns false if the logical switch port has any health checks configured on it. I have some additional notes below. On Fri, Dec 19, 2025 at 4:49 AM Alexandra Rukomoinikova <[email protected]> wrote: > > 1) Refactor service monitor related code to separate function to avoid > code duplication. > > 2) Added LSP health check handling for service monitors. > > Signed-off-by: Alexandra Rukomoinikova <[email protected]> > --- > northd/en-northd.c | 2 + > northd/inc-proc-northd.c | 5 +- > northd/northd.c | 303 +++++++++++++++++++++++++------ > northd/northd.h | 3 + > tests/ovn-inc-proc-graph-dump.at | 2 + > 5 files changed, 263 insertions(+), 52 deletions(-) > > diff --git a/northd/en-northd.c b/northd/en-northd.c > index 6815e6e39..9b37f3eee 100644 > --- a/northd/en-northd.c > +++ b/northd/en-northd.c > @@ -82,6 +82,8 @@ northd_get_input_data(struct engine_node *node, > EN_OVSDB_GET(engine_get_input("NB_network_function", node)); > input_data->nbrec_network_function_group_table = > EN_OVSDB_GET(engine_get_input("NB_network_function_group", node)); > + input_data->nbrec_lsp_hc_table = EN_OVSDB_GET(engine_get_input( > + "NB_logical_switch_port_health_check", node)); > > input_data->sbrec_port_binding_table = > EN_OVSDB_GET(engine_get_input("SB_port_binding", node)); > diff --git a/northd/inc-proc-northd.c b/northd/inc-proc-northd.c > index b9ac33dc3..bb740a9ba 100644 > --- a/northd/inc-proc-northd.c > +++ b/northd/inc-proc-northd.c > @@ -75,7 +75,8 @@ static unixctl_cb_func chassis_features_list; > NB_NODE(chassis_template_var) \ > NB_NODE(sampling_app) \ > NB_NODE(network_function) \ > - NB_NODE(network_function_group) > + NB_NODE(network_function_group) \ > + NB_NODE(logical_switch_port_health_check) > > enum nb_engine_node { > #define NB_NODE(NAME) NB_##NAME, > @@ -256,6 +257,8 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, > engine_add_input(&en_northd, &en_nb_chassis_template_var, NULL); > engine_add_input(&en_northd, &en_nb_network_function, NULL); > engine_add_input(&en_northd, &en_nb_network_function_group, NULL); > + engine_add_input(&en_northd, &en_nb_logical_switch_port_health_check, > + NULL); > > engine_add_input(&en_northd, &en_sb_chassis, NULL); > engine_add_input(&en_northd, &en_sb_mirror, NULL); > diff --git a/northd/northd.c b/northd/northd.c > index c3c0780a3..79bff21b4 100644 > --- a/northd/northd.c > +++ b/northd/northd.c > @@ -3055,14 +3055,14 @@ get_service_mon(const struct hmap > *local_svc_monitors_map, > return NULL; > } > > -static void > +static inline void > set_service_mon_options(const struct sbrec_service_monitor *sbrec_mon, > - const struct smap *nb_hc_options, > + const struct smap *options, This parameter name change is unnecessary. > const char *target_az_name) > { > struct smap sb_svc_options = SMAP_INITIALIZER(&sb_svc_options); > > - smap_clone(&sb_svc_options, nb_hc_options); > + smap_clone(&sb_svc_options, options); > if (target_az_name) { > smap_add(&sb_svc_options, "az-name", target_az_name); > } > @@ -3070,6 +3070,39 @@ set_service_mon_options(const struct > sbrec_service_monitor *sbrec_mon, > smap_destroy(&sb_svc_options); > } > > +static inline void > +configure_service_mon_rec(const struct sbrec_service_monitor *sbrec_mon, > + const char *src_ip, > + const char *target_az_name, > + const char *svc_monitor_mac, > + const struct eth_addr *svc_monitor_mac_ea, > + const struct smap *options) > +{ > + set_service_mon_options(sbrec_mon, options, target_az_name); > + > + struct eth_addr ea; > + if (!sbrec_mon->src_mac || > + !eth_addr_from_string(sbrec_mon->src_mac, &ea) || > + !eth_addr_equals(ea, *svc_monitor_mac_ea)) { > + sbrec_service_monitor_set_src_mac(sbrec_mon, svc_monitor_mac); > + } > + > + if (!sbrec_mon->src_ip || > + strcmp(sbrec_mon->src_ip, src_ip)) { > + sbrec_service_monitor_set_src_ip(sbrec_mon, src_ip); > + } > +} > + > +static inline void > +update_status_to_service_mon(const struct sbrec_service_monitor *sbrec_mon, > + const struct ovn_port *op) > +{ > + if ((!op->sb->n_up || !op->sb->up[0]) && > + sbrec_mon->status && !strcmp(sbrec_mon->status, "online")) { > + sbrec_service_monitor_set_status(sbrec_mon, "offline"); > + } > +} > + > static struct service_monitor_info * > create_or_get_service_mon(struct ovsdb_idl_txn *ovnsb_txn, > struct hmap *local_svc_monitors_map, > @@ -3083,7 +3116,8 @@ create_or_get_service_mon(struct ovsdb_idl_txn > *ovnsb_txn, > struct service_monitor_info *mon_info = > get_service_mon(local_svc_monitors_map, > ic_learned_svc_monitors_map, > - ip, logical_port, service_port, protocol); > + ip, logical_port, > + service_port, protocol); > > if (mon_info) { > if (chassis_name && strcmp(mon_info->sbrec_mon->chassis_name, > @@ -3219,6 +3253,30 @@ ovn_nf_svc_create(struct ovsdb_idl_txn *ovnsb_txn, > mon_info->required = true; > } > > +static inline bool > +check_svc_port_available(const char *logical_port, > + struct hmap *ls_ports, > + struct sset *svc_monitor_lsps, > + struct ovn_port **op, > + char **chassis_name) > +{ > + sset_add(svc_monitor_lsps, logical_port); We should wait to add logical_port to svc_monitor_lsps until after we have confirmed that we can find the ovn_port and that it is enabled. > + > + struct ovn_port *op_p = ovn_port_find(ls_ports, logical_port); > + > + if (!op_p || !lsp_is_enabled(op_p->nbsp)) { > + return false; > + } > + > + if (op_p->sb && op_p->sb->chassis) { > + *chassis_name = op_p->sb->chassis->name; > + } > + > + *op = op_p; > + > + return true; > +} > + > static void > ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn, > const struct ovn_northd_lb *lb, > @@ -3242,30 +3300,26 @@ ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn, > vector_get_ptr(&lb_vip->backends, j); > struct ovn_northd_lb_backend *backend_nb = > &lb_vip_nb->backends_nb[j]; > + const char *protocol = lb->nlb->protocol; > + struct ovn_port *op = NULL; > + char *chassis_name = NULL; IMO, moving these declarations earlier in the function makes the code harder to follow. They used to be declared just before they were used for the first time. Now there is a large gap between when the variable is declared and when it is used for the first time. > > if (!backend_nb->health_check) { > continue; > } > > - sset_add(svc_monitor_lsps, backend_nb->logical_port); > - struct ovn_port *op = ovn_port_find(ls_ports, > - backend_nb->logical_port); > - > if (!backend_nb->remote_backend && > - (!op || !lsp_is_enabled(op->nbsp))) { > - continue; > + !check_svc_port_available(backend_nb->logical_port, > + ls_ports, > + svc_monitor_lsps, > + &op, &chassis_name)) { > + continue; > } > > - const char *protocol = lb->nlb->protocol; > if (!protocol || !protocol[0]) { > protocol = "tcp"; > } > > - const char *chassis_name = NULL; > - if (!backend_nb->remote_backend && op->sb->chassis) { > - chassis_name = op->sb->chassis->name; > - } > - > struct service_monitor_info *mon_info = > create_or_get_service_mon(ovnsb_txn, > local_svc_monitors_map, > @@ -3279,31 +3333,16 @@ ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn, > chassis_name, > backend_nb->remote_backend); > ovs_assert(mon_info); > - set_service_mon_options(mon_info->sbrec_mon, > - &lb_vip_nb->lb_health_check->options, > - backend_nb->az_name); > - struct eth_addr ea; > - if (!mon_info->sbrec_mon->src_mac || > - !eth_addr_from_string(mon_info->sbrec_mon->src_mac, &ea) || > - !eth_addr_equals(ea, *svc_monitor_mac_ea)) { > - sbrec_service_monitor_set_src_mac(mon_info->sbrec_mon, > - svc_monitor_mac); > - } > > - if (!mon_info->sbrec_mon->src_ip || > - strcmp(mon_info->sbrec_mon->src_ip, > - backend_nb->svc_mon_src_ip)) { > - sbrec_service_monitor_set_src_ip( > - mon_info->sbrec_mon, > - backend_nb->svc_mon_src_ip); > - } > + configure_service_mon_rec(mon_info->sbrec_mon, > + backend_nb->svc_mon_src_ip, > + backend_nb->az_name, > + svc_monitor_mac, > + svc_monitor_mac_ea, > + &lb_vip_nb->lb_health_check->options); > > - if (!backend_nb->remote_backend && > - (!op->sb->n_up || !op->sb->up[0]) > - && mon_info->sbrec_mon->status > - && !strcmp(mon_info->sbrec_mon->status, "online")) { > - sbrec_service_monitor_set_status(mon_info->sbrec_mon, > - "offline"); > + if (!backend_nb->remote_backend) { > + update_status_to_service_mon(mon_info->sbrec_mon, op); > } > > mon_info->required = true; > @@ -3311,6 +3350,99 @@ ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn, > } > } > > +static void > +ovn_lsp_svc_monitor_add_address(struct ovsdb_idl_txn *ovnsb_txn, > + struct nbrec_logical_switch_port_health_check *lsp_hc, > + const struct ovn_port *op, > + const char *address, > + const char *svc_monitor_mac, > + const struct eth_addr *svc_monitor_mac_ea, > + struct hmap *local_svc_monitors_map) > +{ > + struct service_monitor_info *mon_info = > + create_or_get_service_mon(ovnsb_txn, > + local_svc_monitors_map, > + NULL, > + "logical-switch-port", > + address, > + op->key, > + NULL, > + lsp_hc->port, > + lsp_hc->protocol, > + (op->sb && op->sb->chassis) ? > + op->sb->chassis->name : NULL, > + false); > + > + ovs_assert(mon_info); > + > + configure_service_mon_rec(mon_info->sbrec_mon, > + lsp_hc->src_ip, > + NULL, > + svc_monitor_mac, > + svc_monitor_mac_ea, > + &lsp_hc->options); > + > + update_status_to_service_mon(mon_info->sbrec_mon, op); > + > + mon_info->required = true; > +} > + > +static void > +ovn_lsp_svc_create_record(struct ovsdb_idl_txn *ovnsb_txn, > + struct nbrec_logical_switch_port_health_check *lsp_hc, > + const struct ovn_port *op, > + const char *svc_monitor_mac, > + const struct eth_addr *svc_monitor_mac_ea, > + struct hmap *local_monitor_map) > +{ > + if (!lsp_hc->n_addresses) { > + for (size_t i = 0; i < op->n_lsp_addrs; i++) { > + for (size_t j = 0; j < op->lsp_addrs[i].n_ipv4_addrs; j++) { > + ovn_lsp_svc_monitor_add_address( > + ovnsb_txn, lsp_hc, op, > + op->lsp_addrs[i].ipv4_addrs[j].addr_s, > + svc_monitor_mac, svc_monitor_mac_ea, > + local_monitor_map); > + } > + for (size_t j = 0; j < op->lsp_addrs[i].n_ipv6_addrs; j++) { > + ovn_lsp_svc_monitor_add_address( > + ovnsb_txn, lsp_hc, op, > + op->lsp_addrs[i].ipv6_addrs[j].addr_s, > + svc_monitor_mac, svc_monitor_mac_ea, > + local_monitor_map); > + } > + } > + } else { > + for (size_t j = 0; j < lsp_hc->n_addresses; j++) { > + ovn_lsp_svc_monitor_add_address( > + ovnsb_txn, lsp_hc, op, > + lsp_hc->addresses[j], > + svc_monitor_mac, svc_monitor_mac_ea, > + local_monitor_map); > + } > + } > +} > + > +static void > +ovn_lsp_svc_monitors_process_port(struct ovsdb_idl_txn *ovnsb_txn, > + const struct ovn_port *op, > + const char *svc_monitor_mac, > + const struct eth_addr *svc_monitor_mac_ea, > + struct hmap *local_monitor_map, > + struct sset *svc_monitor_lsps) > +{ > + sset_add(svc_monitor_lsps, op->key); > + > + for (size_t i = 0; i < op->nbsp->n_health_checks; i++) { > + ovn_lsp_svc_create_record(ovnsb_txn, > + op->nbsp->health_checks[i], > + op, > + svc_monitor_mac, > + svc_monitor_mac_ea, > + local_monitor_map); > + } > +} > + > static bool > build_lb_vip_actions(const struct ovn_northd_lb *lb, > const struct ovn_lb_vip *lb_vip, > @@ -3519,7 +3651,7 @@ build_lb_datapaths(const struct hmap *lbs, const struct > hmap *lb_groups, > } > > static void > -build_svcs( > +build_svc_monitors_data( This function name change is unnecessary. > struct ovsdb_idl_txn *ovnsb_txn, > struct ovsdb_idl_index *sbrec_service_monitor_by_learned_type, > const char *svc_monitor_mac, > @@ -3531,7 +3663,8 @@ build_svcs( > const struct nbrec_network_function_table *nbrec_network_function_table, > struct sset *svc_monitor_lsps, > struct hmap *local_svc_monitors_map, > - struct hmap *ic_learned_svc_monitors_map) > + struct hmap *ic_learned_svc_monitors_map, > + struct hmapx *monitored_ports_map) > { > const struct sbrec_service_monitor *sbrec_mon; > struct sbrec_service_monitor *key = > @@ -3540,6 +3673,11 @@ build_svcs( > > sbrec_service_monitor_index_set_ic_learned(key, false); > > + /* Hash only the IP, port, and logical port. > + * This is necessary because two service monitors with the same IP and > + * logical port will have different `port` values > + * (e.g., an ICMP monitor defaults its port to 0). > + */ I don't understand why this comment is here. We're not doing any hashing right here, so it doesn't make sense to me that this comment is here. > SBREC_SERVICE_MONITOR_FOR_EACH_EQUAL (sbrec_mon, key, > sbrec_service_monitor_by_learned_type) { > uint32_t hash = sbrec_mon->port; > @@ -3581,6 +3719,18 @@ build_svcs( > } > } > > + struct hmapx_node *hmapx_node; > + const struct ovn_port *op; > + HMAPX_FOR_EACH (hmapx_node, monitored_ports_map) { > + op = hmapx_node->data; > + ovn_lsp_svc_monitors_process_port(ovnsb_txn, > + op, > + svc_monitor_mac, > + svc_monitor_mac_ea, > + local_svc_monitors_map, > + svc_monitor_lsps); > + } > + > struct service_monitor_info *mon_info; > HMAP_FOR_EACH_SAFE (mon_info, hmap_node, local_svc_monitors_map) { > if (!mon_info->required) { > @@ -4045,6 +4195,16 @@ ovn_port_allocate_key(struct ovn_port *op) > return true; > } > > +static inline void > +add_monitored_port(struct ovn_port *op, struct hmapx *monitored_ports_map) > +{ > + if (op->nbsp && > + op->nbsp->n_health_checks && > + lsp_is_enabled(op->nbsp)) { > + hmapx_add(monitored_ports_map, op); > + } > +} > + > /* Updates the southbound Port_Binding table so that it contains the logical > * switch ports specified by the northbound database. > * > @@ -4061,7 +4221,8 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn, > struct ovsdb_idl_index *sbrec_chassis_by_hostname, > struct ovsdb_idl_index *sbrec_ha_chassis_grp_by_name, > struct hmap *ls_datapaths, struct hmap *lr_datapaths, > - struct hmap *ls_ports, struct hmap *lr_ports) > + struct hmap *ls_ports, struct hmap *lr_ports, > + struct hmapx *monitored_ports_map) > { > struct ovs_list sb_only, nb_only, both; > /* XXX: Add tag_alloc_table and queue_id_bitmap as part of northd_data > @@ -4137,6 +4298,7 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn, > &active_ha_chassis_grps); > op->od->is_transit_router |= is_transit_router_port(op); > ovs_list_remove(&op->list); > + add_monitored_port(op, monitored_ports_map); > } > > /* Add southbound record for each unmatched northbound record. */ > @@ -4150,6 +4312,7 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn, > &active_ha_chassis_grps); > sbrec_port_binding_set_logical_port(op->sb, op->key); > op->od->is_transit_router |= is_transit_router_port(op); > + add_monitored_port(op, monitored_ports_map); > ovs_list_remove(&op->list); > } > > @@ -15370,6 +15533,34 @@ build_arp_resolve_flows_for_lsp( > } > } > > +static void > +build_arp_nd_lflow_for_lsp_svc_hc(struct ovn_port *op, > + const char *svc_monitor_mac, > + struct lflow_table *lflows, > + struct ds *match, > + struct ds *actions) > +{ > + const struct nbrec_logical_switch_port *nbsp = op->nbsp; > + for (size_t i = 0; i < nbsp->n_health_checks; i++) { > + struct nbrec_logical_switch_port_health_check *lsp_hc = > + nbsp->health_checks[i]; > + ds_clear(match); > + ds_clear(actions); > + > + bool is_ipv4 = strchr(lsp_hc->src_ip, '.') ? true : false; > + > + build_arp_nd_service_monitor_lflow(svc_monitor_mac, > + lsp_hc->src_ip, actions, match, is_ipv4); > + > + ovn_lflow_add_with_hint(lflows, > + op->od, > + S_SWITCH_IN_ARP_ND_RSP, 110, > + ds_cstr(match), ds_cstr(actions), > + &op->nbsp->header_, > + op->lflow_ref); > + } > +} > + > #define ICMP4_NEED_FRAG_FORMAT \ > "icmp4_error {" \ > "%s" \ > @@ -18838,6 +19029,7 @@ build_lswitch_and_lrouter_iterate_by_lsp(struct > ovn_port *op, > const struct shash *meter_groups, > struct ds *match, > struct ds *actions, > + const char *svc_monitor_mac, > struct lflow_table *lflows) > { > ovs_assert(op->nbsp); > @@ -18861,6 +19053,10 @@ build_lswitch_and_lrouter_iterate_by_lsp(struct > ovn_port *op, > > /* Build Logical Router Flows. */ > build_arp_resolve_flows_for_lsp(op, lflows, lr_ports, match, actions); > + if (op->nbsp->n_health_checks) { > + build_arp_nd_lflow_for_lsp_svc_hc(op, svc_monitor_mac, lflows, > + match, actions); > + } > } > > /* Helper function to combine all lflow generation which is iterated by > logical > @@ -18965,11 +19161,8 @@ build_lflows_thread(void *arg) > return NULL; > } > build_lswitch_and_lrouter_iterate_by_lsp(op, > lsi->ls_ports, > - lsi->lr_ports, > - > lsi->meter_groups, > - &lsi->match, > - &lsi->actions, > - lsi->lflows); > + lsi->lr_ports, lsi->meter_groups, &lsi->match, > + &lsi->actions, lsi->svc_monitor_mac, lsi->lflows); > build_lbnat_lflows_iterate_by_lsp( > op, lsi->lr_stateful_table, &lsi->match, > &lsi->actions, lsi->lflows); > @@ -19253,6 +19446,7 @@ build_lswitch_and_lrouter_flows( > lsi.meter_groups, > &lsi.match, > &lsi.actions, > + lsi.svc_monitor_mac, > lsi.lflows); > build_lbnat_lflows_iterate_by_lsp(op, lsi.lr_stateful_table, > &lsi.match, > @@ -19512,6 +19706,7 @@ lflow_handle_northd_port_changes(struct ovsdb_idl_txn > *ovnsb_txn, > lflow_input->lr_ports, > lflow_input->meter_groups, > &match, &actions, > + > lflow_input->svc_monitor_mac, > lflows); > /* Sync the new flows to SB. */ > bool handled = lflow_ref_sync_lflows( > @@ -19571,7 +19766,9 @@ lflow_handle_northd_port_changes(struct ovsdb_idl_txn > *ovnsb_txn, > build_lswitch_and_lrouter_iterate_by_lsp(op, lflow_input->ls_ports, > lflow_input->lr_ports, > lflow_input->meter_groups, > - &match, &actions, lflows); > + &match, &actions, > + > lflow_input->svc_monitor_mac, > + lflows); > > /* Sync the newly added flows to SB. */ > bool handled = lflow_ref_sync_lflows( > @@ -20282,6 +20479,7 @@ northd_init(struct northd_data *data) > hmap_init(&data->lb_group_datapaths_map); > sset_init(&data->svc_monitor_lsps); > hmap_init(&data->local_svc_monitors_map); > + hmapx_init(&data->monitored_ports_map); > init_northd_tracked_data(data); > } > > @@ -20367,6 +20565,7 @@ northd_destroy(struct northd_data *data) > &data->ls_ports, &data->lr_ports); > > sset_destroy(&data->svc_monitor_lsps); > + hmapx_destroy(&data->monitored_ports_map); > destroy_northd_tracked_data(data); > } > > @@ -20472,11 +20671,12 @@ ovnnb_db_run(struct northd_input *input_data, > input_data->sbrec_chassis_by_hostname, > input_data->sbrec_ha_chassis_grp_by_name, > &data->ls_datapaths.datapaths, &data->lr_datapaths.datapaths, > - &data->ls_ports, &data->lr_ports); > + &data->ls_ports, &data->lr_ports, > + &data->monitored_ports_map); > build_lb_port_related_data(&data->lr_datapaths, &data->ls_datapaths, > &data->lb_datapaths_map, > &data->lb_group_datapaths_map); > - build_svcs(ovnsb_txn, > + build_svc_monitors_data(ovnsb_txn, > input_data->sbrec_service_monitor_by_learned_type, > input_data->svc_monitor_mac, > &input_data->svc_monitor_mac_ea, > @@ -20486,7 +20686,8 @@ ovnnb_db_run(struct northd_input *input_data, > &data->ls_ports, &data->lb_datapaths_map, > input_data->nbrec_network_function_table, > &data->svc_monitor_lsps, &data->local_svc_monitors_map, > - input_data->ic_learned_svc_monitors_map); > + input_data->ic_learned_svc_monitors_map, > + &data->monitored_ports_map); > build_lb_count_dps(&data->lb_datapaths_map); > build_network_function_active( > input_data->nbrec_network_function_group_table, > diff --git a/northd/northd.h b/northd/northd.h > index 2869ea97e..bba3ee530 100644 > --- a/northd/northd.h > +++ b/northd/northd.h > @@ -43,6 +43,8 @@ struct northd_input { > const struct nbrec_network_function_table *nbrec_network_function_table; > const struct nbrec_network_function_group_table > *nbrec_network_function_group_table; > + const struct nbrec_logical_switch_port_health_check_table > + *nbrec_lsp_hc_table; > > /* Southbound table references */ > const struct sbrec_port_binding_table *sbrec_port_binding_table; > @@ -204,6 +206,7 @@ struct northd_data { > struct hmap lb_group_datapaths_map; > struct sset svc_monitor_lsps; > struct hmap local_svc_monitors_map; > + struct hmapx monitored_ports_map; > > /* Change tracking data. */ > struct northd_tracked_data trk_data; > diff --git a/tests/ovn-inc-proc-graph-dump.at > b/tests/ovn-inc-proc-graph-dump.at > index eb00ccc7d..27f111eb1 100644 > --- a/tests/ovn-inc-proc-graph-dump.at > +++ b/tests/ovn-inc-proc-graph-dump.at > @@ -16,6 +16,7 @@ digraph "Incremental-Processing-Engine" { > NB_chassis_template_var [[style=filled, shape=box, fillcolor=white, > label="NB_chassis_template_var"]]; > NB_network_function [[style=filled, shape=box, fillcolor=white, > label="NB_network_function"]]; > NB_network_function_group [[style=filled, shape=box, fillcolor=white, > label="NB_network_function_group"]]; > + NB_logical_switch_port_health_check [[style=filled, shape=box, > fillcolor=white, label="NB_logical_switch_port_health_check"]]; > SB_chassis [[style=filled, shape=box, fillcolor=white, > label="SB_chassis"]]; > SB_mirror [[style=filled, shape=box, fillcolor=white, > label="SB_mirror"]]; > SB_meter [[style=filled, shape=box, fillcolor=white, > label="SB_meter"]]; > @@ -73,6 +74,7 @@ digraph "Incremental-Processing-Engine" { > NB_chassis_template_var -> northd [[label=""]]; > NB_network_function -> northd [[label=""]]; > NB_network_function_group -> northd [[label=""]]; > + NB_logical_switch_port_health_check -> northd [[label=""]]; > SB_chassis -> northd [[label=""]]; > SB_mirror -> northd [[label=""]]; > SB_meter -> northd [[label=""]]; > -- > 2.48.1 > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
