#include <vnet/plugin/plugin.h>
#include <vnet/fib/ip6_fib.h>
#include <vnet/adj/adj.h>
+#include <vnet/adj/adj_mcast.h>
#define VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE (1 << 0)
#define VNET_INTERFACE_SET_FLAGS_HELPER_WANT_REDISTRIBUTE (1 << 1)
vnet_device_class_t *dev_class =
vnet_get_device_class (vnm, hi->dev_class_index);
+ if ((flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) &&
+ (si->flags & VNET_SW_INTERFACE_FLAG_ERROR))
+ {
+ error = clib_error_return (0, "Interface in the error state");
+ goto done;
+ }
+
/* save the si admin up flag */
old_flags = si->flags;
hw_index = hw - im->hw_interfaces;
hw->hw_if_index = hw_index;
+ hw->default_rx_mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
if (dev_class->format_device_name)
hw->name = format (0, "%U", dev_class->format_device_name, dev_instance);
if (vec_len (im->deleted_hw_interface_nodes) > 0)
{
vnet_hw_interface_nodes_t *hn;
- vnet_interface_output_runtime_t *rt;
vlib_node_t *node;
vlib_node_runtime_t *nrt;
vlib_node_rename (vm, hw->tx_node_index, "%v", tx_node_name);
vlib_node_rename (vm, hw->output_node_index, "%v", output_node_name);
- rt = vlib_node_get_runtime_data (vm, hw->output_node_index);
- ASSERT (rt->is_deleted == 1);
- rt->is_deleted = 0;
- rt->hw_if_index = hw_index;
- rt->sw_if_index = hw->sw_if_index;
- rt->dev_instance = hw->dev_instance;
+ /* *INDENT-OFF* */
+ foreach_vlib_main ({
+ vnet_interface_output_runtime_t *rt;
+
+ rt = vlib_node_get_runtime_data (this_vlib_main, hw->output_node_index);
+ ASSERT (rt->is_deleted == 1);
+ rt->is_deleted = 0;
+ rt->hw_if_index = hw_index;
+ rt->sw_if_index = hw->sw_if_index;
+ rt->dev_instance = hw->dev_instance;
- rt = vlib_node_get_runtime_data (vm, hw->tx_node_index);
- rt->hw_if_index = hw_index;
- rt->sw_if_index = hw->sw_if_index;
- rt->dev_instance = hw->dev_instance;
+ rt = vlib_node_get_runtime_data (this_vlib_main, hw->tx_node_index);
+ rt->hw_if_index = hw_index;
+ rt->sw_if_index = hw->sw_if_index;
+ rt->dev_instance = hw->dev_instance;
+ });
+ /* *INDENT-ON* */
/* The new class may differ from the old one.
* Functions have to be updated. */
node = vlib_get_node (vm, hw->output_node_index);
- node->function = dev_class->flatten_output_chains ?
- vnet_interface_output_node_flatten_multiarch_select () :
- vnet_interface_output_node_multiarch_select ();
+ node->function = vnet_interface_output_node_multiarch_select ();
node->format_trace = format_vnet_interface_output_trace;
- nrt = vlib_node_get_runtime (vm, hw->output_node_index);
- nrt->function = node->function;
+ /* *INDENT-OFF* */
+ foreach_vlib_main ({
+ nrt = vlib_node_get_runtime (this_vlib_main, hw->output_node_index);
+ nrt->function = node->function;
+ });
+ /* *INDENT-ON* */
node = vlib_get_node (vm, hw->tx_node_index);
node->function = dev_class->tx_function;
node->format_trace = dev_class->format_tx_trace;
- nrt = vlib_node_get_runtime (vm, hw->tx_node_index);
- nrt->function = node->function;
+ /* *INDENT-OFF* */
+ foreach_vlib_main ({
+ nrt = vlib_node_get_runtime (this_vlib_main, hw->tx_node_index);
+ nrt->function = node->function;
+ });
+ /* *INDENT-ON* */
- vlib_worker_thread_node_runtime_update ();
_vec_len (im->deleted_hw_interface_nodes) -= 1;
}
else
r.flags = 0;
r.name = output_node_name;
- r.function = dev_class->flatten_output_chains ?
- vnet_interface_output_node_flatten_multiarch_select () :
- vnet_interface_output_node_multiarch_select ();
+ r.function = vnet_interface_output_node_multiarch_select ();
r.format_trace = format_vnet_interface_output_trace;
{
{
vnet_hw_interface_nodes_t *dn;
- vnet_interface_output_runtime_t *rt =
- vlib_node_get_runtime_data (vm, hw->output_node_index);
- /* Mark node runtime as deleted so output node (if called) will drop packets. */
- rt->is_deleted = 1;
+ /* *INDENT-OFF* */
+ foreach_vlib_main ({
+ vnet_interface_output_runtime_t *rt =
+ vlib_node_get_runtime_data (this_vlib_main, hw->output_node_index);
+
+ /* Mark node runtime as deleted so output node (if called)
+ * will drop packets. */
+ rt->is_deleted = 1;
+ });
+ /* *INDENT-ON* */
vlib_node_rename (vm, hw->output_node_index,
"interface-%d-output-deleted", hw_if_index);
hash_unset_mem (im->hw_interface_by_name, hw->name);
vec_free (hw->name);
+ vec_free (hw->input_node_thread_index_by_queue);
+ vec_free (hw->dq_runtime_index_by_queue);
pool_put (im->hw_interfaces, hw);
}
int
vnet_sw_interface_is_p2p (vnet_main_t * vnm, u32 sw_if_index)
{
+ vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index);
+ if (si->type == VNET_SW_INTERFACE_TYPE_P2P)
+ return 1;
+
vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
vnet_hw_interface_class_t *hc =
vnet_get_hw_interface_class (vnm, hw->hw_class_index);
vnet_interface_main_t *im = &vnm->interface_main;
vlib_buffer_t *b = 0;
vnet_buffer_opaque_t *o = 0;
+ clib_error_t *error;
/*
* Keep people from shooting themselves in the foot.
}
}
- {
- clib_error_t *error;
+ if ((error = vlib_call_init_function (vm, vnet_interface_cli_init)))
+ return error;
- if ((error = vlib_call_init_function (vm, vnet_interface_cli_init)))
- return error;
+ vnm->interface_tag_by_sw_if_index = hash_create (0, sizeof (uword));
+#if VLIB_BUFFER_TRACE_TRAJECTORY > 0
+ if ((error = vlib_call_init_function (vm, trajectory_trace_init)))
return error;
- }
- vnm->interface_tag_by_sw_if_index = hash_create (0, sizeof (uword));
+#endif
+
+ return 0;
}
VLIB_INIT_FUNCTION (vnet_interface_init);
case VNET_LINK_IP6:
return (VNET_L3_PACKET_TYPE_IP6);
case VNET_LINK_MPLS:
- return (VNET_L3_PACKET_TYPE_MPLS_UNICAST);
+ return (VNET_L3_PACKET_TYPE_MPLS);
case VNET_LINK_ARP:
return (VNET_L3_PACKET_TYPE_ARP);
case VNET_LINK_ETHERNET:
+ case VNET_LINK_NSH:
ASSERT (0);
break;
}
void
default_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai)
{
- u8 *rewrite;
+ ip_adjacency_t *adj;
- rewrite = vnet_build_rewrite_for_sw_interface (vnm, sw_if_index,
- adj_get_link_type (ai),
- NULL);
+ adj = adj_get (ai);
- adj_nbr_update_rewrite (ai, ADJ_NBR_REWRITE_FLAG_COMPLETE, rewrite);
+ switch (adj->lookup_next_index)
+ {
+ case IP_LOOKUP_NEXT_ARP:
+ case IP_LOOKUP_NEXT_GLEAN:
+ /*
+ * default rewirte in neighbour adj
+ */
+ adj_nbr_update_rewrite
+ (ai,
+ ADJ_NBR_REWRITE_FLAG_COMPLETE,
+ vnet_build_rewrite_for_sw_interface (vnm,
+ sw_if_index,
+ adj_get_link_type (ai), NULL));
+ break;
+ case IP_LOOKUP_NEXT_MCAST:
+ /*
+ * mcast traffic also uses default rewrite string with no mcast
+ * switch time updates.
+ */
+ adj_mcast_update_rewrite
+ (ai,
+ vnet_build_rewrite_for_sw_interface (vnm,
+ sw_if_index,
+ adj_get_link_type (ai),
+ NULL), 0, 0);
+ break;
+ case IP_LOOKUP_NEXT_DROP:
+ case IP_LOOKUP_NEXT_PUNT:
+ case IP_LOOKUP_NEXT_LOCAL:
+ case IP_LOOKUP_NEXT_REWRITE:
+ case IP_LOOKUP_NEXT_MCAST_MIDCHAIN:
+ case IP_LOOKUP_NEXT_MIDCHAIN:
+ case IP_LOOKUP_NEXT_ICMP_ERROR:
+ case IP_LOOKUP_N_NEXT:
+ ASSERT (0);
+ break;
+ }
}
-
/*
* fd.io coding-style-patch-verification: ON
*