From cdabd6caf93a6f26f2c3740b56cb4572ce99350a Mon Sep 17 00:00:00 2001
From: Matthieu Imbert <matthieu.imbert@inria.fr>
Date: Thu, 7 May 2020 07:48:42 +0200
Subject: [PATCH] [kavlan6] update to kavlan ipv6 address plan

---
 lib/refrepo/input_loader.rb | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/lib/refrepo/input_loader.rb b/lib/refrepo/input_loader.rb
index 2bd96ebf76..a321413bbd 100644
--- a/lib/refrepo/input_loader.rb
+++ b/lib/refrepo/input_loader.rb
@@ -181,6 +181,8 @@ def add_ipv6(h)
 end
 
 def add_kavlan_ipv6s(h)
+  global_vlan_site = {}
+  h['ipv6']['site_global_kavlans'].each { |key, value| global_vlan_site[value] = key }
   h['sites'].each_pair do |site_uid, hs|
     hs['clusters'].each_pair do |_cluster_uid, hc|
       next if !hc['kavlan'] # skip clusters where kavlan is globally set to false (used for initial cluster installation)
@@ -200,8 +202,17 @@ def add_kavlan_ipv6s(h)
             hn['kavlan'][iface].each_key do |kvl|
               kvl_id = kvl.split('-')[1].to_i
               ip6 = h['ipv6']['prefix'] + ':'
-              ip6 += '%x' % h['ipv6']['site_indexes'][site_uid]
-              ip6 += '%x:' % (kvl_id + 0x80)
+              case kvl_id
+              when 1..3 # local non-routed
+                ip6 += '%x' % h['ipv6']['site_indexes'][site_uid]
+                ip6 += '%x:' % (kvl_id + 0x80 - 1)
+              when 4..9 # local routed
+                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)
+              end
               ip6 += '%x' % ((ip4.split('.')[2].to_i & 0b1111) + 1)
               if idx > 0
                 ip6 += ':%x::' % idx
-- 
GitLab