vnet: ip4/6_local->don't drop packet if marked for TCP/UDP offload cksum calculation 15/9115/3
authorJakub Grajciar <Jakub.Grajciar@pantheon.tech>
Mon, 30 Oct 2017 13:56:17 +0000 (14:56 +0100)
committerFlorin Coras <florin.coras@gmail.com>
Fri, 3 Nov 2017 14:55:14 +0000 (14:55 +0000)
Change-Id: I62f625a93e5d818caef382316035cd5447bd8fef
Signed-off-by: Jakub Grajciar <Jakub.Grajciar@pantheon.tech>
src/vnet/ip/ip4_forward.c
src/vnet/ip/ip6_forward.c

index 8b21869..4c559d5 100755 (executable)
@@ -1498,7 +1498,9 @@ ip4_local_validate_l4 (vlib_main_t * vm, vlib_buffer_t * p, ip4_header_t * ip,
 }
 
 #define ip4_local_do_l4_check(is_tcp_udp, flags)                       \
-    (is_tcp_udp && !(flags & VNET_BUFFER_F_L4_CHECKSUM_COMPUTED))
+    (is_tcp_udp && !(flags & VNET_BUFFER_F_L4_CHECKSUM_COMPUTED \
+    || flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM \
+    || flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM))
 
 static inline uword
 ip4_local_inline (vlib_main_t * vm,
@@ -1574,9 +1576,13 @@ ip4_local_inline (vlib_main_t * vm,
          is_tcp_udp1 = is_udp1 || proto1 == IP_PROTOCOL_TCP;
 
          good_tcp_udp0 =
-           (p0->flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
-         good_tcp_udp1 =
-           (p1->flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
+           (p0->flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT
+            && !(p0->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM
+                 || p0->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM)) != 0;
+         good_tcp_udp1 = (p1->flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT
+                          && !(p1->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM
+                               || p1->flags &
+                               VNET_BUFFER_F_OFFLOAD_UDP_CKSUM)) != 0;
 
          if (PREDICT_FALSE (ip4_local_do_l4_check (is_tcp_udp0, p0->flags)
                             || ip4_local_do_l4_check (is_tcp_udp1,
@@ -1731,8 +1737,11 @@ ip4_local_inline (vlib_main_t * vm,
 
          is_udp0 = proto0 == IP_PROTOCOL_UDP;
          is_tcp_udp0 = is_udp0 || proto0 == IP_PROTOCOL_TCP;
+
          good_tcp_udp0 =
-           (p0->flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
+           (p0->flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT
+            && !(p0->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM
+                 || p0->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM)) != 0;
 
          if (PREDICT_FALSE (ip4_local_do_l4_check (is_tcp_udp0, p0->flags)))
            {
index 6b89ec3..7a8b5ed 100644 (file)
@@ -1341,8 +1341,14 @@ ip6_local_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
          is_tcp_udp0 = ip6_next_proto_is_tcp_udp (p0, ip0, &udp_offset0);
          is_tcp_udp1 = ip6_next_proto_is_tcp_udp (p1, ip1, &udp_offset1);
 
-         good_l4_csum0 = (flags0 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
-         good_l4_csum1 = (flags1 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
+         good_l4_csum0 = (flags0 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT
+                          && !(flags0 & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM
+                               || flags0 & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM))
+           != 0;
+         good_l4_csum1 = (flags1 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT
+                          && !(flags1 & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM
+                               || flags1 & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM))
+           != 0;
          len_diff0 = 0;
          len_diff1 = 0;
 
@@ -1506,7 +1512,10 @@ ip6_local_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
          type0 = lm->builtin_protocol_by_ip_protocol[ip0->protocol];
          flags0 = p0->flags;
          is_tcp_udp0 = ip6_next_proto_is_tcp_udp (p0, ip0, &udp_offset0);
-         good_l4_csum0 = (flags0 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
+         good_l4_csum0 = (flags0 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT
+                          && !(flags0 & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM
+                               || flags0 & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM))
+           != 0;
 
          len_diff0 = 0;
          if (PREDICT_TRUE (is_tcp_udp0))