On 5/10/24 12:06 PM, Eelco Chaudron wrote:
On 24 Apr 2024, at 21:53, Adrian Moreno wrote:
Maybe add a small description to this patch.
Signed-off-by: Adrian Moreno <[email protected]>
---
ofproto/ofproto-dpif-psample.c | 59 ++++++++++++++++++++++++++++++++++
ofproto/ofproto-dpif-psample.h | 1 +
ofproto/ofproto-dpif.c | 1 +
3 files changed, 61 insertions(+)
diff --git a/ofproto/ofproto-dpif-psample.c b/ofproto/ofproto-dpif-psample.c
index ea4926eb2..2d73a4ded 100644
--- a/ofproto/ofproto-dpif-psample.c
+++ b/ofproto/ofproto-dpif-psample.c
@@ -20,9 +20,12 @@
#include "dpif.h"
#include "hash.h"
#include "ofproto.h"
+#include "ofproto-dpif.h"
+#include "openvswitch/dynamic-string.h"
#include "openvswitch/hmap.h"
#include "openvswitch/thread.h"
#include "openvswitch/vlog.h"
+#include "unixctl.h"
VLOG_DEFINE_THIS_MODULE(psample);
@@ -205,3 +208,59 @@ dpif_psample_unref(struct dpif_psample *ps)
OVS_EXCLUDED(mutex)
dpif_psample_destroy(ps);
}
}
+
+/* Unix commands. */
+static void
+psample_unixctl_show(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
+{
+ struct psample_exporter_map_node *node;
+ struct ds ds = DS_EMPTY_INITIALIZER;
+ const struct ofproto_dpif *ofproto;
+ bool first = true;
+
+ ofproto = ofproto_dpif_lookup_by_name(argv[1]);
+ if (!ofproto) {
+ unixctl_command_reply_error(conn, "no such bridge");
+ return;
+ }
+
+ if (!ofproto->psample) {
+ unixctl_command_reply_error(conn, "no psample exporters configured");
+ return;
+ }
+
+ ds_put_format(&ds, "Psample statistics for bridge \"%s\":\n", argv[1]);
+
+ ovs_mutex_lock(&mutex);
We hold the global mutex for quite a long time, so we need some other solution.
I agree. I'll see how I can reduce the locking.
Also, do we need some form of sorted output?
Good point, I'll sort the outputs.
+ HMAP_FOR_EACH (node, node, &ofproto->psample->exporters_map) {
+ if (!first) {
+ ds_put_cstr(&ds, "\n");
+ } else {
+ first = false;
+ }
+
+ ds_put_format(&ds, "- Collector Set ID: %"PRIu32"\n",
+ node->exporter.collector_set_id);
+ ds_put_format(&ds, " Psample Group ID: %"PRIu32"\n",
+ node->exporter.group_id);
+ ds_put_format(&ds, " Total number of bytes: %"PRIu64"\n",
+ node->exporter.n_bytes);
+ ds_put_format(&ds, " Total number of packets: %"PRIu64"\n",
+ node->exporter.n_packets);
+ }
+ ovs_mutex_unlock(&mutex);
+
+ unixctl_command_reply(conn, ds_cstr(&ds));
+ ds_destroy(&ds);
+}
+
+void dpif_psample_init(void)
+{
+ static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
New line
+ if (ovsthread_once_start(&once)) {
+ unixctl_command_register("psample/show", "bridge", 1, 1,
+ psample_unixctl_show, NULL);
+ ovsthread_once_done(&once);
+ }
+}
diff --git a/ofproto/ofproto-dpif-psample.h b/ofproto/ofproto-dpif-psample.h
index 763fbd30b..f264ad4c2 100644
--- a/ofproto/ofproto-dpif-psample.h
+++ b/ofproto/ofproto-dpif-psample.h
@@ -34,5 +34,6 @@ bool dpif_psample_get_group_id(struct dpif_psample *,
uint32_t, uint32_t *);
void dpif_psample_credit_stats(struct dpif_psample *, uint32_t,
const struct dpif_flow_stats *);
+void dpif_psample_init(void);
#endif // OFPROTO_DPIF_PSAMPLE_H
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index f1efdd482..ebb399307 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -287,6 +287,7 @@ init(const struct shash *iface_hints)
ofproto_unixctl_init();
ofproto_dpif_trace_init();
udpif_init();
+ dpif_psample_init();
}
static void
--
2.44.0
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev