63 #define foreach_sr_policy_rewrite_next \ 64 _(IP6_LOOKUP, "ip6-lookup") \ 65 _(ERROR, "error-drop") 69 #define _(s,n) SR_POLICY_REWRITE_NEXT_##s, 76 #define foreach_sr_policy_rewrite_error \ 77 _(INTERNAL_ERROR, "Segment Routing undefined error") \ 78 _(BSID_ZERO, "BSID with SL = 0") \ 79 _(COUNTER_TOTAL, "SR steered IPv6 packets") \ 80 _(COUNTER_ENCAP, "SR: Encaps packets") \ 81 _(COUNTER_INSERT, "SR: SRH inserted packets") \ 82 _(COUNTER_BSID, "SR: BindingSID steered packets") 86 #define _(sym,str) SR_POLICY_REWRITE_ERROR_##sym, 93 #define _(sym,string) string, 132 .path =
"set sr encaps source",
133 .short_help =
"set sr encaps source addr <ip6_addr>",
152 u32 header_length = 0;
167 clib_host_to_net_u32 (0 | ((6 & 0xF) << 28));
175 iph->
protocol = IP_PROTOCOL_IPV6_ROUTE;
207 u32 header_length = 0;
245 u32 header_length = 0;
294 memset (segment_list, 0,
sizeof (*segment_list));
364 .ip6 = sr_policy->
bsid,
469 .ip6 = sr_policy->
bsid,
542 u32 weight,
u8 behavior,
u32 fib_table,
u8 is_encap)
570 (fib_table != (
u32) ~ 0 ? fib_table : 0));
581 memset (sr_policy, 0,
sizeof (*sr_policy));
583 sr_policy->
type = behavior;
584 sr_policy->
fib_table = (fib_table != (
u32) ~ 0 ? fib_table : 0);
592 create_sl (sr_policy, segments, weight, is_encap);
598 "SRv6 steering of IP6 prefixes through BSIDs");
600 "SRv6 steering of IP4 prefixes through BSIDs");
648 .ip6 = sr_policy->
bsid,
721 u32 *sl_index_iterate;
751 else if (operation == 2)
759 if (*sl_index_iterate == sl_index)
762 if (*sl_index_iterate != sl_index)
780 else if (operation == 3)
784 if (*sl_index_iterate == sl_index)
787 if (*sl_index_iterate != sl_index)
792 segment_list->
weight = weight;
812 char is_del = 0, is_add = 0, is_mod = 0;
815 u32 sr_policy_index = (
u32) ~ 0, sl_index = (
u32) ~ 0;
816 u32 weight = (
u32) ~ 0, fib_table = (
u32) ~ 0;
824 if (!is_add && !is_mod && !is_del &&
unformat (input,
"add"))
826 else if (!is_add && !is_mod && !is_del &&
unformat (input,
"del"))
828 else if (!is_add && !is_mod && !is_del &&
unformat (input,
"mod"))
833 else if (!is_add && !policy_set
834 &&
unformat (input,
"index %d", &sr_policy_index))
836 else if (
unformat (input,
"weight %d", &weight));
844 else if (
unformat (input,
"add sl"))
846 else if (
unformat (input,
"del sl index %d", &sl_index))
848 else if (
unformat (input,
"mod sl index %d", &sl_index))
850 else if (fib_table == (
u32) ~ 0
851 &&
unformat (input,
"fib-table %d", &fib_table));
854 else if (
unformat (input,
"insert"))
862 if (!is_add && !is_mod && !is_del)
883 if (operation != 1 && sl_index == (
u32) ~ 0)
885 if (operation == 1 &&
vec_len (segments) == 0)
887 if (operation == 3 && weight == (
u32) ~ 0)
890 sr_policy_index, fib_table, operation, segments,
902 "There is already a FIB entry for the BindingSID address.\n" 903 "The SR policy could not be created.");
908 "The selected SR policy only contains ONE segment list. " 909 "Please remove the SR policy instead");
912 "Could not delete the segment list. " 913 "It is not associated with that SR policy.");
916 "Could not modify the segment list. " 917 "The given SL is not associated with such SR policy.");
927 .short_help =
"sr policy [add||del||mod] [bsid 2001::1||index 5] " 928 "next A:: next B:: next C:: (weight 1) (fib-table 2) (encap|insert)",
930 "Manipulation of SR policies.\n" 931 "A Segment Routing policy may contain several SID lists. Each SID list has\n" 932 "an associated weight (default 1), which will result in wECMP (uECMP).\n" 933 "Segment Routing policies might be of type encapsulation or srh insertion\n" 934 "Each SR policy will be associated with a unique BindingSID.\n" 935 "A BindingSID is a locally allocated SegmentID. For every packet that arrives\n" 936 "with IPv6_DA:BSID such traffic will be steered into the SR policy.\n" 937 "The add command will create a SR policy with its first segment list (sl)\n" 938 "The mod command allows you to add, remove, or modify the existing segment lists\n" 939 "within an SR policy.\n" 940 "The del command allows you to delete a SR policy along with all its associated\n" 966 {vec_add1 (vec_policies, sr_policy); } );
971 sr_policy = vec_policies[
i];
976 (sr_policy->
is_encap ?
"Encapsulation" :
988 s =
format (s,
"\t[%u].- ", *sl_index);
995 s =
format (s,
"\b\b > ");
1006 .path =
"show sr policies",
1007 .short_help =
"show sr policies",
1025 (s,
"SR-policy-rewrite: src %U dst %U",
1058 u32 n_left_from, next_index, *from, *to_next;
1065 int encap_pkts = 0, bsid_pkts = 0;
1067 while (n_left_from > 0)
1074 while (n_left_from >= 8 && n_left_to_next >= 4)
1076 u32 bi0, bi1, bi2, bi3;
1078 u32 next0, next1, next2, next3;
1079 next0 = next1 = next2 = next3 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
1081 ip6_header_t *ip0_encap, *ip1_encap, *ip2_encap, *ip3_encap;
1105 to_next[0] = bi0 = from[0];
1106 to_next[1] = bi1 = from[1];
1107 to_next[2] = bi2 = from[2];
1108 to_next[3] = bi3 = from[3];
1112 n_left_to_next -= 4;
1215 n_left_to_next, bi0, bi1, bi2, bi3,
1216 next0, next1, next2, next3);
1220 while (n_left_from > 0 && n_left_to_next > 0)
1226 u32 next0 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
1233 n_left_to_next -= 1;
1265 n_left_to_next, bi0, next0);
1273 SR_POLICY_REWRITE_ERROR_COUNTER_TOTAL,
1276 SR_POLICY_REWRITE_ERROR_COUNTER_BSID,
1285 .name =
"sr-pl-rewrite-encaps",
1286 .vector_size =
sizeof (
u32),
1293 #define _(s,n) [SR_POLICY_REWRITE_NEXT_##s] = n, 1314 ip0_encap->
ttl -= 1;
1315 checksum0 = ip0_encap->
checksum + clib_host_to_net_u16 (0x0100);
1316 checksum0 += checksum0 >= 0xffff;
1323 clib_host_to_net_u32 (0 | ((6 & 0xF) << 28) |
1324 ((ip0_encap->
tos & 0xFF) << 20));
1325 sr0 = (
void *) (ip0 + 1);
1326 sr0->
protocol = IP_PROTOCOL_IP_IN_IP;
1337 u32 n_left_from, next_index, *from, *to_next;
1344 int encap_pkts = 0, bsid_pkts = 0;
1346 while (n_left_from > 0)
1353 while (n_left_from >= 8 && n_left_to_next >= 4)
1355 u32 bi0, bi1, bi2, bi3;
1357 u32 next0, next1, next2, next3;
1358 next0 = next1 = next2 = next3 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
1360 ip4_header_t *ip0_encap, *ip1_encap, *ip2_encap, *ip3_encap;
1384 to_next[0] = bi0 = from[0];
1385 to_next[1] = bi1 = from[1];
1386 to_next[2] = bi2 = from[2];
1387 to_next[3] = bi3 = from[3];
1391 n_left_to_next -= 4;
1493 n_left_to_next, bi0, bi1, bi2, bi3,
1494 next0, next1, next2, next3);
1498 while (n_left_from > 0 && n_left_to_next > 0)
1505 u32 next0 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
1512 n_left_to_next -= 1;
1544 n_left_to_next, bi0, next0);
1552 SR_POLICY_REWRITE_ERROR_COUNTER_TOTAL,
1555 SR_POLICY_REWRITE_ERROR_COUNTER_BSID,
1564 .name =
"sr-pl-rewrite-encaps-v4",
1565 .vector_size =
sizeof (
u32),
1572 #define _(s,n) [SR_POLICY_REWRITE_NEXT_##s] = n, 1593 return (*((
u64 *) m) & 0xffffffffffff);
1601 uword is_ip, eh_size;
1605 eh_type = clib_net_to_host_u16 (eh->
type);
1608 is_ip = (eh_type == ETHERNET_TYPE_IP4 || eh_type == ETHERNET_TYPE_IP6);
1631 u32 n_left_from, next_index, *from, *to_next;
1638 int encap_pkts = 0, bsid_pkts = 0;
1640 while (n_left_from > 0)
1647 while (n_left_from >= 8 && n_left_to_next >= 4)
1649 u32 bi0, bi1, bi2, bi3;
1651 u32 next0, next1, next2, next3;
1652 next0 = next1 = next2 = next3 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
1680 to_next[0] = bi0 = from[0];
1681 to_next[1] = bi1 = from[1];
1682 to_next[2] = bi2 = from[2];
1683 to_next[3] = bi3 = from[3];
1687 n_left_to_next -= 4;
1809 sr0 = (
void *) (ip0 + 1);
1810 sr1 = (
void *) (ip1 + 1);
1811 sr2 = (
void *) (ip2 + 1);
1812 sr3 = (
void *) (ip3 + 1);
1815 IP_PROTOCOL_IP6_NONXT;
1865 n_left_to_next, bi0, bi1, bi2, bi3,
1866 next0, next1, next2, next3);
1870 while (n_left_from > 0 && n_left_to_next > 0)
1879 u32 next0 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
1886 n_left_to_next -= 1;
1923 sr0 = (
void *) (ip0 + 1);
1924 sr0->
protocol = IP_PROTOCOL_IP6_NONXT;
1939 n_left_to_next, bi0, next0);
1947 SR_POLICY_REWRITE_ERROR_COUNTER_TOTAL,
1950 SR_POLICY_REWRITE_ERROR_COUNTER_BSID,
1959 .name =
"sr-pl-rewrite-encaps-l2",
1960 .vector_size =
sizeof (
u32),
1967 #define _(s,n) [SR_POLICY_REWRITE_NEXT_##s] = n, 1982 u32 n_left_from, next_index, *from, *to_next;
1989 int insert_pkts = 0, bsid_pkts = 0;
1991 while (n_left_from > 0)
1998 while (n_left_from >= 8 && n_left_to_next >= 4)
2000 u32 bi0, bi1, bi2, bi3;
2002 u32 next0, next1, next2, next3;
2003 next0 = next1 = next2 = next3 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
2007 u16 new_l0, new_l1, new_l2, new_l3;
2030 to_next[0] = bi0 = from[0];
2031 to_next[1] = bi1 = from[1];
2032 to_next[2] = bi2 = from[2];
2033 to_next[3] = bi3 = from[3];
2037 n_left_to_next -= 4;
2070 if (ip0->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2077 if (ip1->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2084 if (ip2->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2091 if (ip3->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2099 (
void *) sr0 - (
void *) ip0);
2101 (
void *) sr1 - (
void *) ip1);
2103 (
void *) sr2 - (
void *) ip2);
2105 (
void *) sr3 - (
void *) ip3);
2180 ip6_ext_header_t *ip_ext;
2181 if (ip0 + 1 == (
void *) sr0)
2184 ip0->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2188 ip_ext = (
void *) (ip0 + 1);
2190 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2193 if (ip1 + 1 == (
void *) sr1)
2196 ip1->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2200 ip_ext = (
void *) (ip2 + 1);
2202 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2205 if (ip2 + 1 == (
void *) sr2)
2208 ip2->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2212 ip_ext = (
void *) (ip2 + 1);
2214 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2217 if (ip3 + 1 == (
void *) sr3)
2220 ip3->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2224 ip_ext = (
void *) (ip3 + 1);
2226 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2275 n_left_to_next, bi0, bi1, bi2, bi3,
2276 next0, next1, next2, next3);
2280 while (n_left_from > 0 && n_left_to_next > 0)
2287 u32 next0 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
2295 n_left_to_next -= 1;
2306 if (ip0->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2314 (
void *) sr0 - (
void *) ip0);
2336 if (ip0 + 1 == (
void *) sr0)
2339 ip0->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2343 ip6_ext_header_t *ip_ext = (
void *) (ip0 + 1);
2345 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2362 n_left_to_next, bi0, next0);
2370 SR_POLICY_REWRITE_ERROR_COUNTER_TOTAL,
2373 SR_POLICY_REWRITE_ERROR_COUNTER_BSID,
2381 .name =
"sr-pl-rewrite-insert",
2382 .vector_size =
sizeof (
u32),
2389 #define _(s,n) [SR_POLICY_REWRITE_NEXT_##s] = n, 2404 u32 n_left_from, next_index, *from, *to_next;
2411 int insert_pkts = 0, bsid_pkts = 0;
2413 while (n_left_from > 0)
2420 while (n_left_from >= 8 && n_left_to_next >= 4)
2422 u32 bi0, bi1, bi2, bi3;
2424 u32 next0, next1, next2, next3;
2425 next0 = next1 = next2 = next3 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
2429 u16 new_l0, new_l1, new_l2, new_l3;
2452 to_next[0] = bi0 = from[0];
2453 to_next[1] = bi1 = from[1];
2454 to_next[2] = bi2 = from[2];
2455 to_next[3] = bi3 = from[3];
2459 n_left_to_next -= 4;
2492 if (ip0->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2499 if (ip1->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2506 if (ip2->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2513 if (ip3->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2521 (
void *) sr0 - (
void *) ip0);
2523 (
void *) sr1 - (
void *) ip1);
2525 (
void *) sr2 - (
void *) ip2);
2527 (
void *) sr3 - (
void *) ip3);
2593 ip6_ext_header_t *ip_ext;
2594 if (ip0 + 1 == (
void *) sr0)
2597 ip0->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2601 ip_ext = (
void *) (ip0 + 1);
2603 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2606 if (ip1 + 1 == (
void *) sr1)
2609 ip1->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2613 ip_ext = (
void *) (ip2 + 1);
2615 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2618 if (ip2 + 1 == (
void *) sr2)
2621 ip2->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2625 ip_ext = (
void *) (ip2 + 1);
2627 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2630 if (ip3 + 1 == (
void *) sr3)
2633 ip3->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2637 ip_ext = (
void *) (ip3 + 1);
2639 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2688 n_left_to_next, bi0, bi1, bi2, bi3,
2689 next0, next1, next2, next3);
2693 while (n_left_from > 0 && n_left_to_next > 0)
2700 u32 next0 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
2708 n_left_to_next -= 1;
2719 if (ip0->
protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
2727 (
void *) sr0 - (
void *) ip0);
2747 if (ip0 + 1 == (
void *) sr0)
2750 ip0->
protocol = IP_PROTOCOL_IPV6_ROUTE;
2754 ip6_ext_header_t *ip_ext = (
void *) (ip0 + 1);
2756 ip_ext->next_hdr = IP_PROTOCOL_IPV6_ROUTE;
2773 n_left_to_next, bi0, next0);
2781 SR_POLICY_REWRITE_ERROR_COUNTER_TOTAL,
2784 SR_POLICY_REWRITE_ERROR_COUNTER_BSID,
2792 .name =
"sr-pl-rewrite-b-insert",
2793 .vector_size =
sizeof (
u32),
2800 #define _(s,n) [SR_POLICY_REWRITE_NEXT_##s] = n, 2819 goto error_bsid_encaps;
2835 *next0 = SR_POLICY_REWRITE_NEXT_ERROR;
2836 b0->
error = node->
errors[SR_POLICY_REWRITE_ERROR_BSID_ZERO];
2847 u32 n_left_from, next_index, *from, *to_next;
2854 int encap_pkts = 0, bsid_pkts = 0;
2856 while (n_left_from > 0)
2863 while (n_left_from >= 8 && n_left_to_next >= 4)
2865 u32 bi0, bi1, bi2, bi3;
2867 u32 next0, next1, next2, next3;
2868 next0 = next1 = next2 = next3 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
2870 ip6_header_t *ip0_encap, *ip1_encap, *ip2_encap, *ip3_encap;
2872 ip6_ext_header_t *prev0, *prev1, *prev2, *prev3;
2896 to_next[0] = bi0 = from[0];
2897 to_next[1] = bi1 = from[1];
2898 to_next[2] = bi2 = from[2];
2899 to_next[3] = bi3 = from[3];
2903 n_left_to_next -= 4;
2937 IP_PROTOCOL_IPV6_ROUTE);
2939 IP_PROTOCOL_IPV6_ROUTE);
2941 IP_PROTOCOL_IPV6_ROUTE);
2943 IP_PROTOCOL_IPV6_ROUTE);
3019 n_left_to_next, bi0, bi1, bi2, bi3,
3020 next0, next1, next2, next3);
3024 while (n_left_from > 0 && n_left_to_next > 0)
3029 ip6_ext_header_t *prev0;
3032 u32 next0 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
3039 n_left_to_next -= 1;
3050 IP_PROTOCOL_IPV6_ROUTE);
3074 n_left_to_next, bi0, next0);
3082 SR_POLICY_REWRITE_ERROR_COUNTER_TOTAL,
3085 SR_POLICY_REWRITE_ERROR_COUNTER_BSID,
3094 .name =
"sr-pl-rewrite-b-encaps",
3095 .vector_size =
sizeof (
u32),
3102 #define _(s,n) [SR_POLICY_REWRITE_NEXT_##s] = n, 3119 s =
format (s,
"SR: Segment List index:[%d]", index);
3120 s =
format (s,
"\n\tSegments:");
3129 s =
format (s,
"\b\b > - ");
3142 "sr-pl-rewrite-encaps",
3147 "sr-pl-rewrite-encaps-v4",
3157 "sr-pl-rewrite-insert",
3166 "sr-pl-rewrite-b-insert",
3175 "sr-pl-rewrite-b-encaps",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
static clib_error_t * sr_policy_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
CLI for 'sr policies' command family.
#define IPv6_DEFAULT_HOP_LIMIT
u32 fib_table_create_and_lock(fib_protocol_t proto, const char *const fmt,...)
Create a new table with no table ID.
static u8 * compute_rewrite_insert(ip6_address_t *sl)
SR rewrite string computation for SRH insertion (inline)
fib_protocol_t fp_proto
protocol type
dpo_lock_fn_t dv_lock
A reference counting lock function.
u8 type
Type (default is 0)
#define SR_POLICY_TYPE_DEFAULT
#define vec_foreach_index(var, v)
Iterate over vector indices.
sll srl srl sll sra u16x4 i
fib_node_index_t path_index
The index of the FIB path.
#define foreach_sr_policy_rewrite_error
A virtual function table regisitered for a DPO type.
static uword sr_policy_rewrite_b_insert(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Graph node for applying a SR policy into a packet.
#define IPv6_DEFAULT_HEADER_LENGTH
fib_node_index_t fib_table_lookup_exact_match(u32 fib_index, const fib_prefix_t *prefix)
Perfom an exact match in the non-forwarding table.
dpo_id_t path_dpo
ID of the Data-path object.
static uword sr_policy_rewrite_b_encaps(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Graph node for applying a SR policy BSID - Encapsulation.
void sr_dpo_unlock(dpo_id_t *dpo)
no-op unlock function.
static const char *const sr_pr_encaps_ip4_nodes[]
static int dpo_id_is_valid(const dpo_id_t *dpoi)
Return true if the DPO object is valid, i.e.
vlib_node_registration_t sr_policy_rewrite_b_encaps_node
(constructor) VLIB_REGISTER_NODE (sr_policy_rewrite_b_encaps_node)
static u32 ip4_compute_flow_hash(const ip4_header_t *ip, flow_hash_config_t flow_hash_config)
uword mhash_unset(mhash_t *h, void *key, uword *old_value)
#define ethernet_buffer_header_size(b)
Determine the size of the Ethernet headers of the current frame in the buffer.
int sr_policy_mod(ip6_address_t *bsid, u32 index, u32 fib_table, u8 operation, ip6_address_t *segments, u32 sl_index, u32 weight)
Modify an existing SR policy.
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.
dpo_id_t ip4_dpo
DPO for Encaps IPv6.
#define VLIB_BUFFER_PRE_DATA_SIZE
static uword sr_policy_rewrite_insert(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Graph node for applying a SR policy into a packet.
ip6_address_t * segments
SIDs (key)
static u8 * compute_rewrite_bsid(ip6_address_t *sl)
SR rewrite string computation for SRH insertion with BSID (inline)
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).
#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.
static clib_error_t * set_sr_src_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
static ip6_sr_sl_t * create_sl(ip6_sr_policy_t *sr_policy, ip6_address_t *sl, u32 weight, u8 is_encap)
Creates a Segment List and adds it to an SR policy.
static const char *const *const sr_pr_bsid_encaps_nodes[DPO_PROTO_NUM]
u32 l2_sr_policy_rewrite_index
#define ROUTING_HEADER_TYPE_SR
static u8 * format_sr_segment_list_dpo(u8 *s, va_list *args)
vlib_error_t * errors
Vector of errors for this node.
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
ip6_sr_steering_policy_t * steer_policies
static_always_inline void encaps_processing_v6(vlib_node_runtime_t *node, vlib_buffer_t *b0, ip6_header_t *ip0, ip6_header_t *ip0_encap)
IPv6 encapsulation processing as per RFC2473.
vlib_node_registration_t sr_policy_rewrite_encaps_v4_node
(constructor) VLIB_REGISTER_NODE (sr_policy_rewrite_encaps_v4_node)
u8 * rewrite_bsid
Precomputed rewrite header for bindingSID.
vlib_node_registration_t sr_policy_rewrite_encaps_l2_node
(constructor) VLIB_REGISTER_NODE (sr_policy_rewrite_encaps_l2_node)
static uword sr_policy_rewrite_encaps_l2(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Graph node for applying a SR policy into a L2 frame.
flow_hash_config_t fib_table_get_flow_hash_config(u32 fib_index, fib_protocol_t proto)
Get the flow hash configured used by the table.
index_t load_balance_create(u32 n_buckets, dpo_proto_t lb_proto, flow_hash_config_t fhc)
dpo_id_t ip6_dpo
DPO for Encaps/Insert IPv6.
u32 * sw_iface_sr_policies
vlib_node_registration_t sr_policy_rewrite_encaps_node
(constructor) VLIB_REGISTER_NODE (sr_policy_rewrite_encaps_node)
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
#define static_always_inline
enum dpo_type_t_ dpo_type_t
Common types of data-path objects New types can be dynamically added using dpo_register_new_type() ...
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
static const char *const sr_pr_insert_ip6_nodes[]
static u32 l2_flow_hash(vlib_buffer_t *b0)
#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.
SR Segment List (SID list)
#define vlib_prefetch_buffer_header(b, type)
Prefetch buffer metadata.
Aggregrate type for a prefix.
#define clib_error_return(e, args...)
void load_balance_multipath_update(const dpo_id_t *dpo, const load_balance_path_t *raw_nhs, load_balance_flags_t flags)
static uword sr_policy_rewrite_encaps(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Graph node for applying a SR policy into an IPv6 packet.
static const char *const *const sr_pr_encaps_nodes[DPO_PROTO_NUM]
static u64 mac_to_u64(u8 *m)
#define SR_POLICY_TYPE_SPRAY
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
fib_protocol_t dpo_proto_to_fib(dpo_proto_t dpo_proto)
dpo_type_t dpo_register_new_type(const dpo_vft_t *vft, const char *const *const *nodes)
Create and register a new DPO type.
int sr_policy_del(ip6_address_t *bsid, u32 index)
Delete a SR policy.
static void update_replicate(ip6_sr_policy_t *sr_policy)
Updates the Replicate DPO after an SR Policy change.
void fib_table_unlock(u32 fib_index, fib_protocol_t proto)
Take a reference counting lock on the table.
vlib_node_registration_t sr_policy_rewrite_b_insert_node
(constructor) VLIB_REGISTER_NODE (sr_policy_rewrite_b_insert_node)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
vlib_node_registration_t sr_policy_rewrite_insert_node
(constructor) VLIB_REGISTER_NODE (sr_policy_rewrite_insert_node)
u16 current_length
Nbytes between current data and the end of this buffer.
static const char *const sr_pr_bsid_insert_ip6_nodes[]
static dpo_type_t sr_pr_bsid_insert_dpo_type
static u8 * compute_rewrite_encaps(ip6_address_t *sl)
SR rewrite string computation for IPv6 encapsulation (inline)
load-balancing over a choice of [un]equal cost paths
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
static u32 ip6_compute_flow_hash(const ip6_header_t *ip, flow_hash_config_t flow_hash_config)
#define pool_put(P, E)
Free an object E in pool P.
#define vec_dup(V)
Return copy of vector (no header, no alignment)
void sr_dpo_lock(dpo_id_t *dpo)
no-op lock function.
#define vec_del1(v, i)
Delete the element at index I.
#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.
static uword mhash_set(mhash_t *h, void *key, uword new_value, uword *old_value)
#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).
u8 is_encap
Mode (0 is SRH insert, 1 Encaps)
static uword sr_policy_rewrite_encaps_v4(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
Graph node for applying a SR policy into an IPv4 packet.
vlib_error_t error
Error code for buffers to be enqueued to error handler.
u32 weight
SID list weight (wECMP / UCMP)
static void vlib_node_increment_counter(vlib_main_t *vm, u32 node_index, u32 counter_index, u64 increment)
sr_policy_rewrite_error_t
#define ip6_ext_header_len(p)
The fine-grained event logger allows lightweight, thread-safe event logging at minimum cost...
void replicate_multipath_update(const dpo_id_t *dpo, load_balance_path_t *next_hops)
fib_node_index_t fib_table_entry_special_dpo_update(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
Update a 'special' entry to the FIB that links to the DPO passed A special entry is an entry that the...
void mhash_init(mhash_t *h, uword n_value_bytes, uword n_key_bytes)
#define hash_mix64(a0, b0, c0)
#define CLIB_PREFETCH(addr, size, type)
static const char *const sr_pr_bsid_encaps_ip6_nodes[]
#define vec_free(V)
Free vector's memory (no header).
static_always_inline void end_bsid_encaps_srh_processing(vlib_node_runtime_t *node, vlib_buffer_t *b0, ip6_header_t *ip0, ip6_sr_header_t *sr0, u32 *next0)
Function BSID encapsulation.
static u8 * format_sr_policy_rewrite_trace(u8 *s, va_list *args)
Trace for the SR Policy Rewrite graph node.
u32 * segments_lists
SID lists indexes (vector)
#define VLIB_BUFFER_IS_TRACED
#define clib_memcpy(a, b, c)
u32 fib_node_index_t
A typedef of a node index.
dpo_id_t bsid_dpo
DPO for Encaps/Insert for BSID.
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 replicate_create(u32 n_buckets, dpo_proto_t rep_proto)
#define foreach_sr_policy_rewrite_next
clib_error_t * sr_policy_rewrite_init(vlib_main_t *vm)
SR Policy Rewrite initialization.
#define VLIB_CLI_COMMAND(x,...)
static const char *const *const sr_pr_bsid_insert_nodes[DPO_PROTO_NUM]
u16 cached_next_index
Next frame index that vector arguments were last enqueued to last time this node ran.
#define pool_put_index(p, i)
Free pool element with given index.
static uword * mhash_get(mhash_t *h, const void *key)
static const char *const *const sr_pr_insert_nodes[DPO_PROTO_NUM]
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
#define VLIB_NODE_FLAG_TRACE
#define IP_FLOW_HASH_DEFAULT
Default: 5-tuple without the "reverse" bit.
static dpo_type_t sr_pr_encaps_dpo_type
Dynamically added SR SL DPO type.
static_always_inline void encaps_processing_v4(vlib_node_runtime_t *node, vlib_buffer_t *b0, ip6_header_t *ip0, ip4_header_t *ip0_encap)
IPv4 encapsulation processing as per RFC2473.
u32 flow_hash_config_t
A flow hash configuration is a mask of the flow hash options.
mhash_t sr_policies_index_hash
static void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
int sr_policy_add(ip6_address_t *bsid, ip6_address_t *segments, u32 weight, u8 behavior, u32 fib_table, u8 is_encap)
Create a new SR policy.
#define FIB_NODE_INDEX_INVALID
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
#define SR_SEGMENT_LIST_WEIGHT_DEFAULT
ip6_sr_policy_t * sr_policies
u32 path_weight
weight for the path.
u8 * rewrite
Precomputed rewrite header.
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
dpo_id_t bsid_dpo
SR Policy specific DPO - BSID.
static dpo_type_t sr_pr_insert_dpo_type
One path from an [EU]CMP set that the client wants to add to a load-balance object.
static char * sr_policy_rewrite_error_strings[]
Segment Routing main datastructure.
#define VLIB_REGISTER_NODE(x,...)
dpo_id_t ip6_dpo
SR Policy specific DPO - IPv4.
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
#define vec_foreach(var, vec)
Vector iterator.
static const char *const sr_pr_encaps_ip6_nodes[]
#define ip6_ext_header_find_t(i, p, m, t)
u16 flags
Copy of main node flags.
static dpo_type_t sr_pr_bsid_encaps_dpo_type
#define CLIB_CACHE_LINE_BYTES
u32 flags
buffer flags: VLIB_BUFFER_IS_TRACED: trace this buffer.
dpo_id_t ip4_dpo
SR Policy specific DPO - IPv6.
static ip6_address_t sr_pr_encaps_src
IPv6 SA for encapsulated packets.
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
static void update_lb(ip6_sr_policy_t *sr_policy)
Updates the Load Balancer after an SR Policy change.
ip6_address_t bsid
BindingSID (key)
static u32 ip_flow_hash(void *data)
static clib_error_t * show_sr_policies_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
CLI to display onscreen all the SR policies.
Segment Routing data structures definitions.
static uword pool_elts(void *v)
Number of active elements in a pool.