bypass: implement iface-bypassed-stat for callback

pull/3952/head
Eric Leblond 6 years ago committed by Victor Julien
parent 51ab06256a
commit 8c97998cb9

@ -285,6 +285,13 @@ static int FlowManagerFlowTimeout(Flow *f, enum FlowState state, struct timeval
return 0; return 0;
} else { } else {
SCLogDebug("No new packet, dead flow %ld", FlowGetId(f)); SCLogDebug("No new packet, dead flow %ld", FlowGetId(f));
if (f->livedev) {
if (FLOW_IS_IPV4(f)) {
LiveDevAddBypassStats(f->livedev, -1, AF_INET);
} else if (FLOW_IS_IPV6(f)) {
LiveDevAddBypassStats(f->livedev, -1, AF_INET6);
}
}
if (counters) { if (counters) {
counters->bypassed_count++; counters->bypassed_count++;
} }

@ -2436,6 +2436,7 @@ static int AFPBypassCallback(Packet *p)
return 0; return 0;
} }
EBPFUpdateFlow(p->flow, p, NULL); EBPFUpdateFlow(p->flow, p, NULL);
LiveDevAddBypassStats(p->livedev, 1, AF_INET);
return AFPSetFlowStorage(p, p->afp_v.v4_map_fd, keys[0], keys[1]); return AFPSetFlowStorage(p, p->afp_v.v4_map_fd, keys[0], keys[1]);
} }
/* For IPv6 case we don't handle extended header in eBPF */ /* For IPv6 case we don't handle extended header in eBPF */
@ -2493,6 +2494,7 @@ static int AFPBypassCallback(Packet *p)
} }
if (p->flow) if (p->flow)
EBPFUpdateFlow(p->flow, p, NULL); EBPFUpdateFlow(p->flow, p, NULL);
LiveDevAddBypassStats(p->livedev, 1, AF_INET6);
return AFPSetFlowStorage(p, p->afp_v.v6_map_fd, keys[0], keys[1]); return AFPSetFlowStorage(p, p->afp_v.v6_map_fd, keys[0], keys[1]);
} }
#endif #endif
@ -2577,6 +2579,7 @@ static int AFPXDPBypassCallback(Packet *p)
SCFree(keys[1]); SCFree(keys[1]);
return 0; return 0;
} }
LiveDevAddBypassStats(p->livedev, 1, AF_INET);
return AFPSetFlowStorage(p, p->afp_v.v4_map_fd, keys[0], keys[1]); return AFPSetFlowStorage(p, p->afp_v.v4_map_fd, keys[0], keys[1]);
} }
/* For IPv6 case we don't handle extended header in eBPF */ /* For IPv6 case we don't handle extended header in eBPF */
@ -2631,6 +2634,7 @@ static int AFPXDPBypassCallback(Packet *p)
SCFree(keys[1]); SCFree(keys[1]);
return 0; return 0;
} }
LiveDevAddBypassStats(p->livedev, 1, AF_INET6);
return AFPSetFlowStorage(p, p->afp_v.v6_map_fd, keys[0], keys[1]); return AFPSetFlowStorage(p, p->afp_v.v6_map_fd, keys[0], keys[1]);
} }
#endif #endif

@ -513,6 +513,26 @@ void LiveDevSetBypassStats(LiveDevice *dev, uint64_t cnt, int family)
} }
} }
/**
* Modify number of currently bypassed flows for a protocol family
*
* \param dev pointer to LiveDevice to set stats for
* \param cnt number of currently bypassed flows
* \param family AF_INET to set IPv4 count or AF_INET6 to set IPv6 count
*/
void LiveDevAddBypassStats(LiveDevice *dev, int64_t cnt, int family)
{
BypassInfo *bpfdata = LiveDevGetStorageById(dev, g_bypass_storage_id);
if (bpfdata) {
if (family == AF_INET) {
SC_ATOMIC_ADD(bpfdata->ipv4_hash_count, cnt);
} else if (family == AF_INET6) {
SC_ATOMIC_ADD(bpfdata->ipv6_hash_count, cnt);
}
}
}
#ifdef BUILD_UNIX_SOCKET #ifdef BUILD_UNIX_SOCKET
TmEcode LiveDeviceGetBypassedStats(json_t *cmd, json_t *answer, void *data) TmEcode LiveDeviceGetBypassedStats(json_t *cmd, json_t *answer, void *data)
{ {

@ -66,6 +66,7 @@ int LiveRegisterDeviceName(const char *dev);
int LiveRegisterDevice(const char *dev); int LiveRegisterDevice(const char *dev);
int LiveDevUseBypass(LiveDevice *dev); int LiveDevUseBypass(LiveDevice *dev);
void LiveDevSetBypassStats(LiveDevice *dev, uint64_t cnt, int family); void LiveDevSetBypassStats(LiveDevice *dev, uint64_t cnt, int family);
void LiveDevAddBypassStats(LiveDevice *dev, int64_t cnt, int family);
int LiveGetDeviceCount(void); int LiveGetDeviceCount(void);
const char *LiveGetDeviceName(int number); const char *LiveGetDeviceName(int number);
LiveDevice *LiveGetDevice(const char *dev); LiveDevice *LiveGetDevice(const char *dev);

Loading…
Cancel
Save