This patch removes ct_dpif_format_flags() in favor of the existing
format_flags_masked().
This has the extra bonus of showing keys with empty values as "key=0",
instead of showing "key=".

E.g., the following:

NEW tcp,orig=([...]),reply=([...]),id=1800618864,
status=CONFIRMED|SRC_NAT_DONE|DST_NAT_DONE,timeout=120,
protoinfo=(state_orig=SYN_SENT,state_reply=SYN_SENT,wscale_orig=7,
           wscale_reply=0,flags_orig=WINDOW_SCALE|SACK_PERM,flags_reply=)

becomes:

NEW tcp,orig=([...]),reply=([...]),id=1800618864,
status=CONFIRMED|SRC_NAT_DONE|DST_NAT_DONE,timeout=120,
protoinfo=(state_orig=SYN_SENT,state_reply=SYN_SENT,wscale_orig=7,
           wscale_reply=0,flags_orig=WINDOW_SCALE|SACK_PERM,flags_reply=0)

Signed-off-by: Paolo Valerio <[email protected]>
---
v2:
 - updated commit message (was "ct-dpif: Do not show flag key if empty.")
 - instead of hiding the key, ct_dpif_format_flags() got replaced by
   format_flags_masked() which will show "key=0" in case of empty flags
---
 lib/ct-dpif.c |   76 +++++++++++++++++++++++++++++----------------------------
 lib/ct-dpif.h |    4 +++
 2 files changed, 43 insertions(+), 37 deletions(-)

diff --git a/lib/ct-dpif.c b/lib/ct-dpif.c
index cfc2315e3..6f17a26b5 100644
--- a/lib/ct-dpif.c
+++ b/lib/ct-dpif.c
@@ -35,20 +35,11 @@ static void ct_dpif_format_counters(struct ds *,
                                     const struct ct_dpif_counters *);
 static void ct_dpif_format_timestamp(struct ds *,
                                      const struct ct_dpif_timestamp *);
-static void ct_dpif_format_flags(struct ds *, const char *title,
-                                 uint32_t flags, const struct flags *);
 static void ct_dpif_format_protoinfo(struct ds *, const char *title,
                                      const struct ct_dpif_protoinfo *,
                                      bool verbose);
 static void ct_dpif_format_helper(struct ds *, const char *title,
                                   const struct ct_dpif_helper *);
-
-static const struct flags ct_dpif_status_flags[] = {
-#define CT_DPIF_STATUS_FLAG(FLAG) { CT_DPIF_STATUS_##FLAG, #FLAG },
-    CT_DPIF_STATUS_FLAGS
-#undef CT_DPIF_STATUS_FLAG
-    { 0, NULL } /* End marker. */
-};
 
 /* Dumping */
 
@@ -275,6 +266,20 @@ ct_dpif_entry_uninit(struct ct_dpif_entry *entry)
     }
 }
 
+static const char *
+ct_dpif_status_flags(uint32_t flags)
+{
+    switch (flags) {
+#define CT_DPIF_STATUS_FLAG(FLAG) \
+    case CT_DPIF_STATUS_##FLAG: \
+        return #FLAG;
+    CT_DPIF_STATUS_FLAGS
+#undef CT_DPIF_TCP_FLAG
+    default:
+        return NULL;
+    }
+}
+
 void
 ct_dpif_format_entry(const struct ct_dpif_entry *entry, struct ds *ds,
                      bool verbose, bool print_stats)
@@ -305,8 +310,9 @@ ct_dpif_format_entry(const struct ct_dpif_entry *entry, 
struct ds *ds,
         ds_put_format(ds, ",zone=%"PRIu16, entry->zone);
     }
     if (verbose) {
-        ct_dpif_format_flags(ds, ",status=", entry->status,
-                             ct_dpif_status_flags);
+        format_flags_masked(ds, ",status", ct_dpif_status_flags,
+                            entry->status, CT_DPIF_STATUS_MASK,
+                            CT_DPIF_STATUS_MASK);
     }
     if (print_stats) {
         ds_put_format(ds, ",timeout=%"PRIu32, entry->timeout);
@@ -415,28 +421,6 @@ ct_dpif_format_tuple(struct ds *ds, const struct 
ct_dpif_tuple *tuple)
     }
 }
 
-static void
-ct_dpif_format_flags(struct ds *ds, const char *title, uint32_t flags,
-                     const struct flags *table)
-{
-    if (title) {
-        ds_put_cstr(ds, title);
-    }
-    for (; table->name; table++) {
-        if (flags & table->flag) {
-            ds_put_format(ds, "%s|", table->name);
-        }
-    }
-    ds_chomp(ds, '|');
-}
-
-static const struct flags tcp_flags[] = {
-#define CT_DPIF_TCP_FLAG(FLAG)  { CT_DPIF_TCPF_##FLAG, #FLAG },
-    CT_DPIF_TCP_FLAGS
-#undef CT_DPIF_TCP_FLAG
-    { 0, NULL } /* End marker. */
-};
-
 const char *ct_dpif_tcp_state_string[] = {
 #define CT_DPIF_TCP_STATE(STATE) [CT_DPIF_TCPS_##STATE] = #STATE,
     CT_DPIF_TCP_STATES
@@ -498,6 +482,20 @@ ct_dpif_format_protoinfo_tcp(struct ds *ds,
     ct_dpif_format_enum(ds, "state=", tcp_state, ct_dpif_tcp_state_string);
 }
 
+static const char *
+ct_dpif_tcp_flags(uint32_t flags)
+{
+    switch (flags) {
+#define CT_DPIF_TCP_FLAG(FLAG) \
+    case CT_DPIF_TCPF_##FLAG: \
+        return #FLAG;
+    CT_DPIF_TCP_FLAGS
+#undef CT_DPIF_TCP_FLAG
+    default:
+        return NULL;
+    }
+}
+
 static void
 ct_dpif_format_protoinfo_tcp_verbose(struct ds *ds,
                                      const struct ct_dpif_protoinfo *protoinfo)
@@ -512,10 +510,14 @@ ct_dpif_format_protoinfo_tcp_verbose(struct ds *ds,
                       protoinfo->tcp.wscale_orig,
                       protoinfo->tcp.wscale_reply);
     }
-    ct_dpif_format_flags(ds, ",flags_orig=", protoinfo->tcp.flags_orig,
-                         tcp_flags);
-    ct_dpif_format_flags(ds, ",flags_reply=", protoinfo->tcp.flags_reply,
-                         tcp_flags);
+
+    format_flags_masked(ds, ",flags_orig", ct_dpif_tcp_flags,
+                        protoinfo->tcp.flags_orig, CT_DPIF_TCPF_MASK,
+                        CT_DPIF_TCPF_MASK);
+
+    format_flags_masked(ds, ",flags_reply", ct_dpif_tcp_flags,
+                        protoinfo->tcp.flags_reply, CT_DPIF_TCPF_MASK,
+                        CT_DPIF_TCPF_MASK);
 }
 
 static void
diff --git a/lib/ct-dpif.h b/lib/ct-dpif.h
index b59cba962..2848549b0 100644
--- a/lib/ct-dpif.h
+++ b/lib/ct-dpif.h
@@ -103,6 +103,8 @@ enum ct_dpif_tcp_flags {
 #undef CT_DPIF_TCP_FLAG
 };
 
+#define CT_DPIF_TCPF_MASK ((CT_DPIF_TCPF_MAXACK_SET << 1) - 1)
+
 extern const char *ct_dpif_sctp_state_string[];
 
 #define CT_DPIF_SCTP_STATES \
@@ -173,6 +175,8 @@ enum ct_dpif_status_flags {
 #undef CT_DPIF_STATUS_FLAG
 };
 
+#define CT_DPIF_STATUS_MASK ((CT_DPIF_STATUS_UNTRACKED << 1) - 1)
+
 struct ct_dpif_entry {
     /* Const members. */
     struct ct_dpif_tuple tuple_orig;

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

Reply via email to