summaryrefslogtreecommitdiff
path: root/python/vyos
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 /python/vyos
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.
Diffstat (limited to 'python/vyos')
-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):