On 2/7/26 10:48 PM, Alexandra Rukomoinikova wrote:
> Add logic to process logical switch port health checks in northd.
> 
> Signed-off-by: Alexandra Rukomoinikova <[email protected]>
> ---
> v1 --> v2: fixed comments, removed all the unnecessary code from the previous 
> version
>            and made the code working with minimal changes.
>            I will try to remove duplicate code in service monitor creation
>            (Now we have almost the same code with creation for lb hc, nf hc 
> and now in lsp hc)
>            in the following patches.
> ---

Hi Alexandra,

After a first glance, I have some minor comments below.

Moving on to reviewing patch 3/8 for now.

Thanks,
Dumitru

>  lib/ovn-util.c                   |  40 +++++++
>  lib/ovn-util.h                   |   4 +
>  northd/en-northd.c               |   2 +
>  northd/inc-proc-northd.c         |   5 +-
>  northd/northd.c                  | 190 +++++++++++++++++++++++++++----
>  northd/northd.h                  |   3 +
>  tests/ovn-inc-proc-graph-dump.at |   2 +
>  tests/ovn-northd.at              |  91 +++++++++++++++
>  8 files changed, 314 insertions(+), 23 deletions(-)
> 
> diff --git a/lib/ovn-util.c b/lib/ovn-util.c
> index 1e754ac1c..9814e2d16 100644
> --- a/lib/ovn-util.c
> +++ b/lib/ovn-util.c
> @@ -521,6 +521,46 @@ find_lport_address(const struct lport_addresses *laddrs, 
> const char *ip_s)
>      return NULL;
>  }
>  
> +bool
> +lport_addresses_contains_ip(const struct lport_addresses *lsp_addrs,
> +                            unsigned int n_lsp_addrs,
> +                            const char *ip_s)
> +{
> +    bool is_ipv4 = strchr(ip_s, '.') != NULL;
> +    struct in6_addr ip6;
> +    ovs_be32 ip4;
> +
> +    if (is_ipv4) {
> +        if (!ip_parse(ip_s, &ip4)) {
> +            return false;
> +        }
> +    } else {
> +        if (!ipv6_parse(ip_s, &ip6)) {
> +            return false;
> +        }
> +    }
> +
> +    for (size_t i = 0; i < n_lsp_addrs; i++) {
> +        const struct lport_addresses *laddrs = &lsp_addrs[i];
> +
> +        if (is_ipv4) {
> +            for (size_t j = 0; j < laddrs->n_ipv4_addrs; j++) {
> +                if (laddrs->ipv4_addrs[j].addr == ip4) {
> +                    return true;
> +                }
> +            }
> +        } else {
> +            for (size_t j = 0; j < laddrs->n_ipv6_addrs; j++) {
> +                if (IN6_ARE_ADDR_EQUAL(&laddrs->ipv6_addrs[j].addr, &ip6)) {
> +                    return true;
> +                }
> +            }
> +        }
> +    }
> +
> +    return false;
> +}
> +
>  /* Go through 'addresses' and add found IPv4 addresses to 'ipv4_addrs' and
>   * IPv6 addresses to 'ipv6_addrs'. */
>  void
> diff --git a/lib/ovn-util.h b/lib/ovn-util.h
> index 0ba0d1c26..1719caac4 100644
> --- a/lib/ovn-util.h
> +++ b/lib/ovn-util.h
> @@ -130,6 +130,10 @@ const char *find_lport_address(const struct 
> lport_addresses *laddrs,
>  void split_addresses(const char *addresses, struct svec *ipv4_addrs,
>                       struct svec *ipv6_addrs);
>  
> +bool lport_addresses_contains_ip(const struct lport_addresses *lport_address,
> +                                 unsigned int n_lsp_addrs,
> +                                 const char *ip_s);
> +
>  char *alloc_nat_zone_key(const char *name, const char *type);
>  
>  const char *default_nb_db(void);
> 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 21e6aedcc..732066638 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 b4bb4ba6d..8cb307ca3 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -3543,7 +3543,77 @@ build_lb_datapaths(const struct hmap *lbs, const 
> struct hmap *lb_groups,
>  }
>  
>  static void
> -build_svcs(
> +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_svc_monitors_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++) {
> +        struct nbrec_logical_switch_port_health_check *lsp_hc =
> +            op->nbsp->health_checks[i];
> +        struct service_monitor_info *mon_info = NULL;
> +
> +        /* Check if this address is still on the port */
> +        bool lsp_contain_ip =
> +            lport_addresses_contains_ip(op->lsp_addrs, op->n_lsp_addrs,
> +                                        lsp_hc->address);
> +
> +        /* Remove outdated records */
> +        if (!lsp_contain_ip) {
> +            mon_info = get_service_mon(local_svc_monitors_map,
> +                                        NULL, lsp_hc->address,
> +                                        op->key, lsp_hc->port,
> +                                        lsp_hc->protocol);

Nit: indentation (should be one space to the left).

> +            if (mon_info) {
> +                sbrec_service_monitor_delete(mon_info->sbrec_mon);
> +                hmap_remove(local_svc_monitors_map, &mon_info->hmap_node);
> +                free(mon_info);
> +            }
> +            continue;
> +        }
> +
> +        mon_info = create_or_get_service_mon(ovnsb_txn,
> +                                             local_svc_monitors_map,
> +                                             NULL, "logical-switch-port",
> +                                             lsp_hc->address, op->key, NULL,
> +                                             lsp_hc->port, lsp_hc->protocol,
> +                                             (op->sb && op->sb->chassis) ?
> +                                              op->sb->chassis->name : NULL,
> +                                             false);
> +
> +        mon_info->required = true;
> +        set_service_mon_options(mon_info->sbrec_mon,
> +                                &lsp_hc->options, NULL);
> +
> +        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, lsp_hc->src_ip)) {
> +            sbrec_service_monitor_set_src_ip(mon_info->sbrec_mon,
> +                                                lsp_hc->src_ip);

Nit: indentation.

> +        }
> +
> +        if ((!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");

Nit: indentation.

> +        }
> +    }
> +}
> +
> +static void
> +build_svc_monitors_data(
>      struct ovsdb_idl_txn *ovnsb_txn,
>      struct ovsdb_idl_index *sbrec_service_monitor_by_learned_type,
>      const char *svc_monitor_mac,
> @@ -3555,7 +3625,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 =
> @@ -3605,6 +3676,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) {
> @@ -4084,6 +4167,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.
>   *
> @@ -4100,7 +4193,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
> @@ -4175,6 +4269,7 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn,
>                                op, queue_id_bitmap,
>                                &active_ha_chassis_grps);
>          op->od->is_transit_router |= is_transit_router_port(op);
> +        add_monitored_port(op, monitored_ports_map);
>          ovs_list_remove(&op->list);
>      }
>  
> @@ -4189,6 +4284,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);
>      }
>  
> @@ -4370,6 +4466,11 @@ lsp_can_be_inc_processed(const struct 
> nbrec_logical_switch_port *nbsp)
>          }
>      }
>  
> +     /* Attaching health check is not supported for now. */
> +    if (nbsp->n_health_checks) {
> +        return false;
> +    }
> +
>      return true;
>  }
>  
> @@ -15533,6 +15634,42 @@ 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];
> +
> +        /* Check if this address is still on the port */
> +        bool lsp_contain_ip =
> +            lport_addresses_contains_ip(op->lsp_addrs, op->n_lsp_addrs,
> +                                        lsp_hc->address);
> +

Instead of the bool variable we can just:

if (!lport_addresses_contains_ip(...)) {
    continue;
}

> +        if (!lsp_contain_ip) {
> +            continue;
> +        }
> +
> +        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(lflows, op->od, S_SWITCH_IN_ARP_ND_RSP, 110,
> +                      ds_cstr(match), ds_cstr(actions),
> +                      op->lflow_ref,
> +                      WITH_HINT(&op->nbsp->header_));
> +    }
> +}
> +
>  #define ICMP4_NEED_FRAG_FORMAT                           \
>      "icmp4_error {"                                      \
>      "%s"                                                 \
> @@ -19004,6 +19141,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);
> @@ -19027,6 +19165,8 @@ 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);
> +    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
> @@ -19130,12 +19270,10 @@ build_lflows_thread(void *arg)
>                      if (stop_parallel_processing()) {
>                          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);
> +                    build_lswitch_and_lrouter_iterate_by_lsp(
> +                        op, lsi->ls_ports, 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);
> @@ -19419,6 +19557,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,
> @@ -19676,6 +19815,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(
> @@ -19733,7 +19873,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(
> @@ -20436,6 +20578,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);
>  }
>  
> @@ -20521,6 +20664,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);
>  }
>  
> @@ -20626,21 +20770,23 @@ 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,
> -               input_data->sbrec_service_monitor_by_learned_type,
> -               input_data->svc_monitor_mac,
> -               &input_data->svc_monitor_mac_ea,
> -               input_data->svc_monitor_mac_dst,
> -               input_data->svc_monitor_ip,
> -               input_data->svc_monitor_ip_dst,
> -               &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);
> +    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,
> +        input_data->svc_monitor_mac_dst,
> +        input_data->svc_monitor_ip,
> +        input_data->svc_monitor_ip_dst,
> +        &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,
> +        &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 eb5c15f34..77e8b049b 100644
> --- a/northd/northd.h
> +++ b/northd/northd.h
> @@ -44,6 +44,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;
> @@ -203,6 +205,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 3fe7b8fbd..ff2c8c0c7 100644
> --- a/tests/ovn-inc-proc-graph-dump.at
> +++ b/tests/ovn-inc-proc-graph-dump.at
> @@ -18,6 +18,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"]];
> @@ -75,6 +76,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=""]];
> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> index 512e42036..2b46474fd 100644
> --- a/tests/ovn-northd.at
> +++ b/tests/ovn-northd.at
> @@ -19359,3 +19359,94 @@ AT_CHECK([grep "ls1-to-spine" ls1flows | 
> ovn_strip_lflows | sort], [0], [dnl
>  
>  OVN_CLEANUP_NORTHD
>  AT_CLEANUP
> +
> +AT_SETUP([Logical Switch Port Health Check - lflow/service monitor 
> synchronization])
> +ovn_start
> +
> +check ovn-nbctl ls-add ls1
> +check ovn-nbctl lsp-add ls1 lport1 -- \
> +    lsp-set-addresses lport1 "f0:00:0f:01:02:04 192.168.0.10" 
> "f0:00:0f:01:02:06 192.168.0.11"
> +
> +check ovn-nbctl set NB_Global . options:svc_monitor_mac="11:11:11:11:11:11"
> +
> +# Create service monitor for all lsp addresses.
> +check ovn-nbctl lsp-hc-add lport1 icmp 192.168.0.255 192.168.0.10
> +check ovn-nbctl lsp-hc-add lport1 icmp 192.168.0.255 192.168.0.11
> +
> +# Check lflow and service monitor synchronization
> +AT_CHECK([ovn-sbctl lflow-list ls1 | grep 'ls_in_arp_rsp'| grep 
> "priority=110" | ovn_strip_lflows], [0], [dnl
> +  table=??(ls_in_arp_rsp      ), priority=110  , match=(arp.tpa == 
> 192.168.0.255 && arp.op == 1), action=(eth.dst = eth.src; eth.src = 
> 11:11:11:11:11:11; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
> 11:11:11:11:11:11; arp.tpa = arp.spa; arp.spa = 192.168.0.255; outport = 
> inport; flags.loopback = 1; output;)
> +])
> +
> +check_row_count sb:Service_Monitor 2
> +check_column "false false" sb:Service_Monitor ic_learned logical_port=lport1
> +check_column "false false" sb:Service_Monitor remote logical_port=lport1
> +check_column "192.168.0.10 192.168.0.11" sb:Service_Monitor ip 
> logical_port=lport1
> +check_column "icmp icmp" sb:Service_Monitor protocol logical_port=lport1
> +check_column "192.168.0.255 192.168.0.255" sb:Service_Monitor src_ip 
> logical_port=lport1
> +check_column "0 0" sb:Service_Monitor port logical_port=lport1
> +check_column "logical-switch-port logical-switch-port" sb:Service_Monitor 
> type logical_port=lport1
> +check_column "11:11:11:11:11:11 11:11:11:11:11:11" sb:Service_Monitor 
> src_mac logical_port=lport1
> +
> +# Create one more service monitor for all lsp addresses.
> +check ovn-nbctl lsp-hc-add lport1 tcp 192.168.0.254 80 192.168.0.10
> +check ovn-nbctl lsp-hc-add lport1 tcp 192.168.0.254 80 192.168.0.11
> +
> +AT_CHECK([ovn-sbctl lflow-list ls1 | grep 'ls_in_arp_rsp'| grep 
> "priority=110" | ovn_strip_lflows], [0], [dnl
> +  table=??(ls_in_arp_rsp      ), priority=110  , match=(arp.tpa == 
> 192.168.0.254 && arp.op == 1), action=(eth.dst = eth.src; eth.src = 
> 11:11:11:11:11:11; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
> 11:11:11:11:11:11; arp.tpa = arp.spa; arp.spa = 192.168.0.254; outport = 
> inport; flags.loopback = 1; output;)
> +  table=??(ls_in_arp_rsp      ), priority=110  , match=(arp.tpa == 
> 192.168.0.255 && arp.op == 1), action=(eth.dst = eth.src; eth.src = 
> 11:11:11:11:11:11; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
> 11:11:11:11:11:11; arp.tpa = arp.spa; arp.spa = 192.168.0.255; outport = 
> inport; flags.loopback = 1; output;)
> +])
> +
> +# Check options propogations
> +hc_lport1_uuid=$(fetch_column nb:logical_switch_port_health_check _uuid 
> address="192.168.0.10" protocol="tcp")
> +
> +check ovn-nbctl set logical_switch_port_health_check $hc_lport1_uuid 
> options:interval=3
> +check ovn-nbctl set logical_switch_port_health_check $hc_lport1_uuid 
> options:timeout=30
> +check ovn-nbctl set logical_switch_port_health_check $hc_lport1_uuid 
> options:success_count=1
> +check ovn-nbctl set logical_switch_port_health_check $hc_lport1_uuid 
> options:failure_count=2
> +
> +sm_lport1_uuid=$(fetch_column sb:service_monitor _uuid protocol="tcp" 
> ip="192.168.0.10")
> +
> +AT_CHECK([ovn-sbctl get Service_Monitor $sm_lport1_uuid options:interval],
> +[0], ["3"
> +])
> +AT_CHECK([ovn-sbctl get Service_Monitor $sm_lport1_uuid 
> options:failure_count],
> +[0], ["2"
> +])
> +AT_CHECK([ovn-sbctl get Service_Monitor $sm_lport1_uuid 
> options:success_count],
> +[0], ["1"
> +])
> +AT_CHECK([ovn-sbctl get Service_Monitor $sm_lport1_uuid options:timeout],
> +[0], ["30"
> +])
> +
> +check ovn-nbctl lsp-del lport1
> +check_row_count sb:Service_Monitor 0
> +AT_CHECK([ovn-sbctl lflow-list ls1 | grep 'ls_in_arp_rsp'| grep 
> "priority=110" | ovn_strip_lflows], [0], [dnl])
> +
> +# Create a port with health checks in one transaction - checking the 
> processing of incremental processing
> +check ovn-nbctl lsp-add ls1 lport1 -- \
> +    lsp-set-addresses lport1 "f0:00:0f:01:02:04 192.168.0.10" 
> "f0:00:0f:01:02:06 192.168.0.11" -- \
> +    lsp-hc-add lport1 icmp 192.168.0.255 192.168.0.10 -- \
> +    lsp-hc-add lport1 icmp 192.168.0.255 192.168.0.11
> +
> +check_row_count sb:Service_Monitor 2
> +AT_CHECK([ovn-sbctl lflow-list ls1 | grep 'ls_in_arp_rsp'| grep 
> "priority=110" | ovn_strip_lflows], [0], [dnl
> +  table=??(ls_in_arp_rsp      ), priority=110  , match=(arp.tpa == 
> 192.168.0.255 && arp.op == 1), action=(eth.dst = eth.src; eth.src = 
> 11:11:11:11:11:11; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
> 11:11:11:11:11:11; arp.tpa = arp.spa; arp.spa = 192.168.0.255; outport = 
> inport; flags.loopback = 1; output;)
> +])
> +
> +check_row_count sb:Service_Monitor 2
> +
> +# Change the addresses on the switch port - expect records in SBDB to be 
> deleted.
> +lport1=$(fetch_column nb:logical_switch_port _uuid  name="lport1")
> +check ovn-nbctl clear logical_switch_port $lport1 addresses
> +
> +check_row_count sb:Service_Monitor 0
> +AT_CHECK([ovn-sbctl lflow-list ls1 | grep 'ls_in_arp_rsp'| grep 
> "priority=110" | ovn_strip_lflows], [0], [])
> +
> +check ovn-nbctl lsp-set-addresses lport1 "f0:00:0f:01:02:04 192.168.0.10" 
> "f0:00:0f:01:02:06 192.168.0.11"
> +check_row_count sb:Service_Monitor 2
> +
> +AT_CLEANUP
> +])
> +

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to