http_static: fix memory hss_session using after be freed
[vpp.git] / src / plugins / dhcp / dhcp4_proxy_node.c
index 28c3e62..2b49d49 100644 (file)
@@ -16,7 +16,6 @@
  */
 
 #include <vlib/vlib.h>
-#include <vnet/pg/pg.h>
 #include <dhcp/dhcp_proxy.h>
 #include <dhcp/client.h>
 #include <vnet/fib/ip4_fib.h>
@@ -371,7 +370,6 @@ dhcp_proxy_to_server_input (vlib_main_t * vm,
                         DHCP_PROXY_ERROR_ALLOC_FAIL, 1);
                      continue;
                    }
-                 VLIB_BUFFER_TRACE_TRAJECTORY_INIT (c0);
                  ci0 = vlib_get_buffer_index (vm, c0);
                  server = &proxy->dhcp_servers[ii];
 
@@ -465,7 +463,6 @@ dhcp_proxy_to_server_input (vlib_main_t * vm,
   return from_frame->n_vectors;
 }
 
-/* *INDENT-OFF* */
 VLIB_REGISTER_NODE (dhcp_proxy_to_server_node, static) = {
   .function = dhcp_proxy_to_server_input,
   .name = "dhcp-proxy-to-server",
@@ -488,7 +485,6 @@ VLIB_REGISTER_NODE (dhcp_proxy_to_server_node, static) = {
   .unformat_buffer = unformat_dhcp_proxy_header,
 #endif
 };
-/* *INDENT-ON* */
 
 typedef enum
 {
@@ -532,6 +528,8 @@ dhcp_proxy_to_client_input (vlib_main_t * vm,
          vnet_hw_interface_t *hi0;
          u32 sw_if_index = ~0;
          vnet_sw_interface_t *si0;
+         u32 inner_vlan = (u32) ~ 0;
+         u32 outer_vlan = (u32) ~ 0;
          u32 error0 = (u32) ~ 0;
          vnet_sw_interface_t *swif;
          u32 fib_index;
@@ -719,24 +717,44 @@ dhcp_proxy_to_client_input (vlib_main_t * vm,
          vlib_buffer_advance (b0, -(sizeof (ethernet_header_t)));
          si0 = vnet_get_sw_interface (vnm, original_sw_if_index);
          if (si0->type == VNET_SW_INTERFACE_TYPE_SUB)
-           vlib_buffer_advance (b0, -4 /* space for VLAN tag */ );
+           {
+             if (si0->sub.eth.flags.one_tag == 1)
+               {
+                 vlib_buffer_advance (b0, -4 /* space for 1 VLAN tag */ );
+                 outer_vlan = (si0->sub.eth.outer_vlan_id << 16) | 0x0800;
+               }
+             else if (si0->sub.eth.flags.two_tags == 1)
+               {
+                 vlib_buffer_advance (b0, -8 /* space for 2 VLAN tag */ );
+                 outer_vlan = (si0->sub.eth.outer_vlan_id << 16) | 0x8100;
+                 inner_vlan = (si0->sub.eth.inner_vlan_id << 16) | 0x0800;
+               }
+           }
 
          mac0 = vlib_buffer_get_current (b0);
 
          hi0 = vnet_get_sup_hw_interface (vnm, original_sw_if_index);
          ei0 = pool_elt_at_index (em->interfaces, hi0->hw_instance);
-         clib_memcpy (mac0->src_address, ei0->address,
-                      sizeof (ei0->address));
+         clib_memcpy (mac0->src_address, &ei0->address,
+                      sizeof (mac0->src_address));
          clib_memset (mac0->dst_address, 0xff, sizeof (mac0->dst_address));
-         mac0->type = (si0->type == VNET_SW_INTERFACE_TYPE_SUB) ?
-           clib_net_to_host_u16 (0x8100) : clib_net_to_host_u16 (0x0800);
 
-         if (si0->type == VNET_SW_INTERFACE_TYPE_SUB)
+         if (si0->type == VNET_SW_INTERFACE_TYPE_SUB
+             && outer_vlan != (u32) ~ 0)
            {
+             mac0->type = (si0->sub.eth.flags.dot1ad == 1) ?
+               clib_net_to_host_u16 (0x88a8) : clib_net_to_host_u16 (0x8100);
              u32 *vlan_tag = (u32 *) (mac0 + 1);
-             u32 tmp;
-             tmp = (si0->sub.id << 16) | 0x0800;
-             *vlan_tag = clib_host_to_net_u32 (tmp);
+             *vlan_tag = clib_host_to_net_u32 (outer_vlan);
+             if (inner_vlan != (u32) ~ 0)
+               {
+                 u32 *inner_vlan_tag = (u32 *) (vlan_tag + 1);
+                 *inner_vlan_tag = clib_host_to_net_u32 (inner_vlan);
+               }
+           }
+         else
+           {
+             mac0->type = clib_net_to_host_u16 (0x0800);
            }
 
        do_trace:
@@ -763,7 +781,6 @@ dhcp_proxy_to_client_input (vlib_main_t * vm,
   return from_frame->n_vectors;
 }
 
-/* *INDENT-OFF* */
 VLIB_REGISTER_NODE (dhcp_proxy_to_client_node, static) = {
   .function = dhcp_proxy_to_client_input,
   .name = "dhcp-proxy-to-client",
@@ -783,7 +800,6 @@ VLIB_REGISTER_NODE (dhcp_proxy_to_client_node, static) = {
     [DHCP4_PROXY_NEXT_TX] = "interface-output",
   },
 };
-/* *INDENT-ON* */
 
 void
 dhcp_maybe_register_udp_ports (dhcp_port_reg_flags_t ports)
@@ -936,13 +952,11 @@ dhcp4_proxy_set_command_fn (vlib_main_t * vm,
                              format_unformat_error, input);
 }
 
-/* *INDENT-OFF* */
 VLIB_CLI_COMMAND (dhcp_proxy_set_command, static) = {
   .path = "set dhcp proxy",
   .short_help = "set dhcp proxy [del] server <ip-addr> src-address <ip-addr> [server-fib-id <n>] [rx-fib-id <n>]",
   .function = dhcp4_proxy_set_command_fn,
 };
-/* *INDENT-ON* */
 
 static u8 *
 format_dhcp4_proxy_server (u8 * s, va_list * args)
@@ -960,16 +974,14 @@ format_dhcp4_proxy_server (u8 * s, va_list * args)
 
   rx_fib = ip4_fib_get (proxy->rx_fib_index);
 
-  s = format (s, "%=14u%=16U",
-             rx_fib->table_id,
-             format_ip46_address, &proxy->dhcp_src_address, IP46_TYPE_ANY);
+  s = format (s, "%=14u%=16U", rx_fib->hash.table_id, format_ip46_address,
+             &proxy->dhcp_src_address, IP46_TYPE_ANY);
 
   vec_foreach (server, proxy->dhcp_servers)
   {
     server_fib = ip4_fib_get (server->server_fib_index);
-    s = format (s, "%u,%U  ",
-               server_fib->table_id,
-               format_ip46_address, &server->dhcp_server, IP46_TYPE_ANY);
+    s = format (s, "%u,%U  ", server_fib->hash.table_id, format_ip46_address,
+               &server->dhcp_server, IP46_TYPE_ANY);
   }
   return s;
 }
@@ -997,13 +1009,11 @@ dhcp4_proxy_show_command_fn (vlib_main_t * vm,
   return (NULL);
 }
 
-/* *INDENT-OFF* */
 VLIB_CLI_COMMAND (dhcp_proxy_show_command, static) = {
   .path = "show dhcp proxy",
   .short_help = "Display dhcp proxy server info",
   .function = dhcp4_proxy_show_command_fn,
 };
-/* *INDENT-ON* */
 
 static clib_error_t *
 dhcp_option_82_vss_fn (vlib_main_t * vm,
@@ -1048,13 +1058,11 @@ dhcp_option_82_vss_fn (vlib_main_t * vm,
     }
 }
 
-/* *INDENT-OFF* */
 VLIB_CLI_COMMAND (dhcp_proxy_vss_command,static) = {
   .path = "set dhcp option-82 vss",
   .short_help = "set dhcp option-82 vss [del] table <table id> [oui <n> vpn-id <n> | vpn-ascii-id <text>]",
   .function = dhcp_option_82_vss_fn,
 };
-/* *INDENT-ON* */
 
 static clib_error_t *
 dhcp_vss_show_command_fn (vlib_main_t * vm,
@@ -1065,13 +1073,11 @@ dhcp_vss_show_command_fn (vlib_main_t * vm,
   return (NULL);
 }
 
-/* *INDENT-OFF* */
 VLIB_CLI_COMMAND (dhcp_proxy_vss_show_command, static) = {
   .path = "show dhcp vss",
   .short_help = "show dhcp VSS",
   .function = dhcp_vss_show_command_fn,
 };
-/* *INDENT-ON* */
 
 static clib_error_t *
 dhcp_option_82_address_show_command_fn (vlib_main_t * vm,
@@ -1114,13 +1120,11 @@ dhcp_option_82_address_show_command_fn (vlib_main_t * vm,
   return 0;
 }
 
-/* *INDENT-OFF* */
 VLIB_CLI_COMMAND (dhcp_proxy_address_show_command,static) = {
   .path = "show dhcp option-82-address interface",
   .short_help = "show dhcp option-82-address interface <interface>",
   .function = dhcp_option_82_address_show_command_fn,
 };
-/* *INDENT-ON* */
 
 /*
  * fd.io coding-style-patch-verification: ON