65 u32 is_del,
u32 * result_if_address_index)
77 (address_length == 0) ||
78 (lm->
is_ip6 && address_length > 128) ||
79 (!lm->
is_ip6 && address_length > 32))
81 vnm->
api_errno = VNET_API_ERROR_ADDRESS_LENGTH_MISMATCH;
83 (
"%U wrong length (expected %d) for interface %U",
94 vnm->
api_errno = VNET_API_ERROR_ADDRESS_NOT_FOUND_FOR_INTERFACE;
97 addr_fib, address_length,
128 if (result_if_address_index)
129 *result_if_address_index = ~0;
139 memset (a, ~0,
sizeof (a[0]));
144 while (pi != (
u32) ~ 0)
162 (hi != ~0) ? hi : ai;
163 if (result_if_address_index)
164 *result_if_address_index = ai;
168 if (result_if_address_index)
180 lookup_main.if_address_pool_index_by_sw_if_index,
183 lookup_main.if_address_pool_index_by_sw_if_index,
202 sizeof (ip6_address_fib_t));
215 for (i = 0; i < 256; i++)
237 #define _(n,v) if (flow_hash_config & v) s = format (s, "%s ", #n); 254 s =
format (s,
"unknown %d", n);
288 u32 adj_index = va_arg (*args,
u32);
289 u8 *packet_data = va_arg (*args,
u8 *);
290 u32 n_packet_data_bytes = va_arg (*args,
u32);
323 else if (
unformat (input,
"null-send-unreach"))
325 else if (
unformat (input,
"null-send-prohibit"))
329 else if (
unformat (input,
"classify"))
331 u32 classify_table_index;
333 if (!
unformat (input,
"%d", &classify_table_index))
363 u32 table_id, is_del;
373 memset (&pfx, 0,
sizeof (pfx));
382 memset (&rpath, 0,
sizeof (rpath));
384 if (
unformat (line_input,
"table %d", &table_id))
386 else if (
unformat (line_input,
"del"))
388 else if (
unformat (line_input,
"add"))
390 else if (
unformat (line_input,
"resolve-via-host"))
400 else if (
unformat (line_input,
"resolve-via-attached"))
410 else if (
unformat (line_input,
"out-label %U",
420 else if (
unformat (line_input,
"via-label %U",
423 rpath.frp_weight = 1;
426 rpath.frp_sw_if_index = ~0;
429 else if (
unformat (line_input,
"count %f", &count))
432 else if (
unformat (line_input,
"%U/%d",
438 else if (
unformat (line_input,
"%U/%d",
444 else if (
unformat (line_input,
"via %U %U weight %u",
448 &rpath.frp_sw_if_index, &rpath.frp_weight))
454 else if (
unformat (line_input,
"via %U %U weight %u",
458 &rpath.frp_sw_if_index, &rpath.frp_weight))
464 else if (
unformat (line_input,
"via %U %U",
468 &rpath.frp_sw_if_index))
470 rpath.frp_weight = 1;
475 else if (
unformat (line_input,
"via %U %U",
479 &rpath.frp_sw_if_index))
481 rpath.frp_weight = 1;
485 else if (
unformat (line_input,
"via %U next-hop-table %d",
487 &rpath.frp_addr.ip4, &rpath.frp_fib_index))
489 rpath.frp_weight = 1;
490 rpath.frp_sw_if_index = ~0;
494 else if (
unformat (line_input,
"via %U next-hop-table %d",
496 &rpath.frp_addr.ip6, &rpath.frp_fib_index))
498 rpath.frp_weight = 1;
499 rpath.frp_sw_if_index = ~0;
503 else if (
unformat (line_input,
"via %U",
510 rpath.frp_fib_index = table_id;
511 rpath.frp_weight = 1;
512 rpath.frp_sw_if_index = ~0;
516 else if (
unformat (line_input,
"via %U",
519 rpath.frp_fib_index = table_id;
520 rpath.frp_weight = 1;
521 rpath.frp_sw_if_index = ~0;
526 "lookup in table %d", &rpath.frp_fib_index))
528 rpath.frp_proto = pfx.fp_proto;
529 rpath.frp_sw_if_index = ~0;
532 else if (
vec_len (prefixs) > 0 &&
535 &rpath.frp_sw_if_index))
537 rpath.frp_weight = 1;
538 rpath.frp_proto = prefixs[0].
fp_proto;
541 else if (
vec_len (prefixs) > 0 &&
585 for (i = 0; i <
vec_len (prefixs); i++)
587 if (is_del && 0 == vec_len (rpaths))
591 else if (!is_del && 1 == vec_len (dpos))
600 else if (vec_len (dpos) > 0)
604 "Load-balancing over multiple special adjacencies is unsupported");
607 else if (0 < vec_len (rpaths))
610 ip46_address_t dst = prefixs[
i].
fp_addr;
617 for (k = 0; k < n; k++)
619 for (j = 0; j <
vec_len (rpaths); j++)
626 rpaths[i].frp_fib_index);
632 rpaths[i].frp_fib_index);
658 clib_host_to_net_u32 (incr +
659 clib_net_to_host_u32 (dst.
664 int bucket = (incr < 64 ? 0 : 1);
665 dst.ip6.as_u64[bucket] =
666 clib_host_to_net_u64 (incr +
667 clib_net_to_host_u64 (dst.ip6.as_u64
695 .short_help =
"Internet protocol (IP) commands",
702 .short_help =
"Internet protocol version 6 (IPv6) commands",
709 .short_help =
"Internet protocol (IP) show commands",
716 .short_help =
"Internet protocol version 6 (IPv6) show commands",
750 .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>]",
763 u32 table_id, is_del;
769 u32 gcount, scount, ss, gg, incr;
776 memset (&pfx, 0,
sizeof (pfx));
777 memset (&rpath, 0,
sizeof (rpath));
786 if (
unformat (line_input,
"table %d", &table_id))
788 else if (
unformat (line_input,
"del"))
790 else if (
unformat (line_input,
"add"))
792 else if (
unformat (line_input,
"scount %d", &scount))
794 else if (
unformat (line_input,
"gcount %d", &gcount))
796 else if (
unformat (line_input,
"%U %U",
804 else if (
unformat (line_input,
"%U %U",
812 else if (
unformat (line_input,
"%U/%d",
819 else if (
unformat (line_input,
"%U/%d",
826 else if (
unformat (line_input,
"%U",
833 else if (
unformat (line_input,
"%U",
840 else if (
unformat (line_input,
"via %U",
846 else if (
unformat (line_input,
"via local"))
854 else if (
unformat (line_input,
"%U",
886 incr = 1 << (32 - (pfx.
fp_len % 32));
890 incr = 1 << (128 - (pfx.
fp_len % 128));
893 for (ss = 0; ss < scount; ss++)
895 for (gg = 0; gg < gcount; gg++)
921 clib_host_to_net_u32 (incr +
922 clib_net_to_host_u32 (pfx.
928 int bucket = (incr < 64 ? 0 : 1);
930 clib_host_to_net_u64 (incr +
931 clib_net_to_host_u64 (pfx.
932 fp_grp_addr.ip6.as_u64
940 clib_host_to_net_u32 (1 +
947 clib_host_to_net_u64 (1 +
955 if (scount > 1 || gcount > 1)
957 (scount * gcount) / (timet[1] - timet[0]));
990 .short_help =
"ip mroute [add|del] <dst-ip-addr>/<width> [table <table-id>] [via <next-hop-ip-addr> [<interface>],",
1010 uword *event_data = 0;
1014 if (retry_count > 0)
1019 for (i = 0; i < retry_count; i++)
1062 uword *event_data = 0;
1066 if (retry_count > 0)
1071 for (i = 0; i < retry_count; i++)
1116 u32 sw_if_index = ~0;
1117 int retry_count = 3;
1119 int address_set = 0;
1130 else if (
unformat (line_input,
"retry %d", &retry_count))
1148 if (sw_if_index == ~0)
1153 if (address_set == 0)
1158 if (address_set > 1)
1193 .path =
"ip probe-neighbor",
1195 .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)
fib_protocol_t fp_proto
protocol type
void mfib_table_entry_delete(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source)
Delete a FIB entry.
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)
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
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.
This packet is to be rewritten and forwarded to the next processing node.
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).
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
fib_node_index_t mfib_table_entry_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, fib_rpf_id_t rpf_id, mfib_entry_flags_t entry_flags)
Add a new (with no replication) or lock an existing entry.
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
ip_lookup_next_t
An adjacency is a representation of an attached L3 peer.
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.
#define vec_add(V, E, N)
Add N elements to end of vector V (no header, unspecified alignment)
Adjacency to punt this packet.
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.
Aggregrate type for a prefix.
const dpo_id_t * punt_dpo_get(dpo_proto_t proto)
#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.
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
u16 fp_len
The mask length.
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.
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.
This packet matches an "interface route" and packets need to be passed to ARP to find rewrite string ...
Recursion constraint of via an attahced prefix.
static uword mhash_set(mhash_t *h, void *key, uword new_value, uword *old_value)
clib_error_t * vnet_ip_mroute_cmd(vlib_main_t *vm, unformat_input_t *main_input, vlib_cli_command_t *cmd)
This packet matches an "incomplete adjacency" and packets need to be passed to ARP to find rewrite st...
uword unformat_mfib_entry_flags(unformat_input_t *input, va_list *args)
Adjacency to drop this packet.
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)
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
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.
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)
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
Next hop after ip4-lookup.
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.
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.
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