udp: calculate inner checksums if needed before udp encap 06/32506/2
authorArthur de Kerhor <arthurdekerhor@gmail.com>
Tue, 1 Jun 2021 09:27:48 +0000 (11:27 +0200)
committerArthur de Kerhor <arthurdekerhor@gmail.com>
Tue, 1 Jun 2021 10:03:47 +0000 (12:03 +0200)
We do not want to encap headers containing wrong checksums.

Additionnally, this clears the checksums offlads flags, which
was something missing since the outer headers checksums were
calculated during the encap. Hence, those should not be
recalculated afterwards.

Type: fix
Change-Id: I7fd07987b4f13f76c6990a1c08dc2f960bdd8de1
Signed-off-by: Arthur de Kerhor <arthurdekerhor@gmail.com>
src/vnet/udp/udp_encap.c
src/vnet/udp/udp_inlines.h

index 28ea560..cb93adb 100644 (file)
@@ -64,7 +64,7 @@ udp_encap_add_and_lock (fib_protocol_t proto,
   u8 pfx_len = 0;
   index_t uei;
 
-  pool_get_aligned (udp_encap_pool, ue, CLIB_CACHE_LINE_BYTES);
+  pool_get_aligned_zero (udp_encap_pool, ue, CLIB_CACHE_LINE_BYTES);
   uei = ue - udp_encap_pool;
 
   vlib_validate_combined_counter (&(udp_encap_counters), uei);
index 067289c..e4eb0c8 100644 (file)
@@ -20,6 +20,7 @@
 #include <vnet/ip/ip4.h>
 #include <vnet/ip/ip6.h>
 #include <vnet/udp/udp_packet.h>
+#include <vnet/interface_output.h>
 
 always_inline void *
 vlib_buffer_push_udp (vlib_buffer_t * b, u16 sp, u16 dp, u8 offload_csum)
@@ -99,6 +100,8 @@ always_inline void
 ip_udp_encap_one (vlib_main_t * vm, vlib_buffer_t * b0, u8 * ec0, word ec_len,
                  u8 is_ip4)
 {
+  vnet_calc_checksums_inline (vm, b0, is_ip4, !is_ip4);
+
   vlib_buffer_advance (b0, -ec_len);
 
   if (is_ip4)
@@ -132,6 +135,9 @@ ip_udp_encap_two (vlib_main_t * vm, vlib_buffer_t * b0, vlib_buffer_t * b1,
 
   ASSERT (_vec_len (ec0) == _vec_len (ec1));
 
+  vnet_calc_checksums_inline (vm, b0, is_v4, !is_v4);
+  vnet_calc_checksums_inline (vm, b1, is_v4, !is_v4);
+
   vlib_buffer_advance (b0, -ec_len);
   vlib_buffer_advance (b1, -ec_len);