Correctly configure the IPv6 LLA address

Handle a corner case where the address allocated by slaac is the
same as the ipv6 default link local address.

Closes-bug: #1709215
Change-Id: Ida667292fce41e281e016d56a278eef3b8939ed4
This commit is contained in:
Jacky Hu 2017-08-07 17:04:37 +08:00 committed by Jakub Libosvar
parent d2bf790a44
commit 6c437b7ced
2 changed files with 31 additions and 0 deletions

View File

@ -122,6 +122,8 @@ class LinuxInterfaceDriver(object):
# skip the IPv6 link-local
if cidr == default_ipv6_lla:
# it's already configured, leave it alone
cidrs.discard(cidr)
continue
if cidr in preserve_ips:

View File

@ -254,6 +254,35 @@ class TestABCDriver(TestBase):
mock.call().addr.delete(cidr),
mock.call().addr.add(cidr)])
def test_l3_init_with_duplicated_ipv6_lla(self):
device_name = 'tap0'
cidr = 'fe80::a8bb:ccff:fedd:eeff/64'
ns = '12345678-1234-5678-90ab-ba0987654321'
addresses = [dict(scope='link',
dynamic=False,
cidr=cidr)]
self.ip_dev().addr.list = mock.Mock(return_value=addresses)
bc = BaseChild(self.conf)
bc.init_l3(device_name, [cidr], namespace=ns)
self.ip_dev.assert_has_calls(
[mock.call(device_name, namespace=ns),
mock.call().addr.list()])
# The above assert won't verify there were no extra calls right
# after list()
self.assertFalse(self.ip_dev().addr.add.called)
def test_l3_init_with_not_present_ipv6_lla(self):
device_name = 'tap0'
cidr = 'fe80::a8bb:ccff:fedd:eeff/64'
ns = '12345678-1234-5678-90ab-ba0987654321'
self.ip_dev().addr.list = mock.Mock(return_value=[])
bc = BaseChild(self.conf)
bc.init_l3(device_name, [cidr], namespace=ns)
self.ip_dev.assert_has_calls(
[mock.call(device_name, namespace=ns),
mock.call().addr.list(),
mock.call().addr.add(cidr)])
def test_add_ipv6_addr(self):
device_name = 'tap0'
cidr = '2001:db8::/64'