summaryrefslogtreecommitdiffstats
path: root/src/vnet/bier
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2018-02-23 05:29:09 -0800
committerDamjan Marion <dmarion.lists@gmail.com>2018-03-09 11:59:58 +0000
commit31ed74407643595fdce206e9d7487108fb8b33ab (patch)
treec22c3703c30b7d457b858fe899f56e57613cbb52 /src/vnet/bier
parent8f931a47b0fa58d5d33a792062650a42ff8bef70 (diff)
MPLS Unifom mode
- support both pipe and uniform modes for all MPLS LSP - all API programming for output-labels requires that the mode (and associated data) is specificed - API changes in MPLS, BIER and IP are involved - new DPO [sub] types for MPLS labels to handle the two modes. Change-Id: I87b76401e996f10dfbdbe4552ff6b19af958783c Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/bier')
-rw-r--r--src/vnet/bier/bier.api10
-rw-r--r--src/vnet/bier/bier_api.c20
-rw-r--r--src/vnet/bier/bier_fmask.c9
-rw-r--r--src/vnet/bier/bier_output.c4
-rw-r--r--src/vnet/bier/bier_test.c30
5 files changed, 46 insertions, 27 deletions
diff --git a/src/vnet/bier/bier.api b/src/vnet/bier/bier.api
index 446863c8ee8..d07379e92f0 100644
--- a/src/vnet/bier/bier.api
+++ b/src/vnet/bier/bier.api
@@ -18,7 +18,7 @@
This file defines vpp BIER control-plane API messages which are generally
called through a shared memory interface.
*/
-option version = "1.0.0";
+option version = "1.1.0";
import "vnet/fib/fib_types.api";
/** \brief BIER Table Indentifier
@@ -84,7 +84,7 @@ autoreply define bier_route_add_del
u8 br_is_replace;
vl_api_bier_table_id_t br_tbl_id;
u8 br_n_paths;
- vl_api_fib_path3_t br_paths[br_n_paths];
+ vl_api_fib_path_t br_paths[br_n_paths];
};
define bier_route_dump
@@ -101,7 +101,7 @@ define bier_route_details
u16 br_bp;
vl_api_bier_table_id_t br_tbl_id;
u32 br_n_paths;
- vl_api_fib_path3_t br_paths[br_n_paths];
+ vl_api_fib_path_t br_paths[br_n_paths];
};
/** \brief BIER Imposition Add
@@ -211,7 +211,7 @@ autoreply define bier_disp_entry_add_del
u8 bde_is_add;
u8 bde_payload_proto;
u8 bde_n_paths;
- vl_api_fib_path3_t bde_paths[bde_n_paths];
+ vl_api_fib_path_t bde_paths[bde_n_paths];
};
define bier_disp_entry_dump
@@ -229,7 +229,7 @@ define bier_disp_entry_details
u8 bde_is_add;
u8 bde_payload_proto;
u8 bde_n_paths;
- vl_api_fib_path3_t bde_paths[bde_n_paths];
+ vl_api_fib_path_t bde_paths[bde_n_paths];
};
/*
diff --git a/src/vnet/bier/bier_api.c b/src/vnet/bier/bier_api.c
index 4b1d1c28781..77b2cabaa44 100644
--- a/src/vnet/bier/bier_api.c
+++ b/src/vnet/bier/bier_api.c
@@ -202,8 +202,16 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp)
mp->br_paths[ii].n_labels - 1);
for (jj = 0; jj < mp->br_paths[ii].n_labels; jj++)
{
- brpath->frp_label_stack[jj] =
- ntohl(mp->br_paths[ii].label_stack[jj]);
+ brpath->frp_label_stack[jj].fml_value =
+ ntohl(mp->br_paths[ii].label_stack[jj].label);
+ brpath->frp_label_stack[jj].fml_ttl =
+ mp->br_paths[ii].label_stack[jj].ttl;
+ brpath->frp_label_stack[jj].fml_exp =
+ mp->br_paths[ii].label_stack[jj].exp;
+ brpath->frp_label_stack[jj].fml_mode =
+ (mp->br_paths[ii].label_stack[jj].is_uniform ?
+ FIB_MPLS_LSP_MODE_UNIFORM :
+ FIB_MPLS_LSP_MODE_PIPE);
}
if (mp->br_paths[ii].is_udp_encap)
@@ -275,11 +283,11 @@ send_bier_route_details (const bier_table_t *bt,
fib_route_path_encode_t *api_rpaths = NULL, *api_rpath;
bier_route_details_walk_t *ctx = args;
vl_api_bier_route_details_t *mp;
- vl_api_fib_path3_t *fp;
+ vl_api_fib_path_t *fp;
u32 n_paths, m_size;
n_paths = fib_path_list_get_n_paths(be->be_path_list);
- m_size = sizeof(*mp) + (n_paths * sizeof(vl_api_fib_path3_t));
+ m_size = sizeof(*mp) + (n_paths * sizeof(vl_api_fib_path_t));
mp = vl_msg_api_alloc(m_size);
if (!mp)
return;
@@ -636,7 +644,7 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt,
bier_disp_entry_details_walk_t *ctx = args;
vl_api_bier_disp_entry_details_t *mp;
bier_hdr_proto_id_t pproto;
- vl_api_fib_path3_t *fp;
+ vl_api_fib_path_t *fp;
u32 n_paths, m_size;
FOR_EACH_BIER_HDR_PROTO(pproto)
@@ -645,7 +653,7 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt,
if (INDEX_INVALID != pl)
{
n_paths = fib_path_list_get_n_paths(pl);
- m_size = sizeof(*mp) + (n_paths * sizeof(vl_api_fib_path3_t));
+ m_size = sizeof(*mp) + (n_paths * sizeof(vl_api_fib_path_t));
mp = vl_msg_api_alloc(m_size);
if (!mp)
return;
diff --git a/src/vnet/bier/bier_fmask.c b/src/vnet/bier/bier_fmask.c
index 2fc24dca819..31d884af060 100644
--- a/src/vnet/bier/bier_fmask.c
+++ b/src/vnet/bier/bier_fmask.c
@@ -177,16 +177,13 @@ bier_fmask_init (bier_fmask_t *bfm,
if (!(bfm->bfm_flags & BIER_FMASK_FLAG_DISP))
{
- /*
- * leave this label in host byte order so we can OR in the TTL
- */
if (NULL != rpaths->frp_label_stack)
{
- olabel = rpaths->frp_label_stack[0];
+ olabel = rpaths->frp_label_stack[0].fml_value;
vnet_mpls_uc_set_label(&bfm->bfm_label, olabel);
vnet_mpls_uc_set_exp(&bfm->bfm_label, 0);
vnet_mpls_uc_set_s(&bfm->bfm_label, 1);
- vnet_mpls_uc_set_ttl(&bfm->bfm_label, 0);
+ vnet_mpls_uc_set_ttl(&bfm->bfm_label, 64);
bfm->bfm_flags |= BIER_FMASK_FLAG_MPLS;
}
else
@@ -207,7 +204,9 @@ bier_fmask_init (bier_fmask_t *bfm,
vnet_mpls_uc_set_label(&bfm->bfm_label, id);
vnet_mpls_uc_set_s(&bfm->bfm_label, 1);
vnet_mpls_uc_set_exp(&bfm->bfm_label, 0);
+ vnet_mpls_uc_set_ttl(&bfm->bfm_label, 64);
}
+ bfm->bfm_label = clib_host_to_net_u32(bfm->bfm_label);
}
bfm->bfm_pl = fib_path_list_create((FIB_PATH_LIST_FLAG_SHARED |
diff --git a/src/vnet/bier/bier_output.c b/src/vnet/bier/bier_output.c
index db115d3ad5e..01eeffe475c 100644
--- a/src/vnet/bier/bier_output.c
+++ b/src/vnet/bier/bier_output.c
@@ -140,8 +140,8 @@ bier_output (vlib_main_t * vm,
h0 = vlib_buffer_get_current(b0);
h0[0] = bfm0->bfm_label;
- vnet_mpls_uc_set_ttl(h0, vnet_buffer(b0)->mpls.ttl - 1);
- h0[0] = clib_host_to_net_u32(h0[0]);
+
+ ((char*)h0)[3]= vnet_buffer(b0)->mpls.ttl - 1;
}
/*
diff --git a/src/vnet/bier/bier_test.c b/src/vnet/bier/bier_test.c
index 08a8c55954d..6c7af829811 100644
--- a/src/vnet/bier/bier_test.c
+++ b/src/vnet/bier/bier_test.c
@@ -316,7 +316,10 @@ bier_test_mpls_spf (void)
.frp_bier_fib_index = bti,
.frp_sw_if_index = ~0,
};
- vec_add1(path_1_1_1_1.frp_label_stack, 500);
+ fib_mpls_label_t fml_500 = {
+ .fml_value = 500,
+ };
+ vec_add1(path_1_1_1_1.frp_label_stack, fml_500);
vec_add1(paths_1_1_1_1, path_1_1_1_1);
const fib_prefix_t pfx_1_1_1_1_s_32 = {
.fp_addr = nh_1_1_1_1,
@@ -389,8 +392,10 @@ bier_test_mpls_spf (void)
.ttl = 255,
},
};
- mpls_label_t *out_lbl_99 = NULL;
- vec_add1(out_lbl_99, 99);
+ fib_mpls_label_t *out_lbl_99 = NULL, fml_99 = {
+ .fml_value = 99,
+ };
+ vec_add1(out_lbl_99, fml_99);
fei = fib_table_entry_update_one_path(0,
&pfx_1_1_1_1_s_32,
@@ -443,8 +448,10 @@ bier_test_mpls_spf (void)
.ttl = 255,
},
};
- mpls_label_t *out_lbl_100 = NULL;
- vec_add1(out_lbl_100, 100);
+ fib_mpls_label_t *out_lbl_100 = NULL, fml_100 = {
+ .fml_value = 100,
+ };
+ vec_add1(out_lbl_100, fml_100);
fei = fib_table_entry_path_add(0,
&pfx_1_1_1_1_s_32,
@@ -505,13 +512,18 @@ bier_test_mpls_spf (void)
.frp_bier_fib_index = bti,
.frp_sw_if_index = ~0,
};
- vec_add1(path_1_1_1_2.frp_label_stack, 501);
+ fib_mpls_label_t fml_501 = {
+ .fml_value = 501,
+ };
+ vec_add1(path_1_1_1_2.frp_label_stack, fml_501);
vec_add1(paths_1_1_1_2, path_1_1_1_2);
input_paths_1_1_1_2 = vec_dup(paths_1_1_1_2);
index_t bei_3;
- mpls_label_t *out_lbl_101 = NULL;
- vec_add1(out_lbl_101, 101);
+ fib_mpls_label_t *out_lbl_101 = NULL, fml_101 = {
+ .fml_value = 101,
+ };
+ vec_add1(out_lbl_101, fml_101);
fei = fib_table_entry_path_add(0,
&pfx_1_1_1_2_s_32,
FIB_SOURCE_API,
@@ -605,7 +617,7 @@ bier_test_mpls_spf (void)
* add the via back
*/
out_lbl_101 = NULL;
- vec_add1(out_lbl_101, 101);
+ vec_add1(out_lbl_101, fml_101);
fei = fib_table_entry_path_add(0,
&pfx_1_1_1_2_s_32,
FIB_SOURCE_API,