Skip to content

Commit 2536a3d

Browse files
committed
iperf3: Factor out data transfer logic to separate function.
So it can be reused by the server code. Signed-off-by: Damien George <damien@micropython.org>
1 parent 75c56ac commit 2536a3d

File tree

1 file changed

+39
-27
lines changed

1 file changed

+39
-27
lines changed

python-ecosys/iperf3/iperf3.py

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,33 @@ def make_cookie():
198198
return cookie
199199

200200

201+
def _transfer(udp, reverse, addr, s_data, buf, udp_last_send, udp_packet_id, udp_interval, stats):
202+
if udp:
203+
if reverse:
204+
recvninto(s_data, buf)
205+
udp_in_sec, udp_in_usec, udp_in_id = struct.unpack_from(">III", buf, 0)
206+
if udp_in_id != udp_packet_id + 1:
207+
stats.add_lost_packets(udp_in_id - (udp_packet_id + 1))
208+
udp_packet_id = udp_in_id
209+
stats.add_bytes(len(buf))
210+
else:
211+
t = ticks_us()
212+
if t - udp_last_send > udp_interval:
213+
udp_last_send += udp_interval
214+
udp_packet_id += 1
215+
struct.pack_into(">III", buf, 0, t // 1000000, t % 1000000, udp_packet_id)
216+
n = s_data.sendto(buf, addr)
217+
stats.add_bytes(n)
218+
else:
219+
if reverse:
220+
recvninto(s_data, buf)
221+
n = len(buf)
222+
else:
223+
n = s_data.send(buf)
224+
stats.add_bytes(n)
225+
return udp_last_send, udp_packet_id
226+
227+
201228
def server_once():
202229
# Listen for a connection
203230
ai = socket.getaddrinfo("0.0.0.0", 5201)
@@ -360,6 +387,7 @@ def client(host, udp=False, reverse=False, bandwidth=10 * 1024 * 1024):
360387
else:
361388
param["tcp"] = True
362389
param["len"] = 3000
390+
udp_interval = None
363391

364392
if reverse:
365393
param["reverse"] = True
@@ -403,33 +431,17 @@ def client(host, udp=False, reverse=False, bandwidth=10 * 1024 * 1024):
403431
stats.stop()
404432
else:
405433
# Send/receiver data
406-
if udp:
407-
if reverse:
408-
recvninto(s_data, buf)
409-
udp_in_sec, udp_in_usec, udp_in_id = struct.unpack_from(">III", buf, 0)
410-
# print(udp_in_sec, udp_in_usec, udp_in_id)
411-
if udp_in_id != udp_packet_id + 1:
412-
stats.add_lost_packets(udp_in_id - (udp_packet_id + 1))
413-
udp_packet_id = udp_in_id
414-
stats.add_bytes(len(buf))
415-
else:
416-
# print('UDP send', udp_last_send, t, udp_interval)
417-
if t - udp_last_send > udp_interval:
418-
udp_last_send += udp_interval
419-
udp_packet_id += 1
420-
struct.pack_into(
421-
">III", buf, 0, t // 1000000, t % 1000000, udp_packet_id
422-
)
423-
n = s_data.sendto(buf, ai[-1])
424-
stats.add_bytes(n)
425-
else:
426-
if reverse:
427-
recvninto(s_data, buf)
428-
n = len(buf)
429-
else:
430-
# print('TCP send', len(buf))
431-
n = s_data.send(buf)
432-
stats.add_bytes(n)
434+
udp_last_send, udp_packet_id = _transfer(
435+
udp,
436+
reverse,
437+
ai[-1],
438+
s_data,
439+
buf,
440+
udp_last_send,
441+
udp_packet_id,
442+
udp_interval,
443+
stats,
444+
)
433445

434446
elif pollable_is_sock(pollable, s_ctrl):
435447
# Receive command

0 commit comments

Comments
 (0)