tcp: add option to punt traffic

Until now, if the stack didn't find a connection for a packet, it sent
back a reset. With the punt option enabled, packets are now enqueued to
error-punt where they can be handed off to the host os.

Change-Id: I12dea8694b8bd24c92b0d601412928aa7b8046cb
Signed-off-by: Florin Coras <fcoras@cisco.com>
Signed-off-by: Pierre Pfister <ppfister@cisco.com>
diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c
index 64a0707..bd57eca 100644
--- a/src/vnet/tcp/tcp_input.c
+++ b/src/vnet/tcp/tcp_input.c
@@ -2869,6 +2869,7 @@
   TCP_INPUT_NEXT_SYN_SENT,
   TCP_INPUT_NEXT_ESTABLISHED,
   TCP_INPUT_NEXT_RESET,
+  TCP_INPUT_NEXT_PUNT,
   TCP_INPUT_N_NEXT
 } tcp_input_next_t;
 
@@ -2878,7 +2879,8 @@
   _ (RCV_PROCESS, "tcp4-rcv-process")           \
   _ (SYN_SENT, "tcp4-syn-sent")                 \
   _ (ESTABLISHED, "tcp4-established")		\
-  _ (RESET, "tcp4-reset")
+  _ (RESET, "tcp4-reset")			\
+  _ (PUNT, "error-punt")
 
 #define foreach_tcp6_input_next                 \
   _ (DROP, "error-drop")                        \
@@ -2886,7 +2888,8 @@
   _ (RCV_PROCESS, "tcp6-rcv-process")           \
   _ (SYN_SENT, "tcp6-syn-sent")                 \
   _ (ESTABLISHED, "tcp6-established")		\
-  _ (RESET, "tcp6-reset")
+  _ (RESET, "tcp6-reset")			\
+  _ (PUNT, "error-punt")
 
 #define filter_flags (TCP_FLAG_SYN|TCP_FLAG_ACK|TCP_FLAG_RST|TCP_FLAG_FIN)
 
@@ -3010,9 +3013,18 @@
 	    }
 	  else
 	    {
-	      /* Send reset */
-	      next0 = TCP_INPUT_NEXT_RESET;
-	      error0 = TCP_ERROR_NO_LISTENER;
+	      if ((is_ip4 && tm->punt_unknown4) ||
+		  (!is_ip4 && tm->punt_unknown6))
+		{
+		  next0 = TCP_INPUT_NEXT_PUNT;
+		  error0 = TCP_ERROR_PUNT;
+		}
+	      else
+		{
+		  /* Send reset */
+		  next0 = TCP_INPUT_NEXT_RESET;
+		  error0 = TCP_ERROR_NO_LISTENER;
+		}
 	    }
 
 	done: