diff options
Diffstat (limited to 'src/vnet')
-rw-r--r-- | src/vnet/dpo/mpls_label_dpo.c | 2 | ||||
-rw-r--r-- | src/vnet/mpls/mpls.api | 1 | ||||
-rw-r--r-- | src/vnet/mpls/mpls_api.c | 9 | ||||
-rwxr-xr-x | src/vnet/srmpls/sr_mpls_policy.c | 21 |
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); |