Skip to content

Commit 8c81d23

Browse files
committed
Encode frequency field in wrxfwd_t in network byte order
Use only ip address of forwarder in antenna_id inside of aggregator. Add more checks in forwarder/aggregator unit tests
1 parent 613e45f commit 8c81d23

File tree

4 files changed

+49
-10
lines changed

4 files changed

+49
-10
lines changed

src/rx.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ void Forwarder::process_packet(const uint8_t *buf, size_t size, uint8_t wlan_idx
357357
uint8_t bandwidth, sockaddr_in *sockaddr)
358358
{
359359
wrxfwd_t fwd_hdr = { .wlan_idx = wlan_idx,
360-
.freq = freq,
360+
.freq = htons(freq),
361361
.mcs_index = mcs_index,
362362
.bandwidth = bandwidth };
363363

@@ -500,7 +500,8 @@ void Aggregator::log_rssi(const sockaddr_in *sockaddr, uint8_t wlan_idx, const u
500500

501501
if (sockaddr != NULL && sockaddr->sin_family == AF_INET)
502502
{
503-
key.antenna_id = ((uint64_t)ntohl(sockaddr->sin_addr.s_addr) << 32 | (uint64_t)ntohs(sockaddr->sin_port) << 16);
503+
// We ignore port here because for the one host (wlan_idx, antenna_id) will be unique key for all forwarder processes.
504+
key.antenna_id = ((uint64_t)ntohl(sockaddr->sin_addr.s_addr) << 32);
504505
}
505506

506507
key.antenna_id |= ((uint64_t)wlan_idx << 8 | (uint64_t)ant[i]);
@@ -972,8 +973,9 @@ void network_loop(int srv_port, Aggregator &agg, int log_interval, int rcv_buf_s
972973
fprintf(stderr, "Short packet (rx fwd header)\n");
973974
continue;
974975
}
975-
agg.process_packet(buf, rsize - sizeof(wrxfwd_t), fwd_hdr.wlan_idx, fwd_hdr.antenna,
976-
fwd_hdr.rssi, fwd_hdr.noise, fwd_hdr.freq,
976+
agg.process_packet(buf, rsize - sizeof(wrxfwd_t),
977+
fwd_hdr.wlan_idx, fwd_hdr.antenna,
978+
fwd_hdr.rssi, fwd_hdr.noise, ntohs(fwd_hdr.freq),
977979
fwd_hdr.mcs_index, fwd_hdr.bandwidth, &sockaddr);
978980
}
979981
if(errno != EWOULDBLOCK) throw runtime_error(string_format("Error receiving packet: %s", strerror(errno)));

src/tx.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,14 @@ class UdpTransmitter : public Transmitter
210210

211211
memset(fwd_hdr.antenna, 0xff, sizeof(fwd_hdr.antenna));
212212
memset(fwd_hdr.rssi, SCHAR_MIN, sizeof(fwd_hdr.rssi));
213+
memset(fwd_hdr.noise, SCHAR_MAX, sizeof(fwd_hdr.noise));
213214

215+
fwd_hdr.mcs_index = 1;
216+
fwd_hdr.bandwidth = 20;
217+
fwd_hdr.freq = htons(4321);
214218
fwd_hdr.antenna[0] = (uint8_t)(rand() % 2);
215-
fwd_hdr.rssi[0] = (int8_t)(rand() & 0xff);
219+
fwd_hdr.rssi[0] = -42;
220+
fwd_hdr.noise[0] = -70;
216221

217222
struct iovec iov[2] = {{ .iov_base = (void*)&fwd_hdr,
218223
.iov_len = sizeof(fwd_hdr)},

wfb_ng/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def add_rssi_cb(self, rssi_cb):
185185
def _stats_agg_by_freq(self, ant_stats):
186186
stats_agg = {}
187187

188-
for (((freq, mcs_index, bandwith), ant_id),
188+
for (((freq, mcs_index, bandwidth), ant_id),
189189
(pkt_s,
190190
rssi_min, rssi_avg, rssi_max,
191191
snr_min, snr_avg, snr_max)) in ant_stats.items():
@@ -561,7 +561,7 @@ def init_wlans(max_bw, wlans):
561561
elif max_bw == 160:
562562
ht_mode = '160MHz'
563563
else:
564-
raise Exception('Unsupported bandwith %d MHz' % (max_bw,))
564+
raise Exception('Unsupported bandwidth %d MHz' % (max_bw,))
565565

566566
if not settings.common.primary:
567567
log.msg('Skip card init due to secondary role')

wfb_ng/tests/test_txrx.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,37 @@ def _f(self, *args, **kwargs):
3535
return _f
3636

3737

38+
class FakeAntennaProtocol(object):
39+
def process_new_session(self, rx_id, session):
40+
log.msg('%s new session %r' % (rx_id, session))
41+
42+
43+
def update_rx_stats(self, rx_id, packet_stats, ant_stats, session):
44+
log.msg('%s %r %r %r' % (rx_id, packet_stats, ant_stats, session))
45+
46+
for (((freq, mcs_index, bandwidth), ant_id),
47+
(pkt_s,
48+
rssi_min, rssi_avg, rssi_max,
49+
snr_min, snr_avg, snr_max)) in ant_stats.items():
50+
51+
assert pkt_s >= 0
52+
assert freq == 4321
53+
assert mcs_index == 1
54+
assert bandwidth == 20
55+
assert rssi_min == rssi_avg == rssi_max == -42
56+
assert snr_min == snr_avg == snr_max == 28
57+
58+
host, port, wlan_idx, ant_id = struct.unpack('!IHBB', ant_id.to_bytes(8, byteorder='big'))
59+
assert host == 0x7f000001
60+
assert port == 0
61+
assert 0 <= wlan_idx < 2
62+
assert 0 <= ant_id < 2
63+
64+
def update_tx_stats(self, tx_id, packet_stats, ant_latency):
65+
log.msg('%s %r %r' % (tx_id, packet_stats, ant_latency))
66+
67+
68+
3869
class TXCommandClient(DatagramProtocol):
3970
noisy = False
4071

@@ -100,8 +131,9 @@ def setUp(self):
100131
# '-Q', '-P 1', ## requires root priv
101132
'-i', str(link_id), '-e', str(epoch), '-R', str(512 * 1024), 'wlan0']
102133

103-
self.rx_pp = RXProtocol(None, cmd_rx, 'debug rx')
104-
self.tx_pp = TXProtocol(None, cmd_tx, 'debug tx')
134+
ap = FakeAntennaProtocol()
135+
self.rx_pp = RXProtocol(ap, cmd_rx, 'debug rx')
136+
self.tx_pp = TXProtocol(ap, cmd_tx, 'debug tx')
105137

106138
self.rx_pp.start().addErrback(lambda f: f.trap('twisted.internet.error.ProcessTerminated'))
107139
self.tx_pp.start().addErrback(lambda f: f.trap('twisted.internet.error.ProcessTerminated'))
@@ -136,7 +168,7 @@ def test_txrx(self):
136168
if i not in (4, 9, 10, 11, 12, 11 + 4, 11 + 5, 11 + 6):
137169
self.rxp.send_msg(pkt)
138170

139-
yield df_sleep(0.1)
171+
yield df_sleep(1.1)
140172
self.assertEqual([b'm%d' % (i + 1,) for i in range(16) if i + 1 != 4], self.rxp.rxq)
141173

142174

0 commit comments

Comments
 (0)