46 #define VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE (1 << 0) 47 #define VNET_INTERFACE_SET_FLAGS_HELPER_WANT_REDISTRIBUTE (1 << 1) 80 for (i = 0; i < n; i++)
83 sizeof (s[i].sw_hw_if_index));
96 for (i = 0; i < n; i++)
99 sizeof (s[i].sw_hw_if_index));
140 .name =
"vnet_sw_interface_set_flags",.serialize =
146 .name =
"vnet_hw_interface_set_flags",.serialize =
163 vnet_hw_interface_class_t * hw_class = vnet_get_hw_interface_class (vnm, hif->hw_class_index);
164 serialize_cstring (m, hw_class->name);
173 vec_add2 (sts, st, 1);
174 st->sw_hw_if_index = sif->sw_if_index;
175 st->flags = sif->flags;
189 vec_add2 (sts, st, 1);
190 st->sw_hw_if_index = hif->hw_if_index;
191 st->flags = hif->flags;
217 unserialize_cstring (m, &class_name);
218 p = hash_get_mem (im->hw_interface_class_by_name, class_name);
220 error = vnet_hw_interface_set_class_helper (vnm, hif->hw_if_index, p[0], 0);
222 clib_error_report (error);
223 vec_free (class_name);
244 _vnet_interface_function_list_elt_t **
247 _vnet_interface_function_list_elt_t *elt;
258 error = elt->fp (vnm, if_index, flags);
261 elt = elt->next_interface_function;
278 if (hw_class->interface_add_del_function
280 hw_class->interface_add_del_function (vnm, hw_if_index, is_create)))
283 if (dev_class->interface_add_del_function
285 dev_class->interface_add_del_function (vnm, hw_if_index,
303 #define VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE (1 << 0) 304 #define VNET_INTERFACE_SET_FLAGS_HELPER_WANT_REDISTRIBUTE (1 << 1) 331 if (!is_create && (hi->
flags & mask) == flags)
335 if (!dev_class->redistribute)
351 if (hw_class->link_up_down_function
352 && (error = hw_class->link_up_down_function (vnm, hw_if_index,
398 sw_interface_admin_up_down_functions);
413 if ((flags != (si_sup->
flags & mask)) &&
415 && ((si_sup->
flags & mask) ==
431 (0,
"not allowed as %U belong to a BondEthernet interface",
437 if ((si->
flags & mask) == flags)
448 if (!dev_class->redistribute)
465 old_flags = si->
flags;
470 (vnm, sw_if_index, flags,
476 si->
flags = old_flags;
489 if ((flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) &&
497 old_flags = si->
flags;
500 if (!(flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP))
501 si->
flags &= ~VNET_SW_INTERFACE_FLAG_ADMIN_UP;
503 if (dev_class->admin_up_down_function
504 && (error = dev_class->admin_up_down_function (vnm,
509 si->
flags = old_flags;
513 if (hw_class->admin_up_down_function
514 && (error = hw_class->admin_up_down_function (vnm,
519 si->
flags = old_flags;
524 if (!(flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
544 (vnm, hw_if_index, flags,
552 (vnm, sw_if_index, flags,
612 dev_class->subif_add_del_function)
614 error = dev_class->subif_add_del_function (vnm, hi->
hw_if_index,
623 (vnm, *sw_if_index, template->flags,
692 bool changed =
false;
697 if (si->
mtu[i] != mtu[i])
739 n->
function = dev_class->tx_function;
743 dev_class->tx_function_n_errors,
744 dev_class->tx_function_error_strings);
761 u32 hw_class_index,
u32 hw_instance)
773 char *tx_node_name =
NULL, *output_node_name =
NULL;
776 memset (hw, 0,
sizeof (*hw));
782 if (dev_class->format_device_name)
783 hw->
name =
format (0,
"%U", dev_class->format_device_name, dev_instance);
784 else if (hw_class->format_interface_name)
785 hw->
name =
format (0,
"%U", hw_class->format_interface_name,
788 hw->
name =
format (0,
"%s%x", hw_class->name, dev_instance);
792 sizeof (hw->
name[0]),
802 .hw_if_index = hw_index
816 if (dev_class->tx_function == 0)
817 goto no_output_nodes;
819 tx_node_name = (
char *)
format (0,
"%v-tx", hw->
name);
820 output_node_name = (
char *)
format (0,
"%v-output", hw->
name);
868 node->function = dev_class->tx_function;
869 node->format_trace = dev_class->format_tx_trace;
889 memset (&r, 0,
sizeof (r));
891 r.runtime_data = &rt;
892 r.runtime_data_bytes =
sizeof (rt);
894 r.vector_size =
sizeof (
u32);
897 r.name = tx_node_name;
898 r.function = dev_class->tx_function;
907 r.name = output_node_name;
914 "interface is deleted",
988 vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index);
989 u64 sup_and_sub_key =
990 ((u64) (si->sup_sw_if_index) << 32) | (u64) si->sub.id;
991 hash_unset_mem_free (&im->sw_if_index_by_sup_and_sub, &sup_and_sub_key);
992 vnet_delete_sw_interface (vnm, sw_if_index);
1001 if (dev_class->tx_function)
1019 "interface-%d-output-deleted", hw_if_index);
1042 u32 id, sw_if_index;
1052 if (WALK_STOP == fn (vnm, sw_if_index, ctx))
1070 if (WALK_STOP == fn (vnm, si, ctx))
1079 u32 hw_if_index = va_arg (*va,
u32);
1080 char *hw_class_name = va_arg (*va,
char *);
1091 char *hw_class_name;
1108 .name =
"vnet_hw_interface_set_class",.serialize =
1114 u32 hw_class_index,
u32 hw_instance)
1127 u32 hw_class_index,
u32 redistribute)
1149 "%v must be admin down to change class from %s to %s",
1150 hi->
name, old_class->name, new_class->name);
1153 if ((new_class->is_valid_class_for_interface
1154 && !new_class->is_valid_class_for_interface (vnm, hw_if_index,
1156 || (dev_class->is_valid_class_for_interface
1157 && !dev_class->is_valid_class_for_interface (vnm, hw_if_index,
1160 "%v class cannot be changed from %s to %s",
1161 hi->
name, old_class->name, new_class->name);
1166 &vnet_hw_interface_set_class_msg, hw_if_index,
1172 if (old_class->hw_class_change)
1173 old_class->hw_class_change (vnm, hw_if_index, old_class->index,
1179 if (new_class->hw_class_change)
1180 new_class->hw_class_change (vnm, hw_if_index, old_class->index,
1183 if (dev_class->hw_class_change)
1184 dev_class->hw_class_change (vnm, hw_if_index, new_class->index);
1212 if (dev_class->rx_redirect_to_node)
1214 dev_class->rx_redirect_to_node (vnm, hw_if_index, node_index);
1218 return VNET_API_ERROR_UNIMPLEMENTED;
1284 #define _(a) if (sizeof(o->a) > sizeof (o->unused)) \ 1286 ("FATAL: size of opaque union subtype %s is %d (max %d)", \ 1287 #a, sizeof(o->a), sizeof (o->unused)); 1292 (0,
"FATAL: size of vlib buffer opaque %d, size of vnet opaque %d",
1302 im->sw_if_counters[VNET_INTERFACE_COUNTER_##E].name = #n; \ 1303 im->sw_if_counters[VNET_INTERFACE_COUNTER_##E].stat_segment_name = "/" #p "/" #n; 1309 im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_##E].name = #n; \ 1310 im->combined_sw_if_counters[VNET_INTERFACE_COUNTER_##E].stat_segment_name = "/" #p "/" #n; 1327 c = c->next_class_registration;
1346 if (
NULL == c->build_rewrite)
1348 if (
NULL == c->update_adjacency)
1352 c = c->next_class_registration;
1361 #if VLIB_BUFFER_TRACE_TRAJECTORY > 0 1383 if (dev_class->name_renumber == 0 || dev_class->format_device_name == 0)
1384 return VNET_API_ERROR_UNIMPLEMENTED;
1386 rv = dev_class->name_renumber (hi, new_show_dev_instance);
1394 hi->
name =
format (0,
"%U", dev_class->format_device_name,
1414 "unable to find hw interface for index %u",
1418 old_name = hw->
name;
1449 if (dev_class->mac_addr_change_function)
1452 dev_class->mac_addr_change_function (hi, (
char *) mac_address);
1460 if (
NULL != hw_class->mac_addr_change_function)
1461 hw_class->mac_addr_change_function (hi, (
char *) mac_address);
1467 "MAC Address Change is not supported on this interface");
1474 "mac address change is not supported for interface index %u",
1485 (vnm, hw_if_index, mac_address);
1491 u32 ip_sw_if_index,
u8 enable)
1506 [unnumbered_sw_if_index] =
1508 lookup_main.if_address_pool_index_by_sw_if_index[ip_sw_if_index];
1510 lookup_main.if_address_pool_index_by_sw_if_index
1511 [unnumbered_sw_if_index] =
1513 lookup_main.if_address_pool_index_by_sw_if_index[ip_sw_if_index];
1521 [unnumbered_sw_if_index] = ~0;
1523 [unnumbered_sw_if_index] = ~0;
1539 return (VNET_L3_PACKET_TYPE_IP4);
1541 return (VNET_L3_PACKET_TYPE_IP6);
1543 return (VNET_L3_PACKET_TYPE_MPLS);
1545 return (VNET_L3_PACKET_TYPE_ARP);
1657 else if (
unformat (line_input,
"disable")
1675 .path =
"interface collect detailed-stats",
1676 .short_help =
"interface collect detailed-stats <enable|disable>",
vnet_config_main_t config_main
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
void serialize_vnet_interface_state(serialize_main_t *m, va_list *va)
#define VNET_SW_INTERFACE_FLAG_UNNUMBERED
l2_input_config_t * configs
static clib_error_t * vnet_hw_interface_set_class_helper(vnet_main_t *vnm, u32 hw_if_index, u32 hw_class_index, u32 redistribute)
clib_error_t * vnet_hw_interface_set_flags(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
void vlib_validate_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
validate a combined counter
volatile u32 * sw_if_counter_lock
vnet_hw_interface_nodes_t * deleted_hw_interface_nodes
_vnet_interface_function_list_elt_t * hw_interface_link_up_down_functions[VNET_ITF_FUNC_N_PRIO]
#define vec_serialize(m, v, f)
An indication that the rewrite is complete, i.e.
vnet_main_t * vnet_get_main(void)
static vnet_hw_interface_t * vnet_get_sup_hw_interface(vnet_main_t *vnm, u32 sw_if_index)
vnet_interface_main_t interface_main
void * vnet_interface_output_node_multiarch_select(void)
uword vlib_node_add_named_next_with_slot(vlib_main_t *vm, uword node, char *name, uword slot)
u32 opaque[10]
Opaque data used by sub-graphs for their own purposes.
int vnet_hw_interface_rx_redirect_to_node(vnet_main_t *vnm, u32 hw_if_index, u32 node_index)
void vnet_hw_interface_walk_sw(vnet_main_t *vnm, u32 hw_if_index, vnet_hw_sw_interface_walk_t fn, void *ctx)
Walk the SW interfaces on a HW interface - this is the super interface and any sub-interfaces.
vnet_link_t adj_get_link_type(adj_index_t ai)
Return the link type of the adjacency.
static clib_error_t * call_elf_section_interface_callbacks(vnet_main_t *vnm, u32 if_index, u32 flags, _vnet_interface_function_list_elt_t **elts)
#define vec_unserialize(m, v, f)
format_function_t * format_trace
vnet_device_class_t * device_class_registrations
u32 * input_node_thread_index_by_queue
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
This packet is to be rewritten and forwarded to the next processing node.
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
word vnet_sw_interface_compare(vnet_main_t *vnm, uword sw_if_index0, uword sw_if_index1)
int vnet_interface_name_renumber(u32 sw_if_index, u32 new_show_dev_instance)
static void vnet_clear_sw_interface_tag(vnet_main_t *vnm, u32 sw_if_index)
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
#define hash_set_mem(h, key, value)
MC_SERIALIZE_MSG(vnet_sw_interface_set_flags_msg, static)
ip_lookup_main_t lookup_main
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
uword * sub_interface_sw_if_index_by_id
static void unserialize_vnet_hw_interface_set_flags(serialize_main_t *m, va_list *va)
uword * interface_tag_by_sw_if_index
#define VNET_HW_INTERFACE_FLAG_LINK_UP
_vnet_interface_function_list_elt_t * hw_interface_add_del_functions[VNET_ITF_FUNC_N_PRIO]
struct _vnet_device_class vnet_device_class_t
#define mc_serialize(mc, msg, args...)
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
uword * dq_runtime_index_by_queue
static clib_error_t * vnet_hw_interface_set_flags_helper(vnet_main_t *vnm, u32 hw_if_index, u32 flags, u32 helper_flags)
f64 max_rate_bits_per_sec
#define VNET_HW_INTERFACE_FLAG_DUPLEX_MASK
static clib_error_t * collect_detailed_interface_stats_cli(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vlib_node_function_t * function
void vlib_register_errors(vlib_main_t *vm, u32 node_index, u32 n_errors, char *error_strings[])
static void unserialize_vec_vnet_sw_hw_interface_state(serialize_main_t *m, va_list *va)
Adjacency to punt this packet.
enum walk_rc_t_ walk_rc_t
Walk return code.
#define VNET_HW_INTERFACE_FLAG_SPEED_MASK
void adj_glean_update_rewrite(adj_index_t adj_index)
adj_glean_update_rewrite
static ip_adjacency_t * adj_get(adj_index_t adj_index)
Get a pointer to an adjacency object from its index.
void default_update_adjacency(vnet_main_t *vnm, u32 sw_if_index, u32 ai)
Default adjacency update function.
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
vlib_node_function_t * function
Node function to call.
#define VLIB_INIT_FUNCTION(x)
static u32 vnet_create_sw_interface_no_callbacks(vnet_main_t *vnm, vnet_sw_interface_t *template)
static vnet_device_class_t * vnet_get_device_class(vnet_main_t *vnm, u32 dev_class_index)
vlib_combined_counter_main_t * combined_sw_if_counters
#define hash_foreach(key_var, value_var, h, body)
uword vlib_node_add_next_with_slot(vlib_main_t *vm, uword node_index, uword next_node_index, uword slot)
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
static vnet_sw_interface_t * vnet_get_sup_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
static clib_error_t * call_hw_interface_add_del_callbacks(vnet_main_t *vnm, u32 hw_if_index, u32 is_create)
#define clib_error_return(e, args...)
static walk_rc_t sw_interface_walk_callback(vnet_main_t *vnm, u32 sw_if_index, void *ctx)
#define vec_end(v)
End (last data address) of vector.
#define vlib_call_init_function(vm, x)
u32 vnet_register_interface(vnet_main_t *vnm, u32 dev_class_index, u32 dev_instance, u32 hw_class_index, u32 hw_instance)
#define hash_create_string(elts, value_bytes)
void vnet_sw_interface_set_protocol_mtu(vnet_main_t *vnm, u32 sw_if_index, u32 mtu[])
uword * hw_interface_by_name
vnet_hw_interface_t * hw_interfaces
#define hash_create_mem(elts, key_bytes, value_bytes)
format_function_t format_vnet_sw_interface_name
void adj_mcast_update_rewrite(adj_index_t adj_index, u8 *rewrite, u8 offset)
adj_mcast_update_rewrite
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
static void vlib_zero_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
Clear a combined counter Clears the set of per-thread counters.
u8 * format_vnet_interface_output_trace(u8 *s, va_list *va)
#define hash_unset_mem(h, key)
void ip4_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
void vnet_sw_interface_walk(vnet_main_t *vnm, vnet_sw_interface_walk_t fn, void *ctx)
Walk all the SW interfaces in the system.
int vnet_sw_interface_is_p2p(vnet_main_t *vnm, u32 sw_if_index)
#define VNET_SW_INTERFACE_FLAG_BOND_SLAVE
#define pool_put(P, E)
Free an object E in pool P.
static void serialize_vec_vnet_sw_hw_interface_state(serialize_main_t *m, va_list *va)
uword * sw_if_index_by_sup_and_sub
static void * vlib_node_get_runtime_data(vlib_main_t *vm, u32 node_index)
Get node runtime private data by node index.
This packet matches an "interface route" and packets need to be passed to ARP to find rewrite string ...
u8 * vnet_build_rewrite_for_sw_interface(vnet_main_t *vnm, u32 sw_if_index, vnet_link_t link_type, const void *dst_address)
static void unserialize_vnet_hw_interface_set_class(serialize_main_t *m, va_list *va)
vlib_simple_counter_main_t * sw_if_counters
word vnet_hw_interface_compare(vnet_main_t *vnm, uword hw_if_index0, uword hw_if_index1)
format_function_t * format_buffer
void vnet_sw_interface_update_unnumbered(u32 unnumbered_sw_if_index, u32 ip_sw_if_index, u8 enable)
#define foreach_vlib_main(body)
uword * hw_interface_class_by_name
void unserialize_cstring(serialize_main_t *m, char **s)
#define foreach_simple_interface_counter_name
void unserialize_vnet_interface_state(serialize_main_t *m, va_list *va)
clib_error_t * vnet_rename_interface(vnet_main_t *vnm, u32 hw_if_index, char *new_name)
This packet matches an "incomplete adjacency" and packets need to be passed to ARP to find rewrite st...
Adjacency to drop this packet.
clib_error_t * serialize(serialize_main_t *m,...)
#define foreach_combined_interface_counter_name
#define vec_free(V)
Free vector's memory (no header).
Multicast Midchain Adjacency.
static vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
Get node runtime by node index.
clib_error_t * vnet_hw_interface_change_mac_address(vnet_main_t *vnm, u32 hw_if_index, u8 *mac_address)
unformat_function_t * unformat_buffer
static void vnet_interface_counter_unlock(vnet_interface_main_t *im)
#define ETHERNET_INTERFACE_FLAG_MTU
static void unserialize_integer(serialize_main_t *m, void *x, u32 n_bytes)
static void serialize_integer(serialize_main_t *m, u64 x, u32 n_bytes)
static clib_error_t * call_sw_interface_add_del_callbacks(vnet_main_t *vnm, u32 sw_if_index, u32 is_create)
void vnet_hw_interface_init_for_class(vnet_main_t *vnm, u32 hw_if_index, u32 hw_class_index, u32 hw_instance)
static void setup_output_node(vlib_main_t *vm, u32 node_index, vnet_hw_interface_class_t *hw_class)
u8 * default_build_rewrite(vnet_main_t *vnm, u32 sw_if_index, vnet_link_t link_type, const void *dst_address)
Return a complete, zero-length (aka dummy) rewrite.
u32 unnumbered_sw_if_index
format_function_t format_vnet_sw_interface_flags
#define VLIB_CLI_COMMAND(x,...)
static void unserialize_vnet_sw_interface_set_flags(serialize_main_t *m, va_list *va)
#define VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE
static clib_error_t * vnet_sw_interface_set_flags_helper(vnet_main_t *vnm, u32 sw_if_index, u32 flags, u32 helper_flags)
This packets follow a mid-chain adjacency.
u32 * if_address_pool_index_by_sw_if_index
Head of doubly linked list of interface addresses for each software interface.
static void vnet_interface_counter_lock(vnet_interface_main_t *im)
void vlib_validate_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
validate a simple counter
#define hash_create(elts, value_bytes)
enum vnet_interface_function_priority_t_ vnet_interface_function_priority_t
#define VNET_SW_INTERFACE_FLAG_ADMIN_UP
u8 output_feature_arc_index
_vnet_interface_function_list_elt_t * sw_interface_mtu_change_functions[VNET_ITF_FUNC_N_PRIO]
void collect_detailed_interface_stats_flag_clear(void)
static void serialize_vnet_sw_hw_interface_set_flags(serialize_main_t *m, va_list *va)
void vlib_node_rename(vlib_main_t *vm, u32 node_index, char *fmt,...)
#define VNET_SW_INTERFACE_FLAG_PUNT
ip_lookup_main_t lookup_main
static void setup_tx_node(vlib_main_t *vm, u32 node_index, vnet_device_class_t *dev_class)
enum vnet_link_t_ vnet_link_t
Link Type: A description of the protocol of packets on the link.
u32 vlib_register_node(vlib_main_t *vm, vlib_node_registration_t *r)
static vnet_hw_interface_class_t * vnet_get_hw_interface_class(vnet_main_t *vnm, u32 hw_class_index)
#define clib_error_report(e)
clib_error_t * unserialize(serialize_main_t *m,...)
static void vlib_zero_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
Clear a simple counter Clears the set of per-thread u16 counters, and the u64 counter.
#define vec_cmp(v1, v2)
Compare two vectors (only applicable to vectors of signed numbers).
walk_rc_t(* vnet_hw_sw_interface_walk_t)(vnet_main_t *vnm, u32 sw_if_index, void *ctx)
Call back walk type for walking SW indices on a HW interface.
uword * device_class_by_name
static vlib_main_t * vlib_get_main(void)
void vnet_delete_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
void serialize_cstring(serialize_main_t *m, char *s)
int collect_detailed_interface_stats_flag
struct _vlib_node_registration vlib_node_registration_t
This packets needs to go to ICMP error.
This packet is for one of our own IP addresses.
void vnet_hw_interface_set_mtu(vnet_main_t *vnm, u32 hw_if_index, u32 mtu)
#define hash_create_vec(elts, key_bytes, value_bytes)
struct _vnet_hw_interface_class vnet_hw_interface_class_t
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
#define VNET_SW_INTERFACE_FLAG_ERROR
clib_error_t * vnet_interface_init(vlib_main_t *vm)
static clib_error_t * vnet_hw_interface_change_mac_address_helper(vnet_main_t *vnm, u32 hw_if_index, u8 *mac_address)
ip_lookup_next_t lookup_next_index
Next hop after ip4-lookup.
vnet_l3_packet_type_t vnet_link_to_l3_proto(vnet_link_t link)
Convert a link to to an Ethertype.
static clib_error_t * vnet_interface_cli_init(vlib_main_t *vm)
vnet_mtu_t vnet_link_to_mtu(vnet_link_t link)
void collect_detailed_interface_stats_flag_set(void)
static int vnet_hw_interface_rx_redirect_to_node_helper(vnet_main_t *vnm, u32 hw_if_index, u32 node_index, u32 redistribute)
vnet_sw_interface_t * sw_interfaces
vnet_hw_interface_class_t * hw_interface_class_registrations
a point 2 point interface
u32 ethernet_set_flags(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
vnet_hw_interface_class_t * hw_interface_classes
void vnet_sw_interface_set_mtu(vnet_main_t *vnm, u32 sw_if_index, u32 mtu)
walk_rc_t(* vnet_sw_interface_walk_t)(vnet_main_t *vnm, vnet_sw_interface_t *si, void *ctx)
Call back walk type for walking SW indices on a HW interface.
_vnet_interface_function_list_elt_t * sw_interface_add_del_functions[VNET_ITF_FUNC_N_PRIO]
static void * clib_mem_alloc_aligned(uword size, uword align)
static void serialize_vnet_hw_interface_set_class(serialize_main_t *m, va_list *va)
vnet_sw_interface_type_t type
ip4_main_t ip4_main
Global ip4 main structure.
static vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
Get vlib node by index.
#define VLIB_NODE_FLAG_IS_OUTPUT
#define vec_foreach(var, vec)
Vector iterator.
vnet_hw_interface_rx_mode default_rx_mode
void vnet_delete_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
clib_error_t * vnet_sw_interface_set_flags(vnet_main_t *vnm, u32 sw_if_index, u32 flags)
vnet_device_class_t * device_classes
#define foreach_buffer_opaque_union_subtype
_vnet_interface_function_list_elt_t * sw_interface_admin_up_down_functions[VNET_ITF_FUNC_N_PRIO]
clib_error_t * vnet_create_sw_interface(vnet_main_t *vnm, vnet_sw_interface_t *template, u32 *sw_if_index)
#define CLIB_CACHE_LINE_BYTES
static_always_inline vnet_feature_config_main_t * vnet_feature_get_config_main(u16 arc)
void adj_nbr_update_rewrite(adj_index_t adj_index, adj_nbr_rewrite_flag_t flags, u8 *rewrite)
adj_nbr_update_rewrite
static clib_error_t * call_sw_interface_mtu_change_callbacks(vnet_main_t *vnm, u32 sw_if_index)
#define VNET_INTERFACE_SET_FLAGS_HELPER_WANT_REDISTRIBUTE
void ip6_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
clib_error_t * vnet_hw_interface_set_class(vnet_main_t *vnm, u32 hw_if_index, u32 hw_class_index)