static void peek_packet(struct peak_tracks *peek, const timeslice_t *timer, void *buf, unsigned int len, unsigned int type) { struct peak_packet stackptr(packet); struct peak_track *flow; struct peak_track _flow; if (peak_packet_parse(packet, buf, len, type) || !packet->net_len) { /* here be dragons */ return; } TRACK_KEY(&_flow, packet); flow = peak_track_acquire(peek, &_flow); if (!flow) { panic("tracker is empty\n"); } { const unsigned int dir = !!netcmp(&packet->net_saddr, &flow->addr[LOWER]); if (!flow->li[dir]) { flow->li[dir] = peak_li_get(packet); } } peek_report(packet, flow, timer); }
static void test_track(void) { struct peak_tracks *tracker; struct peak_packet packet; struct netaddr usr1, usr2; struct peak_track _flow; struct peak_track *flow; memset(&packet, 0, sizeof(packet)); netaddr4(&usr1, 0); netaddr4(&usr2, 1); tracker = peak_track_init(2); assert(tracker); packet.net_saddr = usr1; packet.net_daddr = usr2; packet.flow_sport = 80; packet.flow_dport = 51000; TRACK_KEY(&_flow, &packet); flow = peak_track_acquire(tracker, &_flow); assert(flow); assert(flow == peak_track_acquire(tracker, &_flow)); assert(flow == peak_track_acquire(tracker, flow)); packet.net_saddr = usr2; packet.net_daddr = usr1; packet.flow_sport = 51000; packet.flow_dport = 80; TRACK_KEY(&_flow, &packet); assert(flow == peak_track_acquire(tracker, &_flow)); packet.net_saddr = usr1; packet.net_daddr = usr2; packet.flow_sport = 51000; packet.flow_dport = 80; TRACK_KEY(&_flow, &packet); assert(flow != peak_track_acquire(tracker, &_flow)); packet.net_saddr = usr1; packet.net_daddr = usr2; packet.flow_sport = 51000; packet.flow_dport = 80; packet.net_type = 1; TRACK_KEY(&_flow, &packet); assert(peak_track_acquire(tracker, &_flow)); peak_track_exit(tracker); }