Multiple API message handlers call vnet_get_sup_hw_interface(...)
without checking the inbound sw_if_index. This can cause a
pool_elt_at_index ASSERT in a debug image, and major disorder in a
production image.
Given that a number of places are coded as follows, add an
"api_visible_or_null" variant of vnet_get_sup_hw_interface, which
returns NULL given an invalid sw_if_index, or a hidden sw interface:
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || memif_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a memif interface");
Rename two existing xxx_safe functions -> xxx_or_null to make it
obvious what they return.
Type: fix
Change-Id: I29996e8d0768fd9e0c5495bd91ff8bedcf2c5697
Signed-off-by: Dave Barach <dave@barachs.net>
22 files changed:
vnet_hw_interface_t *hw;
int rv = 0;
vnet_hw_interface_t *hw;
int rv = 0;
- hw = vnet_get_sup_hw_interface (vnm, htonl (mp->sw_if_index));
+ hw =
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm,
+ htonl (mp->sw_if_index));
if (hw == NULL || avf_device_class.index != hw->dev_class_index)
{
rv = VNET_API_ERROR_INVALID_INTERFACE;
if (hw == NULL || avf_device_class.index != hw->dev_class_index)
{
rv = VNET_API_ERROR_INVALID_INTERFACE;
return clib_error_return (0,
"please specify interface name or sw_if_index");
return clib_error_return (0,
"please specify interface name or sw_if_index");
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || avf_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not an AVF interface");
if (hw == NULL || avf_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not an AVF interface");
return clib_error_return (0,
"please specify interface name or sw_if_index");
return clib_error_return (0,
"please specify interface name or sw_if_index");
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || avf_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a AVF interface");
if (hw == NULL || avf_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a AVF interface");
return clib_error_return (0,
"please specify interface name or sw_if_index");
return clib_error_return (0,
"please specify interface name or sw_if_index");
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || mrvl_pp2_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a Marvell PP2 interface");
if (hw == NULL || mrvl_pp2_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a Marvell PP2 interface");
return clib_error_return (0,
"please specify interface name or sw_if_index");
return clib_error_return (0,
"please specify interface name or sw_if_index");
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || memif_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a memif interface");
if (hw == NULL || memif_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a memif interface");
vlib_main_t *vm = vlib_get_main ();
vnet_main_t *vnm = vnet_get_main ();
vl_api_memif_delete_reply_t *rmp;
vlib_main_t *vm = vlib_get_main ();
vnet_main_t *vnm = vnet_get_main ();
vl_api_memif_delete_reply_t *rmp;
- vnet_hw_interface_t *hi =
- vnet_get_sup_hw_interface (vnm, ntohl (mp->sw_if_index));
+ vnet_hw_interface_t *hi;
memif_if_t *mif;
int rv = 0;
memif_if_t *mif;
int rv = 0;
+ hi =
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm,
+ ntohl (mp->sw_if_index));
+
if (hi == NULL || memif_device_class.index != hi->dev_class_index)
rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
else
if (hi == NULL || memif_device_class.index != hi->dev_class_index)
rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
else
return clib_error_return (0,
"please specify interface name or sw_if_index");
return clib_error_return (0,
"please specify interface name or sw_if_index");
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || rdma_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a RDMA interface");
if (hw == NULL || rdma_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a RDMA interface");
return clib_error_return (0,
"please specify interface name or sw_if_index");
return clib_error_return (0,
"please specify interface name or sw_if_index");
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || vmxnet3_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a vmxnet3 interface");
if (hw == NULL || vmxnet3_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a vmxnet3 interface");
return clib_error_return (0,
"please specify interface name or sw_if_index");
return clib_error_return (0,
"please specify interface name or sw_if_index");
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || vmxnet3_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a vmxnet3 interface");
if (hw == NULL || vmxnet3_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a vmxnet3 interface");
vnet_hw_interface_t *hw;
int rv = 0;
vnet_hw_interface_t *hw;
int rv = 0;
- hw = vnet_get_sup_hw_interface (vnm, htonl (mp->sw_if_index));
+ hw =
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm,
+ htonl (mp->sw_if_index));
if (hw == NULL || vmxnet3_device_class.index != hw->dev_class_index)
{
if (hw == NULL || vmxnet3_device_class.index != hw->dev_class_index)
{
- rv = VNET_API_ERROR_INVALID_INTERFACE;
+ rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
if (rw->sw_if_index != ~0)
{
vnet_sw_interface_t *si;
if (rw->sw_if_index != ~0)
{
vnet_sw_interface_t *si;
- si = vnet_get_sw_interface_safe (vnm, rw->sw_if_index);
+ si = vnet_get_sw_interface_or_null (vnm, rw->sw_if_index);
if (NULL != si)
s = format (s, "%U:", format_vnet_sw_interface_name, vnm, si);
else
if (NULL != si)
s = format (s, "%U:", format_vnet_sw_interface_name, vnm, si);
else
if (is_set)
{
vnet_sw_interface_t *sw_if =
if (is_set)
{
vnet_sw_interface_t *sw_if =
- vnet_get_sw_interface_safe (&vnet_main, sw_if_index);
+ vnet_get_sw_interface_or_null (&vnet_main, sw_if_index);
vnet_hw_interface_t *hw_if =
vnet_get_hw_interface (&vnet_main, sw_if->hw_if_index);
u8 *s = format (NULL, "UDP echo source is: %v\n", hw_if->name);
vnet_hw_interface_t *hw_if =
vnet_get_hw_interface (&vnet_main, sw_if->hw_if_index);
u8 *s = format (NULL, "UDP echo source is: %v\n", hw_if->name);
bfd_udp_set_echo_source (u32 sw_if_index)
{
vnet_sw_interface_t *sw_if =
bfd_udp_set_echo_source (u32 sw_if_index)
{
vnet_sw_interface_t *sw_if =
- vnet_get_sw_interface_safe (bfd_udp_main.vnet_main, sw_if_index);
+ vnet_get_sw_interface_or_null (bfd_udp_main.vnet_main, sw_if_index);
if (sw_if)
{
bfd_udp_main.echo_source_sw_if_index = sw_if_index;
if (sw_if)
{
bfd_udp_main.echo_source_sw_if_index = sw_if_index;
* pick an unused address from that subnet
*/
vnet_sw_interface_t *sw_if =
* pick an unused address from that subnet
*/
vnet_sw_interface_t *sw_if =
- vnet_get_sw_interface_safe (bfd_udp_main.vnet_main,
- bfd_udp_main.echo_source_sw_if_index);
+ vnet_get_sw_interface_or_null (bfd_udp_main.vnet_main,
+ bfd_udp_main.echo_source_sw_if_index);
if (sw_if && sw_if->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
{
if (BFD_TRANSPORT_UDP4 == transport)
if (sw_if && sw_if->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
{
if (BFD_TRANSPORT_UDP4 == transport)
{
bfd_udp_main_t *bum = &bfd_udp_main;
vnet_sw_interface_t *sw_if =
{
bfd_udp_main_t *bum = &bfd_udp_main;
vnet_sw_interface_t *sw_if =
- vnet_get_sw_interface_safe (bfd_udp_main.vnet_main, sw_if_index);
+ vnet_get_sw_interface_or_null (bfd_udp_main.vnet_main, sw_if_index);
u8 local_ip_valid = 0;
ip_interface_address_t *ia = NULL;
if (!sw_if)
u8 local_ip_valid = 0;
ip_interface_address_t *ia = NULL;
if (!sw_if)
virtio_if_t *vif;
vnet_hw_interface_t *hw;
virtio_if_t *vif;
vnet_hw_interface_t *hw;
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || virtio_device_class.index != hw->dev_class_index)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
if (hw == NULL || virtio_device_class.index != hw->dev_class_index)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
vnet_main_t *vnm = vnet_get_main ();
virtio_main_t *mm = &virtio_main;
virtio_if_t *vif;
vnet_main_t *vnm = vnet_get_main ();
virtio_main_t *mm = &virtio_main;
virtio_if_t *vif;
- vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ vnet_hw_interface_t *hw;
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
+
if (hw == NULL || virtio_device_class.index != hw->dev_class_index)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
if (hw == NULL || virtio_device_class.index != hw->dev_class_index)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
return clib_error_return (0,
"please specify interface name or sw_if_index");
return clib_error_return (0,
"please specify interface name or sw_if_index");
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || virtio_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a virtio interface");
if (hw == NULL || virtio_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a virtio interface");
vnet_hw_interface_t *hwif;
u16 qid;
vnet_hw_interface_t *hwif;
u16 qid;
- if (!(hwif = vnet_get_sup_hw_interface (vnm, sw_if_index)) ||
- hwif->dev_class_index != vhost_user_device_class.index)
+ if (!
+ (hwif =
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index))
+ || hwif->dev_class_index != vhost_user_device_class.index)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
vui = pool_elt_at_index (vum->vhost_user_interfaces, hwif->dev_instance);
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
vui = pool_elt_at_index (vum->vhost_user_interfaces, hwif->dev_instance);
vnet_hw_interface_t *hwif;
uword *if_index;
vnet_hw_interface_t *hwif;
uword *if_index;
- if (!(hwif = vnet_get_sup_hw_interface (vnm, sw_if_index)) ||
- hwif->dev_class_index != vhost_user_device_class.index)
+ if (!
+ (hwif =
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index))
+ || hwif->dev_class_index != vhost_user_device_class.index)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
if (sock_filename == NULL || !(strlen (sock_filename) > 0))
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
if (sock_filename == NULL || !(strlen (sock_filename) > 0))
&sw_if_index))
{
vnet_hw_interface_t *hwif =
&sw_if_index))
{
vnet_hw_interface_t *hwif =
- vnet_get_sup_hw_interface (vnm, sw_if_index);
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hwif == NULL ||
vhost_user_device_class.index != hwif->dev_class_index)
{
if (hwif == NULL ||
vhost_user_device_class.index != hwif->dev_class_index)
{
vl_api_virtio_pci_delete_reply_t *rmp;
vl_api_registration_t *reg;
vl_api_virtio_pci_delete_reply_t *rmp;
vl_api_registration_t *reg;
- hw = vnet_get_sup_hw_interface (vnm, htonl (mp->sw_if_index));
+ hw =
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm,
+ htonl (mp->sw_if_index));
if (hw == NULL || virtio_device_class.index != hw->dev_class_index)
{
if (hw == NULL || virtio_device_class.index != hw->dev_class_index)
{
- rv = VNET_API_ERROR_INVALID_INTERFACE;
+ rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
am->is_mp_safe[VL_API_SW_INTERFACE_DETAILS] = 1;
am->is_mp_safe[VL_API_SW_INTERFACE_TAG_ADD_DEL] = 1;
am->is_mp_safe[VL_API_SW_INTERFACE_DETAILS] = 1;
am->is_mp_safe[VL_API_SW_INTERFACE_TAG_ADD_DEL] = 1;
+ /* Do not replay VL_API_SW_INTERFACE_DUMP messages */
+ am->api_trace_cfg[VL_API_SW_INTERFACE_DUMP].replay_enable = 0;
+
/*
* Set up the (msg_name, crc, message-id) table
*/
/*
* Set up the (msg_name, crc, message-id) table
*/
u32 sw_if_index = va_arg (*args, u32);
vnet_sw_interface_t *si;
u32 sw_if_index = va_arg (*args, u32);
vnet_sw_interface_t *si;
- si = vnet_get_sw_interface_safe (vnm, sw_if_index);
+ si = vnet_get_sw_interface_or_null (vnm, sw_if_index);
}
always_inline vnet_hw_interface_t *
}
always_inline vnet_hw_interface_t *
-vnet_get_hw_interface_safe (vnet_main_t * vnm, u32 hw_if_index)
+vnet_get_hw_interface_or_null (vnet_main_t * vnm, u32 hw_if_index)
{
if (!pool_is_free_index (vnm->interface_main.hw_interfaces, hw_if_index))
return pool_elt_at_index (vnm->interface_main.hw_interfaces, hw_if_index);
{
if (!pool_is_free_index (vnm->interface_main.hw_interfaces, hw_if_index))
return pool_elt_at_index (vnm->interface_main.hw_interfaces, hw_if_index);
}
always_inline vnet_sw_interface_t *
}
always_inline vnet_sw_interface_t *
-vnet_get_sw_interface_safe (vnet_main_t * vnm, u32 sw_if_index)
+vnet_get_sw_interface_or_null (vnet_main_t * vnm, u32 sw_if_index)
{
if (!pool_is_free_index (vnm->interface_main.sw_interfaces, sw_if_index))
return pool_elt_at_index (vnm->interface_main.sw_interfaces, sw_if_index);
{
if (!pool_is_free_index (vnm->interface_main.sw_interfaces, sw_if_index))
return pool_elt_at_index (vnm->interface_main.sw_interfaces, sw_if_index);
return vnet_get_hw_interface (vnm, sw->hw_if_index);
}
return vnet_get_hw_interface (vnm, sw->hw_if_index);
}
+always_inline vnet_hw_interface_t *
+vnet_get_sup_hw_interface_api_visible_or_null (vnet_main_t * vnm,
+ u32 sw_if_index)
+{
+ vnet_sw_interface_t *si;
+ if (PREDICT_FALSE (pool_is_free_index (vnm->interface_main.sw_interfaces,
+ sw_if_index)))
+ return NULL;
+ si = vnet_get_sup_sw_interface (vnm, sw_if_index);
+ if (PREDICT_FALSE (si->flags & VNET_SW_INTERFACE_FLAG_HIDDEN))
+ return NULL;
+ ASSERT ((si->type == VNET_SW_INTERFACE_TYPE_HARDWARE) ||
+ (si->type == VNET_SW_INTERFACE_TYPE_PIPE));
+ return vnet_get_hw_interface (vnm, si->hw_if_index);
+}
+
always_inline vnet_hw_interface_class_t *
vnet_get_hw_interface_class (vnet_main_t * vnm, u32 hw_class_index)
{
always_inline vnet_hw_interface_class_t *
vnet_get_hw_interface_class (vnet_main_t * vnm, u32 hw_class_index)
{
if (sw_if_index == ~0)
return format (s, "N/A");
if (sw_if_index == ~0)
return format (s, "N/A");
- vnet_sw_interface_t *swif = vnet_get_sw_interface_safe (vnm, sw_if_index);
+ vnet_sw_interface_t *swif =
+ vnet_get_sw_interface_or_null (vnm, sw_if_index);
if (!swif)
return format (s, "Stale");
return format (s, "%U", format_vnet_sw_interface_name, vnm,
if (!swif)
return format (s, "Stale");
return format (s, "%U", format_vnet_sw_interface_name, vnm,
- vnet_get_sw_interface_safe (vnm, sw_if_index));
+ vnet_get_sw_interface_or_null (vnm, sw_if_index));
}
typedef struct l2fib_dump_walk_ctx_t_
}
typedef struct l2fib_dump_walk_ctx_t_
l2_output_config_t *config = 0;
vnet_hw_interface_t *hi;
l2_output_config_t *config = 0;
vnet_hw_interface_t *hi;
- hi = vnet_get_sup_hw_interface (vnet_main, sw_if_index);
+ hi = vnet_get_sup_hw_interface_api_visible_or_null (vnet_main, sw_if_index);
u32 push_outer_et;
u32 cfg_tags;
u32 push_outer_et;
u32 cfg_tags;
- hi = vnet_get_sup_hw_interface (vnet_main, sw_if_index);
+ hi = vnet_get_sup_hw_interface_api_visible_or_null (vnet_main, sw_if_index);
if (!hi || (hi->hw_class_index != ethernet_hw_interface_class.index))
{
error = VNET_API_ERROR_INVALID_INTERFACE; /* non-ethernet interface */
if (!hi || (hi->hw_class_index != ethernet_hw_interface_class.index))
{
error = VNET_API_ERROR_INVALID_INTERFACE; /* non-ethernet interface */
*vtr_tag2 = 0;
*push_dot1q = 0;
*vtr_tag2 = 0;
*push_dot1q = 0;
- hi = vnet_get_sup_hw_interface (vnet_main, sw_if_index);
+ hi = vnet_get_sup_hw_interface_api_visible_or_null (vnet_main, sw_if_index);
if (!hi || (hi->hw_class_index != ethernet_hw_interface_class.index))
{
/* non-ethernet interface */
if (!hi || (hi->hw_class_index != ethernet_hw_interface_class.index))
{
/* non-ethernet interface */
if (a->is_add)
{
if (a->sw_if_index != APP_NAMESPACE_INVALID_INDEX
if (a->is_add)
{
if (a->sw_if_index != APP_NAMESPACE_INVALID_INDEX
- && !vnet_get_sw_interface_safe (vnet_get_main (), a->sw_if_index))
+ && !vnet_get_sw_interface_or_null (vnet_get_main (),
+ a->sw_if_index))
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
+#define foreach_no_print_function \
+_(memclnt_keepalive_reply)
+
+#define _(f) \
+static void * vl_api_ ## f ## _t_print \
+ (vl_api_ ## f ## _t * mp, void * handle) \
+{ \
+ return handle; \
+}
+foreach_no_print_function;
+#undef _
+
#define foreach_custom_print_no_arg_function \
_(lisp_eid_table_vni_dump) \
_(lisp_map_resolver_dump) \
#define foreach_custom_print_no_arg_function \
_(lisp_eid_table_vni_dump) \
_(lisp_map_resolver_dump) \
s = format (0, "SCRIPT: " #f ); \
FINISH; \
}
s = format (0, "SCRIPT: " #f ); \
FINISH; \
}
-foreach_custom_print_no_arg_function
+foreach_custom_print_no_arg_function;
#undef _
#define foreach_custom_print_function \
_(CREATE_LOOPBACK, create_loopback) \
#undef _
#define foreach_custom_print_function \
_(CREATE_LOOPBACK, create_loopback) \
_(DNS_RESOLVE_IP, dns_resolve_ip) \
_(SESSION_RULE_ADD_DEL, session_rule_add_del) \
_(OUTPUT_ACL_SET_INTERFACE, output_acl_set_interface) \
_(DNS_RESOLVE_IP, dns_resolve_ip) \
_(SESSION_RULE_ADD_DEL, session_rule_add_del) \
_(OUTPUT_ACL_SET_INTERFACE, output_acl_set_interface) \
-_(QOS_RECORD_ENABLE_DISABLE, qos_record_enable_disable)
- void
+_(QOS_RECORD_ENABLE_DISABLE, qos_record_enable_disable) \
+_(MEMCLNT_KEEPALIVE_REPLY, memclnt_keepalive_reply)
+
+void
vl_msg_api_custom_dump_configure (api_main_t * am)
{
#define _(n,f) am->msg_print_handlers[VL_API_##n] \
vl_msg_api_custom_dump_configure (api_main_t * am)
{
#define _(n,f) am->msg_print_handlers[VL_API_##n] \