diff --git a/python-ecosys/iperf3/iperf3.py b/python-ecosys/iperf3/iperf3.py index 363d10d59..05d69f774 100644 --- a/python-ecosys/iperf3/iperf3.py +++ b/python-ecosys/iperf3/iperf3.py @@ -198,6 +198,33 @@ def make_cookie(): return cookie +def _transfer(udp, reverse, addr, s_data, buf, udp_last_send, udp_packet_id, udp_interval, stats): + if udp: + if reverse: + recvninto(s_data, buf) + udp_in_sec, udp_in_usec, udp_in_id = struct.unpack_from(">III", buf, 0) + if udp_in_id != udp_packet_id + 1: + stats.add_lost_packets(udp_in_id - (udp_packet_id + 1)) + udp_packet_id = udp_in_id + stats.add_bytes(len(buf)) + else: + t = ticks_us() + if t - udp_last_send > udp_interval: + udp_last_send += udp_interval + udp_packet_id += 1 + struct.pack_into(">III", buf, 0, t // 1000000, t % 1000000, udp_packet_id) + n = s_data.sendto(buf, addr) + stats.add_bytes(n) + else: + if reverse: + recvninto(s_data, buf) + n = len(buf) + else: + n = s_data.send(buf) + stats.add_bytes(n) + return udp_last_send, udp_packet_id + + def server_once(): # Listen for a connection ai = socket.getaddrinfo("0.0.0.0", 5201) @@ -233,13 +260,21 @@ def server_once(): s_data, addr = s_listen.accept() print("Accepted connection:", addr) recvn(s_data, COOKIE_SIZE) + udp = False + udp_packet_id = 0 + udp_interval = None + udp_last_send = None elif param.get("udp", False): # Close TCP connection and open UDP "connection" s_listen.close() s_data = socket.socket(ai[0], socket.SOCK_DGRAM) s_data.bind(ai[-1]) data, addr = s_data.recvfrom(4) - s_data.sendto(b"\x12\x34\x56\x78", addr) + s_data.sendto(struct.pack("III", buf, 0) - # print(udp_in_sec, udp_in_usec, udp_in_id) - if udp_in_id != udp_packet_id + 1: - stats.add_lost_packets(udp_in_id - (udp_packet_id + 1)) - udp_packet_id = udp_in_id - stats.add_bytes(len(buf)) - else: - # print('UDP send', udp_last_send, t, udp_interval) - if t - udp_last_send > udp_interval: - udp_last_send += udp_interval - udp_packet_id += 1 - struct.pack_into( - ">III", buf, 0, t // 1000000, t % 1000000, udp_packet_id - ) - n = s_data.sendto(buf, ai[-1]) - stats.add_bytes(n) - else: - if reverse: - recvninto(s_data, buf) - n = len(buf) - else: - # print('TCP send', len(buf)) - n = s_data.send(buf) - stats.add_bytes(n) + udp_last_send, udp_packet_id = _transfer( + udp, + reverse, + ai[-1], + s_data, + buf, + udp_last_send, + udp_packet_id, + udp_interval, + stats, + ) elif pollable_is_sock(pollable, s_ctrl): # Receive command @@ -534,7 +559,7 @@ def main(): client(opt_host, opt_udp, opt_reverse) -if sys.platform == "linux": +if sys.implementation.name != "micropython": def pollable_is_sock(pollable, sock): return sock is not None and pollable[0] == sock.fileno() @@ -544,12 +569,12 @@ def ticks_us(): def ticks_diff(a, b): return a - b - - if __name__ == "__main__": - main() else: def pollable_is_sock(pollable, sock): return pollable[0] == sock from time import ticks_us, ticks_diff + +if sys.platform == "linux" and __name__ == "__main__": + main() diff --git a/python-ecosys/iperf3/manifest.py b/python-ecosys/iperf3/manifest.py index 06964ce2a..d63c2d6d1 100644 --- a/python-ecosys/iperf3/manifest.py +++ b/python-ecosys/iperf3/manifest.py @@ -1,3 +1,3 @@ -metadata(version="0.1.4", pypi="iperf3", pypi_publish="uiperf3") +metadata(version="0.1.5", pypi="iperf3", pypi_publish="uiperf3") module("iperf3.py")