53 #ifndef CLIB_MARCH_VARIANT 60 #define OI_DECAP 0x80000000 94 u32 classify_table_index =
96 if (classify_table_index != (
u32) ~ 0)
144 #ifndef CLIB_MARCH_VARIANT 173 sw_if_index, !is_enable, 0, 0);
206 u32 if_address_index;
207 ip6_address_fib_t ip6_af, *addr_fib = 0;
211 if (sw_if_index == 0)
219 if (address_length != 128)
221 vnm->
api_errno = VNET_API_ERROR_ADDRESS_LENGTH_MISMATCH;
224 (
"prefix length of link-local address must be 128");
236 vnm->
api_errno = VNET_API_ERROR_ADDRESS_NOT_DELETABLE;
241 vnm->
api_errno = VNET_API_ERROR_ADDRESS_NOT_FOUND_FOR_INTERFACE;
264 if (im->fib_index_by_sw_if_index[sw_if_index] ==
265 im->fib_index_by_sw_if_index[sif->sw_if_index])
267 foreach_ip_interface_address
268 (&im->lookup_main, ia, sif->sw_if_index,
272 ip_interface_address_get_address
273 (&im->lookup_main, ia);
274 if (ip6_destination_matches_route
275 (im, address, x, ia->address_length) ||
276 ip6_destination_matches_route (im,
281 vnm->api_errno = VNET_API_ERROR_DUPLICATE_IF_ADDRESS;
284 (
"failed to add %U which conflicts with %U for interface %U",
285 format_ip6_address_and_length, address,
287 format_ip6_address_and_length, x,
289 format_vnet_sw_if_index_name, vnm,
307 if (elts_before ==
pool_elts (lm->if_address_pool))
317 im, ip6_af.fib_index,
323 vec_foreach (cb, im->add_del_interface_address_callbacks)
341 u32 is_admin_up, fib_index;
347 lookup_main.if_address_pool_index_by_sw_if_index,
358 a = ip_interface_address_get_address (&im->lookup_main, ia);
360 ip6_add_interface_routes (vnm, sw_if_index,
364 ip6_del_interface_routes (im, fib_index,
365 a, ia->address_length);
378 .arc_name =
"ip6-unicast",
380 .last_in_arc =
"ip6-lookup",
386 .arc_name =
"ip6-unicast",
387 .node_name =
"ip6-flow-classify",
393 .arc_name =
"ip6-unicast",
394 .node_name =
"ip6-inacl",
400 .arc_name =
"ip6-unicast",
401 .node_name =
"ip6-policer-classify",
407 .arc_name =
"ip6-unicast",
408 .node_name =
"ipsec6-input-feature",
414 .arc_name =
"ip6-unicast",
415 .node_name =
"l2tp-decap",
421 .arc_name =
"ip6-unicast",
422 .node_name =
"vpath-input-ip6",
428 .arc_name =
"ip6-unicast",
429 .node_name =
"ip6-vxlan-bypass",
435 .arc_name =
"ip6-unicast",
436 .node_name =
"ip6-not-enabled",
442 .arc_name =
"ip6-unicast",
443 .node_name =
"ip6-lookup",
450 .arc_name =
"ip6-multicast",
452 .last_in_arc =
"ip6-mfib-forward-lookup",
457 .arc_name =
"ip6-multicast",
458 .node_name =
"vpath-input-ip6",
463 .arc_name =
"ip6-multicast",
464 .node_name =
"ip6-not-enabled",
469 .arc_name =
"ip6-multicast",
470 .node_name =
"ip6-mfib-forward-lookup",
477 .arc_name =
"ip6-output",
478 .start_nodes =
VNET_FEATURES (
"ip6-rewrite",
"ip6-midchain",
"ip6-dvr-dpo"),
479 .last_in_arc =
"interface-output",
484 .arc_name =
"ip6-output",
485 .node_name =
"ip6-outacl",
490 .arc_name =
"ip6-output",
491 .node_name =
"ipsec6-output-feature",
496 .arc_name =
"ip6-output",
497 .node_name =
"interface-output",
535 sw_if_index, is_add, 0, 0);
554 .name =
"ip6-lookup",
555 .vector_size =
sizeof (
u32),
556 .format_trace = format_ip6_lookup_trace,
567 u32 n_left_from, n_left_to_next, *from, *to_next;
573 n_left_from = frame->n_vectors;
574 next = node->cached_next_index;
576 while (n_left_from > 0)
581 while (n_left_from >= 4 && n_left_to_next >= 2)
586 u32 pi0, lbi0, hc0, pi1, lbi1, hc1;
604 pi0 = to_next[0] = from[0];
605 pi1 = to_next[1] = from[1];
679 (ip0->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS))
686 (ip1->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS))
701 to_next, n_left_to_next,
702 pi0, pi1, next0, next1);
705 while (n_left_from > 0 && n_left_to_next > 0)
756 (ip0->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS))
766 to_next, n_left_to_next,
776 return frame->n_vectors;
782 .name =
"ip6-load-balance",
783 .vector_size =
sizeof (
u32),
784 .sibling_of =
"ip6-lookup",
785 .format_trace = format_ip6_lookup_trace,
797 u8 packet_data[128 - 1 *
sizeof (
u32)];
801 #ifndef CLIB_MARCH_VARIANT 807 ip6_forward_next_trace_t *t = va_arg (*args, ip6_forward_next_trace_t *);
822 ip6_forward_next_trace_t *t = va_arg (*args, ip6_forward_next_trace_t *);
825 s =
format (s,
"fib %d dpo-idx %d flow hash: 0x%08x",
839 ip6_forward_next_trace_t *t = va_arg (*args, ip6_forward_next_trace_t *);
842 s =
format (s,
"tx_sw_if_index %d adj-idx %d : %U flow hash: 0x%08x",
853 #ifndef CLIB_MARCH_VARIANT 869 ip6_forward_next_trace_t *t0, *t1;
881 if (b0->
flags & VLIB_BUFFER_IS_TRACED)
896 if (b1->
flags & VLIB_BUFFER_IS_TRACED)
919 ip6_forward_next_trace_t *t0;
925 if (b0->
flags & VLIB_BUFFER_IS_TRACED)
951 u16 sum16, payload_length_host_byte_order;
952 u32 i, n_this_buffer, n_bytes_left;
953 u32 headers_size =
sizeof (ip0[0]);
954 void *data_this_buffer;
961 payload_length_host_byte_order = clib_net_to_host_u16 (ip0->
payload_length);
962 data_this_buffer = (
void *) (ip0 + 1);
981 ip6_hop_by_hop_ext_t *ext_hdr =
982 (ip6_hop_by_hop_ext_t *) data_this_buffer;
985 ASSERT ((ext_hdr->next_hdr == IP_PROTOCOL_ICMP6)
986 || (ext_hdr->next_hdr == IP_PROTOCOL_UDP));
988 skip_bytes = 8 * (1 + ext_hdr->n_data_u64s);
989 data_this_buffer = (
void *) ((
u8 *) data_this_buffer + skip_bytes);
991 payload_length_host_byte_order -= skip_bytes;
992 headers_size += skip_bytes;
995 n_bytes_left = n_this_buffer = payload_length_host_byte_order;
999 u32 n_ip_bytes_this_buffer =
1001 if (n_this_buffer + headers_size > n_ip_bytes_this_buffer)
1004 n_ip_bytes_this_buffer - headers_size : 0;
1011 n_bytes_left -= n_this_buffer;
1012 if (n_bytes_left == 0)
1015 if (!(p0->
flags & VLIB_BUFFER_NEXT_PRESENT))
1040 || ip0->
protocol == IP_PROTOCOL_ICMP6
1041 || ip0->
protocol == IP_PROTOCOL_UDP
1042 || ip0->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS);
1044 udp0 = (
void *) (ip0 + 1);
1047 p0->
flags |= (VNET_BUFFER_F_L4_CHECKSUM_COMPUTED
1048 | VNET_BUFFER_F_L4_CHECKSUM_CORRECT);
1054 p0->
flags |= (VNET_BUFFER_F_L4_CHECKSUM_COMPUTED
1055 | ((sum16 == 0) << VNET_BUFFER_F_LOG2_L4_CHECKSUM_CORRECT));
1089 if (proto0 != IP_PROTOCOL_UDP)
1092 proto0 = (proto0 == IP_PROTOCOL_TCP) ? proto0 : 0;
1100 .arc_name =
"ip6-local",
1111 u32 *from, n_left_from;
1114 u8 arc_index = vnet_feat_arc_ip6_local.feature_arc_index;
1128 while (n_left_from > 2)
1131 if (n_left_from >= 6)
1140 error[0] = IP6_ERROR_UNKNOWN_PROTOCOL;
1141 error[1] = IP6_ERROR_UNKNOWN_PROTOCOL;
1147 if (head_of_feature_arc)
1157 flags[0] = b[0]->
flags;
1158 flags[1] = b[1]->
flags;
1160 u32 good_l4_csum[2];
1162 flags[0] & (VNET_BUFFER_F_L4_CHECKSUM_CORRECT |
1163 VNET_BUFFER_F_OFFLOAD_TCP_CKSUM |
1164 VNET_BUFFER_F_OFFLOAD_UDP_CKSUM);
1166 flags[1] & (VNET_BUFFER_F_L4_CHECKSUM_CORRECT |
1167 VNET_BUFFER_F_OFFLOAD_TCP_CKSUM |
1168 VNET_BUFFER_F_OFFLOAD_UDP_CKSUM);
1170 u32 udp_offset[2] = { };
1176 i16 len_diff[2] = { 0 };
1184 u16 ip_len, udp_len;
1185 ip_len = clib_net_to_host_u16 (ip[0]->payload_length);
1186 udp_len = clib_net_to_host_u16 (udp->
length);
1187 len_diff[0] = ip_len - udp_len;
1196 u16 ip_len, udp_len;
1197 ip_len = clib_net_to_host_u16 (ip[1]->payload_length);
1198 udp_len = clib_net_to_host_u16 (udp->
length);
1199 len_diff[1] = ip_len - udp_len;
1211 && !(flags[0] & VNET_BUFFER_F_L4_CHECKSUM_COMPUTED);
1214 && !(flags[1] & VNET_BUFFER_F_L4_CHECKSUM_COMPUTED);
1218 good_l4_csum[0] = flags[0] & VNET_BUFFER_F_L4_CHECKSUM_CORRECT;
1223 good_l4_csum[1] = flags[1] & VNET_BUFFER_F_L4_CHECKSUM_CORRECT;
1226 error[0] = IP6_ERROR_UNKNOWN_PROTOCOL;
1227 error[0] = len_diff[0] < 0 ? IP6_ERROR_UDP_LENGTH : error[0];
1228 error[1] = IP6_ERROR_UNKNOWN_PROTOCOL;
1229 error[1] = len_diff[1] < 0 ? IP6_ERROR_UDP_LENGTH : error[1];
1232 IP6_ERROR_UDP_CHECKSUM,
1233 "Wrong IP6 errors constants");
1235 IP6_ERROR_ICMP_CHECKSUM,
1236 "Wrong IP6 errors constants");
1239 !good_l4_csum[0] ? IP6_ERROR_UDP_CHECKSUM + type[0] : error[0];
1241 !good_l4_csum[1] ? IP6_ERROR_UDP_CHECKSUM + type[1] : error[1];
1246 unroutable[0] = error[0] == IP6_ERROR_UNKNOWN_PROTOCOL
1249 unroutable[1] = error[1] == IP6_ERROR_UNKNOWN_PROTOCOL
1256 ip[0]) ? IP6_ERROR_SRC_LOOKUP_MISS
1263 ip[1]) ? IP6_ERROR_SRC_LOOKUP_MISS
1287 if (head_of_feature_arc)
1290 ip6_unknown[0] = error[0] == (
u8) IP6_ERROR_UNKNOWN_PROTOCOL;
1291 ip6_unknown[1] = error[1] == (
u8) IP6_ERROR_UNKNOWN_PROTOCOL;
1294 u32 next32 = next[0];
1302 u32 next32 = next[1];
1319 error = IP6_ERROR_UNKNOWN_PROTOCOL;
1324 if (head_of_feature_arc)
1331 flags & (VNET_BUFFER_F_L4_CHECKSUM_CORRECT |
1332 VNET_BUFFER_F_OFFLOAD_TCP_CKSUM |
1333 VNET_BUFFER_F_OFFLOAD_UDP_CKSUM);
1345 u16 ip_len, udp_len;
1347 udp_len = clib_net_to_host_u16 (udp->
length);
1348 len_diff = ip_len - udp_len;
1355 && !(flags & VNET_BUFFER_F_L4_CHECKSUM_COMPUTED);
1359 good_l4_csum = flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT;
1362 error = IP6_ERROR_UNKNOWN_PROTOCOL;
1363 error = len_diff < 0 ? IP6_ERROR_UDP_LENGTH : error;
1366 IP6_ERROR_UDP_CHECKSUM,
1367 "Wrong IP6 errors constants");
1369 IP6_ERROR_ICMP_CHECKSUM,
1370 "Wrong IP6 errors constants");
1372 error = !good_l4_csum ? IP6_ERROR_UDP_CHECKSUM + type : error;
1376 u8 unroutable = error == IP6_ERROR_UNKNOWN_PROTOCOL
1383 ip) ? IP6_ERROR_SRC_LOOKUP_MISS :
1399 if (head_of_feature_arc)
1403 u32 next32 = next[0];
1430 .name =
"ip6-local",
1431 .vector_size =
sizeof (
u32),
1454 .name =
"ip6-local-end-of-arc",
1455 .vector_size =
sizeof (
u32),
1458 .sibling_of =
"ip6-local",
1462 .arc_name =
"ip6-local",
1463 .node_name =
"ip6-local-end-of-arc",
1468 #ifdef CLIB_MARCH_VARIANT 1491 icmp6_neighbor_solicitation_header_t *
h;
1516 vnm->
api_errno = VNET_API_ERROR_NO_MATCHING_INTERFACE;
1518 (0,
"no matching interface address for destination %U (interface %U)",
1534 h->ip.dst_address.as_u8[13] = dst->
as_u8[13];
1535 h->ip.dst_address.as_u8[14] = dst->
as_u8[14];
1536 h->ip.dst_address.as_u8[15] = dst->
as_u8[15];
1538 h->ip.src_address = src[0];
1539 h->neighbor.target_address = dst[0];
1552 h->neighbor.icmp.checksum =
1554 ASSERT (bogus_length == 0);
1561 ip46_address_t nh = {
1606 #define IP6_MCAST_ADDR_MASK 0xffffffff 1610 u16 adj_packet_bytes,
bool is_locally_generated,
1613 if (adj_packet_bytes >= 1280 && packet_bytes > adj_packet_bytes)
1615 if (is_locally_generated)
1621 *error = IP6_ERROR_MTU_EXCEEDED;
1625 *error = IP6_ERROR_MTU_EXCEEDED;
1637 int do_counters,
int is_midchain,
int is_mcast,
1642 u32 n_left_from, n_left_to_next, *to_next, next_index;
1650 while (n_left_from > 0)
1654 while (n_left_from >= 4 && n_left_to_next >= 2)
1659 u32 pi0, rw_len0, next0, error0, adj_index0;
1660 u32 pi1, rw_len1, next1, error1, adj_index1;
1661 u32 tx_sw_if_index0, tx_sw_if_index1;
1662 bool is_locally_originated0, is_locally_originated1;
1681 pi0 = to_next[0] = from[0];
1682 pi1 = to_next[1] = from[1];
1687 n_left_to_next -= 2;
1698 error0 = error1 = IP6_ERROR_NONE;
1701 is_locally_originated0 =
1702 p0->
flags & VNET_BUFFER_F_LOCALLY_ORIGINATED;
1720 error0 = IP6_ERROR_TIME_EXPIRED;
1724 ICMP6_time_exceeded_ttl_exceeded_in_transit,
1730 p0->
flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED;
1732 is_locally_originated1 =
1733 p1->
flags & VNET_BUFFER_F_LOCALLY_ORIGINATED;
1751 error1 = IP6_ERROR_TIME_EXPIRED;
1755 ICMP6_time_exceeded_ttl_exceeded_in_transit,
1761 p1->
flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED;
1766 rw_len0 = adj0[0].rewrite_header.data_bytes;
1767 rw_len1 = adj1[0].rewrite_header.data_bytes;
1768 vnet_buffer (p0)->ip.save_rewrite_length = rw_len0;
1769 vnet_buffer (p1)->ip.save_rewrite_length = rw_len1;
1775 thread_index, adj_index0, 1,
1779 thread_index, adj_index1, 1,
1790 if (do_gso && (p0->
flags & VNET_BUFFER_F_GSO))
1792 if (do_gso && (p1->
flags & VNET_BUFFER_F_GSO))
1798 adj0[0].rewrite_header.max_l3_packet_bytes,
1799 is_locally_originated0, &next0, &error0);
1801 adj1[0].rewrite_header.max_l3_packet_bytes,
1802 is_locally_originated1, &next1, &error1);
1811 tx_sw_if_index0 = adj0[0].rewrite_header.sw_if_index;
1813 next0 = adj0[0].rewrite_header.next_index;
1818 tx_sw_if_index0, &next0, p0);
1829 tx_sw_if_index1 = adj1[0].rewrite_header.sw_if_index;
1831 next1 = adj1[0].rewrite_header.next_index;
1836 tx_sw_if_index1, &next1, p1);
1871 rewrite_header.dst_mcast_offset,
1876 rewrite_header.dst_mcast_offset,
1882 to_next, n_left_to_next,
1883 pi0, pi1, next0, next1);
1886 while (n_left_from > 0 && n_left_to_next > 0)
1892 u32 adj_index0, next0, error0;
1893 u32 tx_sw_if_index0;
1894 bool is_locally_originated0;
1896 pi0 = to_next[0] = from[0];
1906 error0 = IP6_ERROR_NONE;
1910 is_locally_originated0 =
1911 p0->
flags & VNET_BUFFER_F_LOCALLY_ORIGINATED;
1928 error0 = IP6_ERROR_TIME_EXPIRED;
1932 ICMP6_time_exceeded_ttl_exceeded_in_transit,
1938 p0->
flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED;
1950 rw_len0 = adj0[0].rewrite_header.data_bytes;
1951 vnet_buffer (p0)->ip.save_rewrite_length = rw_len0;
1957 thread_index, adj_index0, 1,
1965 if (do_gso && (p0->
flags & VNET_BUFFER_F_GSO))
1969 adj0[0].rewrite_header.max_l3_packet_bytes,
1970 is_locally_originated0, &next0, &error0);
1979 tx_sw_if_index0 = adj0[0].rewrite_header.sw_if_index;
1982 next0 = adj0[0].rewrite_header.next_index;
1987 tx_sw_if_index0, &next0, p0);
2004 rewrite_header.dst_mcast_offset,
2012 n_left_to_next -= 1;
2015 to_next, n_left_to_next,
2033 int do_counters,
int is_midchain,
int is_mcast)
2038 is_midchain, is_mcast,
2042 is_midchain, is_mcast,
2099 .name =
"ip6-midchain",
2100 .vector_size =
sizeof (
u32),
2102 .sibling_of =
"ip6-rewrite",
2107 .name =
"ip6-rewrite",
2108 .vector_size =
sizeof (
u32),
2120 .name =
"ip6-rewrite-bcast",
2121 .vector_size =
sizeof (
u32),
2124 .sibling_of =
"ip6-rewrite",
2129 .name =
"ip6-rewrite-mcast",
2130 .vector_size =
sizeof (
u32),
2132 .sibling_of =
"ip6-rewrite",
2138 .name =
"ip6-mcast-midchain",
2139 .vector_size =
sizeof (
u32),
2141 .sibling_of =
"ip6-rewrite",
2149 #ifndef CLIB_MARCH_VARIANT 2153 #define foreach_ip6_hop_by_hop_error \ 2154 _(PROCESSED, "pkts with ip6 hop-by-hop options") \ 2155 _(FORMAT, "incorrectly formatted hop-by-hop options") \ 2156 _(UNKNOWN_OPTION, "unknown ip6 hop-by-hop options") 2161 #define _(sym,str) IP6_HOP_BY_HOP_ERROR_##sym, 2182 #define _(sym,string) string, 2187 #ifndef CLIB_MARCH_VARIANT 2192 int total_len = va_arg (*args,
int);
2197 s =
format (s,
"IP6_HOP_BY_HOP: next protocol %d len %d total %d",
2203 while (opt0 < limit0)
2213 if (hm->
trace[type0])
2215 s = (*hm->
trace[type0]) (s, opt0);
2220 format (s,
"\n unrecognized option %d length %d", type0,
2247 s =
format (s,
"IP6_HOP_BY_HOP: next index %d len %d traced %d",
2253 while (opt0 < limit0)
2263 if (hm->
trace[type0])
2265 s = (*hm->
trace[type0]) (s, opt0);
2270 format (s,
"\n unrecognized option %d length %d", type0,
2293 while (opt0 < limit0)
2306 if ((*hm->
options[type0]) (b0, ip0, opt0) < 0)
2308 error0 = IP6_HOP_BY_HOP_ERROR_FORMAT;
2320 error0 = IP6_HOP_BY_HOP_ERROR_UNKNOWN_OPTION;
2324 error0 = IP6_HOP_BY_HOP_ERROR_UNKNOWN_OPTION;
2327 ICMP6_parameter_problem_unrecognized_option,
2328 (
u8 *) opt0 - (
u8 *) ip0);
2331 error0 = IP6_HOP_BY_HOP_ERROR_UNKNOWN_OPTION;
2336 ICMP6_parameter_problem,
2337 ICMP6_parameter_problem_unrecognized_option,
2338 (
u8 *) opt0 - (
u8 *) ip0);
2366 u32 n_left_from, *from, *to_next;
2370 n_left_from = frame->n_vectors;
2371 next_index = node->cached_next_index;
2373 while (n_left_from > 0)
2379 while (n_left_from >= 4 && n_left_to_next >= 2)
2387 u8 error0 = 0, error1 = 0;
2404 to_next[0] = bi0 = from[0];
2405 to_next[1] = bi1 = from[1];
2409 n_left_to_next -= 2;
2432 ((hbh0->
length + 1) << 3));
2435 ((hbh1->
length + 1) << 3));
2440 if ((hbh0->
length + 1) << 3 >
2443 error0 = IP6_HOP_BY_HOP_ERROR_FORMAT;
2450 if ((hbh1->
length + 1) << 3 >
2453 error1 = IP6_HOP_BY_HOP_ERROR_FORMAT;
2475 if (b0->
flags & VLIB_BUFFER_IS_TRACED)
2479 u32 trace_len = (hbh0->
length + 1) << 3;
2489 if (b1->
flags & VLIB_BUFFER_IS_TRACED)
2493 u32 trace_len = (hbh1->
length + 1) << 3;
2511 n_left_to_next, bi0, bi1, next0,
2515 while (n_left_from > 0 && n_left_to_next > 0)
2531 n_left_to_next -= 1;
2547 ((hbh0->
length + 1) << 3));
2552 if ((hbh0->
length + 1) << 3 >
2555 error0 = IP6_HOP_BY_HOP_ERROR_FORMAT;
2574 u32 trace_len = (hbh0->
length + 1) << 3;
2589 n_left_to_next, bi0, next0);
2593 return frame->n_vectors;
2599 .name =
"ip6-hop-by-hop",
2600 .sibling_of =
"ip6-lookup",
2601 .vector_size =
sizeof (
u32),
2604 .n_errors =
ARRAY_LEN (ip6_hop_by_hop_error_strings),
2622 #ifndef CLIB_MARCH_VARIANT 2646 hm->
options[option] = options;
2673 for (i = 0; i < 256; i++)
2708 for (j = 0; j < i0; j++)
2713 clib_host_to_net_u32 (
pow2_mask (i1) << (32 - i1));
2727 "ip6 FIB fwding table",
2730 "ip6 FIB non-fwding table",
2752 icmp6_neighbor_solicitation_header_t p;
2756 p.ip.ip_version_traffic_class_and_flow_label =
2757 clib_host_to_net_u32 (0x6 << 28);
2758 p.ip.payload_length =
2759 clib_host_to_net_u16 (
sizeof (p) -
2761 (icmp6_neighbor_solicitation_header_t, neighbor));
2762 p.ip.protocol = IP_PROTOCOL_ICMP6;
2763 p.ip.hop_limit = 255;
2766 p.neighbor.icmp.type = ICMP6_neighbor_solicitation;
2768 p.link_layer_option.header.type =
2769 ICMP6_NEIGHBOR_DISCOVERY_OPTION_source_link_layer_address;
2770 p.link_layer_option.header.n_data_u64s =
2771 sizeof (p.link_layer_option) /
sizeof (
u64);
2777 "ip6 neighbor discovery");
2818 .path =
"test ip6 link",
2820 .short_help =
"test ip6 link <mac-address>",
2824 #ifndef CLIB_MARCH_VARIANT 2832 if (~0 == fib_index)
2833 return VNET_API_ERROR_NO_SUCH_FIB;
2849 u32 flow_hash_config = 0;
2854 if (
unformat (input,
"table %d", &table_id))
2857 else if (unformat (input, #a)) { flow_hash_config |= v; matched=1;} 2878 clib_warning (
"BUG: illegal flow hash config 0x%x", flow_hash_config);
2963 .path =
"set ip6 flow-hash",
2965 "set ip6 flow-hash table <table-id> [src] [dst] [sport] [dport] [proto] [reverse]",
2985 ip6_local_node.index)->
3012 .path =
"show ip6 local",
3014 .short_help =
"show ip6 local",
3018 #ifndef CLIB_MARCH_VARIANT 3031 return VNET_API_ERROR_NO_MATCHING_INTERFACE;
3034 return VNET_API_ERROR_NO_SUCH_ENTRY;
3041 if (
NULL != if_addr)
3046 .fp_addr.ip6 = *if_addr,
3054 if (table_index != (
u32) ~ 0)
3085 u32 table_index = ~0;
3086 int table_index_set = 0;
3092 if (
unformat (input,
"table-index %d", &table_index))
3093 table_index_set = 1;
3101 if (table_index_set == 0)
3104 if (sw_if_index == ~0)
3114 case VNET_API_ERROR_NO_MATCHING_INTERFACE:
3117 case VNET_API_ERROR_NO_SUCH_ENTRY:
3136 .path =
"set ip6 classify",
3138 "set ip6 classify intfc <interface> table-index <classify-idx>",
3153 if (
unformat (input,
"hash-buckets %d", &tmp))
3155 else if (
unformat (input,
"heap-size %U",
static vlib_cli_command_t set_ip6_flow_hash_command
(constructor) VLIB_CLI_COMMAND (set_ip6_flow_hash_command)
u8 * format_ip6_forward_next_trace(u8 *s, va_list *args)
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
#define vnet_rewrite_one_header(rw0, p0, most_likely_size)
u16 lb_n_buckets
number of buckets in the load-balance.
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
#define HBH_OPTION_TYPE_DISCARD_UNKNOWN_ICMP
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.
static uword ip6_local_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int head_of_feature_arc)
static vlib_cli_command_t trace
(constructor) VLIB_CLI_COMMAND (trace)
static clib_error_t * ip6_sw_interface_admin_up_down(vnet_main_t *vnm, u32 sw_if_index, u32 flags)
static vlib_cli_command_t test_link_command
(constructor) VLIB_CLI_COMMAND (test_link_command)
static u8 * format_ip6_lookup_trace(u8 *s, va_list *args)
static int fib_urpf_check_size(index_t ui)
Data-Plane function to check the size of an uRPF list, (i.e.
void ip_frag_set_vnet_buffer(vlib_buffer_t *b, u16 mtu, u8 next_index, u8 flags)
struct ip_adjacency_t_::@46::@48 midchain
IP_LOOKUP_NEXT_MIDCHAIN.
format_function_t format_vlib_node_name
static u8 ip6_next_proto_is_tcp_udp(vlib_buffer_t *p0, ip6_header_t *ip0, u32 *udp_offset0)
static void vlib_increment_combined_counter(vlib_combined_counter_main_t *cm, u32 thread_index, u32 index, u64 n_packets, u64 n_bytes)
Increment a combined counter.
u32 * mfib_index_by_sw_if_index
Table index indexed by software interface.
clib_error_t * ip6_neighbor_set_link_local_address(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *address)
#define IP6_LOOKUP_NEXT_NODES
int dpo_is_adj(const dpo_id_t *dpo)
Return TRUE is the DPO is any type of adjacency.
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)
static clib_error_t * set_ip6_classify_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vnet_interface_main_t interface_main
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)
The table that stores ALL routes learned by the DP.
static void ip6_link_local_address_from_ethernet_mac_address(ip6_address_t *ip, u8 *mac)
#define foreach_ip6_hop_by_hop_error
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
static ip6_address_t * ip6_interface_address_matching_destination(ip6_main_t *im, ip6_address_t *dst, u32 sw_if_index, ip_interface_address_t **result_ia)
vlib_node_registration_t ip6_lookup_node
(constructor) VLIB_REGISTER_NODE (ip6_lookup_node)
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 clib_memcpy_fast(a, b, c)
static u8 * format_ip6_rewrite_trace(u8 *s, va_list *args)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
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.
flow_hash_config_t lb_hash_config
the hash config to use when selecting a bucket.
static const dpo_id_t * load_balance_get_fwd_bucket(const load_balance_t *lb, u16 bucket)
u8 * ip_enabled_by_sw_if_index
This packet is to be rewritten and forwarded to the next processing node.
u16 current_length
Nbytes between current data and the end of this buffer.
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
int ip6_hbh_unregister_option(u8 option)
static clib_error_t * ip6_config(vlib_main_t *vm, unformat_input_t *input)
static uword ip6_lookup_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
#define STRUCT_OFFSET_OF(t, f)
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
static clib_error_t * test_ip6_link_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static ip_csum_t ip_csum_with_carry(ip_csum_t sum, ip_csum_t x)
u32 ip6_neighbor_sw_interface_add_del(vnet_main_t *vnm, u32 sw_if_index, u32 is_add)
create and initialize router advertisement parameters with default values for this intfc ...
unformat_function_t unformat_vnet_sw_interface
vlib_node_registration_t ip6_rewrite_mcast_node
(constructor) VLIB_REGISTER_NODE (ip6_rewrite_mcast_node)
#define VLIB_NODE_FN(node)
static u32 ip6_fib_table_fwding_lookup(ip6_main_t *im, u32 fib_index, const ip6_address_t *dst)
vlib_error_t * errors
Vector of errors for this node.
static char * ip6_hop_by_hop_error_strings[]
static uword vlib_buffer_length_in_chain(vlib_main_t *vm, vlib_buffer_t *b)
Get length in bytes of the buffer chain.
u8 mcast_feature_arc_index
Feature arc indices.
format_function_t format_vnet_sw_if_index_name
static uword vlib_node_add_next(vlib_main_t *vm, uword node, uword next_node)
ip_lookup_next_t
An adjacency is a representation of an attached L3 peer.
uword as_uword[16/sizeof(uword)]
VNET_SW_INTERFACE_ADD_DEL_FUNCTION(ip6_sw_interface_add_del)
static pg_node_t * pg_get_node(uword node_index)
VNET_FEATURE_ARC_INIT(ip6_unicast, static)
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.
vlib_packet_template_t discover_neighbor_packet_template
u32 ip6_tcp_udp_icmp_validate_checksum(vlib_main_t *vm, vlib_buffer_t *p0)
u8 output_feature_arc_index
static ip_adjacency_t * adj_get(adj_index_t adj_index)
Get a pointer to an adjacency object from its index.
static u8 * format_ip6_hop_by_hop_trace(u8 *s, va_list *args)
u8 * format_ethernet_address(u8 *s, va_list *args)
clib_bihash_24_8_t ip6_hash
void * vlib_packet_template_get_packet(vlib_main_t *vm, vlib_packet_template_t *t, u32 *bi_result)
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
#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...
static clib_error_t * show_ip6_local_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define VLIB_INIT_FUNCTION(x)
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.
static uword pow2_mask(uword x)
u16 lb_n_buckets_minus_1
number of buckets in the load-balance - 1.
vlib_node_registration_t ip6_mcast_midchain_node
(constructor) VLIB_REGISTER_NODE (ip6_mcast_midchain_node)
static clib_error_t * set_ip6_flow_hash_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static_always_inline void calc_checksums(vlib_main_t *vm, vlib_buffer_t *b)
#define vlib_prefetch_buffer_header(b, type)
Prefetch buffer metadata.
#define IP6_FIB_DEFAULT_HASH_NUM_BUCKETS
Aggregrate type for a prefix.
vlib_frame_t * vlib_get_frame_to_node(vlib_main_t *vm, u32 to_node_index)
#define clib_error_return(e, args...)
void adj_unlock(adj_index_t adj_index)
Release a reference counting lock on the adjacency.
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, int do_gso)
#define clib_error_create(args...)
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.
#define vlib_call_init_function(vm, x)
static clib_error_t * ip6_sw_interface_add_del(vnet_main_t *vnm, u32 sw_if_index, u32 is_add)
u8 * format_ip6_hop_by_hop_ext_hdr(u8 *s, va_list *args)
static clib_error_t * vnet_feature_init(vlib_main_t *vm)
void icmp6_error_set_vnet_buffer(vlib_buffer_t *b, u8 type, u8 code, u32 data)
u32 lookup_table_nbuckets
vlib_error_t error
Error code for buffers to be enqueued to error handler.
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...
static vlib_cli_command_t show_ip6_local
(constructor) VLIB_CLI_COMMAND (show_ip6_local)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
vlib_node_registration_t ip6_rewrite_bcast_node
(constructor) VLIB_REGISTER_NODE (ip6_rewrite_bcast_node)
void vlib_packet_template_init(vlib_main_t *vm, vlib_packet_template_t *t, void *packet_data, uword n_packet_data_bytes, uword min_n_buffers_each_alloc, char *fmt,...)
u32 * classify_table_index_by_sw_if_index
First table index to use for this interface, ~0 => none.
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)
static void ip6_del_interface_routes(ip6_main_t *im, u32 fib_index, ip6_address_t *address, u32 address_length)
static const dpo_id_t * load_balance_get_bucket_i(const load_balance_t *lb, u32 bucket)
vlib_node_registration_t ip6_input_node
(constructor) VLIB_REGISTER_NODE (ip6_input_node)
#define IP6_FIB_DEFAULT_HASH_MEMORY_SIZE
void vlib_put_frame_to_node(vlib_main_t *vm, u32 to_node_index, vlib_frame_t *f)
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
int vnet_set_ip6_flow_hash(u32 table_id, u32 flow_hash_config)
static u32 ip6_compute_flow_hash(const ip6_header_t *ip, flow_hash_config_t flow_hash_config)
u8 local_next_by_ip_protocol[256]
Table mapping ip protocol to ip[46]-local node next index.
vnet_sw_interface_flags_t flags
static clib_error_t * ip6_hop_by_hop_init(vlib_main_t *vm)
vl_api_address_union_t src_address
void vnet_sw_interface_update_unnumbered(u32 unnumbered_sw_if_index, u32 ip_sw_if_index, u8 enable)
load_balance_main_t load_balance_main
The one instance of load-balance main.
#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.
#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.
VNET_FEATURE_INIT(ip6_flow_classify, static)
#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).
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))
vlib_combined_counter_main_t adjacency_counters
Adjacency packet counters.
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)
u8 packet_data[128 - 1 *sizeof(u32)]
ip6_address_t fib_masks[129]
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 VLIB_EARLY_CONFIG_FUNCTION(x, n,...)
Adjacency to drop this packet.
#define VLIB_REGISTER_NODE(x,...)
#define CLIB_PREFETCH(addr, size, type)
ip6_address_t * ip6_interface_first_address(ip6_main_t *im, u32 sw_if_index)
get first IPv6 interface address
static_always_inline void vlib_buffer_enqueue_to_next(vlib_main_t *vm, vlib_node_runtime_t *node, u32 *buffers, u16 *nexts, uword count)
#define vec_free(V)
Free vector's memory (no header).
vlib_node_registration_t ip6_local_node
(constructor) VLIB_REGISTER_NODE (ip6_local_node)
void fib_table_entry_delete(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Delete a FIB entry.
void fib_table_set_flow_hash_config(u32 fib_index, fib_protocol_t proto, flow_hash_config_t hash_config)
Set the flow hash configured used by the table.
vlib_node_registration_t ip6_midchain_node
(constructor) VLIB_REGISTER_NODE (ip6_midchain_node)
static ip_csum_t ip_incremental_checksum(ip_csum_t sum, void *_data, uword n_bytes)
#define clib_warning(format, args...)
static vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
Get node runtime by node index.
This table stores the routes that are used to forward traffic.
unformat_function_t * unformat_edit
#define vlib_prefetch_buffer_data(b, type)
void ip_lookup_init(ip_lookup_main_t *lm, u32 is_ip6)
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
u32 adj_index_t
An index for adjacencies.
void vlib_put_next_frame(vlib_main_t *vm, vlib_node_runtime_t *r, u32 next_index, u32 n_vectors_left)
Release pointer to next frame vector 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.
vlib_combined_counter_main_t lbm_via_counters
u8 builtin_protocol_by_ip_protocol[256]
IP_BUILTIN_PROTOCOL_{TCP,UDP,ICMP,OTHER} by protocol in IP header.
#define VLIB_CLI_COMMAND(x,...)
struct _vnet_classify_main vnet_classify_main_t
#define foreach_flow_hash_bit
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...
ip6_add_del_interface_address_function_t * function
u16 cached_next_index
Next frame index that vector arguments were last enqueued to last time this node ran.
void ip6_register_protocol(u32 protocol, u32 node_index)
uword unformat_ethernet_address(unformat_input_t *input, va_list *args)
index_t lb_urpf
This is the index of the uRPF list for this LB.
clib_error_t * ip6_probe_neighbor(vlib_main_t *vm, ip6_address_t *dst, u32 sw_if_index, u8 refresh)
u8 pre_data[VLIB_BUFFER_PRE_DATA_SIZE]
Space for inserting data before buffer start.
VNET_SW_INTERFACE_ADMIN_UP_DOWN_FUNCTION(ip6_sw_interface_admin_up_down)
ip6_hop_by_hop_main_t ip6_hop_by_hop_main
ip_lookup_main_t lookup_main
void ip6_hbh_set_next_override(uword next)
vlib_node_registration_t ip6_local_end_of_arc_node
(constructor) VLIB_REGISTER_NODE (ip6_local_end_of_arc_node)
static load_balance_t * load_balance_get(index_t lbi)
The default route source.
static void ip6_addr_fib_init(ip6_address_fib_t *addr_fib, const ip6_address_t *address, u32 fib_index)
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.
vlib_node_registration_t ip6_hop_by_hop_node
(constructor) VLIB_REGISTER_NODE (ip6_hop_by_hop_node)
static void ip6_mtu_check(vlib_buffer_t *b, u16 packet_bytes, u16 adj_packet_bytes, bool is_locally_generated, u32 *next, u32 *error)
#define HBH_OPTION_TYPE_DISCARD_UNKNOWN_ICMP_NOT_MCAST
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
vnet_classify_main_t vnet_classify_main
int vnet_set_ip6_classify_intfc(vlib_main_t *vm, u32 sw_if_index, u32 table_index)
static uword ip6_address_is_link_local_unicast(const ip6_address_t *a)
#define clib_mem_unaligned(pointer, type)
static uword ip6_address_is_equal(const ip6_address_t *a, const ip6_address_t *b)
Route added as a result of interface configuration.
static uword ip6_address_is_multicast(const ip6_address_t *a)
ip6_fib_table_instance_t ip6_table[IP6_FIB_NUM_TABLES]
The two FIB tables; fwding and non-fwding.
#define VNET_FEATURES(...)
static int ip6_locate_header(vlib_buffer_t *p0, ip6_header_t *ip0, int find_hdr_type, u32 *offset)
static vlib_main_t * vlib_get_main(void)
vlib_node_registration_t ip6_rewrite_node
(constructor) VLIB_REGISTER_NODE (ip6_rewrite_node)
static void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
#define vec_elt(v, i)
Get vector value at index i.
ip6_address_t ip6_neighbor_get_link_local_address(u32 sw_if_index)
struct _vlib_node_registration vlib_node_registration_t
u8 ucast_feature_arc_index
This packets needs to go to ICMP error.
void ip6_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
static void vnet_ip_mcast_fixup_header(u32 dst_mcast_mask, u32 dst_mcast_offset, u32 *addr, u8 *packet0)
#define HBH_OPTION_TYPE_DISCARD_UNKNOWN
index_t dpoi_index
the index of objects of that type
union ip_adjacency_t_::@46 sub_type
static void ip6_set_solicited_node_multicast_address(ip6_address_t *a, u32 id)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static void ip6_ethernet_mac_address_from_link_local_address(u8 *mac, ip6_address_t *ip)
ip_lookup_next_t lookup_next_index
Next hop after ip4-lookup.
u32 next_buffer
Next buffer for this linked-list of buffers.
#define STATIC_ASSERT(truth,...)
static uword max_log2(uword x)
#define IP6_MCAST_ADDR_MASK
This bits of an IPv6 address to mask to construct a multicast MAC address.
VLIB buffer representation.
vnet_sw_interface_t * sw_interfaces
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
adj_index_t adj_glean_add_or_lock(fib_protocol_t proto, vnet_link_t linkt, u32 sw_if_index, const ip46_address_t *nh_addr)
Glean Adjacency.
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)
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)
A collection of combined counters.
u16 ip6_tcp_udp_icmp_compute_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip6_header_t *ip0, int *bogus_lengthp)
static vlib_cli_command_t set_ip6_classify_command
(constructor) VLIB_CLI_COMMAND (set_ip6_classify_command)
ip6_mfib_table_instance_t ip6_mtable
the single MFIB table
u8 *(* trace[256])(u8 *s, ip6_hop_by_hop_option_t *opt)
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.
static vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
Get vlib node by index.
#define HBH_OPTION_TYPE_SKIP_UNKNOWN
adj_index_t adj_nbr_add_or_lock(fib_protocol_t nh_proto, vnet_link_t link_type, const ip46_address_t *nh_addr, u32 sw_if_index)
Neighbour Adjacency sub-type.
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
#define vec_foreach(var, vec)
Vector iterator.
u16 flags
Copy of main node flags.
u16 dpoi_next_node
The next VLIB node to follow.
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
static u32 ip6_lookup(gid_ip6_table_t *db, u32 vni, ip_prefix_t *key)
int(* options[256])(vlib_buffer_t *b, ip6_header_t *ip, ip6_hop_by_hop_option_t *opt)
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)
static_always_inline void vlib_get_buffers(vlib_main_t *vm, u32 *bi, vlib_buffer_t **b, int count)
Translate array of buffer indices into buffer pointers.
#define VLIB_NODE_FLAG_TRACE
static clib_error_t * ip6_lookup_init(vlib_main_t *vm)
#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)
#define vnet_rewrite_two_headers(rw0, rw1, p0, p1, most_likely_size)
#define CLIB_CACHE_LINE_BYTES
vlib_node_registration_t ip6_load_balance_node
(constructor) VLIB_REGISTER_NODE (ip6_load_balance_node)
This adjacency/interface has output features configured.
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
u32 * fib_index_by_sw_if_index
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
#define HBH_OPTION_TYPE_HIGH_ORDER_BITS
static u16 ip_csum_fold(ip_csum_t c)
static int adj_are_counters_enabled(void)
Get the global configuration option for enabling per-adj counters.
clib_bihash_40_8_t ip6_mhash
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_always_inline void vnet_feature_arc_start(u8 arc, u32 sw_if_index, u32 *next0, vlib_buffer_t *b0)
static uword pool_elts(void *v)
Number of active elements in a pool.