mirror of
https://github.com/espressif/openthread.git
synced 2026-08-24 19:29:52 +00:00
[srp] get parsed TXT entry from SRP server (#6113)
This commit returns parsed TXT entries for service from the SRP server, it enables prettier CLI output and easier Advertising Proxy processing. We moved the otSrpTxtEntry to include/openthread/dns.h because this structure can ( and will) also be used by DNS-SD client. We also added one more mKeyLength field in otDnsTxtEntry for saving length of the TXT key so that we can iterate over the encoded TXT data without dynamically allocating memory for each entry.
This commit is contained in:
@@ -757,7 +757,7 @@ class NodeImpl:
|
||||
'port': '12345',
|
||||
'priority': '0',
|
||||
'weight': '0',
|
||||
'TXT': '00',
|
||||
'TXT': ['abc=010203'],
|
||||
'host_fullname': 'my-host.default.service.arpa.',
|
||||
'host': 'my-host',
|
||||
'addresses': ['2001::1', '2001::2']
|
||||
@@ -783,16 +783,20 @@ class NodeImpl:
|
||||
service_list.append(service)
|
||||
continue
|
||||
|
||||
# 'port', 'priority', 'weight', 'TXT'
|
||||
for i in range(0, 4):
|
||||
# 'port', 'priority', 'weight'
|
||||
for i in range(0, 3):
|
||||
key_value = lines.pop(0).strip().split(':')
|
||||
service[key_value[0].strip()] = key_value[1].strip()
|
||||
|
||||
txt_entries = lines.pop(0).strip().split('[')[1].strip(' ]').split(',')
|
||||
txt_entries = map(str.strip, txt_entries)
|
||||
service['TXT'] = [txt for txt in txt_entries if txt]
|
||||
|
||||
service['host_fullname'] = lines.pop(0).strip().split(':')[1].strip()
|
||||
service['host'] = service['host_fullname'].split('.')[0]
|
||||
|
||||
addresses = lines.pop(0).strip().split('[')[1].strip(' ]').split(',')
|
||||
map(str.strip, addresses)
|
||||
addresses = map(str.strip, addresses)
|
||||
service['addresses'] = [addr for addr in addresses if addr]
|
||||
|
||||
service_list.append(service)
|
||||
@@ -860,8 +864,10 @@ class NodeImpl:
|
||||
self.send_command(f'srp client host address')
|
||||
self._expect_done()
|
||||
|
||||
def srp_client_add_service(self, instance_name, service_name, port):
|
||||
self.send_command(f'srp client service add {instance_name} {service_name} {port}')
|
||||
def srp_client_add_service(self, instance_name, service_name, port, priority=0, weight=0, txt_entries=[]):
|
||||
txt_record = "".join(self._encode_txt_entry(entry) for entry in txt_entries)
|
||||
self.send_command(
|
||||
f'srp client service add {instance_name} {service_name} {port} {priority} {weight} {txt_record}')
|
||||
self._expect_done()
|
||||
|
||||
def srp_client_remove_service(self, instance_name, service_name):
|
||||
@@ -874,6 +880,16 @@ class NodeImpl:
|
||||
service_lines = self._expect_command_output(cmd)
|
||||
return [self._parse_srp_client_service(line) for line in service_lines]
|
||||
|
||||
def _encode_txt_entry(self, entry):
|
||||
"""Encodes the TXT entry to the DNS-SD TXT record format as a HEX string.
|
||||
|
||||
Example usage:
|
||||
self._encode_txt_entries(['abc']) -> '03616263'
|
||||
self._encode_txt_entries(['def=']) -> '046465663d'
|
||||
self._encode_txt_entries(['xyz=XYZ']) -> '0778797a3d58595a'
|
||||
"""
|
||||
return '{:02x}'.format(len(entry)) + "".join("{:02x}".format(ord(c)) for c in entry)
|
||||
|
||||
def _parse_srp_client_service(self, line: str):
|
||||
"""Parse one line of srp service list into a dictionary which
|
||||
maps string keys to string values.
|
||||
|
||||
@@ -94,7 +94,7 @@ class SrpRegisterSingleService(thread_cert.TestCase):
|
||||
client.srp_client_set_host_name('my-host')
|
||||
client.srp_client_set_host_address('2001::1')
|
||||
client.srp_client_start(server.get_addrs()[0], client.get_srp_server_port())
|
||||
client.srp_client_add_service('my-service', '_ipps._tcp', 12345)
|
||||
client.srp_client_add_service('my-service', '_ipps._tcp', 12345, 0, 0, ['abc', 'def=', 'xyz=XYZ'])
|
||||
self.simulator.go(2)
|
||||
|
||||
self.check_host_and_service(server, client)
|
||||
@@ -135,7 +135,7 @@ class SrpRegisterSingleService(thread_cert.TestCase):
|
||||
# reused.
|
||||
#
|
||||
|
||||
client.srp_client_add_service('my-service', '_ipps._tcp', 12345)
|
||||
client.srp_client_add_service('my-service', '_ipps._tcp', 12345, 0, 0, ['abc', 'def=', 'xyz=XYZ'])
|
||||
self.simulator.go(2)
|
||||
|
||||
self.check_host_and_service(server, client)
|
||||
@@ -181,7 +181,6 @@ class SrpRegisterSingleService(thread_cert.TestCase):
|
||||
self.assertEqual(client_service['state'], 'Registered')
|
||||
|
||||
server_services = server.srp_server_get_services()
|
||||
print(server_services)
|
||||
self.assertEqual(len(server_services), 1)
|
||||
server_service = server_services[0]
|
||||
|
||||
@@ -193,6 +192,9 @@ class SrpRegisterSingleService(thread_cert.TestCase):
|
||||
self.assertEqual(int(server_service['port']), int(client_service['port']))
|
||||
self.assertEqual(int(server_service['priority']), int(client_service['priority']))
|
||||
self.assertEqual(int(server_service['weight']), int(client_service['weight']))
|
||||
# We output value of TXT entry as HEX string.
|
||||
print(server_service['TXT'])
|
||||
self.assertEqual(server_service['TXT'], ['abc', 'def=', 'xyz=58595a'])
|
||||
self.assertEqual(server_service['host'], 'my-host')
|
||||
|
||||
server_hosts = server.srp_server_get_hosts()
|
||||
|
||||
Reference in New Issue
Block a user