ip: Add ip46-local node for local swif[rx]

Type: improvement

This adds a new ip[46]-receive node, sibling
of ip[46]-local. Its goal is to set
vnet_buffer (b)->ip.rx_sw_if_index to the
sw_if_index of the local interface.

In dependant nodes further down the line (e.g.
hoststack) we then set sw_if_idx[rx] to this
value. So that we know which local interface
did receive the packet.

The TCP issue this fixes is that :

On accepts, we were setting tc->sw_if_index
to the source sw_if_index. We should use
the dest sw_if_index, so that packets
coming back on this connection have the
right source sw_if_index. And also setting
it in the tx-ed packet.

Change-Id: I569ed673e15c21e71f365c3ad45439b05bd14a9f
Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
diff --git a/src/vnet/tcp/tcp_inlines.h b/src/vnet/tcp/tcp_inlines.h
index dfdf801..e82f308 100644
--- a/src/vnet/tcp/tcp_inlines.h
+++ b/src/vnet/tcp/tcp_inlines.h
@@ -237,6 +237,13 @@
   tcp_header_t *tcp;
   u8 result = 0;
 
+  /* Set the sw_if_index[VLIB_RX] to the interface we received
+   * the connection on (the local interface) */
+  vnet_buffer (b)->sw_if_index[VLIB_RX] =
+    vnet_buffer (b)->ip.rx_sw_if_index != ~0 ?
+      vnet_buffer (b)->ip.rx_sw_if_index :
+      vnet_buffer (b)->sw_if_index[VLIB_RX];
+
   if (is_ip4)
     {
       ip4_header_t *ip4 = vlib_buffer_get_current (b);