[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:
kangping
2021-01-28 21:12:56 -08:00
committed by GitHub
parent c03458433e
commit 46f796d4f0
17 changed files with 382 additions and 197 deletions
+22 -6
View File
@@ -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()