tcp: add option to pass opaque to next node
[vpp.git] / src / vnet / dhcp / dhcp4_proxy_node.c
index c1ae514..8a51708 100644 (file)
@@ -181,7 +181,14 @@ dhcp_proxy_to_server_input (vlib_main_t * vm,
              goto do_trace;
            }
 
-         space_left = vlib_buffer_chain_linearize (vm, b0);
+         if (!vlib_buffer_chain_linearize (vm, b0))
+           {
+             error0 = DHCP_PROXY_ERROR_PKT_TOO_BIG;
+             next0 = DHCP_PROXY_TO_SERVER_INPUT_NEXT_DROP;
+             pkts_too_big++;
+             goto do_trace;
+           }
+         space_left = vlib_buffer_space_left_at_end (vm, b0);
          /* cant parse chains...
           * and we need some space for option 82*/
          if ((b0->flags & VLIB_BUFFER_NEXT_PRESENT) != 0 ||
@@ -351,6 +358,7 @@ dhcp_proxy_to_server_input (vlib_main_t * vm,
                  u32 ci0;
 
                  c0 = vlib_buffer_copy (vm, b0);
+                 VLIB_BUFFER_TRACE_TRAJECTORY_INIT (c0);
                  ci0 = vlib_get_buffer_index (vm, c0);
                  server = &proxy->dhcp_servers[ii];
 
@@ -377,6 +385,7 @@ dhcp_proxy_to_server_input (vlib_main_t * vm,
                    {
                      dhcp_proxy_trace_t *tr;
 
+                     vlib_buffer_copy_trace_flag (vm, b0, ci0);
                      tr = vlib_add_trace (vm, node, c0, sizeof (*tr));
                      tr->which = 0;    /* to server */
                      tr->error = error0;
@@ -528,8 +537,8 @@ dhcp_proxy_to_client_input (vlib_main_t * vm,
       if (1 /* dpm->insert_option_82 */ )
        {
          /* linearize needed to "unclone" and scan options */
-         int space_left = vlib_buffer_chain_linearize (vm, b0);
-         if ((b0->flags & VLIB_BUFFER_NEXT_PRESENT) != 0 || space_left < 0)
+         int rv = vlib_buffer_chain_linearize (vm, b0);
+         if ((b0->flags & VLIB_BUFFER_NEXT_PRESENT) != 0 || !rv)
            {
              error0 = DHCP_PROXY_ERROR_PKT_TOO_BIG;
              goto drop_packet;
@@ -737,21 +746,24 @@ VLIB_REGISTER_NODE (dhcp_proxy_to_client_node, static) = {
 /* *INDENT-ON* */
 
 void
-dhcp_maybe_register_udp_ports (void)
+dhcp_maybe_register_udp_ports (dhcp_port_reg_flags_t ports)
 {
   dhcp_proxy_main_t *dm = &dhcp_proxy_main;
   vlib_main_t *vm = dm->vlib_main;
+  int port_regs_diff = dm->udp_ports_registered ^ ports;
 
-  if (dm->udp_ports_registered)
+  if (!port_regs_diff)
     return;
 
-  udp_register_dst_port (vm, UDP_DST_PORT_dhcp_to_client,
-                        dhcp_proxy_to_client_node.index, 1 /* is_ip4 */ );
+  if ((port_regs_diff & DHCP_PORT_REG_CLIENT) & ports)
+    udp_register_dst_port (vm, UDP_DST_PORT_dhcp_to_client,
+                          dhcp_proxy_to_client_node.index, 1 /* is_ip4 */ );
 
-  udp_register_dst_port (vm, UDP_DST_PORT_dhcp_to_server,
-                        dhcp_proxy_to_server_node.index, 1 /* is_ip4 */ );
+  if ((port_regs_diff & DHCP_PORT_REG_SERVER) & ports)
+    udp_register_dst_port (vm, UDP_DST_PORT_dhcp_to_server,
+                          dhcp_proxy_to_server_node.index, 1 /* is_ip4 */ );
 
-  dm->udp_ports_registered = 1;
+  dm->udp_ports_registered |= ports;
 }
 
 static clib_error_t *
@@ -790,7 +802,7 @@ dhcp4_proxy_set_server (ip46_address_t * addr,
   if (ip46_address_is_zero (src_addr))
     return VNET_API_ERROR_INVALID_SRC_ADDRESS;
 
-  dhcp_maybe_register_udp_ports ();
+  dhcp_maybe_register_udp_ports (DHCP_PORT_REG_CLIENT | DHCP_PORT_REG_SERVER);
 
   rx_fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4,
                                                    rx_table_id,