65 u32 is_del,
u32 * result_if_address_index)
76 if ((a && (address_length != a->
address_length)) || (address_length == 0))
78 vnm->
api_errno = VNET_API_ERROR_ADDRESS_LENGTH_MISMATCH;
80 (
"%U wrong length (expected %d) for interface %U",
91 vnm->
api_errno = VNET_API_ERROR_ADDRESS_NOT_FOUND_FOR_INTERFACE;
94 addr_fib, address_length,
125 if (result_if_address_index)
126 *result_if_address_index = ~0;
136 memset (a, ~0,
sizeof (a[0]));
141 while (pi != (
u32) ~ 0)
159 (hi != ~0) ? hi : ai;
160 if (result_if_address_index)
161 *result_if_address_index = ai;
165 if (result_if_address_index)
177 lookup_main.if_address_pool_index_by_sw_if_index,
180 lookup_main.if_address_pool_index_by_sw_if_index,
193 "Cache line marker must be 1st element in struct");
196 "Data in cache line 0 is bigger than cache line size");
209 sizeof (ip6_address_fib_t));
222 for (i = 0; i < 256; i++)
244 #define _(n,v) if (flow_hash_config & v) s = format (s, "%s ", #n); 260 s =
format (s,
"unknown %d", n);
294 u32 adj_index = va_arg (*args,
u32);
295 u8 *packet_data = va_arg (*args,
u8 *);
296 u32 n_packet_data_bytes = va_arg (*args,
u32);
329 else if (
unformat (input,
"null-send-unreach"))
331 else if (
unformat (input,
"null-send-prohibit"))
335 else if (
unformat (input,
"classify"))
337 u32 classify_table_index;
339 if (!
unformat (input,
"%d", &classify_table_index))
395 u32 table_id, is_del;
405 memset (&pfx, 0,
sizeof (pfx));
414 memset (&rpath, 0,
sizeof (rpath));
416 if (
unformat (line_input,
"table %d", &table_id))
418 else if (
unformat (line_input,
"del"))
420 else if (
unformat (line_input,
"add"))
422 else if (
unformat (line_input,
"resolve-via-host"))
432 else if (
unformat (line_input,
"resolve-via-attached"))
442 else if (
unformat (line_input,
"out-label %U",
452 else if (
unformat (line_input,
"via-label %U",
455 rpath.frp_weight = 1;
457 rpath.frp_sw_if_index = ~0;
460 else if (
unformat (line_input,
"count %f", &count))
463 else if (
unformat (line_input,
"%U/%d",
469 else if (
unformat (line_input,
"%U/%d",
475 else if (
unformat (line_input,
"via %U %U weight %u",
479 &rpath.frp_sw_if_index, &rpath.frp_weight))
485 else if (
unformat (line_input,
"via %U %U weight %u",
489 &rpath.frp_sw_if_index, &rpath.frp_weight))
495 else if (
unformat (line_input,
"via %U %U",
499 &rpath.frp_sw_if_index))
501 rpath.frp_weight = 1;
506 else if (
unformat (line_input,
"via %U %U",
510 &rpath.frp_sw_if_index))
512 rpath.frp_weight = 1;
516 else if (
unformat (line_input,
"via %U next-hop-table %d",
518 &rpath.frp_addr.ip4, &rpath.frp_fib_index))
520 rpath.frp_weight = 1;
521 rpath.frp_sw_if_index = ~0;
525 else if (
unformat (line_input,
"via %U next-hop-table %d",
527 &rpath.frp_addr.ip6, &rpath.frp_fib_index))
529 rpath.frp_weight = 1;
530 rpath.frp_sw_if_index = ~0;
534 else if (
unformat (line_input,
"via %U",
541 rpath.frp_fib_index = table_id;
542 rpath.frp_weight = 1;
543 rpath.frp_sw_if_index = ~0;
547 else if (
unformat (line_input,
"via %U",
550 rpath.frp_fib_index = table_id;
551 rpath.frp_weight = 1;
552 rpath.frp_sw_if_index = ~0;
557 "lookup in table %d", &rpath.frp_fib_index))
559 rpath.frp_proto = pfx.fp_proto;
560 rpath.frp_sw_if_index = ~0;
563 else if (
vec_len (prefixs) > 0 &&
566 &rpath.frp_sw_if_index))
568 rpath.frp_weight = 1;
569 rpath.frp_proto = prefixs[0].
fp_proto;
572 else if (
vec_len (prefixs) > 0 &&
616 for (i = 0; i <
vec_len (prefixs); i++)
618 if (is_del && 0 == vec_len (rpaths))
622 else if (!is_del && 1 == vec_len (dpos))
631 else if (vec_len (dpos) > 0)
635 "Load-balancing over multiple special adjacencies is unsupported");
638 else if (0 < vec_len (rpaths))
641 ip46_address_t dst = prefixs[
i].
fp_addr;
648 for (k = 0; k < n; k++)
650 for (j = 0; j <
vec_len (rpaths); j++)
657 rpaths[i].frp_fib_index);
663 rpaths[i].frp_fib_index);
689 clib_host_to_net_u32 (incr +
690 clib_net_to_host_u32 (dst.
695 int bucket = (incr < 64 ? 0 : 1);
696 dst.ip6.as_u64[bucket] =
697 clib_host_to_net_u64 (incr +
698 clib_net_to_host_u64 (dst.ip6.as_u64
726 .short_help =
"Internet protocol (IP) commands",
733 .short_help =
"Internet protocol version 6 (IPv6) commands",
740 .short_help =
"Internet protocol (IP) show commands",
747 .short_help =
"Internet protocol version 6 (IPv6) show commands",
781 .short_help =
"ip route [add|del] [count <n>] <dst-ip-addr>/<width> [table <table-id>] [via <next-hop-ip-addr> [<interface>] [weight <weight>]] | [via arp <interface> <adj-hop-ip-addr>] | [via drop|punt|local<id>|arp|classify <classify-idx>] [lookup in table <out-table-id>]",
794 u32 table_id, is_del;
800 u32 gcount, scount, ss, gg, incr;
807 memset (&pfx, 0,
sizeof (pfx));
808 memset (&rpath, 0,
sizeof (rpath));
817 if (
unformat (line_input,
"table %d", &table_id))
819 else if (
unformat (line_input,
"del"))
821 else if (
unformat (line_input,
"add"))
823 else if (
unformat (line_input,
"scount %d", &scount))
825 else if (
unformat (line_input,
"gcount %d", &gcount))
827 else if (
unformat (line_input,
"%U %U",
835 else if (
unformat (line_input,
"%U %U",
843 else if (
unformat (line_input,
"%U/%d",
849 else if (
unformat (line_input,
"%U/%d",
855 else if (
unformat (line_input,
"%U",
862 else if (
unformat (line_input,
"%U",
869 else if (
unformat (line_input,
"via %U",
878 else if (
unformat (line_input,
"%U",
910 incr = 1 << (32 - (pfx.
fp_len % 32));
914 incr = 1 << (128 - (pfx.
fp_len % 128));
917 for (ss = 0; ss < scount; ss++)
919 for (gg = 0; gg < gcount; gg++)
945 clib_host_to_net_u32 (incr +
946 clib_net_to_host_u32 (pfx.
952 int bucket = (incr < 64 ? 0 : 1);
954 clib_host_to_net_u64 (incr +
955 clib_net_to_host_u64 (pfx.
956 fp_grp_addr.ip6.as_u64
964 clib_host_to_net_u32 (1 +
971 clib_host_to_net_u64 (1 +
979 if (scount > 1 || gcount > 1)
981 (scount * gcount) / (timet[1] - timet[0]));
1013 .path =
"ip mroute",
1014 .short_help =
"ip mroute [add|del] <dst-ip-addr>/<width> [table <table-id>] [via <next-hop-ip-addr> [<interface>],",
1034 uword *event_data = 0;
1038 if (retry_count > 0)
1043 for (i = 0; i < retry_count; i++)
1086 uword *event_data = 0;
1090 if (retry_count > 0)
1095 for (i = 0; i < retry_count; i++)
1140 u32 sw_if_index = ~0;
1141 int retry_count = 3;
1143 int address_set = 0;
1154 else if (
unformat (line_input,
"retry %d", &retry_count))
1172 if (sw_if_index == ~0)
1177 if (address_set == 0)
1182 if (address_set > 1)
1217 .path =
"ip probe-neighbor",
1219 .short_help =
"ip probe-neighbor <interface> <ip4-addr> | <ip6-addr> [retry nn]",
static clib_error_t * ip6_probe_neighbor_wait(vlib_main_t *vm, ip6_address_t *a, u32 sw_if_index, int retry_count)
u32 fib_table_id_find_fib_index(fib_protocol_t proto, u32 table_id)
fib_protocol_t fp_proto
protocol type
ip_lookup_next_t
Common (IP4/IP6) next index stored in adjacency.
void mfib_table_entry_delete(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source)
Delete a FIB entry.
fib_protocol_t frp_proto
The protocol of the address below.
void ip_null_dpo_add_and_lock(dpo_proto_t proto, ip_null_dpo_action_t action, dpo_id_t *dpo)
ip46_address_t fp_src_addr
sll srl srl sll sra u16x4 i
void receive_dpo_add_or_lock(dpo_proto_t proto, u32 sw_if_index, const ip46_address_t *nh_addr, dpo_id_t *dpo)
ip_adjacency_t * adj_pool
The global adjacnecy pool.
static f64 vlib_process_wait_for_event_or_clock(vlib_main_t *vm, f64 dt)
Suspend a cooperative multi-tasking thread Waits for an event, or for the indicated number of seconds...
enum mfib_entry_flags_t_ mfib_entry_flags_t
ip_adjacency_t * adjacency_heap
static uword unformat_dpo(unformat_input_t *input, va_list *args)
A representation of a path as described by a route producer.
uword unformat_mfib_itf_flags(unformat_input_t *input, va_list *args)
ip_interface_address_t * if_address_pool
Pool of addresses that are assigned to interfaces.
vnet_main_t * vnet_get_main(void)
static clib_error_t * ip4_probe_neighbor_wait(vlib_main_t *vm, ip4_address_t *a, u32 sw_if_index, int retry_count)
uword mhash_unset(mhash_t *h, void *key, uword *old_value)
static f64 vlib_time_now(vlib_main_t *vm)
fib_node_index_t fib_table_entry_path_add2(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, fib_route_path_t *rpath)
Add n paths to an entry (aka route) in the FIB.
u32 mpls_label_t
A label value only, i.e.
void dpo_copy(dpo_id_t *dst, const dpo_id_t *src)
atomic copy a data-plane object.
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
#define STRUCT_OFFSET_OF(t, f)
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
unformat_function_t unformat_vnet_sw_interface
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
mhash_t address_to_if_address_index
Hash table mapping address to index in interface address pool.
format_function_t format_vnet_sw_if_index_name
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
clib_error_t * vnet_ip_route_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd)
unformat_function_t unformat_mpls_unicast_label
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
Adjacency to drop this packet.
#define vec_add(V, E, N)
Add N elements to end of vector V (no header, unspecified alignment)
const dpo_id_t * drop_dpo_get(dpo_proto_t proto)
u8 * format_ip_lookup_next(u8 *s, va_list *args)
static ip_adjacency_t * adj_get(adj_index_t adj_index)
Get a pointer to an adjacency object from its index.
u32 frp_sw_if_index
The interface.
static uword vlib_process_get_events(vlib_main_t *vm, uword **data_vector)
Return the first event type which has occurred and a vector of per-event data of that type...
Recursion constraint of via a host prefix.
fib_node_index_t mfib_table_entry_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, mfib_entry_flags_t entry_flags)
Add a new (with no replication) or lock an existing entry.
Aggregrate type for a prefix.
const dpo_id_t * punt_dpo_get(dpo_proto_t proto)
Adjacency to punt this packet.
#define clib_error_return(e, args...)
fib_node_index_t mfib_table_entry_path_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *rpath, mfib_itf_flags_t itf_flags)
Add n paths to an entry (aka route) in the FIB.
#define clib_error_create(args...)
enum dpo_proto_t_ dpo_proto_t
Data path protocol.
u16 fp_len
The mask length.
This packet matches an "interface route" and packets need to be passed to ARP to find rewrite string ...
clib_error_t * ip6_probe_neighbor(vlib_main_t *vm, ip6_address_t *dst, u32 sw_if_index)
clib_error_t * ip4_probe_neighbor(vlib_main_t *vm, ip4_address_t *dst, u32 sw_if_index)
vnet_api_error_t api_errno
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
format_function_t format_vnet_sw_interface_name
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
uword * fib_index_by_table_id
Hash table mapping table id to fib index.
void vnet_register_ip6_neighbor_resolution_event(vnet_main_t *vnm, void *address_arg, uword node_index, uword type_opaque, uword data)
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
index_t classify_dpo_create(dpo_proto_t proto, u32 classify_table_index)
#define pool_put(P, E)
Free an object E in pool P.
void fib_table_entry_path_remove2(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_route_path_t *rpath)
Remove n paths to an entry (aka route) in the FIB.
u8 local_next_by_ip_protocol[256]
Table mapping ip protocol to ip[46]-local node next index.
Recursion constraint of via an attahced prefix.
static uword mhash_set(mhash_t *h, void *key, uword new_value, uword *old_value)
uword * fib_index_by_table_id
clib_error_t * vnet_ip_mroute_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd)
uword unformat_mfib_entry_flags(unformat_input_t *input, va_list *args)
void mhash_init(mhash_t *h, uword n_value_bytes, uword n_key_bytes)
static vlib_process_t * vlib_get_current_process(vlib_main_t *vm)
#define MPLS_LABEL_INVALID
#define vec_free(V)
Free vector's memory (no header).
void fib_table_entry_delete(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Delete a FIB entry.
u32 frp_weight
[un]equal cost path weight
#define clib_warning(format, args...)
void ip_lookup_init(ip_lookup_main_t *lm, u32 is_ip6)
This packet matches an "incomplete adjacency" and packets need to be passed to ARP to find rewrite st...
void vnet_register_ip4_arp_resolution_event(vnet_main_t *vnm, void *address_arg, uword node_index, uword type_opaque, uword data)
void dpo_set(dpo_id_t *dpo, dpo_type_t type, dpo_proto_t proto, index_t index)
Set/create a DPO ID The DPO will be locked.
Aggregrate type for a prefix.
u8 builtin_protocol_by_ip_protocol[256]
IP_BUILTIN_PROTOCOL_{TCP,UDP,ICMP,OTHER} by protocol in IP header.
#define VLIB_CLI_COMMAND(x,...)
#define foreach_flow_hash_bit
u32 * if_address_pool_index_by_sw_if_index
Head of doubly linked list of interface addresses for each software interface.
fib_node_index_t fib_table_entry_special_dpo_add(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
Add a 'special' entry to the FIB that links to the DPO passed A special entry is an entry that the FI...
static uword * mhash_get(mhash_t *h, const void *key)
This packets follow a mid-chain adjacency.
fib_route_path_flags_t frp_flags
flags on the path
dpo_proto_t fib_proto_to_dpo(fib_protocol_t fib_proto)
u32 flow_hash_config_t
A flow hash configuration is a mask of the flow hash options.
fib_protocol_t fp_proto
protocol type
static clib_error_t * ip_sw_interface_add_del(vnet_main_t *vnm, u32 sw_if_index, u32 is_add)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
ip_lookup_next_t lookup_next_index
#define STATIC_ASSERT(truth,...)
u32 mfib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
u32 is_ip6
1 for ip6; 0 for ip4.
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
clib_error_t * ip_interface_address_add_del(ip_lookup_main_t *lm, u32 sw_if_index, void *addr_fib, u32 address_length, u32 is_del, u32 *result_if_address_index)
enum mfib_itf_flags_t_ mfib_itf_flags_t
static uword vlib_in_process_context(vlib_main_t *vm)
ip4_main_t ip4_main
Global ip4 main structure.
This packet is to be rewritten and forwarded to the next processing node.
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
u8 * format_ip_flow_hash_config(u8 *s, va_list *args)
static clib_error_t * probe_neighbor_address(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u8 * format_ip_adjacency_packet_data(u8 *s, va_list *args)
u16 fp_len
The mask length.
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header, unspecified alignment)
void mfib_table_entry_path_remove(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *rpath)
Remove n paths to an entry (aka route) in the FIB.
#define CLIB_CACHE_LINE_BYTES
u32 frp_fib_index
The FIB index to lookup the nexthop Only valid for recursive paths.
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
VNET_SW_INTERFACE_ADD_DEL_FUNCTION(ip_sw_interface_add_del)
const ip46_address_t zero_addr
u32 fib_result_n_bytes
Number of bytes in a fib result.
ip46_address_t fp_grp_addr
The address type is not deriveable from the fp_addr member.
u32 next_this_sw_interface
format_function_t * format_address_and_length
Either format_ip4_address_and_length or format_ip6_address_and_length.
u32 prev_this_sw_interface