From 7e4128eebafa8e8a305333fa249e676d18384b1f Mon Sep 17 00:00:00 2001
From: Matthieu Imbert <matthieu.imbert@inria.fr>
Date: Mon, 2 Nov 2020 15:13:21 +0100
Subject: [PATCH] kavlan ipv6: change address plan for global kavlans

---
 lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb |  2 +-
 lib/refrepo/input_loader.rb                           | 11 ++++++++---
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb b/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb
index 300228050a..d87b5f8169 100644
--- a/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb
+++ b/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb
@@ -67,7 +67,7 @@ subnet <%= kavlan_ip.network %> netmask <%= kavlan_ip.netmask %> {
        kavlan6_net = kavlan_id + 0x90 - 4
        kavlan6_ip = "#{refapi['sites'][site_uid]['ipv6']['prefix']}#{sprintf('%02x', kavlan6_net)}::/64"
      else      # global vlan
-       kavlan6_ip = "#{refapi['sites'][site_uid]['ipv6']['prefix']}a0::/59"
+       kavlan6_ip = "#{refapi['sites'][site_uid]['ipv6']['prefix']}a0::/64"
      end -%>
 subnet6 <%= kavlan6_ip %> {
 <% end -%>
diff --git a/lib/refrepo/input_loader.rb b/lib/refrepo/input_loader.rb
index 1e605f21c2..56e73b38b9 100644
--- a/lib/refrepo/input_loader.rb
+++ b/lib/refrepo/input_loader.rb
@@ -213,10 +213,15 @@ def add_kavlan_ipv6s(h)
                 ip6 += '%x' % h['ipv6']['site_indexes'][site_uid]
                 ip6 += '%x:' % (kvl_id + 0x90 - 4)
               else      # global
-                ip6 += '%x' % h['ipv6']['site_indexes'][global_vlan_site[kvl_id]]
-                ip6 += '%x:' % ((h['ipv6']['site_indexes'][site_uid]&0x1f) + 0xa0)
+                ip6 += '%xa0:' % h['ipv6']['site_indexes'][global_vlan_site[kvl_id]] # no matter what, the gw is always on the global kavlan's site
+              end
+              if kvl_id > 9
+                # global kavlan: set most signicant octet of interface part to site index
+                ip6 += '%x' % h['ipv6']['site_indexes'][site_uid]
+                ip6 += '%02x' % ((ip4.split('.')[2].to_i & 0b1111) + 1)
+              else
+                ip6 += '%x' % ((ip4.split('.')[2].to_i & 0b1111) + 1)
               end
-              ip6 += '%x' % ((ip4.split('.')[2].to_i & 0b1111) + 1)
               if idx > 0
                 ip6 += ':%x::' % idx
               else
-- 
GitLab