tcp: fix ip check in lookup validation 20/23320/3
authorFlorin Coras <fcoras@cisco.com>
Thu, 7 Nov 2019 16:26:06 +0000 (08:26 -0800)
committerDave Barach <openvpp@barachs.net>
Fri, 8 Nov 2019 16:12:42 +0000 (16:12 +0000)
Type: fix

Change-Id: Ia18632c8fe22bdcfdf3cb48a4234f8703a7ac1d7
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vnet/tcp/tcp_input.c

index 08cea1e..bc78b39 100755 (executable)
@@ -2277,25 +2277,31 @@ tcp_lookup_is_valid (tcp_connection_t * tc, vlib_buffer_t * b,
   if (tc->c_lcl_port == 0 && tc->state == TCP_STATE_LISTEN)
     return 1;
 
+  u8 is_ip_valid = 0, val_l, val_r;
 
-  u8 is_ip_valid = 0;
   if (tc->connection.is_ip4)
     {
       ip4_header_t *ip4_hdr = (ip4_header_t *) vlib_buffer_get_current (b);
-      is_ip_valid =
-       (!(ip4_address_compare
-          (&ip4_hdr->src_address, &tc->connection.rmt_ip.ip4)
-          && ip4_address_compare (&ip4_hdr->dst_address,
-                                  &tc->connection.lcl_ip.ip4)));
+
+      val_l = !ip4_address_compare (&ip4_hdr->dst_address,
+                                   &tc->connection.lcl_ip.ip4);
+      val_l = val_l || ip_is_zero (&tc->connection.lcl_ip, 1);
+      val_r = !ip4_address_compare (&ip4_hdr->src_address,
+                                   &tc->connection.rmt_ip.ip4);
+      val_r = val_r || tc->state == TCP_STATE_LISTEN;
+      is_ip_valid = val_l && val_r;
     }
   else
     {
       ip6_header_t *ip6_hdr = (ip6_header_t *) vlib_buffer_get_current (b);
-      is_ip_valid =
-       (!(ip6_address_compare
-          (&ip6_hdr->src_address, &tc->connection.rmt_ip.ip6)
-          && ip6_address_compare (&ip6_hdr->dst_address,
-                                  &tc->connection.lcl_ip.ip6)));
+
+      val_l = !ip6_address_compare (&ip6_hdr->dst_address,
+                                   &tc->connection.lcl_ip.ip6);
+      val_l = val_l || ip_is_zero (&tc->connection.lcl_ip, 0);
+      val_r = !ip6_address_compare (&ip6_hdr->src_address,
+                                   &tc->connection.rmt_ip.ip6);
+      val_r = val_r || tc->state == TCP_STATE_LISTEN;
+      is_ip_valid = val_l && val_r;
     }
 
   u8 is_valid = (tc->c_lcl_port == hdr->dst_port