|
FD.io VPP
v21.10.1-2-g0a485f517
Vector Packet Processing
|
Go to the documentation of this file.
55 #ifndef CLIB_MARCH_VARIANT
62 #define OI_DECAP 0x80000000
76 .fp_len = address_length,
80 address->as_u64[0] &
im->fib_masks[address_length].as_u64[0],
81 address->as_u64[1] &
im->fib_masks[address_length].as_u64[1],
105 if (address_length < 128)
183 .fp_len = address_length,
187 address->as_u64[0] &
im->fib_masks[address_length].as_u64[0],
188 address->as_u64[1] &
im->fib_masks[address_length].as_u64[1],
210 if (address_length <= 128)
238 #ifndef CLIB_MARCH_VARIANT
273 else if (
hi->l3_if_count)
283 ip6_address_t *result = 0;
301 u32 address_length,
u32 is_del)
307 u32 if_address_index;
308 ip6_address_fib_t ip6_af, *addr_fib = 0;
309 const ip6_address_t *ll_addr;
317 if (address_length != 128)
319 vnm->
api_errno = VNET_API_ERROR_ADDRESS_LENGTH_MISMATCH;
322 (
"prefix length of link-local address must be 128");
341 vnm->
api_errno = VNET_API_ERROR_ADDRESS_NOT_DELETABLE;
346 vnm->
api_errno = VNET_API_ERROR_ADDRESS_NOT_FOUND_FOR_INTERFACE;
376 ip_interface_address_get_address
377 (&im->lookup_main, ia);
379 if (ip6_destination_matches_route
380 (im, address, x, ia->address_length) ||
381 ip6_destination_matches_route (im,
387 if ((sw_if_index == sif->sw_if_index) &&
388 (ia->address_length == address_length) &&
389 !ip6_address_is_equal (x, address))
392 if (ia->flags & IP_INTERFACE_ADDRESS_FLAG_STALE)
401 vnm->api_errno = VNET_API_ERROR_DUPLICATE_IF_ADDRESS;
402 error = clib_error_create
403 (
"failed to add %U which conflicts with %U for interface %U",
404 format_ip6_address_and_length, address,
406 format_ip6_address_and_length, x,
408 format_vnet_sw_if_index_name, vnm,
422 if (~0 == if_address_index)
424 vnm->api_errno = VNET_API_ERROR_ADDRESS_NOT_FOUND_FOR_INTERFACE;
426 lm->format_address_and_length,
427 addr_fib, address_length,
440 if (~0 != if_address_index)
465 addr_fib, address_length,
471 vnm->api_errno = VNET_API_ERROR_DUPLICATE_IF_ADDRESS;
473 (
"Prefix %U already found on interface %U",
474 lm->format_address_and_length, addr_fib, address_length,
480 addr_fib, address_length,
500 im, ip6_af.fib_index,
508 address, address_length, if_address_index, is_del);
526 u32 is_admin_up, fib_index;
529 lookup_main.if_address_pool_index_by_sw_if_index,
540 a = ip_interface_address_get_address (&im->lookup_main, ia);
542 ip6_add_interface_routes (vnm, sw_if_index,
546 ip6_del_interface_routes (sw_if_index, im, fib_index,
547 a, ia->address_length);
560 .arc_name =
"ip6-unicast",
562 .last_in_arc =
"ip6-lookup",
568 .arc_name =
"ip6-unicast",
569 .node_name =
"ip6-flow-classify",
575 .arc_name =
"ip6-unicast",
576 .node_name =
"ip6-inacl",
582 .arc_name =
"ip6-unicast",
583 .node_name =
"ip6-policer-classify",
589 .arc_name =
"ip6-unicast",
590 .node_name =
"ipsec6-input-feature",
596 .arc_name =
"ip6-unicast",
597 .node_name =
"l2tp-decap",
603 .arc_name =
"ip6-unicast",
604 .node_name =
"vpath-input-ip6",
610 .arc_name =
"ip6-unicast",
611 .node_name =
"ip6-vxlan-bypass",
617 .arc_name =
"ip6-unicast",
618 .node_name =
"ip6-not-enabled",
624 .arc_name =
"ip6-unicast",
625 .node_name =
"ip6-lookup",
632 .arc_name =
"ip6-multicast",
634 .last_in_arc =
"ip6-mfib-forward-lookup",
639 .arc_name =
"ip6-multicast",
640 .node_name =
"vpath-input-ip6",
645 .arc_name =
"ip6-multicast",
646 .node_name =
"ip6-not-enabled",
651 .arc_name =
"ip6-multicast",
652 .node_name =
"ip6-mfib-forward-lookup",
659 .arc_name =
"ip6-output",
660 .start_nodes =
VNET_FEATURES (
"ip6-rewrite",
"ip6-midchain",
"ip6-dvr-dpo"),
661 .last_in_arc =
"interface-output",
666 .arc_name =
"ip6-output",
667 .node_name =
"ip6-outacl",
672 .arc_name =
"ip6-output",
673 .node_name =
"ipsec6-output-feature",
678 .arc_name =
"ip6-output",
679 .node_name =
"interface-output",
741 .name =
"ip6-lookup",
742 .vector_size =
sizeof (
u32),
770 u32 lbi0, hc0, lbi1, hc1;
922 return frame->n_vectors;
928 .name =
"ip6-load-balance",
929 .vector_size =
sizeof (
u32),
930 .sibling_of =
"ip6-lookup",
943 u8 packet_data[128 - 1 *
sizeof (
u32)];
947 #ifndef CLIB_MARCH_VARIANT
956 s =
format (s,
"%Ufib:%d adj:%d flow:%d",
974 s =
format (s,
"fib %d dpo-idx %d flow hash: 0x%08x",
991 s =
format (s,
"tx_sw_if_index %d adj-idx %d : %U flow hash: 0x%08x",
1002 #ifndef CLIB_MARCH_VARIANT
1030 if (b0->
flags & VLIB_BUFFER_IS_TRACED)
1045 if (b1->
flags & VLIB_BUFFER_IS_TRACED)
1074 if (b0->
flags & VLIB_BUFFER_IS_TRACED)
1100 u16 payload_length, payload_length_host_byte_order;
1102 u32 headers_size =
sizeof (ip0[0]);
1103 u8 *data_this_buffer;
1109 payload_length_host_byte_order = clib_net_to_host_u16 (ip0->
payload_length);
1110 data_this_buffer = (
u8 *) (ip0 + 1);
1115 if (
PREDICT_FALSE (next_hdr == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS))
1118 ip6_hop_by_hop_ext_t *ext_hdr =
1119 (ip6_hop_by_hop_ext_t *) data_this_buffer;
1122 ASSERT ((ext_hdr->next_hdr == IP_PROTOCOL_ICMP6)
1123 || (ext_hdr->next_hdr == IP_PROTOCOL_UDP));
1125 skip_bytes = 8 * (1 + ext_hdr->n_data_u64s);
1126 data_this_buffer = (
void *) ((
u8 *) data_this_buffer + skip_bytes);
1128 payload_length_host_byte_order -= skip_bytes;
1129 headers_size += skip_bytes;
1135 payload_length = clib_host_to_net_u16 (payload_length_host_byte_order);
1136 next_hdr = ext_hdr->next_hdr;
1140 sum0 = payload_length + clib_host_to_net_u16 (next_hdr);
1152 payload_length_host_byte_order,
1153 (
u8 *) ip0, headers_size, NULL);
1156 payload_length_host_byte_order, NULL, 0,
1170 || ip0->
protocol == IP_PROTOCOL_ICMP6
1171 || ip0->
protocol == IP_PROTOCOL_UDP
1172 || ip0->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS);
1174 udp0 = (
void *) (ip0 + 1);
1177 p0->
flags |= (VNET_BUFFER_F_L4_CHECKSUM_COMPUTED
1178 | VNET_BUFFER_F_L4_CHECKSUM_CORRECT);
1184 p0->
flags |= (VNET_BUFFER_F_L4_CHECKSUM_COMPUTED
1185 | ((sum16 == 0) << VNET_BUFFER_F_LOG2_L4_CHECKSUM_CORRECT));
1201 fib_index =
vec_elt (
im->fib_index_by_sw_if_index,
1219 if (proto0 != IP_PROTOCOL_UDP)
1222 proto0 = (proto0 == IP_PROTOCOL_TCP) ? proto0 : 0;
1230 .arc_name =
"ip6-local",
1239 u16 payload_length_host_byte_order;
1240 u32 n_this_buffer, n_bytes_left;
1242 u32 headers_size =
sizeof (ip0[0]);
1243 u8 *data_this_buffer;
1246 data_this_buffer = (
u8 *) (ip0 + 1);
1248 ip6_hop_by_hop_ext_t *ext_hdr = (ip6_hop_by_hop_ext_t *) data_this_buffer;
1252 if (!(ext_hdr->next_hdr == IP_PROTOCOL_ICMP6)
1253 || (ext_hdr->next_hdr == IP_PROTOCOL_UDP))
1257 payload_length_host_byte_order = clib_net_to_host_u16 (ip0->
payload_length);
1258 n_bytes_left = n_this_buffer = payload_length_host_byte_order;
1261 u32 n_ip_bytes_this_buffer =
1263 if (n_this_buffer + headers_size > n_ip_bytes_this_buffer)
1266 n_ip_bytes_this_buffer - headers_size : 0;
1269 n_bytes_left -= n_this_buffer;
1272 if (n_bytes_left == 0)
1288 u8 arc_index = vnet_feat_arc_ip6_local.feature_arc_index;
1314 error[0] = IP6_ERROR_UNKNOWN_PROTOCOL;
1315 error[1] = IP6_ERROR_UNKNOWN_PROTOCOL;
1321 if (head_of_feature_arc)
1339 l4_offload[0] = (
flags[0] & VNET_BUFFER_F_OFFLOAD) &&
1340 (oflags[0] & (VNET_BUFFER_OFFLOAD_F_TCP_CKSUM |
1341 VNET_BUFFER_OFFLOAD_F_UDP_CKSUM));
1342 l4_offload[1] = (
flags[1] & VNET_BUFFER_F_OFFLOAD) &&
1343 (oflags[1] & (VNET_BUFFER_OFFLOAD_F_TCP_CKSUM |
1344 VNET_BUFFER_OFFLOAD_F_UDP_CKSUM));
1346 u32 good_l4_csum[2];
1348 (
flags[0] & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) | l4_offload[0];
1350 (
flags[1] & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) | l4_offload[1];
1352 u32 udp_offset[2] = { };
1358 i16 len_diff[2] = { 0 };
1366 u16 ip_len, udp_len;
1367 ip_len = clib_net_to_host_u16 (
ip[0]->payload_length);
1368 udp_len = clib_net_to_host_u16 (udp->
length);
1369 len_diff[0] = ip_len - udp_len;
1378 u16 ip_len, udp_len;
1379 ip_len = clib_net_to_host_u16 (
ip[1]->payload_length);
1380 udp_len = clib_net_to_host_u16 (udp->
length);
1381 len_diff[1] = ip_len - udp_len;
1393 && !(
flags[0] & VNET_BUFFER_F_L4_CHECKSUM_COMPUTED);
1396 && !(
flags[1] & VNET_BUFFER_F_L4_CHECKSUM_COMPUTED);
1400 good_l4_csum[0] =
flags[0] & VNET_BUFFER_F_L4_CHECKSUM_CORRECT;
1401 error[0] = IP6_ERROR_UNKNOWN_PROTOCOL;
1406 error[0] = IP6_ERROR_BAD_LENGTH;
1411 good_l4_csum[1] =
flags[1] & VNET_BUFFER_F_L4_CHECKSUM_CORRECT;
1412 error[1] = IP6_ERROR_UNKNOWN_PROTOCOL;
1417 error[1] = IP6_ERROR_BAD_LENGTH;
1421 error[0] = len_diff[0] < 0 ? IP6_ERROR_UDP_LENGTH :
error[0];
1423 error[1] = len_diff[1] < 0 ? IP6_ERROR_UDP_LENGTH :
error[1];
1426 IP6_ERROR_UDP_CHECKSUM,
1427 "Wrong IP6 errors constants");
1429 IP6_ERROR_ICMP_CHECKSUM,
1430 "Wrong IP6 errors constants");
1433 !good_l4_csum[0] ? IP6_ERROR_UDP_CHECKSUM +
type[0] :
error[0];
1435 !good_l4_csum[1] ? IP6_ERROR_UDP_CHECKSUM +
type[1] :
error[1];
1440 unroutable[0] =
error[0] == IP6_ERROR_UNKNOWN_PROTOCOL
1443 unroutable[1] =
error[1] == IP6_ERROR_UNKNOWN_PROTOCOL
1450 ip[0]) ? IP6_ERROR_SRC_LOOKUP_MISS
1457 ip[1]) ? IP6_ERROR_SRC_LOOKUP_MISS
1481 if (head_of_feature_arc)
1484 ip6_unknown[0] =
error[0] == (
u8) IP6_ERROR_UNKNOWN_PROTOCOL;
1485 ip6_unknown[1] =
error[1] == (
u8) IP6_ERROR_UNKNOWN_PROTOCOL;
1513 error = IP6_ERROR_UNKNOWN_PROTOCOL;
1518 if (head_of_feature_arc)
1527 u32 l4_offload = (
flags & VNET_BUFFER_F_OFFLOAD) &&
1528 (oflags & (VNET_BUFFER_OFFLOAD_F_TCP_CKSUM |
1529 VNET_BUFFER_OFFLOAD_F_UDP_CKSUM));
1532 (
flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) | l4_offload;
1543 u16 ip_len, udp_len;
1544 ip_len = clib_net_to_host_u16 (
ip->payload_length);
1545 udp_len = clib_net_to_host_u16 (udp->
length);
1546 len_diff = ip_len - udp_len;
1554 !(
flags & VNET_BUFFER_F_L4_CHECKSUM_COMPUTED);
1558 good_l4_csum =
flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT;
1559 error = IP6_ERROR_UNKNOWN_PROTOCOL;
1564 error = IP6_ERROR_BAD_LENGTH;
1569 error = len_diff < 0 ? IP6_ERROR_UDP_LENGTH :
error;
1571 IP6_ERROR_UDP_CHECKSUM,
1572 "Wrong IP6 errors constants");
1574 IP6_ERROR_ICMP_CHECKSUM,
1575 "Wrong IP6 errors constants");
1581 u8 unroutable =
error == IP6_ERROR_UNKNOWN_PROTOCOL
1588 ip) ? IP6_ERROR_SRC_LOOKUP_MISS :
1604 if (head_of_feature_arc)
1623 return frame->n_vectors;
1635 .name =
"ip6-local",
1636 .vector_size =
sizeof (
u32),
1659 .name =
"ip6-local-end-of-arc",
1660 .vector_size =
sizeof (
u32),
1663 .sibling_of =
"ip6-local",
1667 .arc_name =
"ip6-local",
1668 .node_name =
"ip6-local-end-of-arc",
1673 #ifdef CLIB_MARCH_VARIANT
1711 #define IP6_MCAST_ADDR_MASK 0xffffffff
1715 u16 adj_packet_bytes,
bool is_locally_generated,
1718 if (adj_packet_bytes >= 1280 && packet_bytes > adj_packet_bytes)
1720 if (is_locally_generated)
1728 *
error = IP6_ERROR_MTU_EXCEEDED;
1732 *
error = IP6_ERROR_MTU_EXCEEDED;
1744 int do_counters,
int is_midchain,
int is_mcast)
1765 u32 pi0, rw_len0, next0, error0, adj_index0;
1766 u32 pi1, rw_len1, next1, error1, adj_index1;
1767 u32 tx_sw_if_index0, tx_sw_if_index1;
1768 bool is_locally_originated0, is_locally_originated1;
1787 pi0 = to_next[0] =
from[0];
1788 pi1 = to_next[1] =
from[1];
1793 n_left_to_next -= 2;
1804 error0 = error1 = IP6_ERROR_NONE;
1807 is_locally_originated0 =
1808 p0->
flags & VNET_BUFFER_F_LOCALLY_ORIGINATED;
1826 error0 = IP6_ERROR_TIME_EXPIRED;
1830 ICMP6_time_exceeded_ttl_exceeded_in_transit,
1835 is_locally_originated1 =
1836 p1->
flags & VNET_BUFFER_F_LOCALLY_ORIGINATED;
1854 error1 = IP6_ERROR_TIME_EXPIRED;
1858 ICMP6_time_exceeded_ttl_exceeded_in_transit,
1866 rw_len0 = adj0[0].rewrite_header.data_bytes;
1867 rw_len1 = adj1[0].rewrite_header.data_bytes;
1868 vnet_buffer (p0)->ip.save_rewrite_length = rw_len0;
1869 vnet_buffer (p1)->ip.save_rewrite_length = rw_len1;
1890 if (p0->
flags & VNET_BUFFER_F_GSO)
1892 if (p1->
flags & VNET_BUFFER_F_GSO)
1896 adj0[0].rewrite_header.max_l3_packet_bytes,
1897 is_locally_originated0, &next0, is_midchain,
1900 adj1[0].rewrite_header.max_l3_packet_bytes,
1901 is_locally_originated1, &next1, is_midchain,
1909 tx_sw_if_index0 = adj0[0].rewrite_header.sw_if_index;
1911 next0 = adj0[0].rewrite_header.next_index;
1927 tx_sw_if_index1 = adj1[0].rewrite_header.sw_if_index;
1929 next1 = adj1[0].rewrite_header.next_index;
1976 rewrite_header.dst_mcast_offset,
1981 rewrite_header.dst_mcast_offset,
1987 to_next, n_left_to_next,
1988 pi0, pi1, next0, next1);
1997 u32 adj_index0, next0, error0;
1998 u32 tx_sw_if_index0;
1999 bool is_locally_originated0;
2001 pi0 = to_next[0] =
from[0];
2011 error0 = IP6_ERROR_NONE;
2015 is_locally_originated0 =
2016 p0->
flags & VNET_BUFFER_F_LOCALLY_ORIGINATED;
2033 error0 = IP6_ERROR_TIME_EXPIRED;
2037 ICMP6_time_exceeded_ttl_exceeded_in_transit,
2056 rw_len0 = adj0[0].rewrite_header.data_bytes;
2057 vnet_buffer (p0)->ip.save_rewrite_length = rw_len0;
2071 if (p0->
flags & VNET_BUFFER_F_GSO)
2075 adj0[0].rewrite_header.max_l3_packet_bytes,
2076 is_locally_originated0, &next0, is_midchain,
2085 tx_sw_if_index0 = adj0[0].rewrite_header.sw_if_index;
2088 next0 = adj0[0].rewrite_header.next_index;
2111 rewrite_header.dst_mcast_offset,
2119 n_left_to_next -= 1;
2122 to_next, n_left_to_next,
2133 return frame->n_vectors;
2140 int do_counters,
int is_midchain,
int is_mcast)
2143 is_midchain, is_mcast);
2199 .name =
"ip6-midchain",
2200 .vector_size =
sizeof (
u32),
2202 .sibling_of =
"ip6-rewrite",
2207 .name =
"ip6-rewrite",
2208 .vector_size =
sizeof (
u32),
2220 .name =
"ip6-rewrite-bcast",
2221 .vector_size =
sizeof (
u32),
2224 .sibling_of =
"ip6-rewrite",
2229 .name =
"ip6-rewrite-mcast",
2230 .vector_size =
sizeof (
u32),
2232 .sibling_of =
"ip6-rewrite",
2238 .name =
"ip6-mcast-midchain",
2239 .vector_size =
sizeof (
u32),
2241 .sibling_of =
"ip6-rewrite",
2249 #ifndef CLIB_MARCH_VARIANT
2253 #define foreach_ip6_hop_by_hop_error \
2254 _(PROCESSED, "pkts with ip6 hop-by-hop options") \
2255 _(FORMAT, "incorrectly formatted hop-by-hop options") \
2256 _(UNKNOWN_OPTION, "unknown ip6 hop-by-hop options")
2261 #define _(sym,str) IP6_HOP_BY_HOP_ERROR_##sym,
2282 #define _(sym,string) string,
2287 #ifndef CLIB_MARCH_VARIANT
2292 int total_len = va_arg (*args,
int);
2296 s =
format (s,
"IP6_HOP_BY_HOP: next protocol %d len %d total %d",
2302 while (opt0 < limit0)
2312 if (hm->
trace[type0])
2314 s = (*hm->
trace[type0]) (s, opt0);
2318 s =
format (s,
"\n unrecognized option %d length %d", type0,
2345 s =
format (s,
"IP6_HOP_BY_HOP: next index %d len %d traced %d",
2351 while (opt0 < limit0)
2361 if (hm->
trace[type0])
2363 s = (*hm->
trace[type0]) (s, opt0);
2367 s =
format (s,
"\n unrecognized option %d length %d", type0,
2390 while (opt0 < limit0)
2403 if ((*hm->
options[type0]) (b0, ip0, opt0) < 0)
2405 error0 = IP6_HOP_BY_HOP_ERROR_FORMAT;
2417 error0 = IP6_HOP_BY_HOP_ERROR_UNKNOWN_OPTION;
2421 error0 = IP6_HOP_BY_HOP_ERROR_UNKNOWN_OPTION;
2424 ICMP6_parameter_problem_unrecognized_option,
2425 (
u8 *) opt0 - (
u8 *) ip0);
2428 error0 = IP6_HOP_BY_HOP_ERROR_UNKNOWN_OPTION;
2433 ICMP6_parameter_problem,
2434 ICMP6_parameter_problem_unrecognized_option,
2435 (
u8 *) opt0 - (
u8 *) ip0);
2484 u8 error0 = 0, error1 = 0;
2501 to_next[0] = bi0 =
from[0];
2502 to_next[1] = bi1 =
from[1];
2506 n_left_to_next -= 2;
2529 ((hbh0->
length + 1) << 3));
2532 ((hbh1->
length + 1) << 3));
2537 if ((hbh0->
length + 1) << 3 >
2540 error0 = IP6_HOP_BY_HOP_ERROR_FORMAT;
2547 if ((hbh1->
length + 1) << 3 >
2550 error1 = IP6_HOP_BY_HOP_ERROR_FORMAT;
2572 if (b0->
flags & VLIB_BUFFER_IS_TRACED)
2576 u32 trace_len = (hbh0->
length + 1) << 3;
2586 if (b1->
flags & VLIB_BUFFER_IS_TRACED)
2590 u32 trace_len = (hbh1->
length + 1) << 3;
2608 n_left_to_next, bi0, bi1, next0,
2628 n_left_to_next -= 1;
2644 ((hbh0->
length + 1) << 3));
2649 if ((hbh0->
length + 1) << 3 >
2652 error0 = IP6_HOP_BY_HOP_ERROR_FORMAT;
2671 u32 trace_len = (hbh0->
length + 1) << 3;
2686 n_left_to_next, bi0, next0);
2690 return frame->n_vectors;
2696 .name =
"ip6-hop-by-hop",
2697 .sibling_of =
"ip6-lookup",
2698 .vector_size =
sizeof (
u32),
2719 #ifndef CLIB_MARCH_VARIANT
2747 im->hbh_enabled = 1;
2765 hm->
trace[option] = NULL;
2770 for (
i = 0;
i < 256;
i++)
2779 im->hbh_enabled = 0;
2805 for (j = 0; j < i0; j++)
2806 im->fib_masks[
i].as_u32[j] = ~0;
2809 im->fib_masks[
i].as_u32[i0] =
2810 clib_host_to_net_u32 (
pow2_mask (i1) << (32 - i1));
2828 im->hbh_enabled = 0;
2842 u32 flow_hash_config = 0;
2849 #define _(a, b, v) \
2850 else if (unformat (input, #a)) \
2852 flow_hash_config |= v; \
2875 clib_warning (
"BUG: illegal flow hash config 0x%x", flow_hash_config);
2959 .path =
"set ip6 flow-hash",
2960 .short_help =
"set ip6 flow-hash table <table-id> [src] [dst] [sport] "
2961 "[dport] [proto] [reverse] [flowlabel]",
3008 .path =
"show ip6 local",
3010 .short_help =
"show ip6 local",
3014 #ifndef CLIB_MARCH_VARIANT
3023 ip6_address_t *if_addr;
3026 return VNET_API_ERROR_NO_MATCHING_INTERFACE;
3029 return VNET_API_ERROR_NO_SUCH_ENTRY;
3036 if (NULL != if_addr)
3041 .fp_addr.ip6 = *if_addr,
3047 if (table_index != (
u32) ~ 0)
3076 u32 table_index = ~0;
3077 int table_index_set = 0;
3083 if (
unformat (input,
"table-index %d", &table_index))
3084 table_index_set = 1;
3092 if (table_index_set == 0)
3105 case VNET_API_ERROR_NO_MATCHING_INTERFACE:
3108 case VNET_API_ERROR_NO_SUCH_ENTRY:
3127 .path =
"set ip6 classify",
3129 "set ip6 classify intfc <interface> table-index <classify-idx>",
@ IP_INTERFACE_ADDRESS_FLAG_STALE
static void ip6_del_interface_routes(u32 sw_if_index, ip6_main_t *im, u32 fib_index, ip6_address_t *address, u32 address_length)
#define HBH_OPTION_TYPE_DISCARD_UNKNOWN_ICMP_NOT_MCAST
static uword ip6_address_is_link_local_unicast(const ip6_address_t *a)
static uword ip6_address_is_equal(const ip6_address_t *a, const ip6_address_t *b)
static int adj_are_counters_enabled(void)
Get the global configuration option for enabling per-adj counters.
u16 dpoi_next_node
The next VLIB node to follow.
vnet_interface_main_t * im
ip_interface_prefix_t * if_prefix_pool
Pool of prefixes containing addresses assigned to interfaces.
mhash_t prefix_to_if_prefix_index
Hash table mapping prefix to index in interface prefix pool.
static u32 ip6_lookup(gid_ip6_table_t *db, u32 vni, ip_prefix_t *key)
static vlib_cli_command_t trace
(constructor) VLIB_CLI_COMMAND (trace)
u16 lb_n_buckets
number of buckets in the load-balance.
ip_interface_prefix_key_t key
ip6_hop_by_hop_main_t ip6_hop_by_hop_main
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
vlib_node_registration_t ip6_local_end_of_arc_node
(constructor) VLIB_REGISTER_NODE (ip6_local_end_of_arc_node)
index_t dpoi_index
the index of objects of that type
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
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...
vlib_buffer_t * bufs[VLIB_FRAME_SIZE]
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
vlib_node_registration_t ip6_mcast_midchain_node
(constructor) VLIB_REGISTER_NODE (ip6_mcast_midchain_node)
#define vlib_prefetch_buffer_header(b, type)
Prefetch buffer metadata.
vlib_main_t vlib_node_runtime_t vlib_frame_t * frame
int vnet_set_ip6_classify_intfc(vlib_main_t *vm, u32 sw_if_index, u32 table_index)
void icmp6_error_set_vnet_buffer(vlib_buffer_t *b, u8 type, u8 code, u32 data)
static_always_inline u8 ip6_tcp_udp_icmp_bad_length(vlib_main_t *vm, vlib_buffer_t *p0)
static uword vlib_node_add_next(vlib_main_t *vm, uword node, uword next_node)
u8 ucast_feature_arc_index
#define clib_memcpy(d, s, n)
void fib_table_entry_delete(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Delete a FIB entry.
nat44_ei_hairpin_src_next_t next_index
fib_node_index_t fib_table_entry_update_one_path(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, dpo_proto_t next_hop_proto, const ip46_address_t *next_hop, u32 next_hop_sw_if_index, u32 next_hop_fib_index, u32 next_hop_weight, fib_mpls_label_t *next_hop_labels, fib_route_path_flags_t path_flags)
Update the entry to have just one path.
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
#define IP6_LOOKUP_NEXT_NODES
static uword pow2_mask(uword x)
static clib_error_t * ip6_sw_interface_add_del(vnet_main_t *vnm, u32 sw_if_index, u32 is_add)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
static int fib_urpf_check_size(index_t ui)
Data-Plane function to check the size of an uRPF list, (i.e.
static clib_error_t * ip6_hop_by_hop_init(vlib_main_t *vm)
@ IP6_LOOKUP_NEXT_POP_HOP_BY_HOP
void ip6_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
vlib_get_buffers(vm, from, b, n_left_from)
static vlib_cli_command_t show_ip6_local
(constructor) VLIB_CLI_COMMAND (show_ip6_local)
@ VLIB_NODE_TYPE_INTERNAL
@ IP6_REWRITE_NEXT_ICMP_ERROR
void ip6_forward_next_trace(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, vlib_rx_or_tx_t which_adj_index)
vlib_main_t vlib_node_runtime_t * node
VNET_FEATURE_INIT(ip6_flow_classify, static)
flow_hash_config_t lb_hash_config
the hash config to use when selecting a bucket.
vnet_classify_main_t vnet_classify_main
static void ip6_add_interface_prefix_routes(ip6_main_t *im, u32 sw_if_index, u32 fib_index, ip6_address_t *address, u32 address_length)
@ FIB_ENTRY_FLAG_ATTACHED
u32 mfib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id, mfib_source_t src)
Get the index of the FIB for a Table-ID.
#define clib_error_return(e, args...)
#define HBH_OPTION_TYPE_SKIP_UNKNOWN
@ IP_BUILTIN_PROTOCOL_UNKNOWN
#define HBH_OPTION_TYPE_DISCARD_UNKNOWN
static void ip6_add_interface_routes(vnet_main_t *vnm, u32 sw_if_index, ip6_main_t *im, u32 fib_index, ip_interface_address_t *a)
vlib_combined_counter_main_t lbm_via_counters
u16 fp_len
The mask length.
@ VNET_REWRITE_HAS_FEATURES
This adjacency/interface has output features configured.
#define vlib_call_init_function(vm, x)
@ VNET_SW_INTERFACE_FLAG_ADMIN_UP
#define pool_put(P, E)
Free an object E in pool P.
u32 * classify_table_index_by_sw_if_index
First table index to use for this interface, ~0 => none.
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
@ IP6_LOOKUP_NEXT_HOP_BY_HOP
static void ip6_mtu_check(vlib_buffer_t *b, u16 packet_bytes, u16 adj_packet_bytes, bool is_locally_generated, u32 *next, u8 is_midchain, u32 *error)
vlib_buffer_enqueue_to_next(vm, node, from,(u16 *) nexts, frame->n_vectors)
static vlib_cli_command_t set_ip6_flow_hash_command
(constructor) VLIB_CLI_COMMAND (set_ip6_flow_hash_command)
static_always_inline void vnet_calc_checksums_inline(vlib_main_t *vm, vlib_buffer_t *b, int is_ip4, int is_ip6)
index_t classify_dpo_create(dpo_proto_t proto, u32 classify_table_index)
clib_error_t * ip_interface_address_add(ip_lookup_main_t *lm, u32 sw_if_index, void *addr_fib, u32 address_length, u32 *result_if_address_index)
static u16 ip_calculate_l4_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip_csum_t sum0, u32 payload_length, u8 *iph, u32 ip_header_size, u8 *l4h)
static uword vlib_buffer_length_in_chain(vlib_main_t *vm, vlib_buffer_t *b)
Get length in bytes of the buffer chain.
static_always_inline void * clib_memcpy_fast(void *restrict dst, const void *restrict src, size_t n)
static uword ip6_local_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int head_of_feature_arc)
static clib_error_t * ip6_sw_interface_admin_up_down(vnet_main_t *vnm, u32 sw_if_index, u32 flags)
static_always_inline void * vnet_feature_arc_start_w_cfg_index(u8 arc, u32 sw_if_index, u32 *next, vlib_buffer_t *b, u32 cfg_index)
void ip_frag_set_vnet_buffer(vlib_buffer_t *b, u16 mtu, u8 next_index, u8 flags)
VNET_SW_INTERFACE_ADMIN_UP_DOWN_FUNCTION(ip6_sw_interface_admin_up_down)
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
#define vec_elt(v, i)
Get vector value at index i.
vlib_node_registration_t ip6_midchain_node
(constructor) VLIB_REGISTER_NODE (ip6_midchain_node)
void ip6_hbh_set_next_override(uword next)
#define CLIB_PREFETCH(addr, size, type)
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
void fib_table_entry_special_remove(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Remove a 'special' entry from the FIB.
vlib_error_t * errors
Vector of errors for this node.
#define pool_foreach(VAR, POOL)
Iterate through pool.
load_balance_main_t load_balance_main
The one instance of load-balance main.
static clib_error_t * set_ip6_classify_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static const dpo_id_t * load_balance_get_fwd_bucket(const load_balance_t *lb, u16 bucket)
#define clib_error_create(args...)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static uword ip6_address_is_multicast(const ip6_address_t *a)
vlib_error_t error
Error code for buffers to be enqueued to error handler.
@ IP_LOOKUP_NEXT_DROP
Adjacency to drop this packet.
static uword ip6_rewrite_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int do_counters, int is_midchain, int is_mcast)
#define VLIB_NODE_FN(node)
void ip6_mfib_interface_enable_disable(u32 sw_if_index, int is_enable)
Add/remove the interface from the accepting list of the special MFIB entries.
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
int vnet_sw_interface_update_unnumbered(u32 unnumbered_sw_if_index, u32 ip_sw_if_index, u8 enable)
void ip_lookup_init(ip_lookup_main_t *lm, u32 is_ip6)
@ FIB_SOURCE_INTERFACE
Route added as a result of interface configuration.
ip_lookup_next_t lookup_next_index
Next hop after ip4-lookup.
static u32 ip6_compute_flow_hash(const ip6_header_t *ip, flow_hash_config_t flow_hash_config)
unformat_function_t * unformat_edit
vlib_node_registration_t ip6_rewrite_node
(constructor) VLIB_REGISTER_NODE (ip6_rewrite_node)
const ip6_address_t * ip6_get_link_local_address(u32 sw_if_index)
vnet_main_t * vnet_get_main(void)
u8 mcast_feature_arc_index
Feature arc indices.
#define VLIB_NODE_FLAG_TRACE
@ IP_LOCAL_NEXT_REASSEMBLY
u32 fib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id, fib_source_t src)
Get the index of the FIB for a Table-ID.
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
int ip6_hbh_unregister_option(u8 option)
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
int ip_flow_hash_set(ip_address_family_t af, u32 table_id, u32 flow_hash_config)
#define static_always_inline
vlib_node_registration_t ip6_hop_by_hop_node
(constructor) VLIB_REGISTER_NODE (ip6_hop_by_hop_node)
#define vlib_prefetch_buffer_with_index(vm, bi, type)
Prefetch buffer metadata by buffer index The first 64 bytes of buffer contains most header informatio...
#define HBH_OPTION_TYPE_HIGH_ORDER_BITS
static pg_node_t * pg_get_node(uword node_index)
if(node->flags &VLIB_NODE_FLAG_TRACE) vnet_interface_output_trace(vm
@ MFIB_SOURCE_DEFAULT_ROUTE
#define clib_mem_unaligned(pointer, type)
u16 ip6_tcp_udp_icmp_compute_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip6_header_t *ip0, int *bogus_lengthp)
static vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
Get vlib node by index.
static const dpo_id_t * load_balance_get_bucket_i(const load_balance_t *lb, u32 bucket)
static ip_interface_prefix_t * ip_get_interface_prefix(ip_lookup_main_t *lm, ip_interface_prefix_key_t *k)
@ IP_BUILTIN_PROTOCOL_UDP
vnet_feature_config_main_t * cm
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
@ FIB_SOURCE_CLASSIFY
Classify.
@ IP_FRAG_NEXT_IP_REWRITE
static int ip6_locate_header(vlib_buffer_t *p0, ip6_header_t *ip0, int find_hdr_type, u32 *offset)
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment)
manual_print typedef address
#define VLIB_CLI_COMMAND(x,...)
static clib_error_t * vnet_feature_init(vlib_main_t *vm)
#define IP6_MCAST_ADDR_MASK
This bits of an IPv6 address to mask to construct a multicast MAC address.
#define STATIC_ASSERT(truth,...)
static clib_error_t * ip6_lookup_init(vlib_main_t *vm)
#define CLIB_CACHE_LINE_BYTES
struct _vlib_node_registration vlib_node_registration_t
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
vlib_node_registration_t ip6_rewrite_mcast_node
(constructor) VLIB_REGISTER_NODE (ip6_rewrite_mcast_node)
vnet_sw_interface_t * sw_interfaces
static u32 ip6_fib_table_fwding_lookup(u32 fib_index, const ip6_address_t *dst)
u16 current_length
Nbytes between current data and the end of this buffer.
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
static uword vnet_sw_interface_is_admin_up(vnet_main_t *vnm, u32 sw_if_index)
int(* options[256])(vlib_buffer_t *b, ip6_header_t *ip, ip6_hop_by_hop_option_t *opt)
static char * ip6_hop_by_hop_error_strings[]
VNET_SW_INTERFACE_ADD_DEL_FUNCTION(ip6_sw_interface_add_del)
vnet_api_error_t api_errno
static vlib_cli_command_t set_ip6_classify_command
(constructor) VLIB_CLI_COMMAND (set_ip6_classify_command)
u8 packet_data[128 - 1 *sizeof(u32)]
@ IP_LOOKUP_NEXT_ICMP_ERROR
This packets needs to go to ICMP error.
ip_lookup_next_t
An adjacency is a representation of an attached L3 peer.
#define vec_free(V)
Free vector's memory (no header).
union ip_adjacency_t_::@144 sub_type
clib_error_t * vnet_sw_interface_supports_addressing(vnet_main_t *vnm, u32 sw_if_index)
static int ip6_urpf_loose_check(ip6_main_t *im, vlib_buffer_t *b, ip6_header_t *i)
returns number of links on which src is reachable.
#define vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next, n_left_to_next, bi0, next0)
Finish enqueueing one buffer forward in the graph.
vlib_node_registration_t ip6_input_node
(constructor) VLIB_REGISTER_NODE (ip6_input_node)
u8 * format_ip6_hop_by_hop_ext_hdr(u8 *s, va_list *args)
static u8 * format_ip6_hop_by_hop_trace(u8 *s, va_list *args)
#define HBH_OPTION_TYPE_DISCARD_UNKNOWN_ICMP
format_function_t format_vlib_node_name
u8 * format_ip6_forward_next_trace(u8 *s, va_list *args)
@ FIB_ENTRY_FLAG_CONNECTED
static clib_error_t * set_ip6_flow_hash_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
clib_error_t * ip6_add_del_interface_address(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *address, u32 address_length, u32 is_del)
format_function_t format_vnet_sw_if_index_name
vlib_node_registration_t ip6_load_balance_node
(constructor) VLIB_REGISTER_NODE (ip6_load_balance_node)
u8 *(* trace[256])(u8 *s, ip6_hop_by_hop_option_t *opt)
unformat_function_t unformat_vnet_sw_interface
description fragment has unexpected format
vlib_combined_counter_main_t adjacency_counters
Adjacency packet counters.
vlib_node_registration_t ip6_rewrite_bcast_node
(constructor) VLIB_REGISTER_NODE (ip6_rewrite_bcast_node)
A collection of combined counters.
@ FIB_SOURCE_DEFAULT_ROUTE
The default route source.
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header,...
vlib_put_next_frame(vm, node, next_index, 0)
static ip_csum_t ip_csum_with_carry(ip_csum_t sum, ip_csum_t x)
u32 fib_table_get_index_for_sw_if_index(fib_protocol_t proto, u32 sw_if_index)
Get the index of the FIB bound to the interface.
@ FIB_ROUTE_PATH_FLAG_NONE
#define VLIB_INIT_FUNCTION(x)
static vnet_hw_interface_t * vnet_get_sup_hw_interface(vnet_main_t *vnm, u32 sw_if_index)
static struct option options[]
vl_api_ip_proto_t protocol
@ IP_BUILTIN_PROTOCOL_ICMP
u32 ia_cfg_index
feature [arc] config index
#define vec_foreach(var, vec)
Vector iterator.
static load_balance_t * load_balance_get(index_t lbi)
static u8 ip6_scan_hbh_options(vlib_buffer_t *b0, ip6_header_t *ip0, ip6_hop_by_hop_header_t *hbh0, ip6_hop_by_hop_option_t *opt0, ip6_hop_by_hop_option_t *limit0, u32 *next0)
void ip6_unregister_protocol(u32 protocol)
struct _vnet_classify_main vnet_classify_main_t
@ IP_LOCAL_NEXT_UDP_LOOKUP
ip_lookup_main_t lookup_main
static vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
Get node runtime by node index.
#define foreach_ip6_hop_by_hop_error
static void ip6_addr_fib_init(ip6_address_fib_t *addr_fib, const ip6_address_t *address, u32 fib_index)
int vnet_feature_enable_disable(const char *arc_name, const char *node_name, u32 sw_if_index, int enable_disable, void *feature_config, u32 n_feature_config_bytes)
static u8 * format_ip6_rewrite_trace(u8 *s, va_list *args)
#define vnet_rewrite_two_headers(rw0, rw1, p0, p1, most_likely_size)
static u8 * format_ip6_lookup_trace(u8 *s, va_list *args)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
clib_error_t * ip_interface_address_del(ip_lookup_main_t *lm, vnet_main_t *vnm, u32 address_index, void *addr_fib, u32 address_length, u32 sw_if_index)
u8 local_next_by_ip_protocol[256]
Table mapping ip protocol to ip[46]-local node next index.
void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
static u8 ip6_next_proto_is_tcp_udp(vlib_buffer_t *p0, ip6_header_t *ip0, u32 *udp_offset0)
static vlib_main_t * vlib_get_main(void)
#define VNET_FEATURES(...)
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
u32 ip_interface_address_find(ip_lookup_main_t *lm, void *addr_fib, u32 address_length)
clib_error_t *() vlib_init_function_t(struct vlib_main_t *vm)
static void vnet_ip_mcast_fixup_header(u32 dst_mcast_mask, u32 dst_mcast_offset, u32 *addr, u8 *packet0)
int dpo_is_adj(const dpo_id_t *dpo)
Return TRUE is the DPO is any type of adjacency.
u8 builtin_protocol_by_ip_protocol[256]
IP_BUILTIN_PROTOCOL_{TCP,UDP,ICMP,OTHER} by protocol in IP header.
#define vnet_rewrite_one_header(rw0, p0, most_likely_size)
static void ip6_del_interface_prefix_routes(ip6_main_t *im, u32 sw_if_index, u32 fib_index, ip6_address_t *address, u32 address_length)
static_always_inline void vnet_feature_arc_start(u8 arc, u32 sw_if_index, u32 *next0, vlib_buffer_t *b0)
#define clib_warning(format, args...)
vlib_node_registration_t ip6_lookup_node
(constructor) VLIB_REGISTER_NODE (ip6_lookup_node)
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
u16 nexts[VLIB_FRAME_SIZE]
int ip6_hbh_register_option(u8 option, int options(vlib_buffer_t *b, ip6_header_t *ip, ip6_hop_by_hop_option_t *opt), u8 *trace(u8 *s, ip6_hop_by_hop_option_t *opt))
u16 lb_n_buckets_minus_1
number of buckets in the load-balance - 1.
#define vlib_validate_buffer_enqueue_x2(vm, node, next_index, to_next, n_left_to_next, bi0, bi1, next0, next1)
Finish enqueueing two buffers forward in the graph.
static_always_inline void clib_prefetch_store(void *p)
u8 pre_data[VLIB_BUFFER_PRE_DATA_SIZE]
Space for inserting data before buffer start.
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.
index_t lb_urpf
This is the index of the uRPF list for this LB.
int ip6_link_set_local_address(u32 sw_if_index, const ip6_address_t *address)
@ IP6_REWRITE_NEXT_FRAGMENT
vl_api_address_union_t src_address
int ip6_link_enable(u32 sw_if_index, const ip6_address_t *link_local_addr)
IPv6 Configuration on an interface.
ip6_address_t * ip6_interface_first_address(ip6_main_t *im, u32 sw_if_index)
get first IPv6 interface address
VNET_FEATURE_ARC_INIT(ip6_unicast, static)
u32 total_length_not_including_first_buffer
Only valid for first buffer in chain.
u32 ip6_tcp_udp_icmp_validate_checksum(vlib_main_t *vm, vlib_buffer_t *p0)
vl_api_interface_index_t sw_if_index
#define vlib_get_next_frame(vm, node, next_index, vectors, n_vectors_left)
Get pointer to next frame vector data by (vlib_node_runtime_t, next_index).
static uword ip6_lookup_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
ip_interface_address_flags_t flags
vlib_node_registration_t ip6_local_node
(constructor) VLIB_REGISTER_NODE (ip6_local_node)
void ip6_register_protocol(u32 protocol, u32 node_index)
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
static clib_error_t * show_ip6_local_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static ip_adjacency_t * adj_get(adj_index_t adj_index)
Get a pointer to an adjacency object from its index.
static uword ip6_rewrite_inline_with_gso(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int do_counters, int is_midchain, int is_mcast)
__clib_export uword mhash_unset(mhash_t *h, void *key, uword *old_value)
Aggregate type for a prefix.
vl_api_fib_path_type_t type
u8 output_feature_arc_index
vnet_interface_main_t interface_main
vlib_increment_combined_counter(ccm, ti, sw_if_index, n_buffers, n_bytes)
#define vlib_prefetch_buffer_data(b, type)
@ IP_FRAG_NEXT_IP_REWRITE_MIDCHAIN
static uword mhash_set(mhash_t *h, void *key, uword new_value, uword *old_value)
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index,...
int ip6_link_disable(u32 sw_if_index)
VLIB buffer representation.
#define VLIB_REGISTER_NODE(x,...)
struct ip_adjacency_t_::@144::@146 midchain
IP_LOOKUP_NEXT_MIDCHAIN.
vl_api_wireguard_peer_flags_t flags