From 7c7d5090177d32efb1bffa648fcb507fe04e97f9 Mon Sep 17 00:00:00 2001 From: Martin Braun Date: Fri, 8 Dec 2017 11:17:30 -0800 Subject: mpm: Fix ECHO command The echo server was using the wrong socket options, allowing responses to be fragmented. Since we use the echo server for MTU discovery, that would have beaten the purpose. Also includes minor formatting fixes. --- mpm/python/usrp_mpm/discovery.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'mpm') diff --git a/mpm/python/usrp_mpm/discovery.py b/mpm/python/usrp_mpm/discovery.py index 9860958c9..7a133af15 100644 --- a/mpm/python/usrp_mpm/discovery.py +++ b/mpm/python/usrp_mpm/discovery.py @@ -18,6 +18,12 @@ from usrp_mpm.mpmlog import get_main_logger RESPONSE_PREAMBLE = "USRP-MPM" RESPONSE_SEP = ";" RESPONSE_CLAIMED_KEY = "claimed" +# "Max MTU" is not a redundant name. We don't know the total path MTU, but we +# can say for sure that it won't exceed a certain value, and that's the max MTU +MAX_MTU = 8000 +# For setsockopt +IP_MTU_DISCOVER = 10 +IP_PMTUDISC_DO = 2 def spawn_discovery_process(device_info, shared_state, discovery_addr): """ @@ -57,15 +63,16 @@ def _discovery_process(device_info, state, discovery_addr): # working yet sock.bind((("0.0.0.0", MPM_DISCOVERY_PORT))) send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + send_sock.setsockopt(socket.IPPROTO_IP, IP_MTU_DISCOVER, IP_PMTUDISC_DO) # TODO yeah I know that's not how you do this - discovery_addr_prefix = discovery_addr.replace('.255', '') + discovery_addr_prefix = discovery_addr.replace('.255', '') if discovery_addr == '0.0.0.0': discovery_addr_prefix = '' try: while True: - data, sender = sock.recvfrom(8000) + data, sender = sock.recvfrom(MAX_MTU) log.info("Got poked by: %s", sender[0]) # TODO this is still part of the awful subnet identification if not sender[0].startswith(discovery_addr_prefix): @@ -77,14 +84,15 @@ def _discovery_process(device_info, state, discovery_addr): log.info(send_data) send_sock.sendto(send_data, sender) elif data.strip(b"\0").startswith(b"MPM-ECHO"): - log.info("Received echo request from {sender}".format( - sender=sender[0]) - ) + log.info("Received echo request from {sender}" + .format(sender=sender[0])) send_data = data - send_sock.sendto(send_data, sender) + try: + send_sock.sendto(send_data, sender) + except OSError as ex: + log.debug("ECHO send error: %s", str(ex)) except Exception as err: - log.error("Error: %s", err) - log.error("Error type: %s", type(err)) + log.error("Unexpected error: `%s' Type: `%s'", str(err), type(err)) sock.close() send_sock.close() exit(1) -- cgit v1.2.3