71 int lookup_for_responses_to_locally_received_packets)
75 u32 n_left_from, n_left_to_next, *from, *to_next;
83 while (n_left_from > 0)
87 while (n_left_from >= 8 && n_left_to_next >= 4)
91 __attribute__ ((unused))
tcp_header_t *tcp0, *tcp1, *tcp2, *tcp3;
97 __attribute__ ((unused))
u32 pi0, fib_index0, lb_index0,
99 __attribute__ ((unused))
u32 pi1, fib_index1, lb_index1,
101 __attribute__ ((unused))
u32 pi2, fib_index2, lb_index2,
103 __attribute__ ((unused))
u32 pi3, fib_index3, lb_index3,
107 u32 hash_c0, hash_c1, hash_c2, hash_c3;
108 const dpo_id_t *dpo0, *dpo1, *dpo2, *dpo3;
130 pi0 = to_next[0] = from[0];
131 pi1 = to_next[1] = from[1];
132 pi2 = to_next[2] = from[2];
133 pi3 = to_next[3] = from[3];
181 if (!lookup_for_responses_to_locally_received_packets)
196 tcp0 = (
void *) (ip0 + 1);
197 tcp1 = (
void *) (ip1 + 1);
198 tcp2 = (
void *) (ip2 + 1);
199 tcp3 = (
void *) (ip3 + 1);
201 is_tcp_udp0 = (ip0->
protocol == IP_PROTOCOL_TCP
202 || ip0->
protocol == IP_PROTOCOL_UDP);
203 is_tcp_udp1 = (ip1->
protocol == IP_PROTOCOL_TCP
204 || ip1->
protocol == IP_PROTOCOL_UDP);
205 is_tcp_udp2 = (ip2->
protocol == IP_PROTOCOL_TCP
206 || ip2->
protocol == IP_PROTOCOL_UDP);
207 is_tcp_udp3 = (ip1->
protocol == IP_PROTOCOL_TCP
208 || ip1->
protocol == IP_PROTOCOL_UDP);
210 if (!lookup_for_responses_to_locally_received_packets)
218 if (!lookup_for_responses_to_locally_received_packets)
226 if (!lookup_for_responses_to_locally_received_packets)
234 if (lookup_for_responses_to_locally_received_packets)
329 (cm, cpu_index, lb_index0, 1,
333 (cm, cpu_index, lb_index1, 1,
337 (cm, cpu_index, lb_index2, 1,
341 (cm, cpu_index, lb_index3, 1,
346 to_next, n_left_to_next,
348 next0, next1, next2, next3);
351 while (n_left_from > 0 && n_left_to_next > 0)
361 __attribute__ ((unused))
u32 pi0, fib_index0, is_tcp_udp0, lbi0;
382 if (!lookup_for_responses_to_locally_received_packets)
391 tcp0 = (
void *) (ip0 + 1);
393 is_tcp_udp0 = (ip0->
protocol == IP_PROTOCOL_TCP
394 || ip0->
protocol == IP_PROTOCOL_UDP);
396 if (!lookup_for_responses_to_locally_received_packets)
399 if (!lookup_for_responses_to_locally_received_packets)
402 if (!lookup_for_responses_to_locally_received_packets)
405 if (lookup_for_responses_to_locally_received_packets)
513 .function =
ip4_lookup,.name =
"ip4-lookup",.vector_size =
524 u32 n_left_from, n_left_to_next, *from, *to_next;
535 while (n_left_from > 0)
540 while (n_left_from >= 4 && n_left_to_next >= 2)
545 u32 pi0, lbi0, hc0, pi1, lbi1, hc1;
563 pi0 = to_next[0] = from[0];
564 pi1 = to_next[1] = from[1];
637 to_next, n_left_to_next,
638 pi0, pi1, next0, next1);
641 while (n_left_from > 0 && n_left_to_next > 0)
690 to_next, n_left_to_next,
703 sizeof (
u32),.sibling_of =
"ip4-lookup",.format_trace =
728 *result_ia = result ? ia : 0;
742 .fp_addr.ip4 = *address,
762 u32 classify_table_index =
764 if (classify_table_index != (
u32) ~ 0)
794 .fp_addr.ip4 = *address,
839 u32 address_length,
u32 is_del)
845 u32 if_address_index, elts_before;
868 ip_interface_address_get_address
869 (&im->lookup_main, ia);
870 if (ip4_destination_matches_route
871 (im, address, x, ia->address_length)
873 ip4_destination_matches_route (im,
879 (
"failed to add %U which conflicts with %U for interface %U",
880 format_ip4_address_and_length, address,
882 format_ip4_address_and_length, x,
884 format_vnet_sw_if_index_name, vnm,
892 (lm, sw_if_index, addr_fib, address_length, is_del, &if_address_index);
912 address, address_length, if_address_index, is_del);
926 (vm, sw_if_index, address, address_length, is_del);
933 .arc_name =
"ip4-unicast",
934 .start_nodes =
VNET_FEATURES (
"ip4-input",
"ip4-input-no-checksum"),
935 .end_node =
"ip4-lookup",
941 .arc_name =
"ip4-unicast",
942 .node_name =
"ip4-flow-classify",
948 .arc_name =
"ip4-unicast",
949 .node_name =
"ip4-inacl",
955 .arc_name =
"ip4-unicast",
956 .node_name =
"ip4-source-check-via-rx",
962 .arc_name =
"ip4-unicast",
963 .node_name =
"ip4-source-check-via-any",
969 .arc_name =
"ip4-unicast",
970 .node_name =
"ip4-source-and-port-range-check-rx",
976 .arc_name =
"ip4-unicast",
977 .node_name =
"ip4-policer-classify",
983 .arc_name =
"ip4-unicast",
984 .node_name =
"ipsec-input-ip4",
990 .arc_name =
"ip4-unicast",
991 .node_name =
"vpath-input-ip4",
997 .arc_name =
"ip4-unicast",
998 .node_name =
"ip4-vxlan-bypass",
1004 .arc_name =
"ip4-unicast",
1005 .node_name =
"ip4-lookup",
1011 .arc_name =
"ip4-unicast",
1012 .node_name =
"ip4-drop",
1020 .arc_name =
"ip4-multicast",
1021 .start_nodes =
VNET_FEATURES (
"ip4-input",
"ip4-input-no-checksum"),
1022 .end_node =
"ip4-lookup-multicast",
1028 .arc_name =
"ip4-multicast",
1029 .node_name =
"vpath-input-ip4",
1035 .arc_name =
"ip4-multicast",
1036 .node_name =
"ip4-lookup-multicast",
1042 .arc_name =
"ip4-multicast",
1043 .node_name =
"ip4-drop",
1050 .arc_name =
"ip4-output",
1051 .start_nodes =
VNET_FEATURES (
"ip4-rewrite",
"ip4-midchain"),
1052 .end_node =
"interface-output",
1058 .arc_name =
"ip4-output",
1059 .node_name =
"ip4-source-and-port-range-check-tx",
1065 .arc_name =
"ip4-output",
1066 .node_name =
"ipsec-output-ip4",
1073 .arc_name =
"ip4-output",
1074 .node_name =
"interface-output",
1136 memset (&h, 0,
sizeof (h));
1142 #define _16(f,v) h.f = clib_host_to_net_u16 (v); 1143 #define _8(f,v) h.f = v; 1144 _16 (l2_type, ETHERNET_ARP_HARDWARE_TYPE_ethernet);
1145 _16 (l3_type, ETHERNET_TYPE_IP4);
1146 _8 (n_l2_address_bytes, 6);
1147 _8 (n_l3_address_bytes, 4);
1148 _16 (opcode, ETHERNET_ARP_OPCODE_request);
1197 s =
format (s,
"fib %d dpo-idx %d flow hash: 0x%08x",
1214 s =
format (s,
"tx_sw_if_index %d dpo-idx %d : %U flow hash: 0x%08x",
1346 .function =
ip4_drop,.name =
"ip4-drop",.vector_size =
1350 [0] =
"error-drop",}
1357 .function =
ip4_punt,.name =
"ip4-punt",.vector_size =
1361 [0] =
"error-punt",}
1372 u32 ip_header_length, payload_length_host_byte_order;
1373 u32 n_this_buffer, n_bytes_left;
1375 void *data_this_buffer;
1379 payload_length_host_byte_order =
1380 clib_net_to_host_u16 (ip0->
length) - ip_header_length;
1382 clib_host_to_net_u32 (payload_length_host_byte_order +
1398 n_bytes_left = n_this_buffer = payload_length_host_byte_order;
1399 data_this_buffer = (
void *) ip0 + ip_header_length;
1407 n_bytes_left -= n_this_buffer;
1408 if (n_bytes_left == 0)
1430 || ip0->
protocol == IP_PROTOCOL_UDP);
1432 udp0 = (
void *) (ip0 + 1);
1454 u32 *from, *to_next, n_left_from, n_left_to_next;
1465 while (n_left_from > 0)
1469 while (n_left_from >= 4 && n_left_to_next >= 2)
1478 u32 pi0, ip_len0, udp_len0, flags0, next0, fib_index0, lbi0;
1479 u32 pi1, ip_len1, udp_len1, flags1, next1, fib_index1, lbi1;
1480 i32 len_diff0, len_diff1;
1481 u8 error0, is_udp0, is_tcp_udp0, good_tcp_udp0, proto0;
1482 u8 error1, is_udp1, is_tcp_udp1, good_tcp_udp1, proto1;
1485 pi0 = to_next[0] = from[0];
1486 pi1 = to_next[1] = from[1];
1490 n_left_to_next -= 2;
1525 is_udp0 = proto0 == IP_PROTOCOL_UDP;
1526 is_udp1 = proto1 == IP_PROTOCOL_UDP;
1527 is_tcp_udp0 = is_udp0 || proto0 == IP_PROTOCOL_TCP;
1528 is_tcp_udp1 = is_udp1 || proto1 == IP_PROTOCOL_TCP;
1540 good_tcp_udp0 |= is_udp0 && udp0->
checksum == 0;
1541 good_tcp_udp1 |= is_udp1 && udp1->
checksum == 0;
1549 ip_len0 = clib_net_to_host_u16 (ip0->
length);
1550 ip_len1 = clib_net_to_host_u16 (ip1->
length);
1551 udp_len0 = clib_net_to_host_u16 (udp0->
length);
1552 udp_len1 = clib_net_to_host_u16 (udp1->
length);
1554 len_diff0 = ip_len0 - udp_len0;
1555 len_diff1 = ip_len1 - udp_len1;
1557 len_diff0 = is_udp0 ? len_diff0 : 0;
1558 len_diff1 = is_udp1 ? len_diff1 : 0;
1561 & good_tcp_udp0 & good_tcp_udp1)))
1570 good_tcp_udp0 |= is_udp0 && udp0->
checksum == 0;
1579 good_tcp_udp1 |= is_udp1 && udp1->
checksum == 0;
1583 good_tcp_udp0 &= len_diff0 >= 0;
1584 good_tcp_udp1 &= len_diff1 >= 0;
1591 error0 = error1 = IP4_ERROR_UNKNOWN_PROTOCOL;
1593 error0 = len_diff0 < 0 ? IP4_ERROR_UDP_LENGTH : error0;
1594 error1 = len_diff1 < 0 ? IP4_ERROR_UDP_LENGTH : error1;
1596 ASSERT (IP4_ERROR_TCP_CHECKSUM + 1 == IP4_ERROR_UDP_CHECKSUM);
1597 error0 = (is_tcp_udp0 && !good_tcp_udp0
1598 ? IP4_ERROR_TCP_CHECKSUM + is_udp0 : error0);
1599 error1 = (is_tcp_udp1 && !good_tcp_udp1
1600 ? IP4_ERROR_TCP_CHECKSUM + is_udp1 : error1);
1636 error0 = ((error0 == IP4_ERROR_UNKNOWN_PROTOCOL &&
1638 IP4_ERROR_SPOOFED_LOCAL_PACKETS : error0);
1639 error0 = ((error0 == IP4_ERROR_UNKNOWN_PROTOCOL &&
1642 ? IP4_ERROR_SRC_LOOKUP_MISS : error0);
1643 error1 = ((error1 == IP4_ERROR_UNKNOWN_PROTOCOL &&
1645 IP4_ERROR_SPOOFED_LOCAL_PACKETS : error1);
1646 error1 = ((error1 == IP4_ERROR_UNKNOWN_PROTOCOL &&
1649 ? IP4_ERROR_SRC_LOOKUP_MISS : error1);
1659 p0->
error = error0 ? error_node->
errors[error0] : 0;
1660 p1->
error = error1 ? error_node->
errors[error1] : 0;
1662 enqueue_code = (next0 != next_index) + 2 * (next1 != next_index);
1666 switch (enqueue_code)
1672 n_left_to_next += 1;
1679 n_left_to_next += 1;
1686 n_left_to_next += 2;
1702 while (n_left_from > 0 && n_left_to_next > 0)
1709 u32 pi0, next0, ip_len0, udp_len0, flags0, fib_index0, lbi0;
1711 u8 error0, is_udp0, is_tcp_udp0, good_tcp_udp0, proto0;
1715 pi0 = to_next[0] = from[0];
1719 n_left_to_next -= 1;
1742 is_udp0 = proto0 == IP_PROTOCOL_UDP;
1743 is_tcp_udp0 = is_udp0 || proto0 == IP_PROTOCOL_TCP;
1752 good_tcp_udp0 |= is_udp0 && udp0->
checksum == 0;
1758 ip_len0 = clib_net_to_host_u16 (ip0->
length);
1759 udp_len0 = clib_net_to_host_u16 (udp0->
length);
1761 len_diff0 = ip_len0 - udp_len0;
1763 len_diff0 = is_udp0 ? len_diff0 : 0;
1774 good_tcp_udp0 |= is_udp0 && udp0->
checksum == 0;
1778 good_tcp_udp0 &= len_diff0 >= 0;
1783 error0 = IP4_ERROR_UNKNOWN_PROTOCOL;
1785 error0 = len_diff0 < 0 ? IP4_ERROR_UDP_LENGTH : error0;
1787 ASSERT (IP4_ERROR_TCP_CHECKSUM + 1 == IP4_ERROR_UDP_CHECKSUM);
1788 error0 = (is_tcp_udp0 && !good_tcp_udp0
1789 ? IP4_ERROR_TCP_CHECKSUM + is_udp0 : error0);
1806 error0 = ((error0 == IP4_ERROR_UNKNOWN_PROTOCOL &&
1808 IP4_ERROR_SPOOFED_LOCAL_PACKETS : error0);
1809 error0 = ((error0 == IP4_ERROR_UNKNOWN_PROTOCOL &&
1812 ? IP4_ERROR_SRC_LOOKUP_MISS : error0);
1819 p0->
error = error0 ? error_node->
errors[error0] : 0;
1823 n_left_to_next += 1;
1831 n_left_to_next -= 1;
1843 .function =
ip4_local,.name =
"ip4-local",.vector_size =
1901 .path =
"show ip local",
1903 .short_help =
"show ip local",
1915 u32 *from, *to_next_drop;
1916 uword n_left_from, n_left_to_next_drop, next_index;
1917 static f64 time_last_seed_change = -1e100;
1918 static u32 hash_seeds[3];
1926 if (time_now - time_last_seed_change > 1e-3)
1930 sizeof (hash_seeds));
1931 for (i = 0; i <
ARRAY_LEN (hash_seeds); i++)
1932 hash_seeds[i] = r[i];
1935 for (i = 0; i <
ARRAY_LEN (hash_bitmap); i++)
1938 time_last_seed_change = time_now;
1947 while (n_left_from > 0)
1950 to_next_drop, n_left_to_next_drop);
1952 while (n_left_from > 0 && n_left_to_next_drop > 0)
1954 u32 pi0, adj_index0, a0, b0, c0, m0, sw_if_index0, drop0;
1972 sw_if_index0 = adj0->rewrite_header.sw_if_index;
1991 c0 &=
BITS (hash_bitmap) - 1;
1995 bm0 = hash_bitmap[c0];
1996 drop0 = (bm0 & m0) != 0;
1999 hash_bitmap[c0] = bm0 | m0;
2003 to_next_drop[0] = pi0;
2005 n_left_to_next_drop -= 1;
2070 ip4_over_ethernet[0].ip4))
2092 adj0->rewrite_header.next_index,
2126 .function =
ip4_arp,.name =
"ip4-arp",.vector_size =
2136 .function =
ip4_glean,.name =
"ip4-glean",.vector_size =
2144 #define foreach_notrace_ip4_arp_error \ 2157 vnet_pcap_drop_trace_filter_add_del \ 2158 (rt->errors[IP4_ARP_ERROR_##a], \ 2197 vnm->
api_errno = VNET_API_ERROR_NO_MATCHING_INTERFACE;
2199 (0,
"no matching interface address for destination %U (interface %U)",
2250 u32 n_left_from, n_left_to_next, *to_next, next_index;
2258 while (n_left_from > 0)
2262 while (n_left_from >= 4 && n_left_to_next >= 2)
2267 u32 pi0, rw_len0, next0, error0, checksum0, adj_index0;
2268 u32 pi1, rw_len1, next1, error1, checksum1, adj_index1;
2269 u32 tx_sw_if_index0, tx_sw_if_index1;
2285 pi0 = to_next[0] = from[0];
2286 pi1 = to_next[1] = from[1];
2291 n_left_to_next -= 2;
2300 ASSERT (adj_index0 && adj_index1);
2305 error0 = error1 = IP4_ERROR_NONE;
2317 checksum0 = ip0->
checksum + clib_host_to_net_u16 (0x0100);
2318 checksum0 += checksum0 >= 0xffff;
2330 error0 = IP4_ERROR_TIME_EXPIRED;
2333 ICMP4_time_exceeded_ttl_exceeded_in_transit,
2352 checksum1 = ip1->
checksum + clib_host_to_net_u16 (0x0100);
2353 checksum1 += checksum1 >= 0xffff;
2365 error1 = IP4_ERROR_TIME_EXPIRED;
2368 ICMP4_time_exceeded_ttl_exceeded_in_transit,
2387 rw_len0 = adj0[0].rewrite_header.data_bytes;
2388 rw_len1 = adj1[0].rewrite_header.data_bytes;
2389 vnet_buffer (p0)->ip.save_rewrite_length = rw_len0;
2390 vnet_buffer (p1)->ip.save_rewrite_length = rw_len1;
2396 rewrite_header.max_l3_packet_bytes ? IP4_ERROR_MTU_EXCEEDED :
2401 rewrite_header.max_l3_packet_bytes ? IP4_ERROR_MTU_EXCEEDED :
2423 next0 = adj0[0].rewrite_header.next_index;
2426 tx_sw_if_index0 = adj0[0].rewrite_header.sw_if_index;
2430 tx_sw_if_index0, &next0, p0);
2434 next1 = adj1[0].rewrite_header.next_index;
2438 tx_sw_if_index1 = adj1[0].rewrite_header.sw_if_index;
2442 tx_sw_if_index1, &next1, p1);
2456 to_next, n_left_to_next,
2457 pi0, pi1, next0, next1);
2460 while (n_left_from > 0 && n_left_to_next > 0)
2465 u32 pi0, rw_len0, adj_index0, next0, error0, checksum0;
2466 u32 tx_sw_if_index0;
2468 pi0 = to_next[0] = from[0];
2481 error0 = IP4_ERROR_NONE;
2489 checksum0 = ip0->
checksum + clib_host_to_net_u16 (0x0100);
2491 checksum0 += checksum0 >= 0xffff;
2509 error0 = IP4_ERROR_TIME_EXPIRED;
2513 ICMP4_time_exceeded_ttl_exceeded_in_transit,
2526 rw_len0 = adj0[0].rewrite_header.data_bytes;
2527 vnet_buffer (p0)->ip.save_rewrite_length = rw_len0;
2537 > adj0[0].rewrite_header.max_l3_packet_bytes
2538 ? IP4_ERROR_MTU_EXCEEDED : error0);
2548 tx_sw_if_index0 = adj0[0].rewrite_header.sw_if_index;
2551 next0 = adj0[0].rewrite_header.next_index;
2559 tx_sw_if_index0, &next0, p0);
2566 n_left_to_next -= 1;
2569 to_next, n_left_to_next,
2632 .function =
ip4_rewrite,.name =
"ip4-rewrite",.vector_size =
2644 .function =
ip4_midchain,.name =
"ip4-midchain",.vector_size =
2656 u32 sw_if_index, table_id;
2667 if (
unformat (input,
"%d", &table_id))
2719 .path =
"set interface ip table",
2721 .short_help =
"set interface ip table <interface> <table-id>",
2732 u32 n_left_from, n_left_to_next, *from, *to_next;
2740 while (n_left_from > 0)
2744 while (n_left_from >= 4 && n_left_to_next >= 2)
2747 u32 pi0, pi1, lb_index0, lb_index1, wrong_next;
2750 u32 fib_index0, fib_index1;
2768 pi0 = to_next[0] = from[0];
2769 pi1 = to_next[1] = from[1];
2823 (cm, cpu_index, lb_index0, 1,
2827 (cm, cpu_index, lb_index1, 1,
2832 n_left_to_next -= 2;
2835 wrong_next = (next0 != next) + 2 * (next1 != next);
2844 n_left_to_next += 1;
2851 n_left_to_next += 1;
2858 n_left_to_next += 2;
2873 while (n_left_from > 0 && n_left_to_next > 0)
2915 (cm, cpu_index, lb_index0, 1,
2920 n_left_to_next -= 1;
2925 n_left_to_next += 1;
2931 n_left_to_next -= 1;
2947 "ip4-lookup-multicast",.vector_size =
sizeof (
u32),.sibling_of =
2955 .function =
ip4_drop,.name =
"ip4-multicast",.vector_size =
2959 [0] =
"error-drop",}
2999 if (
unformat (input,
"table %d", &table_id))
3003 if ((fib) && (fib->
index != table_id))
3007 else if (
unformat (input,
"count %f", &count))
3020 for (i = 0; i < n; i++)
3025 ip4_base_address.
as_u32 =
3026 clib_host_to_net_u32 (1 +
3027 clib_net_to_host_u32 (ip4_base_address.
as_u32));
3058 .path =
"test lookup",
3059 .short_help =
"test lookup <ipv4-addr> [table <fib-id>] [count <nn>]",
3072 return VNET_API_ERROR_NO_SUCH_FIB;
3087 u32 flow_hash_config = 0;
3092 if (
unformat (input,
"table %d", &table_id))
3095 else if (unformat (input, #a)) { flow_hash_config |= v; matched=1;} 3112 case VNET_API_ERROR_NO_SUCH_FIB:
3116 clib_warning (
"BUG: illegal flow hash config 0x%x", flow_hash_config);
3209 .path =
"set ip flow-hash",
3211 "set ip flow-hash table <table-id> [src] [dst] [sport] [dport] [proto] [reverse]",
3228 return VNET_API_ERROR_NO_MATCHING_INTERFACE;
3231 return VNET_API_ERROR_NO_SUCH_ENTRY;
3238 if (
NULL != if_addr)
3243 .fp_addr.ip4 = *if_addr,
3251 if (table_index != (
u32) ~ 0)
3281 u32 table_index = ~0;
3282 int table_index_set = 0;
3283 u32 sw_if_index = ~0;
3288 if (
unformat (input,
"table-index %d", &table_index))
3289 table_index_set = 1;
3297 if (table_index_set == 0)
3300 if (sw_if_index == ~0)
3310 case VNET_API_ERROR_NO_MATCHING_INTERFACE:
3313 case VNET_API_ERROR_NO_SUCH_ENTRY:
3332 .path =
"set ip classify",
3334 "set ip classify intfc <interface> table-index <classify-idx>",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
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.
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
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, fib_protocol_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, mpls_label_t *next_hop_labels, fib_route_path_flags_t path_flags)
Update the entry to have just one path.
#define vnet_rewrite_one_header(rw0, p0, most_likely_size)
u16 lb_n_buckets
number of buckets in the load-balance.
ip_lookup_next_t
Common (IP4/IP6) next index stored in adjacency.
vlib_combined_counter_main_t lbm_to_counters
clib_error_t * ip4_add_del_interface_address(vlib_main_t *vm, u32 sw_if_index, ip4_address_t *address, u32 address_length, u32 is_del)
sll srl srl sll sra u16x4 i
ip4_address_t * ip4_interface_first_address(ip4_main_t *im, u32 sw_if_index, ip_interface_address_t **result_ia)
uword vlib_error_drop_buffers(vlib_main_t *vm, vlib_node_runtime_t *node, u32 *buffers, u32 next_buffer_stride, u32 n_buffers, u32 next_index, u32 drop_error_node, u32 drop_error_code)
static vlib_node_registration_t ip4_drop_node
(constructor) VLIB_REGISTER_NODE (ip4_drop_node)
int vnet_set_ip4_flow_hash(u32 table_id, u32 flow_hash_config)
static int fib_urpf_check_size(index_t ui)
Data-Plane function to check the size of an uRPF list, (i.e.
static uword ip4_drop(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
ip4_add_del_interface_address_callback_t * add_del_interface_address_callbacks
Functions to call when interface address changes.
static vlib_main_t * vlib_get_main(void)
static void vlib_set_next_frame_buffer(vlib_main_t *vm, vlib_node_runtime_t *node, u32 next_index, u32 buffer_index)
ip_interface_address_t * if_address_pool
Pool of addresses that are assigned to interfaces.
static vnet_hw_interface_t * vnet_get_sup_hw_interface(vnet_main_t *vnm, u32 sw_if_index)
static clib_error_t * ip4_add_del_interface_address_internal(vlib_main_t *vm, u32 sw_if_index, ip4_address_t *address, u32 address_length, u32 is_del)
vnet_interface_main_t interface_main
static uword ip4_midchain(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
vlib_node_registration_t ip4_lookup_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_node)
static int ip4_header_bytes(ip4_header_t *i)
static u32 ip4_compute_flow_hash(const ip4_header_t *ip, flow_hash_config_t flow_hash_config)
static f64 vlib_time_now(vlib_main_t *vm)
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.
static void * clib_random_buffer_get_data(clib_random_buffer_t *b, uword n_bytes)
flow_hash_config_t lb_hash_config
the hash config to use when selecting a bucket.
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static clib_error_t * test_lookup_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vlib_validate_buffer_enqueue_x4(vm, node, next_index, to_next, n_left_to_next, bi0, bi1, bi2, bi3, next0, next1, next2, next3)
Finish enqueueing four buffers forward in the graph.
ip_lookup_main_t lookup_main
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
static ip_csum_t ip_csum_with_carry(ip_csum_t sum, ip_csum_t x)
u32 * fib_index_by_sw_if_index
Table index indexed by software interface.
unformat_function_t unformat_vnet_sw_interface
static uword ip4_arp(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
static uword vlib_buffer_length_in_chain(vlib_main_t *vm, vlib_buffer_t *b)
Get length in bytes of the buffer chain.
VNET_FEATURE_ARC_INIT(ip4_unicast, static)
u32 neighbor_probe_adj_index
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)
union ip_adjacency_t_::@175 sub_type
#define IP4_FIB_MTRIE_LEAF_EMPTY
static pg_node_t * pg_get_node(uword node_index)
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_physmem_alloc, char *fmt,...)
static ip4_fib_mtrie_leaf_t ip4_fib_mtrie_lookup_step(ip4_fib_mtrie_t *m, ip4_fib_mtrie_leaf_t current_leaf, const ip4_address_t *dst_address, u32 dst_address_byte_index)
u8 output_feature_arc_index
vnet_main_t * vnet_get_main(void)
#define VNET_BUFFER_LOCALLY_ORIGINATED
static clib_error_t * show_ip_local_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
#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...
ip_csum_t ip_incremental_checksum(ip_csum_t sum, void *_data, uword n_bytes)
#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)
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
static void ip4_add_interface_routes(u32 sw_if_index, ip4_main_t *im, u32 fib_index, ip_interface_address_t *a)
u16 lb_n_buckets_minus_1
number of buckets in the load-balance - 1.
#define IP_BUFFER_L4_CHECKSUM_CORRECT
static uword ip4_rewrite_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int is_midchain)
Aggregrate type for a prefix.
#define IP4_LOOKUP_NEXT_NODES
#define clib_warning(format, args...)
vlib_node_registration_t ip4_arp_node
(constructor) VLIB_REGISTER_NODE (ip4_arp_node)
void ip4_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
static void * ip4_next_header(ip4_header_t *i)
u16 fp_len
The mask length.
#define vlib_call_init_function(vm, x)
struct ip_adjacency_t_::@175::@178 glean
IP_LOOKUP_NEXT_GLEAN.
This packet matches an "interface route" and packets need to be passed to ARP to find rewrite string ...
#define foreach_notrace_ip4_arp_error
static clib_error_t * vnet_feature_init(vlib_main_t *vm)
adj_index_t fib_entry_get_adj(fib_node_index_t fib_entry_index)
static u32 ip4_fib_mtrie_leaf_get_adj_index(ip4_fib_mtrie_leaf_t n)
#define VLIB_BUFFER_NEXT_PRESENT
vlib_node_registration_t ip4_rewrite_node
(constructor) VLIB_REGISTER_NODE (ip4_rewrite_node)
static int ip4_is_fragment(ip4_header_t *i)
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...
#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.
vlib_node_registration_t ip4_input_node
Global ip4 input node.
u16 current_length
Nbytes between current data and the end of this buffer.
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.
static vlib_node_registration_t ip4_local_node
(constructor) VLIB_REGISTER_NODE (ip4_local_node)
index_t classify_dpo_create(dpo_proto_t proto, u32 classify_table_index)
clib_error_t * arp_notrace_init(vlib_main_t *vm)
dpo_type_t dpoi_type
the type
static const dpo_id_t * load_balance_get_bucket_i(const load_balance_t *lb, u32 bucket)
void ip4_register_protocol(u32 protocol, u32 node_index)
static uword ip4_arp_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int is_glean)
uword os_get_cpu_number(void)
static uword ip4_punt(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
void ip4_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 * ip_enabled_by_sw_if_index
static uword ip4_glean(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
ip4_main_t ip4_main
Global ip4 main structure.
u8 local_next_by_ip_protocol[256]
Table mapping ip protocol to ip[46]-local node next index.
static uword ip4_load_balance(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
void vlib_put_frame_to_node(vlib_main_t *vm, u32 to_node_index, vlib_frame_t *f)
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.
#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).
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
vlib_combined_counter_main_t adjacency_counters
Adjacency packet counters.
vlib_error_t error
Error code for buffers to be enqueued to error handler.
static vlib_node_registration_t ip4_punt_node
(constructor) VLIB_REGISTER_NODE (ip4_punt_node)
static u8 * format_ip4_lookup_trace(u8 *s, va_list *args)
clib_error_t * ip4_probe_neighbor(vlib_main_t *vm, ip4_address_t *dst, u32 sw_if_index)
static u8 * format_ip4_rewrite_trace(u8 *s, va_list *args)
static uword ip4_policer_classify(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
static void vlib_buffer_copy_trace_flag(vlib_main_t *vm, vlib_buffer_t *b, u32 bi_target)
#define CLIB_PREFETCH(addr, size, type)
#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.
void icmp4_error_set_vnet_buffer(vlib_buffer_t *b, u8 type, u8 code, u32 data)
ip4_add_del_interface_address_function_t * function
static ip4_fib_t * ip4_fib_get(u32 index)
Get the FIB at the given index.
static clib_error_t * add_del_interface_table(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
struct ip_adjacency_t_::@175::@176 nbr
IP_LOOKUP_NEXT_ARP/IP_LOOKUP_NEXT_REWRITE.
static vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
Get node runtime by node index.
#define clib_memcpy(a, b, c)
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
int ip4_lookup_validate(ip4_address_t *a, u32 fib_index0)
static clib_error_t * set_ip_flow_hash_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
unformat_function_t * unformat_edit
static vlib_node_registration_t ip4_multicast_node
(constructor) VLIB_REGISTER_NODE (ip4_multicast_node)
u8 packet_data[64-1 *sizeof(u32)]
u32 fib_node_index_t
A typedef of a node index.
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.
This packet matches an "incomplete adjacency" and packets need to be passed to ARP to find rewrite st...
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
static void ip4_addr_fib_init(ip4_address_fib_t *addr_fib, ip4_address_t *address, u32 fib_index)
static clib_error_t * set_ip_classify_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define VLIB_CLI_COMMAND(x,...)
static clib_error_t * ip4_sw_interface_add_del(vnet_main_t *vnm, u32 sw_if_index, u32 is_add)
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...
vlib_packet_template_t ip4_arp_request_packet_template
Template used to generate IP4 ARP packets.
vlib_node_registration_t ip4_load_balance_node
(constructor) VLIB_REGISTER_NODE (ip4_load_balance_node)
#define VNET_SW_INTERFACE_FLAG_ADMIN_UP
static void vlib_increment_combined_counter(vlib_combined_counter_main_t *cm, u32 cpu_index, u32 index, u32 packet_increment, u32 byte_increment)
Increment a combined counter.
#define IP4_FIB_MTRIE_LEAF_ROOT
index_t lb_urpf
This is the index of the uRPF list for this LB.
u32 ip4_tcp_udp_validate_checksum(vlib_main_t *vm, vlib_buffer_t *p0)
#define LOG2_IP_BUFFER_L4_CHECKSUM_CORRECT
static load_balance_t * load_balance_get(index_t lbi)
void vlib_buffer_free(vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Free buffers Frees the entire buffer chain for each buffer.
#define hash_v3_finalize32(a, b, c)
vlib_node_registration_t ip4_glean_node
(constructor) VLIB_REGISTER_NODE (ip4_glean_node)
VLIB_NODE_FUNCTION_MULTIARCH(ip4_lookup_node, ip4_lookup)
u32 next_buffer
Next buffer for this linked-list of buffers.
u32 fib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
vlib_node_registration_t ip4_midchain_node
(constructor) VLIB_REGISTER_NODE (ip4_midchain_node)
#define VLIB_NODE_FLAG_TRACE
vnet_classify_main_t vnet_classify_main
Route added as a result of interface configuration.
clib_error_t * ip4_lookup_init(vlib_main_t *vm)
u32 flow_hash_config_t
A flow hash configuration is a mask of the flow hash options.
#define VLIB_BUFFER_IS_TRACED
#define VNET_FEATURES(...)
static uword is_pow2(uword x)
static uword ip4_local(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
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.
#define IP_BUFFER_L4_CHECKSUM_COMPUTED
u8 ucast_feature_arc_index
u16 ip4_tcp_udp_compute_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip4_header_t *ip0)
index_t dpoi_index
the index of objects of that type
VNET_FEATURE_INIT(ip4_flow_classify, static)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
ip_lookup_next_t lookup_next_index
vnet_sw_interface_t * sw_interfaces
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
u8 * format_ip4_forward_next_trace(u8 *s, va_list *args)
#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)
A collection of combined counters.
static uword ip4_flow_classify(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
flow_hash_config_t flow_hash_config
#define clib_mem_unaligned(pointer, type)
static void ip4_del_interface_routes(ip4_main_t *im, u32 fib_index, ip4_address_t *address, u32 address_length)
void * vlib_packet_template_get_packet(vlib_main_t *vm, vlib_packet_template_t *t, u32 *bi_result)
static uword ip4_lookup_multicast(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
#define vlib_prefetch_buffer_header(b, type)
Prefetch buffer metadata.
static uword ip4_source_and_port_range_check_tx(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
#define VLIB_REGISTER_NODE(x,...)
int vnet_set_ip4_classify_intfc(vlib_main_t *vm, u32 sw_if_index, u32 table_index)
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.
#define vec_foreach(var, vec)
Vector iterator.
index_t ip4_fib_table_lookup_lb(ip4_fib_t *fib, const ip4_address_t *addr)
static uword ip4_drop_or_punt(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, ip4_error_t error_code)
u16 dpoi_next_node
The next VLIB node to follow.
#define clib_error_return(e, args...)
VNET_SW_INTERFACE_ADD_DEL_FUNCTION(ip4_sw_interface_add_del)
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
static uword ip4_lookup(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
IPv4 lookup node.
static uword ip4_rewrite(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
IPv4 rewrite node.
vlib_frame_t * vlib_get_frame_to_node(vlib_main_t *vm, u32 to_node_index)
#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)
u32 flags
buffer flags: VLIB_BUFFER_IS_TRACED: trace this buffer.
static int ip4_src_address_for_packet(ip_lookup_main_t *lm, u32 sw_if_index, ip4_address_t *src)
static uword ip4_vxlan_bypass(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
static vlib_node_registration_t ip4_lookup_multicast_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_multicast_node)
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
static uword ip4_source_and_port_range_check_rx(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
static u16 ip4_header_checksum(ip4_header_t *i)
clib_random_buffer_t random_buffer
static u16 ip_csum_fold(ip_csum_t c)
static char * ip4_arp_error_strings[]
static uword ip4_lookup_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int lookup_for_responses_to_locally_received_packets)
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 ip_adjacency_t * ip_get_adjacency(ip_lookup_main_t *lm, u32 adj_index)
struct ip_adjacency_t_::@175::@177 midchain
IP_LOOKUP_NEXT_MIDCHAIN.
ip4_fib_mtrie_leaf_t default_leaf
static_always_inline void vnet_feature_arc_start(u8 arc, u32 sw_if_index, u32 *next0, vlib_buffer_t *b0)
static ip4_address_t * ip4_interface_address_matching_destination(ip4_main_t *im, ip4_address_t *dst, u32 sw_if_index, ip_interface_address_t **result_ia)
static uword pool_elts(void *v)
Number of active elements in a pool.