aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet')
-rw-r--r--src/vnet/dpo/mpls_label_dpo.c2
-rw-r--r--src/vnet/mpls/mpls.api1
-rw-r--r--src/vnet/mpls/mpls_api.c9
-rwxr-xr-xsrc/vnet/srmpls/sr_mpls_policy.c21
4 files changed, 30 insertions, 3 deletions
diff --git a/src/vnet/dpo/mpls_label_dpo.c b/src/vnet/dpo/mpls_label_dpo.c
index 0a7063cc99a..bee155b9035 100644
--- a/src/vnet/dpo/mpls_label_dpo.c
+++ b/src/vnet/dpo/mpls_label_dpo.c
@@ -205,7 +205,7 @@ format_mpls_label_dpo (u8 *s, va_list *args)
}
mld = mpls_label_dpo_get(index);
- s = format(s, "mpls-label[%U%d]:",
+ s = format(s, "mpls-label[%U@%d]:",
format_mpls_label_dpo_flags,
(int) mld->mld_flags, index);
diff --git a/src/vnet/mpls/mpls.api b/src/vnet/mpls/mpls.api
index 6047d255aa7..7ab0f3750cc 100644
--- a/src/vnet/mpls/mpls.api
+++ b/src/vnet/mpls/mpls.api
@@ -54,6 +54,7 @@ define mpls_tunnel_add_del
u8 mt_next_hop_preference;
u8 mt_next_hop[16];
u8 mt_next_hop_n_out_labels;
+ u32 mt_next_hop_via_label;
u32 mt_next_hop_sw_if_index;
u32 mt_next_hop_table_id;
vl_api_fib_mpls_label_t mt_next_hop_out_label_stack[mt_next_hop_n_out_labels];
diff --git a/src/vnet/mpls/mpls_api.c b/src/vnet/mpls/mpls_api.c
index a35e94d3411..8fec8e82e1e 100644
--- a/src/vnet/mpls/mpls_api.c
+++ b/src/vnet/mpls/mpls_api.c
@@ -306,6 +306,7 @@ vl_api_mpls_tunnel_add_del_t_handler (vl_api_mpls_tunnel_add_del_t * mp)
u32 tunnel_sw_if_index;
int ii;
fib_route_path_t rpath, *rpaths = NULL;
+ u32 next_hop_via_label;
memset (&rpath, 0, sizeof (rpath));
@@ -326,6 +327,14 @@ vl_api_mpls_tunnel_add_del_t_handler (vl_api_mpls_tunnel_add_del_t * mp)
rpath.frp_sw_if_index = ntohl (mp->mt_next_hop_sw_if_index);
rpath.frp_weight = 1;
+ next_hop_via_label = ntohl (mp->mt_next_hop_via_label);
+ if ((MPLS_LABEL_INVALID != next_hop_via_label) && (0 != next_hop_via_label))
+ {
+ rpath.frp_proto = DPO_PROTO_MPLS;
+ rpath.frp_local_label = next_hop_via_label;
+ rpath.frp_eos = MPLS_NON_EOS;
+ }
+
if (mp->mt_is_add)
{
for (ii = 0; ii < mp->mt_next_hop_n_out_labels; ii++)
diff --git a/src/vnet/srmpls/sr_mpls_policy.c b/src/vnet/srmpls/sr_mpls_policy.c
index 5bb7fb2bff5..86cd169716a 100755
--- a/src/vnet/srmpls/sr_mpls_policy.c
+++ b/src/vnet/srmpls/sr_mpls_policy.c
@@ -61,6 +61,7 @@ create_sl (mpls_sr_policy_t * sr_policy, mpls_label_t * sl, u32 weight)
{
mpls_sr_main_t *sm = &sr_mpls_main;
mpls_sr_sl_t *segment_list;
+ u32 ii;
pool_get (sm->sid_lists, segment_list);
memset (segment_list, 0, sizeof (*segment_list));
@@ -85,8 +86,24 @@ create_sl (mpls_sr_policy_t * sr_policy, mpls_label_t * sl, u32 weight)
.frp_local_label = sl[0],
};
- if (vec_len (sl) - 1)
- vec_add (path.frp_label_stack, sl + 1, vec_len (sl) - 1);
+ if (vec_len (sl) > 1)
+ {
+ vec_validate (path.frp_label_stack, vec_len (sl) - 2);
+ for (ii = 1; ii < vec_len (sl); ii++)
+ {
+ path.frp_label_stack[ii - 1].fml_value = sl[ii];
+ }
+ }
+ else
+ {
+ /*
+ * add an impliciet NULL label to allow non-eos recursion
+ */
+ fib_mpls_label_t lbl = {
+ .fml_value = MPLS_IETF_IMPLICIT_NULL_LABEL,
+ };
+ vec_add1 (path.frp_label_stack, lbl);
+ }
fib_route_path_t *paths = NULL;
vec_add1 (paths, path);