Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
ARP/API:protect against identical registrations
[vpp.git]
/
src
/
vpp
/
api
/
api.c
diff --git
a/src/vpp/api/api.c
b/src/vpp/api/api.c
index
828394e
..
14ccd86
100644
(file)
--- a/
src/vpp/api/api.c
+++ b/
src/vpp/api/api.c
@@
-158,14
+158,14
@@
typedef enum
} resolve_t;
static vlib_node_registration_t vpe_resolver_process_node;
} 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);
/* Clean up all registrations belonging to the indicated client */
static int arp_change_delete_callback (u32 pool_index, u8 * notused);
static int nd_change_delete_callback (u32 pool_index, u8 * notused);
/* Clean up all registrations belonging to the indicated client */
-int
-
vl_api_
memclnt_delete_callback (u32 client_index)
+static clib_error_t *
+memclnt_delete_callback (u32 client_index)
{
vpe_api_main_t *vam = &vpe_api_main;
vpe_client_registration_t *rp;
{
vpe_api_main_t *vam = &vpe_api_main;
vpe_client_registration_t *rp;
@@
-186,6
+186,8
@@
vl_api_memclnt_delete_callback (u32 client_index)
return 0;
}
return 0;
}
+VL_MSG_API_REAPER_FUNCTION (memclnt_delete_callback);
+
pub_sub_handler (oam_events, OAM_EVENTS);
#define RESOLUTION_EVENT 1
pub_sub_handler (oam_events, OAM_EVENTS);
#define RESOLUTION_EVENT 1
@@
-475,7
+477,6
@@
vl_api_create_vlan_subif_t_handler (vl_api_create_vlan_subif_t * mp)
uword *p;
vnet_interface_main_t *im = &vnm->interface_main;
u64 sup_and_sub_key;
uword *p;
vnet_interface_main_t *im = &vnm->interface_main;
u64 sup_and_sub_key;
- u64 *kp;
unix_shared_memory_queue_t *q;
clib_error_t *error;
unix_shared_memory_queue_t *q;
clib_error_t *error;
@@
-505,9
+506,6
@@
vl_api_create_vlan_subif_t_handler (vl_api_create_vlan_subif_t * mp)
goto out;
}
goto out;
}
- kp = clib_mem_alloc (sizeof (*kp));
- *kp = sup_and_sub_key;
-
memset (&template, 0, sizeof (template));
template.type = VNET_SW_INTERFACE_TYPE_SUB;
template.sup_sw_if_index = hi->sw_if_index;
memset (&template, 0, sizeof (template));
template.type = VNET_SW_INTERFACE_TYPE_SUB;
template.sup_sw_if_index = hi->sw_if_index;
@@
-524,6
+522,10
@@
vl_api_create_vlan_subif_t_handler (vl_api_create_vlan_subif_t * mp)
rv = VNET_API_ERROR_INVALID_REGISTRATION;
goto out;
}
rv = VNET_API_ERROR_INVALID_REGISTRATION;
goto out;
}
+
+ u64 *kp = clib_mem_alloc (sizeof (*kp));
+ *kp = sup_and_sub_key;
+
hash_set (hi->sub_interface_sw_if_index_by_id, id, sw_if_index);
hash_set_mem (im->sw_if_index_by_sup_and_sub, kp, sw_if_index);
hash_set (hi->sub_interface_sw_if_index_by_id, id, sw_if_index);
hash_set_mem (im->sw_if_index_by_sup_and_sub, kp, sw_if_index);
@@
-535,10
+537,10
@@
out:
return;
rmp = vl_msg_api_alloc (sizeof (*rmp));
return;
rmp = vl_msg_api_alloc (sizeof (*rmp));
- rmp->_vl_msg_id =
ntoh
s (VL_API_CREATE_VLAN_SUBIF_REPLY);
+ rmp->_vl_msg_id =
hton
s (VL_API_CREATE_VLAN_SUBIF_REPLY);
rmp->context = mp->context;
rmp->context = mp->context;
- rmp->retval =
ntoh
l (rv);
- rmp->sw_if_index =
ntoh
l (sw_if_index);
+ rmp->retval =
hton
l (rv);
+ rmp->sw_if_index =
hton
l (sw_if_index);
vl_msg_api_send_shmem (q, (u8 *) & rmp);
}
vl_msg_api_send_shmem (q, (u8 *) & rmp);
}
@@
-556,7
+558,6
@@
vl_api_create_subif_t_handler (vl_api_create_subif_t * mp)
uword *p;
vnet_interface_main_t *im = &vnm->interface_main;
u64 sup_and_sub_key;
uword *p;
vnet_interface_main_t *im = &vnm->interface_main;
u64 sup_and_sub_key;
- u64 *kp;
clib_error_t *error;
VALIDATE_SW_IF_INDEX (mp);
clib_error_t *error;
VALIDATE_SW_IF_INDEX (mp);
@@
-585,9
+586,6
@@
vl_api_create_subif_t_handler (vl_api_create_subif_t * mp)
goto out;
}
goto out;
}
- kp = clib_mem_alloc (sizeof (*kp));
- *kp = sup_and_sub_key;
-
memset (&template, 0, sizeof (template));
template.type = VNET_SW_INTERFACE_TYPE_SUB;
template.sup_sw_if_index = sw_if_index;
memset (&template, 0, sizeof (template));
template.type = VNET_SW_INTERFACE_TYPE_SUB;
template.sup_sw_if_index = sw_if_index;
@@
-611,6
+609,9
@@
vl_api_create_subif_t_handler (vl_api_create_subif_t * mp)
goto out;
}
goto out;
}
+ u64 *kp = clib_mem_alloc (sizeof (*kp));
+ *kp = sup_and_sub_key;
+
hash_set (hi->sub_interface_sw_if_index_by_id, sub_id, sw_if_index);
hash_set_mem (im->sw_if_index_by_sup_and_sub, kp, sw_if_index);
hash_set (hi->sub_interface_sw_if_index_by_id, sub_id, sw_if_index);
hash_set_mem (im->sw_if_index_by_sup_and_sub, kp, sw_if_index);
@@
-667,20
+668,11
@@
static void
int rv = 0;
vnet_main_t *vnm = vnet_get_main ();
vl_api_proxy_arp_intfc_enable_disable_reply_t *rmp;
int rv = 0;
vnet_main_t *vnm = vnet_get_main ();
vl_api_proxy_arp_intfc_enable_disable_reply_t *rmp;
- vnet_sw_interface_t *si;
- u32 sw_if_index;
VALIDATE_SW_IF_INDEX (mp);
VALIDATE_SW_IF_INDEX (mp);
- sw_if_index = ntohl (mp->sw_if_index);
-
- if (pool_is_free_index (vnm->interface_main.sw_interfaces, sw_if_index))
- {
- rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
- goto out;
- }
-
- si = vnet_get_sw_interface (vnm, sw_if_index);
+ vnet_sw_interface_t *si =
+ vnet_get_sw_interface (vnm, ntohl (mp->sw_if_index));
ASSERT (si);
ASSERT (si);
@@
-857,7
+849,7
@@
vl_api_vnet_get_summary_stats_t_handler (vl_api_vnet_get_summary_stats_t * mp)
{
which = cm - im->combined_sw_if_counters;
{
which = cm - im->combined_sw_if_counters;
- for (i = 0; i < v
ec_len (cm->maxi
); i++)
+ for (i = 0; i < v
lib_combined_counter_n_counters (cm
); i++)
{
vlib_get_combined_counter (cm, i, &v);
total_pkts[which] += v.packets;
{
vlib_get_combined_counter (cm, i, &v);
total_pkts[which] += v.packets;
@@
-1221,13
+1213,12
@@
static void vl_api_classify_set_interface_ip_table_t_handler
vlib_main_t *vm = vlib_get_main ();
vl_api_classify_set_interface_ip_table_reply_t *rmp;
int rv;
vlib_main_t *vm = vlib_get_main ();
vl_api_classify_set_interface_ip_table_reply_t *rmp;
int rv;
- u32 table_index, sw_if_index;
-
- table_index = ntohl (mp->table_index);
- sw_if_index = ntohl (mp->sw_if_index);
VALIDATE_SW_IF_INDEX (mp);
VALIDATE_SW_IF_INDEX (mp);
+ u32 table_index = ntohl (mp->table_index);
+ u32 sw_if_index = ntohl (mp->sw_if_index);
+
if (mp->is_ipv6)
rv = vnet_set_ip6_classify_intfc (vm, sw_if_index, table_index);
else
if (mp->is_ipv6)
rv = vnet_set_ip6_classify_intfc (vm, sw_if_index, table_index);
else
@@
-1583,6
+1574,14
@@
vl_api_want_ip4_arp_events_t_handler (vl_api_want_ip4_arp_events_t * mp)
if (mp->enable_disable)
{
if (mp->enable_disable)
{
+ 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)
+ goto out;
pool_get (am->arp_events, event);
memset (event, 0, sizeof (*event));
pool_get (am->arp_events, event);
memset (event, 0, sizeof (*event));
@@
-1593,12
+1592,6
@@
vl_api_want_ip4_arp_events_t_handler (vl_api_want_ip4_arp_events_t * mp)
event->pid = mp->pid;
if (mp->address == 0)
event->mac_ip = 1;
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
{
}
else
{
@@
-1608,6
+1601,7
@@
vl_api_want_ip4_arp_events_t_handler (vl_api_want_ip4_arp_events_t * mp)
vpe_resolver_process_node.index,
IP4_ARP_EVENT, ~0 /* pool index */ , 0 /* is_add */ );
}
vpe_resolver_process_node.index,
IP4_ARP_EVENT, ~0 /* pool index */ , 0 /* is_add */ );
}
+out:
REPLY_MACRO (VL_API_WANT_IP4_ARP_EVENTS_REPLY);
}
REPLY_MACRO (VL_API_WANT_IP4_ARP_EVENTS_REPLY);
}
@@
-1656,15
+1650,14
@@
static void vl_api_input_acl_set_interface_t_handler
vlib_main_t *vm = vlib_get_main ();
vl_api_input_acl_set_interface_reply_t *rmp;
int rv;
vlib_main_t *vm = vlib_get_main ();
vl_api_input_acl_set_interface_reply_t *rmp;
int rv;
- u32 sw_if_index, ip4_table_index, ip6_table_index, l2_table_index;
-
- ip4_table_index = ntohl (mp->ip4_table_index);
- ip6_table_index = ntohl (mp->ip6_table_index);
- l2_table_index = ntohl (mp->l2_table_index);
- sw_if_index = ntohl (mp->sw_if_index);
VALIDATE_SW_IF_INDEX (mp);
VALIDATE_SW_IF_INDEX (mp);
+ u32 ip4_table_index = ntohl (mp->ip4_table_index);
+ u32 ip6_table_index = ntohl (mp->ip6_table_index);
+ u32 l2_table_index = ntohl (mp->l2_table_index);
+ u32 sw_if_index = ntohl (mp->sw_if_index);
+
rv = vnet_set_input_acl_intfc (vm, sw_if_index, ip4_table_index,
ip6_table_index, l2_table_index, mp->is_add);
rv = vnet_set_input_acl_intfc (vm, sw_if_index, ip4_table_index,
ip6_table_index, l2_table_index, mp->is_add);
@@
-2011,25
+2004,22
@@
vl_api_feature_enable_disable_t_handler (vl_api_feature_enable_disable_t * mp)
{
vl_api_feature_enable_disable_reply_t *rmp;
int rv = 0;
{
vl_api_feature_enable_disable_reply_t *rmp;
int rv = 0;
- u8 *arc_name, *feature_name;
VALIDATE_SW_IF_INDEX (mp);
VALIDATE_SW_IF_INDEX (mp);
- arc_name = format (0, "%s%c", mp->arc_name, 0);
- feature_name = format (0, "%s%c", mp->feature_name, 0);
+
u8 *
arc_name = format (0, "%s%c", mp->arc_name, 0);
+
u8 *
feature_name = format (0, "%s%c", mp->feature_name, 0);
- vnet_feature_registration_t *reg;
- reg =
+ vnet_feature_registration_t *reg =
vnet_get_feature_reg ((const char *) arc_name,
(const char *) feature_name);
if (reg == 0)
rv = VNET_API_ERROR_INVALID_VALUE;
else
{
vnet_get_feature_reg ((const char *) arc_name,
(const char *) feature_name);
if (reg == 0)
rv = VNET_API_ERROR_INVALID_VALUE;
else
{
- u32 sw_if_index;
+ u32 sw_if_index
= ntohl (mp->sw_if_index)
;
clib_error_t *error = 0;
clib_error_t *error = 0;
- sw_if_index = ntohl (mp->sw_if_index);
if (reg->enable_disable_cb)
error = reg->enable_disable_cb (sw_if_index, mp->enable);
if (!error)
if (reg->enable_disable_cb)
error = reg->enable_disable_cb (sw_if_index, mp->enable);
if (!error)
@@
-2143,7
+2133,6
@@
vpe_api_init (vlib_main_t * vm)
am->oam_events_registration_hash = hash_create (0, sizeof (uword));
am->bfd_events_registration_hash = hash_create (0, sizeof (uword));
am->oam_events_registration_hash = hash_create (0, sizeof (uword));
am->bfd_events_registration_hash = hash_create (0, sizeof (uword));
- vl_api_init (vm);
vl_set_memory_region_name ("/vpe-api");
vl_enable_disable_memory_api (vm, 1 /* enable it */ );
vl_set_memory_region_name ("/vpe-api");
vl_enable_disable_memory_api (vm, 1 /* enable it */ );
@@
-2282,7
+2271,7
@@
format_arp_event (u8 * s, va_list * args)
{
vl_api_ip4_arp_event_t *event = va_arg (*args, vl_api_ip4_arp_event_t *);
{
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
if (event->mac_ip)
s = format (s, "bd mac/ip4 binding events");
else
@@
-2295,7
+2284,7
@@
format_nd_event (u8 * s, va_list * args)
{
vl_api_ip6_nd_event_t *event = va_arg (*args, vl_api_ip6_nd_event_t *);
{
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
if (event->mac_ip)
s = format (s, "bd mac/ip6 binding events");
else