def mdns_server(esp_host): global esp_answered UDP_IP = '0.0.0.0' UDP_PORT = 5353 MCAST_GRP = '224.0.0.251' TESTER_NAME = u'tinytester.local' TESTER_NAME_LWIP = u'tinytester-lwip.local' QUERY_TIMEOUT = 0.2 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) sock.setblocking(False) sock.bind((UDP_IP, UDP_PORT)) mreq = struct.pack('4sl', socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) last_query_timepoint = time.time() while not stop_mdns_server.is_set(): try: current_time = time.time() if current_time - last_query_timepoint > QUERY_TIMEOUT: last_query_timepoint = current_time if not esp_answered.is_set(): sock.sendto(get_dns_query_for_esp(esp_host), (MCAST_GRP, UDP_PORT)) if not esp_delegated_answered.is_set(): sock.sendto(get_dns_query_for_esp(esp_host + '-delegated'), (MCAST_GRP, UDP_PORT)) timeout = max( 0, QUERY_TIMEOUT - (current_time - last_query_timepoint)) read_socks, _, _ = select.select([sock], [], [], timeout) if not read_socks: continue data, addr = sock.recvfrom(1024) dns = dpkt.dns.DNS(data) if len(dns.qd) > 0 and dns.qd[0].type == dpkt.dns.DNS_A: if dns.qd[0].name == TESTER_NAME: console_log('Received query: {} '.format(dns.__repr__())) sock.sendto(get_dns_answer_to_mdns(TESTER_NAME), (MCAST_GRP, UDP_PORT)) elif dns.qd[0].name == TESTER_NAME_LWIP: console_log('Received query: {} '.format(dns.__repr__())) sock.sendto( get_dns_answer_to_mdns_lwip(TESTER_NAME_LWIP, dns.id), addr) if len(dns.an) > 0 and dns.an[0].type == dpkt.dns.DNS_A: if dns.an[0].name == esp_host + u'.local': console_log( 'Received answer to esp32-mdns query: {}'.format( dns.__repr__())) esp_answered.set() if dns.an[0].name == esp_host + u'-delegated.local': console_log( 'Received answer to esp32-mdns-delegate query: {}'. format(dns.__repr__())) esp_delegated_answered.set() except socket.timeout: break except dpkt.UnpackError: continue
def get_dns_query_for_esp(esp_host): dns = dpkt.dns.DNS( b'\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01' ) dns.qd[0].name = esp_host + u'.local' print("Created query for esp host: {} ".format(dns.__repr__())) return dns.pack()
def get_dns_query_for_esp(esp_host): # type:(str) -> dpkt.dns.Msg dns = dpkt.dns.DNS() arr = dpkt.dns.DNS.RR() arr.cls = dpkt.dns.DNS_IN arr.name = esp_host + u'.local' dns.qd.append(arr) console_log('Created query for esp host: {} '.format(dns.__repr__())) return dns.pack()
def get_dns_answer_to_mdns_lwip(tester_host, id): dns = dpkt.dns.DNS(b"\x5e\x39\x84\x00\x00\x01\x00\x01\x00\x00\x00\x00\x0a\x64\x61\x76\x69\x64" b"\x2d\x63\x6f\x6d\x70\x05\x6c\x6f\x63\x61\x6c\x00\x00\x01\x00\x01\xc0\x0c" b"\x00\x01\x00\x01\x00\x00\x00\x0a\x00\x04\xc0\xa8\x0a\x6c") dns.qd[0].name = tester_host dns.an[0].name = tester_host dns.an[0].ip = socket.inet_aton('127.0.0.1') dns.an[0].rdata = socket.inet_aton('127.0.0.1') dns.id = id print("Created answer to mdns (lwip) query: {} ".format(dns.__repr__())) return dns.pack()
def mdns_server(esp_host): global esp_answered UDP_IP = "0.0.0.0" UDP_PORT = 5353 MCAST_GRP = '224.0.0.251' TESTER_NAME = u'tinytester.local' TESTER_NAME_LWIP = u'tinytester-lwip.local' sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) sock.bind((UDP_IP, UDP_PORT)) mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) sock.settimeout(30) while not stop_mdns_server.is_set(): try: if not esp_answered.is_set(): sock.sendto(get_dns_query_for_esp(esp_host), (MCAST_GRP, UDP_PORT)) time.sleep(0.2) data, addr = sock.recvfrom(1024) dns = dpkt.dns.DNS(data) if len(dns.qd) > 0 and dns.qd[0].type == dpkt.dns.DNS_A: if dns.qd[0].name == TESTER_NAME: print("Received query: {} ".format(dns.__repr__())) sock.sendto(get_dns_answer_to_mdns(TESTER_NAME), (MCAST_GRP, UDP_PORT)) elif dns.qd[0].name == TESTER_NAME_LWIP: print("Received query: {} ".format(dns.__repr__())) sock.sendto( get_dns_answer_to_mdns_lwip(TESTER_NAME_LWIP, dns.id), addr) if len(dns.an) > 0 and dns.an[0].type == dpkt.dns.DNS_A: if dns.an[0].name == esp_host + u'.local': print("Received answer to esp32-mdns query: {}".format( dns.__repr__())) esp_answered.set() except socket.timeout: break except dpkt.UnpackError: continue
def get_dns_answer_to_mdns(tester_host): # type:(str) -> dpkt.dns.Msg dns = dpkt.dns.DNS() dns.op = dpkt.dns.DNS_QR | dpkt.dns.DNS_AA dns.rcode = dpkt.dns.DNS_RCODE_NOERR arr = dpkt.dns.DNS.RR() arr.cls = dpkt.dns.DNS_IN arr.type = dpkt.dns.DNS_A arr.name = tester_host arr.ip = socket.inet_aton('127.0.0.1') dns.an.append(arr) console_log('Created answer to mdns query: {} '.format(dns.__repr__())) return dns.pack()
def get_dns_answer_to_mdns(tester_host): dns = dpkt.dns.DNS(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') dns.op = dpkt.dns.DNS_QR | dpkt.dns.DNS_AA dns.rcode = dpkt.dns.DNS_RCODE_NOERR arr = dpkt.dns.DNS.RR() arr.cls = dpkt.dns.DNS_IN arr.type = dpkt.dns.DNS_A arr.name = tester_host arr.ip = socket.inet_aton('127.0.0.1') dns. an.append(arr) print("Created answer to mdns query: {} ".format(dns.__repr__())) return dns.pack()
def mdns_server(esp_host): global g_done UDP_IP = "0.0.0.0" UDP_PORT = 5353 MCAST_GRP = '224.0.0.251' sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) sock.bind((UDP_IP, UDP_PORT)) mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) dns = dpkt.dns.DNS( b'\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01' ) sock.settimeout(30) resp_dns = dpkt.dns.DNS( b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ) resp_dns.op = dpkt.dns.DNS_QR | dpkt.dns.DNS_AA resp_dns.rcode = dpkt.dns.DNS_RCODE_NOERR arr = dpkt.dns.DNS.RR() arr.cls = dpkt.dns.DNS_IN arr.type = dpkt.dns.DNS_A arr.name = u'tinytester.local' arr.ip = socket.inet_aton('127.0.0.1') resp_dns.an.append(arr) sock.sendto(resp_dns.pack(), (MCAST_GRP, UDP_PORT)) while g_run_server: try: m = sock.recvfrom(1024) dns = dpkt.dns.DNS(m[0]) if len(dns.qd) > 0 and dns.qd[0].type == dpkt.dns.DNS_A: if dns.qd[0].name == u'tinytester.local': print(dns.__repr__(), dns.qd[0].name) sock.sendto(resp_dns.pack(), (MCAST_GRP, UDP_PORT)) if len(dns.an) > 0 and dns.an[0].type == dpkt.dns.DNS_A: if dns.an[0].name == esp_host + u'.local': print("Received answer esp32-mdns query") g_done = True print(dns.an[0].name) dns = dpkt.dns.DNS( b'\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01' ) dns.qd[0].name = esp_host + u'.local' sock.sendto(dns.pack(), (MCAST_GRP, UDP_PORT)) print("Sending esp32-mdns query") time.sleep(0.5) sock.sendto(resp_dns.pack(), (MCAST_GRP, UDP_PORT)) except socket.timeout: break except dpkt.UnpackError: continue
def get_mdns_service_query(service): # type:(str) -> dpkt.dns.Msg dns = dpkt.dns.DNS() dns.op = dpkt.dns.DNS_QR | dpkt.dns.DNS_AA dns.rcode = dpkt.dns.DNS_RCODE_NOERR arr = dpkt.dns.DNS.RR() arr.cls = dpkt.dns.DNS_IN arr.type = dpkt.dns.DNS_SRV arr.name = service arr.target = socket.inet_aton('127.0.0.1') arr.srvname = service dns.qd.append(arr) console_log('Created mdns service query: {} '.format(dns.__repr__())) return dns.pack()
def get_dns_answer_to_service_query( mdns_service): # type:(str) -> dpkt.dns.Msg dns = dpkt.dns.DNS() dns.op = dpkt.dns.DNS_QR | dpkt.dns.DNS_AA dns.rcode = dpkt.dns.DNS_RCODE_NOERR arr = dpkt.dns.DNS.RR() arr.name = mdns_service arr.cls = dpkt.dns.DNS_IN arr.type = dpkt.dns.DNS_SRV arr.priority = 0 arr.weight = 0 arr.port = 100 arr.srvname = mdns_service arr.ip = socket.inet_aton('127.0.0.1') dns.an.append(arr) console_log('Created answer to mdns query: {} '.format(dns.__repr__())) return dns.pack()
def mdns_listener(esp_host): # type:(str) -> None print('mdns_listener thread started') UDP_IP = '0.0.0.0' sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) sock.setblocking(False) sock.bind((UDP_IP, UDP_PORT)) mreq = struct.pack('4sl', socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) last_query_timepoint = time.time() QUERY_TIMEOUT = 0.2 while not stop_mdns_listener.is_set(): try: start_mdns_listener.set() current_time = time.time() if current_time - last_query_timepoint > QUERY_TIMEOUT: last_query_timepoint = current_time timeout = max( 0, QUERY_TIMEOUT - (current_time - last_query_timepoint)) read_socks, _, _ = select.select([sock], [], [], timeout) if not read_socks: continue data, _ = sock.recvfrom(1024) dns = dpkt.dns.DNS(data) if len(dns.qd) > 0: if dns.qd[0].name == HOST_NAME: console_log('Received query: {} '.format(dns.__repr__())) sock.sendto(get_dns_answer_to_mdns(HOST_NAME), (MCAST_GRP, UDP_PORT)) if dns.qd[0].name == HOST_NAME: console_log('Received query: {} '.format(dns.__repr__())) sock.sendto(get_dns_answer_to_mdns(HOST_NAME), (MCAST_GRP, UDP_PORT)) if dns.qd[0].name == MDNS_HOST_SERVICE: print(dns.qd[0].name) console_log('Received query: {} '.format(dns.__repr__())) sock.sendto( get_dns_answer_to_service_query(MDNS_HOST_SERVICE), (MCAST_GRP, UDP_PORT)) if len(dns.an) == 1: if dns.an[0].name == SERVICE_NAME: console_log('Received answer to service query: {}'.format( dns.__repr__())) esp_service_answered.set() if len(dns.an) > 1: if dns.an[1].name == SUB_SERVICE_NAME: console_log( 'Received answer for sub service query: {}'.format( dns.__repr__())) esp_sub_service_answered.set() if len(dns.an) > 0 and dns.an[0].type == dpkt.dns.DNS_A: if dns.an[0].name == esp_host + u'.local': console_log( 'Received answer to esp32-mdns query: {}'.format( dns.__repr__())) esp_host_answered.set() if dns.an[0].name == esp_host + u'-delegated.local': console_log( 'Received answer to esp32-mdns-delegate query: {}'. format(dns.__repr__())) esp_delegated_host_answered.set() except socket.timeout: break except dpkt.UnpackError: continue