- bier_table_id_t bti = {
- .bti_set = mp->bi_tbl_id.bt_set,
- .bti_sub_domain = mp->bi_tbl_id.bt_sub_domain,
- .bti_hdr_len = mp->bi_tbl_id.bt_hdr_len_id,
- .bti_type = BIER_TABLE_MPLS_SPF,
- .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN,
- };
- bier_bit_string_t bs = {
- .bbs_len = mp->bi_n_bytes,
- .bbs_buckets = mp->bi_bytes,
- };
-
- bii = bier_imp_add_or_lock(&bti, ntohs(mp->bi_src), &bs);
+ /*
+ * The BSL support by VPP is limited to the size of the
+ * available space in the vlib_buffer_t
+ */
+ if (mp->bi_tbl_id.bt_hdr_len_id >= BIER_HDR_LEN_2048)
+ {
+ rv = VNET_API_ERROR_BIER_BSL_UNSUP;
+ }
+ else
+ {
+ bier_table_id_t bti = {
+ .bti_set = mp->bi_tbl_id.bt_set,
+ .bti_sub_domain = mp->bi_tbl_id.bt_sub_domain,
+ .bti_hdr_len = mp->bi_tbl_id.bt_hdr_len_id,
+ .bti_type = BIER_TABLE_MPLS_SPF,
+ .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN,
+ };
+ bier_bit_string_t bs = {
+ .bbs_len = mp->bi_n_bytes,
+ .bbs_buckets = mp->bi_bytes,
+ };
+
+ bii = bier_imp_add_or_lock(&bti, ntohs(mp->bi_src), &bs);
+ }