dpdk: Add support for Mellanox ConnectX-4 devices
[vpp.git] / vnet / vnet / dhcp / proxy_node.c
index 2f86022..d0d99d7 100644 (file)
@@ -18,6 +18,7 @@
 #include <vlib/vlib.h>
 #include <vnet/pg/pg.h>
 #include <vnet/dhcp/proxy.h>
+#include <vnet/fib/ip4_fib.h>
 
 static char * dhcp_proxy_error_strings[] = {
 #define dhcp_proxy_error(n,s) s,
@@ -93,24 +94,6 @@ u8 * format_dhcp_proxy_header_with_length (u8 * s, va_list * args)
   return s;
 }
 
-/* get first interface address */
-static ip4_address_t *
-ip4_interface_first_address (ip4_main_t * im, u32 sw_if_index)
-{
-  ip_lookup_main_t * lm = &im->lookup_main;
-  ip_interface_address_t * ia = 0;
-  ip4_address_t * result = 0;
-
-  foreach_ip_interface_address (lm, ia, sw_if_index, 
-                                1 /* honor unnumbered */,
-  ({
-    ip4_address_t * a = ip_interface_address_get_address (lm, ia);
-    result = a;
-    break;
-  }));
-  return result;
-}
-
 static uword
 dhcp_proxy_to_server_input (vlib_main_t * vm,
                             vlib_node_runtime_t * node,
@@ -243,7 +226,7 @@ dhcp_proxy_to_server_input (vlib_main_t * vm,
               
               fib_index = im->fib_index_by_sw_if_index 
                 [vnet_buffer(b0)->sw_if_index[VLIB_RX]];
-             fib = vec_elt_at_index (im->fibs, fib_index);
+             fib = ip4_fib_get (fib_index);
              fib_id = fib->table_id;
 
               end = b0->data + b0->current_data + b0->current_length;
@@ -290,7 +273,7 @@ dhcp_proxy_to_server_input (vlib_main_t * vm,
                    * RX interface, if not unnumbered. otherwise use
                    * the loopback interface's ip address.
                    */
-                  ia0 = ip4_interface_first_address(&ip4_main, sw_if_index);
+                  ia0 = ip4_interface_first_address(&ip4_main, sw_if_index, 0);
                   
                   if (ia0 == 0)
                     {
@@ -597,7 +580,7 @@ dhcp_proxy_to_client_input (vlib_main_t * vm,
       if (swif->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)
           sw_if_index = swif->unnumbered_sw_if_index;
 
-      ia0 = ip4_interface_first_address (&ip4_main, sw_if_index);
+      ia0 = ip4_interface_first_address (&ip4_main, sw_if_index, 0);
       if (ia0 == 0)
         {
           error0 = DHCP_PROXY_ERROR_NO_INTERFACE_ADDRESS;
@@ -633,7 +616,7 @@ dhcp_proxy_to_client_input (vlib_main_t * vm,
 
       hi0 = vnet_get_sup_hw_interface (vnm, original_sw_if_index);
       ei0 = pool_elt_at_index (em->interfaces, hi0->hw_instance);
-      memcpy (mac0->src_address, ei0->address, sizeof (ei0->address));
+      clib_memcpy (mac0->src_address, ei0->address, sizeof (ei0->address));
       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);
@@ -717,9 +700,7 @@ int dhcp_proxy_set_server_2 (ip4_address_t *addr, ip4_address_t *src_address,
                              int insert_option_82, int is_del)
 {
   dhcp_proxy_main_t * dpm = &dhcp_proxy_main;
-  ip4_main_t * im = &ip4_main;
   dhcp_server_t * server = 0;
-  ip4_fib_t *rx_fib, *server_fib;
   u32 server_index = 0;
   u32 rx_fib_index = 0;
 
@@ -729,18 +710,9 @@ int dhcp_proxy_set_server_2 (ip4_address_t *addr, ip4_address_t *src_address,
   if (src_address->as_u32 == 0)
     return VNET_API_ERROR_INVALID_SRC_ADDRESS;
 
-  rx_fib = find_ip4_fib_by_table_index_or_id 
-    (&ip4_main, rx_fib_id, IP4_ROUTE_FLAG_TABLE_ID);
-    
-  if (rx_fib == 0)
-    return VNET_API_ERROR_NO_SUCH_INNER_FIB;
-  
-  server_fib = find_ip4_fib_by_table_index_or_id 
-    (&ip4_main, server_fib_id, IP4_ROUTE_FLAG_TABLE_ID);
-    
-  if (server_fib == 0)
-    return VNET_API_ERROR_NO_SUCH_FIB;
-  
+  rx_fib_index = fib_table_find_or_create_and_lock(FIB_PROTOCOL_IP4,
+                                                   rx_fib_id);
+
   if (rx_fib_id == 0)
     {
       server = pool_elt_at_index (dpm->dhcp_servers, 0);
@@ -753,8 +725,6 @@ int dhcp_proxy_set_server_2 (ip4_address_t *addr, ip4_address_t *src_address,
       goto initialize_it;
     }
 
-  rx_fib_index = rx_fib - im->fibs;
-
   if (is_del)
     {
       if (rx_fib_index >= vec_len(dpm->dhcp_server_index_by_rx_fib_index))
@@ -786,7 +756,9 @@ int dhcp_proxy_set_server_2 (ip4_address_t *addr, ip4_address_t *src_address,
  initialize_it:
 
   server->dhcp_server.as_u32 = addr->as_u32;
-  server->server_fib_index = server_fib - im->fibs;
+  server->server_fib_index = 
+      fib_table_find_or_create_and_lock(FIB_PROTOCOL_IP4,
+                                       server_fib_id);
   server->dhcp_src_address.as_u32 = src_address->as_u32;
   server->insert_option_82 = insert_option_82;
   server->valid = 1;
@@ -901,14 +873,12 @@ u8 * format_dhcp_proxy_server (u8 * s, va_list * args)
       return s;
     }
 
-  server_fib = find_ip4_fib_by_table_index_or_id 
-    (&ip4_main, server->server_fib_index, IP4_ROUTE_FLAG_FIB_INDEX);
+  server_fib = ip4_fib_get(server->server_fib_index);
 
   if (server_fib)
     server_fib_id = server_fib->table_id;
 
-  rx_fib = find_ip4_fib_by_table_index_or_id 
-    (&ip4_main, rx_fib_index, IP4_ROUTE_FLAG_FIB_INDEX);
+  rx_fib = ip4_fib_get(rx_fib_index);
 
   if (rx_fib)
     rx_fib_id = rx_fib->table_id;
@@ -1113,7 +1083,7 @@ dhcp_option_82_address_show_command_fn (vlib_main_t * vm,
           swif = vnet_get_sw_interface (vnm, sw_if_index0);
           sw_if_index = (swif->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED) ?
             swif->unnumbered_sw_if_index : sw_if_index0;
-          ia0 = ip4_interface_first_address(&ip4_main, sw_if_index);
+          ia0 = ip4_interface_first_address(&ip4_main, sw_if_index, 0);
           if (ia0)
             {
               vlib_cli_output (vm, "%=20s%=20s", "interface",