#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,
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,
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;
* 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)
{
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;
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;
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);
+ server_index = fib_table_find_or_create_and_lock(FIB_PROTOCOL_IP4,
+ server_fib_id);
+
if (rx_fib_id == 0)
{
server = pool_elt_at_index (dpm->dhcp_servers, 0);
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))
initialize_it:
server->dhcp_server.as_u32 = addr->as_u32;
- server->server_fib_index = server_fib - im->fibs;
+ server->server_fib_index = server_index;
server->dhcp_src_address.as_u32 = src_address->as_u32;
server->insert_option_82 = insert_option_82;
server->valid = 1;
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;
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",