diff options
author | ernstjo <mail@johannesernst.com> | 2020-11-13 11:38:21 +0100 |
---|---|---|
committer | ernstjo <mail@johannesernst.com> | 2020-11-13 11:38:21 +0100 |
commit | 3ca2f48599ef407b0eef93cce25830ae6224e361 (patch) | |
tree | 7fbee1e8f5fbb565f9a33125c5546688b1ea730a /python | |
parent | 81054efa2c07598b2c0c131cc1cf0163e0a8a1be (diff) | |
download | vyos-1x-3ca2f48599ef407b0eef93cce25830ae6224e361.tar.gz vyos-1x-3ca2f48599ef407b0eef93cce25830ae6224e361.zip |
T3068: Automatic generation of IPv6 link local addresses for tunnel interfaces
Better implementation to assign link local addresses automatically because address only assigned to interfaces which supports IPv6 addresses.
Diffstat (limited to 'python')
-rw-r--r-- | python/vyos/ifconfig/tunnel.py | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/python/vyos/ifconfig/tunnel.py b/python/vyos/ifconfig/tunnel.py index 0c87ce3c5..926d66c18 100644 --- a/python/vyos/ifconfig/tunnel.py +++ b/python/vyos/ifconfig/tunnel.py @@ -102,16 +102,6 @@ class _Tunnel(Interface): for k in self.options if k in self.config and self.config[k]]) self._cmd('{} {}'.format(self.create.format(**self.config), options)) self.set_admin_state('down') - - # Linux Kernel does not generate IPv6 Link Local address do to missing MAC - # We have to generate address manually and assign to interface - net = IPv6Network("FE80::/16") - rand_net = IPv6Network((net.network_address + (random.getrandbits(64 - net.prefixlen) << 64 ),64)) - network = IPv6Network(rand_net) - address = str(IPv6Address(network.network_address + getrandbits(network.max_prefixlen - network.prefixlen)))+'/'+str(network.prefixlen) - - # Assign generated IPv6 Link Local address to the interface - self.add_addr(address) def _delete(self): self.set_admin_state('down') @@ -136,6 +126,16 @@ class _Tunnel(Interface): @classmethod def get_config(cls): return dict(zip(cls.options, ['']*len(cls.options))) + + def generate_link_local(): + # Linux Kernel does not generate IPv6 Link Local address do to missing MAC + # We have to generate address manually and assign to interface + net = IPv6Network("FE80::/16") + rand_net = IPv6Network((net.network_address + (random.getrandbits(64 - net.prefixlen) << 64 ),64)) + network = IPv6Network(rand_net) + address = str(IPv6Address(network.network_address + getrandbits(network.max_prefixlen - network.prefixlen)))+'/'+str(network.prefixlen) + + return address class GREIf(_Tunnel): @@ -168,6 +168,12 @@ class GREIf(_Tunnel): create = 'ip tunnel add {ifname} mode {type}' change = 'ip tunnel cha {ifname}' delete = 'ip tunnel del {ifname}' + + + def _create(self): + super()._create(self) + # Assign generated IPv6 Link Local address to the interface + self.add_addr(self.generate_link_local()) # GreTap also called GRE Bridge @@ -233,6 +239,11 @@ class IP6GREIf(_Tunnel): # sudo ip tunnel cha tun100 local: : 2 # Error: an IP address is expected rather than "::2" # works if mode is explicit + + def _create(self): + super()._create(self) + # Assign generated IPv6 Link Local address to the interface + self.add_addr(self.generate_link_local()) class IPIPIf(_Tunnel): @@ -284,6 +295,11 @@ class IPIP6If(_Tunnel): create = 'ip -6 tunnel add {ifname} mode {type}' change = 'ip -6 tunnel cha {ifname}' delete = 'ip -6 tunnel del {ifname}' + + def _create(self): + super()._create(self) + # Assign generated IPv6 Link Local address to the interface + self.add_addr(self.generate_link_local()) class IP6IP6If(IPIP6If): @@ -297,6 +313,11 @@ class IP6IP6If(IPIP6If): ip = [IP6,] default = {'type': 'ip6ip6'} + + def _create(self): + super()._create(self) + # Assign generated IPv6 Link Local address to the interface + self.add_addr(self.generate_link_local()) class SitIf(_Tunnel): @@ -320,6 +341,11 @@ class SitIf(_Tunnel): create = 'ip tunnel add {ifname} mode {type}' change = 'ip tunnel cha {ifname}' delete = 'ip tunnel del {ifname}' + + def _create(self): + super()._create(self) + # Assign generated IPv6 Link Local address to the interface + self.add_addr(self.generate_link_local()) class Sit6RDIf(SitIf): |