aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/srv6
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/srv6')
-rw-r--r--src/vnet/srv6/sr.api33
-rw-r--r--src/vnet/srv6/sr_api.c69
2 files changed, 102 insertions, 0 deletions
diff --git a/src/vnet/srv6/sr.api b/src/vnet/srv6/sr.api
index b33f0ebd811..6190a8c7ff5 100644
--- a/src/vnet/srv6/sr.api
+++ b/src/vnet/srv6/sr.api
@@ -28,6 +28,14 @@ typedef srv6_sid_list
vl_api_ip6_address_t sids[16];
};
+typedef srv6_sid_list_with_sl_index
+{
+ u8 num_sids;
+ u32 weight;
+ u32 sl_index;
+ vl_api_ip6_address_t sids[16];
+};
+
/** \brief IPv6 SR LocalSID add/del request
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
@@ -197,6 +205,7 @@ define sr_policies_dump
u32 context;
};
+
define sr_policies_details
{
u32 context;
@@ -208,6 +217,30 @@ define sr_policies_details
vl_api_srv6_sid_list_t sid_lists[num_sid_lists];
};
+/** \brief Dump the list of SR policies along with actual segment list index on VPP
+ @param client_index - opaque cookie to identify the sender
+ @param context - sender context, to match reply w/ request
+*/
+define sr_policies_with_sl_index_dump
+{
+ u32 client_index;
+ u32 context;
+ option status="in_progress";
+};
+
+
+define sr_policies_with_sl_index_details
+{
+ u32 context;
+ vl_api_ip6_address_t bsid;
+ bool is_spray;
+ bool is_encap;
+ u32 fib_table;
+ u8 num_sid_lists;
+ vl_api_srv6_sid_list_with_sl_index_t sid_lists[num_sid_lists];
+ option status="in_progress";
+};
+
/** \brief Dump the steering policies
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
diff --git a/src/vnet/srv6/sr_api.c b/src/vnet/srv6/sr_api.c
index c039da01c63..278111f1dfc 100644
--- a/src/vnet/srv6/sr_api.c
+++ b/src/vnet/srv6/sr_api.c
@@ -56,6 +56,7 @@ _(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_POLICIES_WITH_SL_INDEX_DUMP, sr_policies_with_sl_index_dump) \
_(SR_STEERING_POL_DUMP, sr_steering_pol_dump)
static void vl_api_sr_localsid_add_del_t_handler
@@ -344,6 +345,74 @@ vl_api_sr_policies_dump_t_handler (vl_api_sr_policies_dump_t * mp)
/* *INDENT-ON* */
}
+
+
+static void send_sr_policies_details_with_sl_index
+ (ip6_sr_policy_t * t, vl_api_registration_t * reg, u32 context)
+{
+ vl_api_sr_policies_with_sl_index_details_t *rmp;
+ ip6_sr_main_t *sm = &sr_main;
+
+ u32 *sl_index, slidx = 0;
+ ip6_sr_sl_t *segment_list = 0;
+ ip6_address_t *segment;
+ vl_api_srv6_sid_list_with_sl_index_t *api_sid_list;
+
+ rmp = vl_msg_api_alloc (sizeof (*rmp) +
+ vec_len (t->segments_lists) *
+ sizeof (vl_api_srv6_sid_list_with_sl_index_t));
+ clib_memset (rmp, 0,
+ (sizeof (*rmp) +
+ vec_len (t->segments_lists) *
+ sizeof (vl_api_srv6_sid_list_with_sl_index_t)));
+
+ rmp->_vl_msg_id = ntohs (VL_API_SR_POLICIES_WITH_SL_INDEX_DETAILS);
+ ip6_address_encode (&t->bsid, rmp->bsid);
+ rmp->is_encap = t->is_encap;
+ rmp->is_spray = t->type;
+ rmp->fib_table = htonl (t->fib_table);
+ rmp->num_sid_lists = vec_len (t->segments_lists);
+
+ /* Fill in all the segments lists */
+ vec_foreach (sl_index, t->segments_lists)
+ {
+ segment_list = pool_elt_at_index (sm->sid_lists, *sl_index);
+
+ api_sid_list = &rmp->sid_lists[sl_index - t->segments_lists];
+ api_sid_list->sl_index = htonl (*sl_index);
+ api_sid_list->num_sids = vec_len (segment_list->segments);
+ api_sid_list->weight = htonl (segment_list->weight);
+ slidx = 0;
+ vec_foreach (segment, segment_list->segments)
+ {
+ ip6_address_encode (segment, api_sid_list->sids[slidx++]);
+ }
+ }
+
+ rmp->context = context;
+ vl_api_send_msg (reg, (u8 *) rmp);
+}
+
+static void
+ vl_api_sr_policies_with_sl_index_dump_t_handler
+ (vl_api_sr_policies_with_sl_index_dump_t * mp)
+{
+ vl_api_registration_t *reg;
+ ip6_sr_main_t *sm = &sr_main;
+ ip6_sr_policy_t *t;
+
+ reg = vl_api_client_index_to_registration (mp->client_index);
+ if (!reg)
+ return;
+
+ /* *INDENT-OFF* */
+ pool_foreach (t, sm->sr_policies,
+ ({
+ send_sr_policies_details_with_sl_index(t, reg, mp->context);
+ }));
+ /* *INDENT-ON* */
+}
+
static void send_sr_steering_pol_details
(ip6_sr_steering_policy_t * t, vl_api_registration_t * reg, u32 context)
{