Exporting Datapath runtime detected features can be useful for
both debugging and for writing system unit testing easier.

Signed-off-by: Andy Zhou <[email protected]>
---
 ofproto/ofproto-dpif.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 1 deletion(-)

diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index df779c2..af70ab3 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -4891,6 +4891,38 @@ ofproto_unixctl_dpif_dump_dps(struct unixctl_conn *conn, 
int argc OVS_UNUSED,
 }
 
 static void
+show_dp_feature_b(struct ds *ds, const char *feature, bool b)
+{
+    ds_put_format(ds, "%s: %s\n", feature, b ? "Yes" : "No");
+}
+
+static void
+show_dp_feature_s(struct ds *ds, const char *feature, size_t s)
+{
+    ds_put_format(ds, "%s: %"PRIuSIZE"\n", feature, s);
+}
+
+static void
+dpif_show_support(const struct dpif_backer_support *support, struct ds *ds)
+{
+    show_dp_feature_b(ds, "Variable length userdata",
+                      support->variable_length_userdata);
+    show_dp_feature_b(ds, "Masked set action", support->masked_set_action);
+    show_dp_feature_b(ds, "Tunnel push pop",   support->tnl_push_pop);
+    show_dp_feature_b(ds, "Ufid",              support->ufid);
+    show_dp_feature_b(ds, "Trunc action",      support->trunc);
+    show_dp_feature_b(ds, "Clone action",      support->clone);
+    show_dp_feature_s(ds, "Max MPLS depth",    support->odp.max_mpls_depth);
+    show_dp_feature_b(ds, "Recirc",            support->odp.recirc);
+    show_dp_feature_b(ds, "CT state",          support->odp.ct_state);
+    show_dp_feature_b(ds, "CT zone",           support->odp.ct_zone);
+    show_dp_feature_b(ds, "CT mark",           support->odp.ct_mark);
+    show_dp_feature_b(ds, "CT label",          support->odp.ct_label);
+    show_dp_feature_b(ds, "CT State NAT",      support->odp.ct_state_nat);
+    show_dp_feature_s(ds, "Max sample nesting",support->sample_nesting);
+}
+
+static void
 dpif_show_backer(const struct dpif_backer *backer, struct ds *ds)
 {
     const struct shash_node **ofprotos;
@@ -4899,7 +4931,6 @@ dpif_show_backer(const struct dpif_backer *backer, struct 
ds *ds)
     size_t i;
 
     dpif_get_dp_stats(backer->dpif, &dp_stats);
-
     ds_put_format(ds, "%s: hit:%"PRIu64" missed:%"PRIu64"\n",
                   dpif_name(backer->dpif), dp_stats.n_hit, dp_stats.n_missed);
 
@@ -5119,6 +5150,24 @@ disable_datapath_clone(struct unixctl_conn *conn 
OVS_UNUSED,
 }
 
 static void
+ofproto_unixctl_dpif_show_dp_features(struct unixctl_conn *conn,
+                                      int argc, const char *argv[],
+                                      void *aux OVS_UNUSED)
+{
+    struct ds ds = DS_EMPTY_INITIALIZER;
+    const char *br = argv[argc -1];
+    struct ofproto_dpif *ofproto = ofproto_dpif_lookup(br);
+
+    if (!ofproto) {
+        unixctl_command_reply_error(conn, "no such bridge");
+        return;
+    }
+
+    dpif_show_support(&ofproto->backer->support, &ds);
+    unixctl_command_reply(conn, ds_cstr(&ds));
+}
+
+static void
 ofproto_unixctl_init(void)
 {
     static bool registered;
@@ -5139,6 +5188,8 @@ ofproto_unixctl_init(void)
                              ofproto_unixctl_dpif_dump_dps, NULL);
     unixctl_command_register("dpif/show", "", 0, 0, ofproto_unixctl_dpif_show,
                              NULL);
+    unixctl_command_register("dpif/show-dp-features", "bridge", 1, 1,
+                             ofproto_unixctl_dpif_show_dp_features, NULL);
     unixctl_command_register("dpif/dump-flows", "[-m] bridge", 1, 2,
                              ofproto_unixctl_dpif_dump_flows, NULL);
 
-- 
1.8.3.1

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

Reply via email to