get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2194262/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2194262,
    "url": "http://patchwork.ozlabs.org/api/patches/2194262/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/ovn/patch/20260207214852.86991-7-arukomoinikova@k2.cloud/",
    "project": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/projects/68/?format=api",
        "name": "Open Virtual Network development",
        "link_name": "ovn",
        "list_id": "ovs-dev.openvswitch.org",
        "list_email": "ovs-dev@openvswitch.org",
        "web_url": "http://openvswitch.org/",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260207214852.86991-7-arukomoinikova@k2.cloud>",
    "list_archive_url": null,
    "date": "2026-02-07T21:48:48",
    "name": "[ovs-dev,7/8,v2] northd: Refactor service monitor creation for consistency.",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": false,
    "hash": "dbd04d0764dc8603daf744aa4b9bcdfcde3ed773",
    "submitter": {
        "id": 89461,
        "url": "http://patchwork.ozlabs.org/api/people/89461/?format=api",
        "name": "Rukomoinikova Aleksandra",
        "email": "ARukomoinikova@k2.cloud"
    },
    "delegate": {
        "id": 94943,
        "url": "http://patchwork.ozlabs.org/api/users/94943/?format=api",
        "username": "dceara",
        "first_name": "Dumitru",
        "last_name": "Ceara",
        "email": "dceara@redhat.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/ovn/patch/20260207214852.86991-7-arukomoinikova@k2.cloud/mbox/",
    "series": [
        {
            "id": 491397,
            "url": "http://patchwork.ozlabs.org/api/series/491397/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/ovn/list/?series=491397",
            "date": "2026-02-07T21:48:46",
            "name": "[ovs-dev,1/8,v2] ovn-nb, ovn-nbctl: Add Logical Switch Port Health Check support.",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/491397/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2194262/comments/",
    "check": "success",
    "checks": "http://patchwork.ozlabs.org/api/patches/2194262/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<ovs-dev-bounces@openvswitch.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "dev@openvswitch.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@legolas.ozlabs.org",
            "ovs-dev@lists.linuxfoundation.org"
        ],
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=k2.cloud header.i=@k2.cloud header.a=rsa-sha256\n header.s=cloudmail header.b=KlFneq/E;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=140.211.166.136; helo=smtp3.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)",
            "smtp3.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key)\n header.d=k2.cloud header.i=@k2.cloud header.a=rsa-sha256 header.s=cloudmail\n header.b=KlFneq/E",
            "smtp3.osuosl.org;\n dmarc=pass (p=none dis=none) header.from=k2.cloud"
        ],
        "Received": [
            "from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4f7l3T6ZJDz1xvW\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 08 Feb 2026 08:49:25 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby smtp3.osuosl.org (Postfix) with ESMTP id D157B612EE;\n\tSat,  7 Feb 2026 21:49:19 +0000 (UTC)",
            "from smtp3.osuosl.org ([127.0.0.1])\n by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id EpGgSawV6cSU; Sat,  7 Feb 2026 21:49:16 +0000 (UTC)",
            "from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])\n\tby smtp3.osuosl.org (Postfix) with ESMTPS id 5AA07612AC;\n\tSat,  7 Feb 2026 21:49:09 +0000 (UTC)",
            "from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id 064BDC0780;\n\tSat,  7 Feb 2026 21:49:09 +0000 (UTC)",
            "from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 7E99EC0782\n for <dev@openvswitch.org>; Sat,  7 Feb 2026 21:49:03 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n by smtp3.osuosl.org (Postfix) with ESMTP id 6794A60797\n for <dev@openvswitch.org>; Sat,  7 Feb 2026 21:49:03 +0000 (UTC)",
            "from smtp3.osuosl.org ([127.0.0.1])\n by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id Q5KgLfFfw_rj for <dev@openvswitch.org>;\n Sat,  7 Feb 2026 21:49:02 +0000 (UTC)",
            "from mail1.k2.cloud (mail1.k2.cloud [109.73.14.252])\n by smtp3.osuosl.org (Postfix) with ESMTPS id 2C1F060744\n for <dev@openvswitch.org>; Sat,  7 Feb 2026 21:49:02 +0000 (UTC)"
        ],
        "X-Virus-Scanned": [
            "amavis at osuosl.org",
            "amavis at osuosl.org"
        ],
        "X-Comment": "SPF check N/A for local connections - client-ip=140.211.9.56;\n helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ",
        "DKIM-Filter": [
            "OpenDKIM Filter v2.11.0 smtp3.osuosl.org 5AA07612AC",
            "OpenDKIM Filter v2.11.0 smtp3.osuosl.org 2C1F060744"
        ],
        "Received-SPF": "Pass (mailfrom) identity=mailfrom; client-ip=109.73.14.252;\n helo=mail1.k2.cloud; envelope-from=arukomoinikova@k2.cloud;\n receiver=<UNKNOWN>",
        "DMARC-Filter": "OpenDMARC Filter v1.4.2 smtp3.osuosl.org 2C1F060744",
        "From": "Alexandra Rukomoinikova <arukomoinikova@k2.cloud>",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=k2.cloud;\n s=cloudmail; t=1770500937;\n bh=c/qjHGbpT5arEPb2JO27Qn/t0E2oOK7ViZ4C5d2ZzWU=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References;\n b=KlFneq/ELSzPuV/rsETrtkTHwEcbUYGDUTncScJ/XS8j+/KSSmDp0J9d5DLqtUgSk\n oOeDrhTLbdbP6SfR7GdwsOj0ZhJfh2zlUTMIuJNJB+Gpmc7u9ltLYzXY/QI6QG01Dn\n OaOcaCWbtdk32prrlc49MDfV+TXFsQRSp2viy4oE=",
        "To": "dev@openvswitch.org",
        "Cc": "Alexandra Rukomoinikova <arukomoinikova@k2.cloud>",
        "Date": "Sun,  8 Feb 2026 00:48:48 +0300",
        "Message-Id": "<20260207214852.86991-7-arukomoinikova@k2.cloud>",
        "In-Reply-To": "<20260207214852.86991-1-arukomoinikova@k2.cloud>",
        "References": "<20260207214852.86991-1-arukomoinikova@k2.cloud>",
        "MIME-Version": "1.0",
        "Subject": "[ovs-dev] [PATCH ovn 7/8 v2] northd: Refactor service monitor\n creation for consistency.",
        "X-BeenThere": "ovs-dev@openvswitch.org",
        "X-Mailman-Version": "2.1.30",
        "Precedence": "list",
        "List-Id": "<ovs-dev.openvswitch.org>",
        "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>",
        "List-Archive": "<http://mail.openvswitch.org/pipermail/ovs-dev/>",
        "List-Post": "<mailto:ovs-dev@openvswitch.org>",
        "List-Help": "<mailto:ovs-dev-request@openvswitch.org?subject=help>",
        "List-Subscribe": "<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "ovs-dev-bounces@openvswitch.org",
        "Sender": "\"dev\" <ovs-dev-bounces@openvswitch.org>"
    },
    "content": "1) Extract common service monitor update logic into helper functions:\n- svc_mon_update_field_if_changed() for field updates with change detection\n- svc_mon_update_status_if_online() for status transition to offline\n- svc_mon_update_mac_ip_addresses() for MAC/IP address updates\n\n2) Simplify Network Function service monitor creation by passing the\nnbrec_network_function object directly instead of individual fields.\n\n3) Improve parameter naming consistency across LB, LSP, and NF service\nmonitor creation functions.\n\nSigned-off-by: Alexandra Rukomoinikova <arukomoinikova@k2.cloud>\n---\nv2: After adding lsp hc, its ended up with three part of nearly identical\n    code for creating service monitors. I split it all into functions to make it more uniform.\n---\n northd/northd.c | 270 +++++++++++++++++++++++-------------------------\n 1 file changed, 131 insertions(+), 139 deletions(-)",
    "diff": "diff --git a/northd/northd.c b/northd/northd.c\nindex b11a57ca9..7a2c472c0 100644\n--- a/northd/northd.c\n+++ b/northd/northd.c\n@@ -3110,6 +3110,7 @@ create_or_get_service_mon(struct ovsdb_idl_txn *ovnsb_txn,\n          */\n         sbrec_service_monitor_set_ic_learned(mon_info->sbrec_mon,\n                                              false);\n+        mon_info->required = true;\n         return mon_info;\n     }\n \n@@ -3137,32 +3138,80 @@ create_or_get_service_mon(struct ovsdb_idl_txn *ovnsb_txn,\n     mon_info = xzalloc(sizeof *mon_info);\n     mon_info->sbrec_mon = sbrec_mon;\n     hmap_insert(local_svc_monitors_map, &mon_info->hmap_node, hash);\n+    mon_info->required = true;\n     return mon_info;\n }\n \n+static inline void\n+svc_mon_update_field_if_changed(\n+    const struct sbrec_service_monitor *sbrec_mon,\n+    const char *old_value, const char *new_value,\n+    void (*setter)(const struct sbrec_service_monitor *, const char *))\n+{\n+    if (old_value && new_value && strcmp(old_value, new_value)) {\n+        setter(sbrec_mon, new_value);\n+    }\n+}\n+\n+static inline void\n+svc_mon_update_status_if_online(const struct sbrec_service_monitor *sbrec_mon,\n+                                bool condition)\n+{\n+    if (condition && sbrec_mon->status &&\n+        !strcmp(sbrec_mon->status, \"online\")) {\n+        sbrec_service_monitor_set_status(sbrec_mon, \"offline\");\n+    }\n+}\n+\n+static void\n+svc_mon_update_mac_ip_addresses(const struct sbrec_service_monitor *sbrec_mon,\n+                                const struct eth_addr *svc_monitor_mac_ea,\n+                                const char *source_mac,\n+                                const char *target_mac,\n+                                const char *source_ip,\n+                                const char *target_ip)\n+{\n+    struct eth_addr ea;\n+    if (sbrec_mon->src_mac ||\n+        !eth_addr_from_string(sbrec_mon->src_mac, &ea) ||\n+        !eth_addr_equals(ea, *svc_monitor_mac_ea)) {\n+        sbrec_service_monitor_set_src_mac(sbrec_mon, source_mac);\n+    }\n+\n+    if (target_mac) {\n+        svc_mon_update_field_if_changed(sbrec_mon, sbrec_mon->mac, target_mac,\n+                                        sbrec_service_monitor_set_mac);\n+    }\n+\n+    svc_mon_update_field_if_changed(sbrec_mon, sbrec_mon->src_ip, source_ip,\n+                                    sbrec_service_monitor_set_src_ip);\n+    if (target_ip) {\n+        svc_mon_update_field_if_changed(sbrec_mon, sbrec_mon->ip, target_ip,\n+                                        sbrec_service_monitor_set_ip);\n+    }\n+}\n+\n static void\n ovn_nf_svc_create(struct ovsdb_idl_txn *ovnsb_txn,\n+                  const struct nbrec_network_function *nbrec_nf,\n                   struct hmap *local_svc_monitors_map,\n                   struct hmap *ic_learned_svc_monitors_map,\n                   struct sset *svc_monitor_lsps,\n                   struct hmap *ls_ports,\n-                  const char *mac_src, const char *mac_dst,\n-                  const char *ip_src, const char *ip_dst,\n-                  const char *logical_port, const char *logical_input_port,\n-                  const struct smap *health_check_options)\n+                  const char *global_svc_monitor_mac_src,\n+                  const struct eth_addr *global_svc_monitor_mac_ea_src,\n+                  const char *global_svc_monitor_mac_dst,\n+                  const char *global_svc_monitor_ip_src,\n+                  const char *global_svc_monitor_ip_dst)\n {\n-    static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);\n-\n-    if (!ip_src || !ip_dst || !mac_src || !mac_dst) {\n-        VLOG_ERR_RL(&rl, \"NetworkFunction: invalid service monitor \"\n-                         \"src_mac: %s dst_mac:%s src_ip:%s dst_ip:%s\",\n-                          mac_src, mac_dst, ip_src, ip_dst);\n+    if (!nbrec_nf->health_check) {\n         return;\n     }\n \n-    const char *ports[] = {logical_port, logical_input_port};\n+    static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);\n+    const char *ports[] = {nbrec_nf->outport->name, nbrec_nf->inport->name};\n     const char *chassis_name = NULL;\n-    bool port_up = true;\n+    bool port_up_condition = true;\n \n     for (size_t i = 0; i < ARRAY_SIZE(ports); i++) {\n         const char *port = ports[i];\n@@ -3183,58 +3232,40 @@ ovn_nf_svc_create(struct ovsdb_idl_txn *ovnsb_txn,\n                              op->sb->chassis->name, port);\n             }\n         }\n-        port_up = port_up && (op->sb->n_up && op->sb->up[0]);\n+        port_up_condition = port_up_condition &&\n+                            (op->sb->n_up && op->sb->up[0]);\n     }\n \n     struct service_monitor_info *mon_info =\n         create_or_get_service_mon(ovnsb_txn,\n                                   local_svc_monitors_map,\n                                   ic_learned_svc_monitors_map,\n-                                  \"network-function\", ip_dst,\n-                                  logical_port,\n-                                  logical_input_port,\n+                                  \"network-function\",\n+                                  global_svc_monitor_ip_dst,\n+                                  nbrec_nf->outport->name,\n+                                  nbrec_nf->inport->name,\n                                   0,\n                                   \"icmp\",\n                                   chassis_name,\n                                   false);\n-    ovs_assert(mon_info);\n-    sbrec_service_monitor_set_options(\n-        mon_info->sbrec_mon, health_check_options);\n-\n-    if (!mon_info->sbrec_mon->src_mac ||\n-        strcmp(mon_info->sbrec_mon->src_mac, mac_src)) {\n-        sbrec_service_monitor_set_src_mac(mon_info->sbrec_mon,\n-                                          mac_src);\n-    }\n-\n-    if (!mon_info->sbrec_mon->mac ||\n-        strcmp(mon_info->sbrec_mon->mac, mac_dst)) {\n-        sbrec_service_monitor_set_mac(mon_info->sbrec_mon,\n-                                      mac_dst);\n-    }\n-\n-    if (!mon_info->sbrec_mon->src_ip ||\n-        strcmp(mon_info->sbrec_mon->src_ip, ip_src)) {\n-        sbrec_service_monitor_set_src_ip(mon_info->sbrec_mon, ip_src);\n-    }\n-\n-    if (!mon_info->sbrec_mon->ip ||\n-        strcmp(mon_info->sbrec_mon->ip, ip_dst)) {\n-        sbrec_service_monitor_set_ip(mon_info->sbrec_mon, ip_dst);\n-    }\n-\n-    if (!port_up && mon_info->sbrec_mon->status\n-        && !strcmp(mon_info->sbrec_mon->status, \"online\")) {\n-        sbrec_service_monitor_set_status(mon_info->sbrec_mon, \"offline\");\n-    }\n-    mon_info->required = true;\n+    set_service_mon_options(mon_info->sbrec_mon,\n+                            &nbrec_nf->health_check->options,\n+                            NULL);\n+    svc_mon_update_mac_ip_addresses(mon_info->sbrec_mon,\n+                                    global_svc_monitor_mac_ea_src,\n+                                    global_svc_monitor_mac_src,\n+                                    global_svc_monitor_mac_dst,\n+                                    global_svc_monitor_ip_src,\n+                                    global_svc_monitor_ip_dst);\n+    svc_mon_update_status_if_online(mon_info->sbrec_mon,\n+                                    !port_up_condition);\n }\n \n static void\n ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn,\n                   const struct ovn_northd_lb *lb,\n-                  const char *svc_monitor_mac,\n-                  const struct eth_addr *svc_monitor_mac_ea,\n+                  const char *global_svc_monitor_mac_src,\n+                  const struct eth_addr *global_svc_monitor_mac_ea_src,\n                   struct hmap *ls_ports,\n                   struct sset *svc_monitor_lsps,\n                   struct hmap *local_svc_monitors_map,\n@@ -3267,6 +3298,9 @@ ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn,\n                 continue;\n             }\n \n+            bool port_up_condition = !backend_nb->remote_backend &&\n+                                     (!op->sb->n_up || !op->sb->up[0]);\n+\n             ovn_northd_lb_backend_set_mon_port(op, backend_nb);\n \n             /* If the service monitor is backed by a real port, use its MAC\n@@ -3277,8 +3311,8 @@ ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn,\n                 source_mac_ea = &backend_nb->svc_mon_lrp->lrp_networks.ea;\n                 source_mac = backend_nb->svc_mon_lrp->lrp_networks.ea_s;\n             } else {\n-                source_mac_ea = svc_monitor_mac_ea;\n-                source_mac = svc_monitor_mac;\n+                source_mac_ea = global_svc_monitor_mac_ea_src;\n+                source_mac = global_svc_monitor_mac_src;\n             }\n \n             const char *protocol = lb->nlb->protocol;\n@@ -3286,52 +3320,26 @@ ovn_lb_svc_create(struct ovsdb_idl_txn *ovnsb_txn,\n                 protocol = \"tcp\";\n             }\n \n-            const char *chassis_name = NULL;\n-            if (!backend_nb->remote_backend && op->sb->chassis) {\n-                chassis_name = op->sb->chassis->name;\n-            }\n-\n             struct service_monitor_info *mon_info =\n                 create_or_get_service_mon(ovnsb_txn,\n                                           local_svc_monitors_map,\n                                           ic_learned_svc_monitors_map,\n-                                          \"load-balancer\",\n-                                          backend->ip_str,\n+                                          \"load-balancer\", backend->ip_str,\n                                           backend_nb->logical_port,\n-                                          NULL,\n-                                          backend->port,\n-                                          protocol,\n-                                          chassis_name,\n+                                          NULL, backend->port, protocol,\n+                                          (!backend_nb->remote_backend &&\n+                                          op->sb->chassis) ?\n+                                          op->sb->chassis->name : NULL,\n                                           backend_nb->remote_backend);\n-            ovs_assert(mon_info);\n+\n             set_service_mon_options(mon_info->sbrec_mon,\n                                     &lb_vip_nb->lb_health_check->options,\n                                     backend_nb->az_name);\n-            struct eth_addr ea;\n-            if (!mon_info->sbrec_mon->src_mac ||\n-                !eth_addr_from_string(mon_info->sbrec_mon->src_mac, &ea) ||\n-                !eth_addr_equals(ea, *source_mac_ea)) {\n-                sbrec_service_monitor_set_src_mac(mon_info->sbrec_mon,\n-                                                  source_mac);\n-            }\n-\n-            if (!mon_info->sbrec_mon->src_ip ||\n-                strcmp(mon_info->sbrec_mon->src_ip,\n-                       backend_nb->svc_mon_src_ip)) {\n-                sbrec_service_monitor_set_src_ip(\n-                    mon_info->sbrec_mon,\n-                    backend_nb->svc_mon_src_ip);\n-            }\n-\n-            if (!backend_nb->remote_backend &&\n-                (!op->sb->n_up || !op->sb->up[0])\n-                && mon_info->sbrec_mon->status\n-                && !strcmp(mon_info->sbrec_mon->status, \"online\")) {\n-                sbrec_service_monitor_set_status(mon_info->sbrec_mon,\n-                                                 \"offline\");\n-            }\n-\n-            mon_info->required = true;\n+            svc_mon_update_mac_ip_addresses(mon_info->sbrec_mon,\n+                                            source_mac_ea, source_mac, NULL,\n+                                            backend_nb->svc_mon_src_ip, NULL);\n+            svc_mon_update_status_if_online(mon_info->sbrec_mon,\n+                                            port_up_condition);\n         }\n     }\n }\n@@ -3544,13 +3552,14 @@ build_lb_datapaths(const struct hmap *lbs, const struct hmap *lb_groups,\n }\n \n static void\n-ovn_lsp_svc_monitors_process_port(struct ovsdb_idl_txn *ovnsb_txn,\n-                                  const struct ovn_port *op,\n-                                  const char *svc_monitor_mac,\n-                                  const struct eth_addr *svc_monitor_mac_ea,\n-                                  struct hmap *local_svc_monitors_map,\n-                                  struct sset *svc_monitor_lsps)\n+ovn_lsp_svc_monitors_process_port(\n+    struct ovsdb_idl_txn *ovnsb_txn, const struct ovn_port *op,\n+    const char *global_svc_monitor_mac_src,\n+    const struct eth_addr *global_svc_monitor_mac_ea_src,\n+    struct hmap *local_svc_monitors_map,\n+    struct sset *svc_monitor_lsps)\n {\n+    bool port_up_condition = !op->sb->n_up || !op->sb->up[0];\n     sset_add(svc_monitor_lsps, op->key);\n \n     for (size_t i = 0; i < op->nbsp->n_health_checks; i++) {\n@@ -3585,31 +3594,14 @@ ovn_lsp_svc_monitors_process_port(struct ovsdb_idl_txn *ovnsb_txn,\n                                              (op->sb && op->sb->chassis) ?\n                                               op->sb->chassis->name : NULL,\n                                              false);\n-\n-        mon_info->required = true;\n         set_service_mon_options(mon_info->sbrec_mon,\n                                 &lsp_hc->options, NULL);\n-\n-        struct eth_addr ea;\n-        if (!mon_info->sbrec_mon->src_mac ||\n-            !eth_addr_from_string(mon_info->sbrec_mon->src_mac, &ea) ||\n-            !eth_addr_equals(ea, *svc_monitor_mac_ea)) {\n-            sbrec_service_monitor_set_src_mac(mon_info->sbrec_mon,\n-                                                svc_monitor_mac);\n-        }\n-\n-        if (!mon_info->sbrec_mon->src_ip ||\n-            strcmp(mon_info->sbrec_mon->src_ip, lsp_hc->src_ip)) {\n-            sbrec_service_monitor_set_src_ip(mon_info->sbrec_mon,\n-                                                lsp_hc->src_ip);\n-        }\n-\n-        if ((!op->sb->n_up || !op->sb->up[0]) &&\n-            mon_info->sbrec_mon->status &&\n-            !strcmp(mon_info->sbrec_mon->status, \"online\")) {\n-            sbrec_service_monitor_set_status(mon_info->sbrec_mon,\n-                                                \"offline\");\n-        }\n+        svc_mon_update_mac_ip_addresses(mon_info->sbrec_mon,\n+                                        global_svc_monitor_mac_ea_src,\n+                                        global_svc_monitor_mac_src,\n+                                        NULL, lsp_hc->src_ip, NULL);\n+        svc_mon_update_status_if_online(mon_info->sbrec_mon,\n+                                        port_up_condition);\n     }\n }\n \n@@ -3617,13 +3609,13 @@ static void\n build_svc_monitors_data(\n     struct ovsdb_idl_txn *ovnsb_txn,\n     struct ovsdb_idl_index *sbrec_service_monitor_by_learned_type,\n-    const char *svc_monitor_mac,\n-    const struct eth_addr *svc_monitor_mac_ea,\n-    const char *svc_monitor_mac_dst,\n-    const char *svc_monitor_ip,\n-    const char *svc_monitor_ip_dst,\n-    struct hmap *ls_ports, struct hmap *lb_dps_map,\n     const struct nbrec_network_function_table *nbrec_network_function_table,\n+    const char *global_svc_monitor_mac_src,\n+    const struct eth_addr *global_svc_monitor_mac_ea_src,\n+    const char *global_svc_monitor_mac_dst,\n+    const char *global_svc_monitor_ip_src,\n+    const char *global_svc_monitor_ip_dst,\n+    struct hmap *ls_ports, struct hmap *lb_dps_map,\n     struct sset *svc_monitor_lsps,\n     struct hmap *local_svc_monitors_map,\n     struct hmap *ic_learned_svc_monitors_map,\n@@ -3653,8 +3645,8 @@ build_svc_monitors_data(\n     struct ovn_lb_datapaths *lb_dps;\n     HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) {\n         ovn_lb_svc_create(ovnsb_txn, lb_dps->lb,\n-                          svc_monitor_mac,\n-                          svc_monitor_mac_ea,\n+                          global_svc_monitor_mac_src,\n+                          global_svc_monitor_mac_ea_src,\n                           ls_ports,\n                           svc_monitor_lsps,\n                           local_svc_monitors_map,\n@@ -3664,17 +3656,17 @@ build_svc_monitors_data(\n     const struct nbrec_network_function *nbrec_nf;\n     NBREC_NETWORK_FUNCTION_TABLE_FOR_EACH (nbrec_nf,\n                             nbrec_network_function_table) {\n-        if (nbrec_nf->health_check) {\n-            ovn_nf_svc_create(ovnsb_txn,\n-                              local_svc_monitors_map,\n-                              ic_learned_svc_monitors_map,\n-                              svc_monitor_lsps,\n-                              ls_ports,\n-                              svc_monitor_mac, svc_monitor_mac_dst,\n-                              svc_monitor_ip, svc_monitor_ip_dst,\n-                              nbrec_nf->outport->name, nbrec_nf->inport->name,\n-                              &nbrec_nf->health_check->options);\n-        }\n+        ovn_nf_svc_create(ovnsb_txn,\n+                          nbrec_nf,\n+                          local_svc_monitors_map,\n+                          ic_learned_svc_monitors_map,\n+                          svc_monitor_lsps,\n+                          ls_ports,\n+                          global_svc_monitor_mac_src,\n+                          global_svc_monitor_mac_ea_src,\n+                          global_svc_monitor_mac_dst,\n+                          global_svc_monitor_ip_src,\n+                          global_svc_monitor_ip_dst);\n     }\n \n     struct hmapx_node *hmapx_node;\n@@ -3683,8 +3675,8 @@ build_svc_monitors_data(\n         op = hmapx_node->data;\n         ovn_lsp_svc_monitors_process_port(ovnsb_txn,\n                                           op,\n-                                          svc_monitor_mac,\n-                                          svc_monitor_mac_ea,\n+                                          global_svc_monitor_mac_src,\n+                                          global_svc_monitor_mac_ea_src,\n                                           local_svc_monitors_map,\n                                           svc_monitor_lsps);\n     }\n@@ -20778,13 +20770,13 @@ ovnnb_db_run(struct northd_input *input_data,\n                                &data->lb_group_datapaths_map);\n     build_svc_monitors_data(ovnsb_txn,\n         input_data->sbrec_service_monitor_by_learned_type,\n+        input_data->nbrec_network_function_table,\n         input_data->svc_monitor_mac,\n         &input_data->svc_monitor_mac_ea,\n         input_data->svc_monitor_mac_dst,\n         input_data->svc_monitor_ip,\n         input_data->svc_monitor_ip_dst,\n         &data->ls_ports, &data->lb_datapaths_map,\n-        input_data->nbrec_network_function_table,\n         &data->svc_monitor_lsps, &data->local_svc_monitors_map,\n         input_data->ic_learned_svc_monitors_map,\n         &data->monitored_ports_map);\n",
    "prefixes": [
        "ovs-dev",
        "7/8",
        "v2"
    ]
}