aboutsummaryrefslogtreecommitdiffstats
path: root/src/vpp/api/api.c
diff options
context:
space:
mode:
authorEyal Bari <ebari@cisco.com>2017-04-01 03:55:08 +0300
committerJohn Lo <loj@cisco.com>2017-04-01 17:36:30 +0000
commitf9f4065354d665c9b23931afbc23106549cf1d16 (patch)
tree9a620ea1ba0cb3754f6798a0845620683bceb8d3 /src/vpp/api/api.c
parent903fd513e32a37e55aec0cfb4cf30e000680e0c3 (diff)
ARP/ND/API:fix arp reg + nd no identical regs
fixed arp registration without allocating the event added protection against identical ND registrations Change-Id: I4e2db4913b35d895d8686ada1f0818920f276ad6 Signed-off-by: Eyal Bari <ebari@cisco.com>
Diffstat (limited to 'src/vpp/api/api.c')
-rw-r--r--src/vpp/api/api.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/src/vpp/api/api.c b/src/vpp/api/api.c
index 09ae8b8f23d..22410fcc22c 100644
--- a/src/vpp/api/api.c
+++ b/src/vpp/api/api.c
@@ -199,7 +199,7 @@ int ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp);
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;
@@ -1571,11 +1571,12 @@ vl_api_want_ip4_arp_events_t_handler (vl_api_want_ip4_arp_events_t * mp)
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 */ ,
@@ -1583,8 +1584,10 @@ vl_api_want_ip4_arp_events_t_handler (vl_api_want_ip4_arp_events_t * mp)
IP4_ARP_EVENT, event - am->arp_events, 1 /* is_add */ );
if (rv)
- goto out;
- pool_get (am->arp_events, event);
+ {
+ pool_put (am->arp_events, event);
+ goto out;
+ }
memset (event, 0, sizeof (*event));
event->_vl_msg_id = ntohs (VL_API_IP4_ARP_EVENT);
@@ -1613,12 +1616,24 @@ vl_api_want_ip6_nd_events_t_handler (vl_api_want_ip6_nd_events_t * mp)
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);
@@ -1629,11 +1644,6 @@ vl_api_want_ip6_nd_events_t_handler (vl_api_want_ip6_nd_events_t * mp)
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
{
@@ -1643,6 +1653,7 @@ vl_api_want_ip6_nd_events_t_handler (vl_api_want_ip6_nd_events_t * mp)
vpe_resolver_process_node.index,
IP6_ND_EVENT, ~0 /* pool index */ , 0 /* is_add */ );
}
+out:
REPLY_MACRO (VL_API_WANT_IP6_ND_EVENTS_REPLY);
}