sr: add "set sr encaps hop-limit" command
[vpp.git] / src / vnet / srv6 / sr_policy_rewrite.c
index aa2f067..8d11da6 100755 (executable)
@@ -107,6 +107,7 @@ static dpo_type_t sr_pr_bsid_insert_dpo_type;
  * @brief IPv6 SA for encapsulated packets
  */
 static ip6_address_t sr_pr_encaps_src;
+static u8 sr_pr_encaps_hop_limit = IPv6_DEFAULT_HOP_LIMIT;
 
 /******************* SR rewrite set encaps IPv6 source addr *******************/
 /* Note:  This is temporal. We don't know whether to follow this path or
@@ -141,6 +142,44 @@ VLIB_CLI_COMMAND (set_sr_src_command, static) = {
 };
 /* *INDENT-ON* */
 
+/******************** SR rewrite set encaps IPv6 hop-limit ********************/
+
+void
+sr_set_hop_limit (u8 hop_limit)
+{
+  sr_pr_encaps_hop_limit = hop_limit;
+}
+
+u8
+sr_get_hop_limit (void)
+{
+  return sr_pr_encaps_hop_limit;
+}
+
+static clib_error_t *
+set_sr_hop_limit_command_fn (vlib_main_t * vm, unformat_input_t * input,
+                            vlib_cli_command_t * cmd)
+{
+  int hop_limit = sr_get_hop_limit ();
+
+  if (unformat_check_input (input) == UNFORMAT_END_OF_INPUT)
+    return clib_error_return (0, "No value specified");
+  if (!unformat (input, "%d", &hop_limit))
+    return clib_error_return (0, "Invalid value");
+  if (hop_limit <= 0 || hop_limit > 255)
+    return clib_error_return (0, "Value out of range [1-255]");
+  sr_pr_encaps_hop_limit = (u8) hop_limit;
+  return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (set_sr_hop_limit_command, static) = {
+  .path = "set sr encaps hop-limit",
+  .short_help = "set sr encaps hop-limit <value>",
+  .function = set_sr_hop_limit_command_fn,
+};
+/* *INDENT-ON* */
+
 /*********************** SR rewrite string computation ************************/
 /**
  * @brief SR rewrite string computation for IPv6 encapsulation (inline)
@@ -175,7 +214,7 @@ compute_rewrite_encaps (ip6_address_t * sl)
   iph->src_address.as_u64[1] = sr_pr_encaps_src.as_u64[1];
   iph->payload_length = header_length - IPv6_DEFAULT_HEADER_LENGTH;
   iph->protocol = IP_PROTOCOL_IPV6;
-  iph->hop_limit = IPv6_DEFAULT_HOP_LIMIT;
+  iph->hop_limit = sr_pr_encaps_hop_limit;
 
   if (vec_len (sl) > 1)
     {
@@ -2921,7 +2960,6 @@ sr_policy_rewrite_b_encaps (vlib_main_t * vm, vlib_node_runtime_t * node,
          ip6_header_t *ip0, *ip1, *ip2, *ip3;
          ip6_header_t *ip0_encap, *ip1_encap, *ip2_encap, *ip3_encap;
          ip6_sr_header_t *sr0, *sr1, *sr2, *sr3;
-         ip6_ext_header_t *prev0, *prev1, *prev2, *prev3;
          ip6_sr_sl_t *sl0, *sl1, *sl2, *sl3;
 
          /* Prefetch next iteration. */
@@ -2985,14 +3023,18 @@ sr_policy_rewrite_b_encaps (vlib_main_t * vm, vlib_node_runtime_t * node,
          ip2_encap = vlib_buffer_get_current (b2);
          ip3_encap = vlib_buffer_get_current (b3);
 
-         ip6_ext_header_find_t (ip0_encap, prev0, sr0,
-                                IP_PROTOCOL_IPV6_ROUTE);
-         ip6_ext_header_find_t (ip1_encap, prev1, sr1,
-                                IP_PROTOCOL_IPV6_ROUTE);
-         ip6_ext_header_find_t (ip2_encap, prev2, sr2,
-                                IP_PROTOCOL_IPV6_ROUTE);
-         ip6_ext_header_find_t (ip3_encap, prev3, sr3,
-                                IP_PROTOCOL_IPV6_ROUTE);
+         sr0 =
+           ip6_ext_header_find (vm, b0, ip0_encap, IP_PROTOCOL_IPV6_ROUTE,
+                                NULL);
+         sr1 =
+           ip6_ext_header_find (vm, b1, ip1_encap, IP_PROTOCOL_IPV6_ROUTE,
+                                NULL);
+         sr2 =
+           ip6_ext_header_find (vm, b2, ip2_encap, IP_PROTOCOL_IPV6_ROUTE,
+                                NULL);
+         sr3 =
+           ip6_ext_header_find (vm, b3, ip3_encap, IP_PROTOCOL_IPV6_ROUTE,
+                                NULL);
 
          end_bsid_encaps_srh_processing (node, b0, ip0_encap, sr0, &next0);
          end_bsid_encaps_srh_processing (node, b1, ip1_encap, sr1, &next1);
@@ -3078,7 +3120,6 @@ sr_policy_rewrite_b_encaps (vlib_main_t * vm, vlib_node_runtime_t * node,
          u32 bi0;
          vlib_buffer_t *b0;
          ip6_header_t *ip0 = 0, *ip0_encap = 0;
-         ip6_ext_header_t *prev0;
          ip6_sr_header_t *sr0;
          ip6_sr_sl_t *sl0;
          u32 next0 = SR_POLICY_REWRITE_NEXT_IP6_LOOKUP;
@@ -3098,8 +3139,9 @@ sr_policy_rewrite_b_encaps (vlib_main_t * vm, vlib_node_runtime_t * node,
                  vec_len (sl0->rewrite));
 
          ip0_encap = vlib_buffer_get_current (b0);
-         ip6_ext_header_find_t (ip0_encap, prev0, sr0,
-                                IP_PROTOCOL_IPV6_ROUTE);
+         sr0 =
+           ip6_ext_header_find (vm, b0, ip0_encap, IP_PROTOCOL_IPV6_ROUTE,
+                                NULL);
          end_bsid_encaps_srh_processing (node, b0, ip0_encap, sr0, &next0);
 
          clib_memcpy_fast (((u8 *) ip0_encap) - vec_len (sl0->rewrite),