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 | |
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.
-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): |