#include "util-privs.h"
#include "util-debug.h"
#include "util-device.h"
+#include "util-ebpf.h"
#include "util-signal.h"
#include "util-buffer.h"
UNIX_CMD_TAKE_ARGS);
UnixManagerRegisterCommand("iface-list", LiveDeviceIfaceList, NULL, 0);
UnixManagerThreadSpawn(0);
+#ifdef HAVE_PACKET_EBPF
+ UnixManagerRegisterCommand("ebpf-bypassed-stats", EBPFGetBypassedStats, NULL, 0);
+#endif
}
}
}
return ret;
}
+#ifdef BUILD_UNIX_SOCKET
+TmEcode EBPFGetBypassedStats(json_t *cmd, json_t *answer, void *data)
+{
+ LiveDevice *ldev = NULL, *ndev;
+
+ json_t *ifaces = NULL;
+ while(LiveDeviceForEach(&ldev, &ndev)) {
+ struct bpf_maps_info *bpfdata = LiveDevGetStorageById(ldev, g_livedev_storage_id);
+ if (bpfdata) {
+ uint64_t ipv4_hash_count = SC_ATOMIC_GET(bpfdata->ipv4_hash_count);
+ uint64_t ipv6_hash_count = SC_ATOMIC_GET(bpfdata->ipv6_hash_count);
+ json_t *iface = json_object();
+ if (ifaces == NULL) {
+ ifaces = json_object();
+ if (ifaces == NULL) {
+ json_object_set_new(answer, "message",
+ json_string("internal error at json object creation"));
+ return TM_ECODE_FAILED;
+ }
+ }
+ json_object_set_new(iface, "ipv4_count", json_integer(ipv4_hash_count));
+ json_object_set_new(iface, "ipv6_count", json_integer(ipv6_hash_count));
+ json_object_set_new(ifaces, ldev->dev, iface);
+ }
+ }
+ if (ifaces) {
+ json_object_set_new(answer, "message", ifaces);
+ SCReturnInt(TM_ECODE_OK);
+ }
+
+ json_object_set_new(answer, "message",
+ json_string("No interface using eBPF bypass"));
+ SCReturnInt(TM_ECODE_FAILED);
+}
+#endif
+
void EBPFRegisterExtension(void)
{
g_livedev_storage_id = LiveDevStorageRegister("bpfmap", sizeof(void *), NULL, BpfMapsInfoFree);
int EBPFSetPeerIface(const char *iface, const char *out_iface);
int EBPFUpdateFlow(Flow *f, Packet *p);
+
+#ifdef BUILD_UNIX_SOCKET
+TmEcode EBPFGetBypassedStats(json_t *cmd, json_t *answer, void *data);
+#endif
#endif