iph->src_address = src_addr;
iph->dst_address = sid_list[0];
iph->payload_length = sr_hdr_len;
- iph->hop_limit = IPv6_DEFAULT_HOP_LIMIT;
+ iph->hop_limit = sr_get_hop_limit ();
if (num_sids > 1)
{
u8 encaps_source[16];
};
+/** \brief IPv6 SR Set SRv6 encapsulation hop-limit
+ @param client_index - opaque cookie to identify the sender
+ @param context - sender context, to match reply w/ request
+ @param hop_limit is the hop-limit value to set
+*/
+autoreply define sr_set_encap_hop_limit
+{
+ u32 client_index;
+ u32 context;
+ u8 hop_limit;
+};
+
/** \brief IPv6 SR steering add/del
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
extern void sr_set_source (ip6_address_t * address);
+extern void sr_set_hop_limit (u8 hop_limit);
+extern u8 sr_get_hop_limit (void);
+
/**
* @brief SR rewrite string computation for SRH insertion (inline)
*
_(SR_POLICY_DEL, sr_policy_del) \
_(SR_STEERING_ADD_DEL, sr_steering_add_del) \
_(SR_SET_ENCAP_SOURCE, sr_set_encap_source) \
+_(SR_SET_ENCAP_HOP_LIMIT, sr_set_encap_hop_limit) \
_(SR_LOCALSIDS_DUMP, sr_localsids_dump) \
_(SR_POLICIES_DUMP, sr_policies_dump) \
_(SR_STEERING_POL_DUMP, sr_steering_pol_dump)
REPLY_MACRO (VL_API_SR_SET_ENCAP_SOURCE_REPLY);
}
+static void
+vl_api_sr_set_encap_hop_limit_t_handler (vl_api_sr_set_encap_hop_limit_t * mp)
+{
+ vl_api_sr_set_encap_hop_limit_reply_t *rmp;
+ int rv = 0;
+
+ if (mp->hop_limit == 0)
+ rv = VNET_API_ERROR_INVALID_VALUE;
+ else
+ sr_set_hop_limit (mp->hop_limit);
+
+ REPLY_MACRO (VL_API_SR_SET_ENCAP_HOP_LIMIT_REPLY);
+}
+
static void vl_api_sr_steering_add_del_t_handler
(vl_api_sr_steering_add_del_t * mp)
{
In case the user decides to create an SR policy an IPv6 Source Address must be specified for the encapsulated traffic. In order to do so the user might use the following command:
set sr encaps source addr XXXX::YYYY
+
+Default hop-limit for the encapsulating IPv6 header is 64. It is possible to specify custom hop-limit value from 1 to 255 using this command:
+
+ set sr encaps hop-limit N
* @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
};
/* *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)
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)
{