summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorernstjo <mail@johannesernst.com>2020-11-13 11:38:21 +0100
committerernstjo <mail@johannesernst.com>2020-11-13 11:38:21 +0100
commit3ca2f48599ef407b0eef93cce25830ae6224e361 (patch)
tree7fbee1e8f5fbb565f9a33125c5546688b1ea730a
parent81054efa2c07598b2c0c131cc1cf0163e0a8a1be (diff)
downloadvyos-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.py46
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):