mpls: Set the MTU field in the frag-needed ICMP when doing MPLS fragmentation 10/35710/3
authorNeale Ranns <neale@graphiant.com>
Fri, 18 Mar 2022 13:05:09 +0000 (13:05 +0000)
committerNeale Ranns <neale@graphiant.com>
Thu, 24 Mar 2022 13:56:43 +0000 (13:56 +0000)
Type: fix

The reported MTU should include the MPLS label overhead

Signed-off-by: Neale Ranns <neale@graphiant.com>
Change-Id: I3df6d2e0b13f49701e187a766a157498dcaafbc0

src/vnet/mpls/mpls_output.c
test/test_ip4.py
test/test_mpls.py

index faeba74..d606360 100644 (file)
@@ -470,14 +470,13 @@ mpls_frag (vlib_main_t * vm,
                        icmp4_error_set_vnet_buffer (
                          p0, ICMP4_destination_unreachable,
                          ICMP4_destination_unreachable_fragmentation_needed_and_dont_fragment_set,
-                         vnet_buffer (p0)->ip_frag.mtu);
+                         mtu);
                        next0 = MPLS_FRAG_NEXT_ICMP4_ERROR;
                      }
                    else
                      {
-                       icmp6_error_set_vnet_buffer (
-                         p0, ICMP6_packet_too_big, 0,
-                         adj0->rewrite_header.max_l3_packet_bytes);
+                       icmp6_error_set_vnet_buffer (p0, ICMP6_packet_too_big,
+                                                    0, mtu);
                        next0 = MPLS_FRAG_NEXT_ICMP6_ERROR;
                      }
                  }
index 873a38a..fb9b8fa 100644 (file)
@@ -1977,6 +1977,7 @@ class TestIPInput(VppTestCase):
             self.assertEqual(icmptypes[icmp.type], "dest-unreach")
             self.assertEqual(icmpcodes[icmp.type][icmp.code],
                              "fragmentation-needed")
+            self.assertEqual(icmp.nexthopmtu, 1500)
             self.assertEqual(icmp.src, self.pg0.remote_ip4)
             self.assertEqual(icmp.dst, self.pg1.remote_ip4)
 
index d94676b..a568f84 100644 (file)
@@ -17,7 +17,7 @@ from vpp_papi import VppEnum
 import scapy.compat
 from scapy.packet import Raw
 from scapy.layers.l2 import Ether, ARP
-from scapy.layers.inet import IP, UDP, ICMP
+from scapy.layers.inet import IP, UDP, ICMP, icmptypes, icmpcodes
 from scapy.layers.inet6 import IPv6, ICMPv6TimeExceeded, ICMPv6EchoRequest, \
     ICMPv6PacketTooBig
 from scapy.contrib.mpls import MPLS
@@ -961,7 +961,11 @@ class TestMPLS(VppTestCase):
         rxs = self.send_and_expect_some(self.pg0, tx, self.pg0)
 
         for rx in rxs:
-            rx[ICMP].code = "fragmentation-needed"
+            self.assertEqual(icmptypes[rx[ICMP].type], "dest-unreach")
+            self.assertEqual(icmpcodes[rx[ICMP].type][rx[ICMP].code],
+                             "fragmentation-needed")
+            # the link MTU is 9000, the MPLS over head is 4 bytes
+            self.assertEqual(rx[ICMP].nexthopmtu, 9000 - 4)
 
         self.assertEqual(self.statistics.get_err_counter(
             "/err/mpls-frag/can't fragment this packet"),
@@ -976,7 +980,7 @@ class TestMPLS(VppTestCase):
 
         rxs = self.send_and_expect_some(self.pg0, tx, self.pg0)
         for rx in rxs:
-            rx[ICMPv6PacketTooBig].mtu = 9000
+            self.assertEqual(rx[ICMPv6PacketTooBig].mtu, 9000 - 4)
 
         #
         # cleanup