} resolve_t;
static vlib_node_registration_t vpe_resolver_process_node;
-vpe_api_main_t vpe_api_main;
+extern vpe_api_main_t vpe_api_main;
static int arp_change_delete_callback (u32 pool_index, u8 * notused);
static int nd_change_delete_callback (u32 pool_index, u8 * notused);
int ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp);
-void
+static void
handle_ip4_arp_event (u32 pool_index)
{
vpe_api_main_t *vam = &vpe_api_main;
bd_main_t *bdm = &bd_main;
vl_api_sw_interface_set_l2_bridge_reply_t *rmp;
int rv = 0;
- u32 rx_sw_if_index = ntohl (mp->rx_sw_if_index);
- u32 bd_id = ntohl (mp->bd_id);
- u32 bd_index;
- u32 bvi = mp->bvi;
- u8 shg = mp->shg;
vlib_main_t *vm = vlib_get_main ();
vnet_main_t *vnm = vnet_get_main ();
VALIDATE_RX_SW_IF_INDEX (mp);
+ u32 rx_sw_if_index = ntohl (mp->rx_sw_if_index);
- bd_index = bd_find_or_add_bd_index (bdm, bd_id);
if (mp->enable)
{
- //VALIDATE_TX_SW_IF_INDEX(mp);
+ u32 bd_id = ntohl (mp->bd_id);
+ u32 bd_index = bd_find_or_add_bd_index (bdm, bd_id);
+ u32 bvi = mp->bvi;
+ u8 shg = mp->shg;
rv = set_int_l2_mode (vm, vnm, MODE_L2_BRIDGE,
rx_sw_if_index, bd_index, bvi, shg, 0);
}
/* *INDENT-OFF* */
pool_foreach (fib_table, im4->fibs,
({
- fib = &fib_table->v4;
vnet_sw_interface_t * si;
+ fib = pool_elt_at_index (im4->v4_fibs, fib_table->ft_index);
+
if (fib->table_id != target_fib_id)
continue;
pool_foreach (fib_table, im6->fibs,
({
vnet_sw_interface_t * si;
- fib = &(fib_table->v6);
+
+ fib = pool_elt_at_index (im6->v6_fibs, fib_table->ft_index);
if (fib->table_id != target_fib_id)
continue;
vec_reset_length (sw_if_indices_to_shut);
+ /* Set the flow hash for this fib to the default */
+ vnet_set_ip6_flow_hash (fib->table_id, IP_FLOW_HASH_DEFAULT);
+
/* Shut down interfaces in this FIB / clean out intfc routes */
pool_foreach (si, im->sw_interfaces,
({
vpe_api_main_t *am = &vpe_api_main;
vnet_main_t *vnm = vnet_get_main ();
vl_api_want_ip4_arp_events_reply_t *rmp;
- vl_api_ip4_arp_event_t *event;
int rv;
if (mp->enable_disable)
{
+ vl_api_ip4_arp_event_t *event;
pool_get (am->arp_events, event);
+ rv = vnet_add_del_ip4_arp_change_event
+ (vnm, arp_change_data_callback,
+ mp->pid, &mp->address /* addr, in net byte order */ ,
+ vpe_resolver_process_node.index,
+ IP4_ARP_EVENT, event - am->arp_events, 1 /* is_add */ );
+
+ if (rv)
+ {
+ pool_put (am->arp_events, event);
+ goto out;
+ }
memset (event, 0, sizeof (*event));
event->_vl_msg_id = ntohs (VL_API_IP4_ARP_EVENT);
event->pid = mp->pid;
if (mp->address == 0)
event->mac_ip = 1;
-
- rv = vnet_add_del_ip4_arp_change_event
- (vnm, arp_change_data_callback,
- mp->pid, &mp->address /* addr, in net byte order */ ,
- vpe_resolver_process_node.index,
- IP4_ARP_EVENT, event - am->arp_events, 1 /* is_add */ );
}
else
{
vpe_resolver_process_node.index,
IP4_ARP_EVENT, ~0 /* pool index */ , 0 /* is_add */ );
}
+out:
REPLY_MACRO (VL_API_WANT_IP4_ARP_EVENTS_REPLY);
}
vpe_api_main_t *am = &vpe_api_main;
vnet_main_t *vnm = vnet_get_main ();
vl_api_want_ip6_nd_events_reply_t *rmp;
- vl_api_ip6_nd_event_t *event;
int rv;
if (mp->enable_disable)
{
+ vl_api_ip6_nd_event_t *event;
pool_get (am->nd_events, event);
+
+ rv = vnet_add_del_ip6_nd_change_event
+ (vnm, nd_change_data_callback,
+ mp->pid, mp->address /* addr, in net byte order */ ,
+ vpe_resolver_process_node.index,
+ IP6_ND_EVENT, event - am->nd_events, 1 /* is_add */ );
+
+ if (rv)
+ {
+ pool_put (am->nd_events, event);
+ goto out;
+ }
memset (event, 0, sizeof (*event));
event->_vl_msg_id = ntohs (VL_API_IP6_ND_EVENT);
if (ip6_address_is_zero ((ip6_address_t *) mp->address))
event->mac_ip = 1;
- rv = vnet_add_del_ip6_nd_change_event
- (vnm, nd_change_data_callback,
- mp->pid, mp->address /* addr, in net byte order */ ,
- vpe_resolver_process_node.index,
- IP6_ND_EVENT, event - am->nd_events, 1 /* is_add */ );
}
else
{
vpe_resolver_process_node.index,
IP6_ND_EVENT, ~0 /* pool index */ , 0 /* is_add */ );
}
+out:
REPLY_MACRO (VL_API_WANT_IP6_ND_EVENTS_REPLY);
}
{
vl_api_ip4_arp_event_t *event = va_arg (*args, vl_api_ip4_arp_event_t *);
- s = format (s, "pid %d: ", event->pid);
+ s = format (s, "pid %d: ", ntohl (event->pid));
if (event->mac_ip)
s = format (s, "bd mac/ip4 binding events");
else
{
vl_api_ip6_nd_event_t *event = va_arg (*args, vl_api_ip6_nd_event_t *);
- s = format (s, "pid %d: ", event->pid);
+ s = format (s, "pid %d: ", ntohl (event->pid));
if (event->mac_ip)
s = format (s, "bd mac/ip6 binding events");
else