From 7bb9fa5ac814b726f4522f57b1d20f4caa482140 Mon Sep 17 00:00:00 2001
From: Pim van Pelt <pim@ipng.nl>
Date: Sat, 26 Mar 2022 17:18:10 +0000
Subject: [PATCH] Assert that a QinX cannot have higher MTU than its
 intermediate interface

---
 config/interface.py                     |  8 +++++++-
 unittest/yaml/error-interface-mtu2.yaml | 12 ++++++++++--
 vpp/reconciler.py                       |  4 ++--
 3 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/config/interface.py b/config/interface.py
index 86c3b1e..825d94d 100644
--- a/config/interface.py
+++ b/config/interface.py
@@ -480,8 +480,14 @@ def validate_interfaces(yaml):
 
                 sub_mtu = get_mtu(yaml, sub_ifname)
                 if sub_mtu > iface_mtu:
-                    msgs.append("sub-interface %s has MTU %d higher than parent MTU %d" % (sub_ifname, sub_iface['mtu'], iface_mtu))
+                    msgs.append("sub-interface %s has MTU %d higher than parent %s MTU %d" % (sub_ifname, sub_iface['mtu'], ifname, iface_mtu))
                     result = False
+                if is_qinx(yaml, sub_ifname):
+                    mid_ifname, mid_iface = get_qinx_parent_by_name(yaml, sub_ifname)
+                    mid_mtu = get_mtu(yaml, mid_ifname)
+                    if sub_mtu > mid_mtu:
+                        msgs.append("sub-interface %s has MTU %d higher than parent %s MTU %d" % (sub_ifname, sub_iface['mtu'], mid_ifname, mid_mtu))
+                        result = False
 
                 sub_lcp = get_lcp(yaml, sub_ifname)
                 if is_l2(yaml, sub_ifname) and sub_lcp:
diff --git a/unittest/yaml/error-interface-mtu2.yaml b/unittest/yaml/error-interface-mtu2.yaml
index 3c14020..e3825bf 100644
--- a/unittest/yaml/error-interface-mtu2.yaml
+++ b/unittest/yaml/error-interface-mtu2.yaml
@@ -2,8 +2,10 @@ test:
   description: "MTU of sub-interfaces cannot be higher than their parent"
   errors:
     expected: 
-     - "sub-interface .* has MTU 9001 higher than parent MTU 9000"
-    count: 1
+     - "sub-interface .* has MTU 9001 higher than parent .* MTU 9000"
+     - "sub-interface .* has MTU 9002 higher than parent .* MTU 9001"
+     - "sub-interface .* has MTU 9002 higher than parent .* MTU 9000"
+    count: 3
 ---
 interfaces:
   GigabitEthernet1/0/0:
@@ -11,3 +13,9 @@ interfaces:
     sub-interfaces:
       100:
         mtu: 9001
+      200:
+        encapsulation:
+          exact-match: True
+          inner-dot1q: 1234
+          dot1q: 100
+        mtu: 9002
diff --git a/vpp/reconciler.py b/vpp/reconciler.py
index ddd0012..61e8f23 100644
--- a/vpp/reconciler.py
+++ b/vpp/reconciler.py
@@ -824,9 +824,9 @@ class Reconciler():
                     config_mtu = config_iface['mtu']
 
                 if shrink and config_mtu < vpp_iface.mtu[0]:
-                    self.logger.info("shrink 1> set interface mtu packet %d %s" % (config_mtu, vpp_iface.interface_name))
+                    self.logger.info("1> set interface mtu packet %d %s" % (config_mtu, vpp_iface.interface_name))
                 elif not shrink and config_mtu > vpp_iface.mtu[0]:
-                    self.logger.info("grow 2> set interface mtu packet %d %s" % (config_mtu, vpp_iface.interface_name))
+                    self.logger.info("2> set interface mtu packet %d %s" % (config_mtu, vpp_iface.interface_name))
 
         return True