Create svc_monitor_type_from_sb() and svc_monitor_proto_from_sb()
helper functions for cleaner code. Add svc_monitor_type_allows_proto()
to validate protocol-type compatibility. Simplify ICMP handling
by removing redundant type checks since validation is now centralized.

Signed-off-by: Alexandra Rukomoinikova <[email protected]>
---
 controller/pinctrl.c | 91 +++++++++++++++++++++++++++++---------------
 1 file changed, 60 insertions(+), 31 deletions(-)

diff --git a/controller/pinctrl.c b/controller/pinctrl.c
index 7b80f4725..476410dcc 100644
--- a/controller/pinctrl.c
+++ b/controller/pinctrl.c
@@ -7021,6 +7021,55 @@ pinctrl_find_svc_monitor(uint32_t dp_key, uint32_t 
port_key,
     return NULL;
 }
 
+static enum svc_monitor_type
+svc_monitor_type_from_sb(const struct sbrec_service_monitor *sb)
+{
+    if (sb->type &&
+        !strcmp(sb->type, "network-function")) {
+        return SVC_MON_TYPE_NF;
+    }
+
+    if (sb->type &&
+        !strcmp(sb->type, "logical-switch-port")) {
+        return SVC_MON_TYPE_LSP;
+    }
+
+    return SVC_MON_TYPE_LB;
+}
+
+static enum svc_monitor_protocol
+svc_monitor_proto_from_sb(const struct sbrec_service_monitor *sb)
+{
+    if (!strcmp(sb->protocol, "udp")) {
+        return SVC_MON_PROTO_UDP;
+    }
+
+    if (!strcmp(sb->protocol, "icmp")) {
+        return SVC_MON_PROTO_ICMP;
+    }
+
+    return SVC_MON_PROTO_TCP;
+}
+
+static bool
+svc_monitor_type_allows_proto(enum svc_monitor_type type,
+                              enum svc_monitor_protocol proto)
+{
+    switch (type) {
+    case SVC_MON_TYPE_NF:
+        return proto == SVC_MON_PROTO_ICMP;
+
+    case SVC_MON_TYPE_LB:
+        return proto == SVC_MON_PROTO_TCP ||
+               proto == SVC_MON_PROTO_UDP;
+
+    case SVC_MON_TYPE_LSP:
+        return true;
+    }
+
+    return false;
+}
+
 static void
 sync_svc_monitors(struct ovsdb_idl_txn *ovnsb_idl_txn,
                   const struct sbrec_service_monitor_table *svc_mon_table,
@@ -7037,26 +7086,6 @@ sync_svc_monitors(struct ovsdb_idl_txn *ovnsb_idl_txn,
 
     const struct sbrec_service_monitor *sb_svc_mon;
     SBREC_SERVICE_MONITOR_TABLE_FOR_EACH (sb_svc_mon, svc_mon_table) {
-        enum svc_monitor_type mon_type;
-        if (sb_svc_mon->type && !strcmp(sb_svc_mon->type,
-                                        "network-function")) {
-            mon_type = SVC_MON_TYPE_NF;
-        } else if (sb_svc_mon->type && !strcmp(sb_svc_mon->type,
-                                        "logical-switch-port")) {
-            mon_type = SVC_MON_TYPE_LSP;
-        } else {
-            mon_type = SVC_MON_TYPE_LB;
-        }
-
-        enum svc_monitor_protocol protocol;
-        if (!strcmp(sb_svc_mon->protocol, "udp")) {
-            protocol = SVC_MON_PROTO_UDP;
-        } else if (!strcmp(sb_svc_mon->protocol, "icmp")) {
-            protocol = SVC_MON_PROTO_ICMP;
-        } else {
-            protocol = SVC_MON_PROTO_TCP;
-        }
-
         const struct sbrec_port_binding *pb
             = lport_lookup_by_name(sbrec_port_binding_by_name,
                                    sb_svc_mon->logical_port);
@@ -7090,10 +7119,16 @@ sync_svc_monitors(struct ovsdb_idl_txn *ovnsb_idl_txn,
         struct eth_addr ea;
         bool mac_found = false;
 
+        enum svc_monitor_type mon_type =
+            svc_monitor_type_from_sb(sb_svc_mon);
+        enum svc_monitor_protocol protocol =
+            svc_monitor_proto_from_sb(sb_svc_mon);
+
+        if (!svc_monitor_type_allows_proto(mon_type, protocol)) {
+            continue;
+        }
+
         if (mon_type == SVC_MON_TYPE_NF) {
-            if (protocol != SVC_MON_PROTO_ICMP) {
-                continue;
-            }
             input_pb = lport_lookup_by_name(sbrec_port_binding_by_name,
                                             sb_svc_mon->logical_input_port);
             if (!input_pb) {
@@ -8432,10 +8467,7 @@ pinctrl_handle_svc_check(struct rconn *swconn, const 
struct flow *ip_flow,
                                  "request" : "reply");
                     return;
                 }
-                if (svc_mon->type == SVC_MON_TYPE_NF ||
-                    svc_mon->type == SVC_MON_TYPE_LSP) {
-                    pinctrl_handle_icmp_svc_check(pkt_in, svc_mon);
-                }
+                pinctrl_handle_icmp_svc_check(pkt_in, svc_mon);
                 return;
             }
         } else if (in_eth->eth_type == htons(ETH_TYPE_IPV6)) {
@@ -8461,10 +8493,7 @@ pinctrl_handle_svc_check(struct rconn *swconn, const 
struct flow *ip_flow,
                                  "request" : "reply");
                     return;
                 }
-                if (svc_mon->type == SVC_MON_TYPE_NF ||
-                    svc_mon->type == SVC_MON_TYPE_LSP) {
-                    pinctrl_handle_icmp_svc_check(pkt_in, svc_mon);
-                }
+                pinctrl_handle_icmp_svc_check(pkt_in, svc_mon);
                 return;
             }
         }
-- 
2.48.1

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

Reply via email to