[border-router] accept RA initiated from the infra interface (#6348)

Accept RA initiated from the infra interface so that we can detect the
existence of another RA daemon which is working on the same infra
interface.

Also enhance the test_single_border_router.py test script to make it
more readable.
This commit is contained in:
kangping
2021-04-07 11:01:29 -07:00
committed by GitHub
parent 414cba3048
commit 39e6172304
4 changed files with 225 additions and 193 deletions
+41 -33
View File
@@ -2670,7 +2670,7 @@ class LinuxHost():
return resp_count
def _getBackboneGua(self) -> Optional[str]:
for addr in self.get_addrs():
for addr in self.get_ether_addrs():
if re.match(config.BACKBONE_PREFIX_REGEX_PATTERN, addr, re.I):
return addr
@@ -2680,12 +2680,19 @@ class LinuxHost():
""" Returns the ULA addresses autoconfigured on the infra link.
"""
addrs = []
for addr in self.get_addrs():
for addr in self.get_ether_addrs():
if re.match(config.ONLINK_PREFIX_REGEX_PATTERN, addr, re.I):
addrs.append(addr)
return addrs
def _getInfraGua(self) -> Optional[str]:
""" Returns the GUA addresses autoconfigured on the infra link.
"""
gua_prefix = config.ONLINK_GUA_PREFIX.split('::/')[0]
return [addr for addr in self.get_ether_addrs() if addr.startswith(gua_prefix)]
def ping(self, *args, **kwargs):
backbone = kwargs.pop('backbone', False)
if backbone:
@@ -2768,6 +2775,31 @@ class LinuxHost():
service['addresses'] = addresses
return service if service['addresses'] else None
def start_radvd_service(self, prefix, slaac):
self.bash("""cat >/etc/radvd.conf <<EOF
interface eth0
{
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 30;
AdvDefaultPreference low;
prefix %s
{
AdvOnLink on;
AdvAutonomous %s;
AdvRouterAddr off;
};
};
EOF
""" % (prefix, 'on' if slaac else 'off'))
self.bash('service radvd start')
self.bash('service radvd status') # Make sure radvd service is running
def stop_radvd_service(self):
self.bash('service radvd stop')
class OtbrNode(LinuxHost, NodeImpl, OtbrDocker):
is_otbr = True
@@ -2796,12 +2828,12 @@ class HostNode(LinuxHost, OtbrDocker):
def start(self, start_radvd=True, prefix=config.DOMAIN_PREFIX, slaac=False):
self._setup_sysctl()
if start_radvd:
self._service_radvd_start(prefix, slaac)
self.start_radvd_service(prefix, slaac)
else:
self._service_radvd_stop()
self.stop_radvd_service()
def stop(self):
self._service_radvd_stop()
self.stop_radvd_service()
def get_addrs(self) -> List[str]:
return self.get_ether_addrs()
@@ -2829,39 +2861,15 @@ class HostNode(LinuxHost, OtbrDocker):
Returns:
IPv6 address string.
"""
assert address_type in [config.ADDRESS_TYPE.BACKBONE_GUA, config.ADDRESS_TYPE.ONLINK_ULA]
if address_type == config.ADDRESS_TYPE.BACKBONE_GUA:
return self._getBackboneGua()
if address_type == config.ADDRESS_TYPE.ONLINK_ULA:
elif address_type == config.ADDRESS_TYPE.ONLINK_ULA:
return self._getInfraUla()
elif address_type == config.ADDRESS_TYPE.ONLINK_GUA:
return self._getInfraGua()
else:
return None
def _service_radvd_start(self, prefix, slaac):
self.bash("""cat >/etc/radvd.conf <<EOF
interface eth0
{
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 30;
AdvDefaultPreference low;
prefix %s
{
AdvOnLink on;
AdvAutonomous %s;
AdvRouterAddr off;
};
};
EOF
""" % (prefix, 'on' if slaac else 'off'))
self.bash('service radvd start')
self.bash('service radvd status') # Make sure radvd service is running
def _service_radvd_stop(self):
self.bash('service radvd stop')
raise ValueError(f'unsupported address type: {address_type}')
if __name__ == '__main__':