NAT44 out2in DHCP client next node 88/10488/3
authorMatthew Smith <mgsmith@netgate.com>
Sat, 10 Feb 2018 03:04:08 +0000 (21:04 -0600)
committerDamjan Marion <dmarion.lists@gmail.com>
Wed, 14 Feb 2018 14:49:14 +0000 (14:49 +0000)
Call vnet_feature_next() for DHCP replies instead of using
default ip4-lookup. This allows DHCP replies to reach an
outside interface if it's configured as a DHCP client.

Change-Id: Icce1cd68b21256fcd6b1fad6792c06578b0e4e36
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
src/plugins/nat/out2in.c

index 7f500a9..a03f780 100755 (executable)
@@ -1105,10 +1105,14 @@ snat_out2in_node_fn (vlib_main_t * vm,
                        * Send DHCP packets to the ipv4 stack, or we won't
                        * be able to use dhcp client on the outside interface
                        */
-                      if (proto0 != SNAT_PROTOCOL_UDP
+                      if (PREDICT_TRUE (proto0 != SNAT_PROTOCOL_UDP
                           || (udp0->dst_port
-                              != clib_host_to_net_u16(UDP_DST_PORT_dhcp_to_client)))
+                              != clib_host_to_net_u16(UDP_DST_PORT_dhcp_to_client))))
                         next0 = SNAT_OUT2IN_NEXT_DROP;
+                      else
+                        vnet_feature_next
+                          (vnet_buffer (b0)->sw_if_index[VLIB_RX],
+                           &next0, b0);
                       goto trace0;
                     }
                   else
@@ -1268,10 +1272,14 @@ snat_out2in_node_fn (vlib_main_t * vm,
                        * Send DHCP packets to the ipv4 stack, or we won't
                        * be able to use dhcp client on the outside interface
                        */
-                      if (proto1 != SNAT_PROTOCOL_UDP
+                      if (PREDICT_TRUE (proto1 != SNAT_PROTOCOL_UDP
                           || (udp1->dst_port
-                              != clib_host_to_net_u16(UDP_DST_PORT_dhcp_to_client)))
+                              != clib_host_to_net_u16(UDP_DST_PORT_dhcp_to_client))))
                         next1 = SNAT_OUT2IN_NEXT_DROP;
+                      else
+                        vnet_feature_next
+                          (vnet_buffer (b1)->sw_if_index[VLIB_RX],
+                           &next1, b1);
                       goto trace1;
                     }
                   else
@@ -1467,10 +1475,14 @@ snat_out2in_node_fn (vlib_main_t * vm,
                        * Send DHCP packets to the ipv4 stack, or we won't
                        * be able to use dhcp client on the outside interface
                        */
-                      if (proto0 != SNAT_PROTOCOL_UDP
+                      if (PREDICT_TRUE (proto0 != SNAT_PROTOCOL_UDP
                           || (udp0->dst_port
-                              != clib_host_to_net_u16(UDP_DST_PORT_dhcp_to_client)))
+                              != clib_host_to_net_u16(UDP_DST_PORT_dhcp_to_client))))
                         next0 = SNAT_OUT2IN_NEXT_DROP;
+                      else
+                        vnet_feature_next
+                          (vnet_buffer (b0)->sw_if_index[VLIB_RX],
+                           &next0, b0);
                       goto trace00;
                     }
                   else
@@ -1707,10 +1719,14 @@ nat44_out2in_reass_node_fn (vlib_main_t * vm,
                            * Send DHCP packets to the ipv4 stack, or we won't
                            * be able to use dhcp client on the outside interface
                            */
-                          if (proto0 != SNAT_PROTOCOL_UDP
+                          if (PREDICT_TRUE (proto0 != SNAT_PROTOCOL_UDP
                               || (udp0->dst_port
-                                  != clib_host_to_net_u16(UDP_DST_PORT_dhcp_to_client)))
+                                  != clib_host_to_net_u16(UDP_DST_PORT_dhcp_to_client))))
                             next0 = SNAT_OUT2IN_NEXT_DROP;
+                          else
+                            vnet_feature_next
+                              (vnet_buffer (b0)->sw_if_index[VLIB_RX],
+                               &next0, b0);
                           goto trace0;
                         }
                       else