LCOV - code coverage report
Current view: top level - vnet/bier - bier_update.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 3 70 4.3 %
Date: 2023-07-05 22:20:52 Functions: 6 9 66.7 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2016 Cisco and/or its affiliates.
       3             :  * Licensed under the Apache License, Version 2.0 (the "License");
       4             :  * you may not use this file except in compliance with the License.
       5             :  * You may obtain a copy of the License at:
       6             :  *
       7             :  *     http://www.apache.org/licenses/LICENSE-2.0
       8             :  *
       9             :  * Unless required by applicable law or agreed to in writing, software
      10             :  * distributed under the License is distributed on an "AS IS" BASIS,
      11             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12             :  * See the License for the specific language governing permissions and
      13             :  * limitations under the License.
      14             :  */
      15             : 
      16             : #include <vnet/vnet.h>
      17             : #include <vnet/mpls/mpls.h>
      18             : 
      19             : #include <vnet/bier/bier_table.h>
      20             : #include <vnet/bier/bier_types.h>
      21             : #include <vnet/bier/bier_update.h>
      22             : 
      23             : clib_error_t *
      24           0 : vnet_bier_table_cmd (vlib_main_t * vm,
      25             :                      unformat_input_t * input,
      26             :                      vlib_cli_command_t * cmd)
      27             : {
      28             :     u32 hdr_len, local_label;
      29           0 :     clib_error_t * error = 0;
      30           0 :     bier_table_id_t bti = {
      31             :         .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN,
      32             :     };
      33           0 :     u32 is_add = 0;
      34             : 
      35           0 :     local_label = MPLS_LABEL_INVALID;
      36             : 
      37           0 :     while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
      38           0 :         if (unformat (input, "del")) {
      39           0 :             is_add = 0;
      40           0 :         } else if (unformat (input, "add")) {
      41           0 :             is_add = 1;
      42           0 :         } else if (unformat (input, "sd %d", &bti.bti_sub_domain)) {
      43           0 :         } else if (unformat (input, "set %d", &bti.bti_set)) {
      44           0 :         } else if (unformat (input, "bsl %d", &hdr_len)) {
      45           0 :         } else if (unformat (input, "mpls %d", &local_label)) {
      46             :         } else {
      47           0 :             error = unformat_parse_error (input);
      48           0 :             goto done;
      49             :         }
      50             :     }
      51             : 
      52           0 :     bti.bti_hdr_len = bier_hdr_bit_len_to_id(hdr_len);
      53             :     // FIXME
      54           0 :     bti.bti_type = BIER_TABLE_MPLS_SPF;
      55             : 
      56           0 :     if (is_add)
      57             :     {
      58           0 :         bier_table_add_or_lock(&bti, local_label);
      59             :     }
      60             :     else
      61             :     {
      62           0 :         bier_table_unlock(&bti);
      63             :     }
      64             : 
      65           0 : done:
      66           0 :     return (error);
      67             : }
      68             : 
      69      272887 : VLIB_CLI_COMMAND (bier_table_command) = {
      70             :   .path = "bier table",
      71             :   .short_help = "bier table [add|del] sd <sub-domain> set <SET> bsl <bit-string-length> [mpls <label>]",
      72             :   .function = vnet_bier_table_cmd,
      73             : };
      74             : 
      75             : clib_error_t *
      76           0 : vnet_bier_route_cmd (vlib_main_t * vm,
      77             :                      unformat_input_t * input,
      78             :                      vlib_cli_command_t * cmd)
      79             : {
      80           0 :     clib_error_t * error = NULL;
      81           0 :     fib_route_path_t *brps = NULL, brp = {
      82             :         .frp_flags = FIB_ROUTE_PATH_BIER_FMASK,
      83             :     };
      84             :     u32 hdr_len, payload_proto;
      85           0 :     bier_table_id_t bti = {
      86             :         .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN,
      87             :     };
      88             :     bier_bp_t bp;
      89           0 :     u32 add = 1;
      90             : 
      91           0 :     payload_proto = DPO_PROTO_BIER;
      92             : 
      93           0 :     while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
      94           0 :         if (unformat (input, "del")) {
      95           0 :             add = 0;
      96           0 :         } else if (unformat (input, "add")) {
      97           0 :             add = 1;
      98           0 :         } else if (unformat (input, "sd %d", &bti.bti_sub_domain)) {
      99           0 :         } else if (unformat (input, "set %d", &bti.bti_set)) {
     100           0 :         } else if (unformat (input, "bsl %d", &hdr_len)) {
     101           0 :         } else if (unformat (input, "bp %d", &bp)) {
     102           0 :         } else if (unformat (input, "via %U",
     103             :                              unformat_fib_route_path,
     104             :                              &brp, &payload_proto)) {
     105             :         } else {
     106           0 :             error = unformat_parse_error (input);
     107           0 :             goto done;
     108             :         }
     109             :     }
     110             : 
     111           0 :     vec_add1(brps, brp);
     112           0 :     bti.bti_hdr_len = bier_hdr_bit_len_to_id(hdr_len);
     113             :     // FIXME
     114           0 :     bti.bti_type    = BIER_TABLE_MPLS_SPF;
     115             : 
     116           0 :     if (add)
     117             :     {
     118           0 :         bier_table_route_path_add(&bti, bp, brps);
     119             :     }
     120             :     else
     121             :     {
     122           0 :         bier_table_route_path_remove(&bti, bp, brps);
     123             :     }
     124             : 
     125           0 : done:
     126           0 :     vec_free(brps);
     127           0 :     return (error);
     128             : }
     129             : 
     130      272887 : VLIB_CLI_COMMAND (bier_route_command) = {
     131             :   .path = "bier route",
     132             :   .short_help = "bier route [add|del] sd <sud-domain> set <set> bsl <bit-string-length> bp <bit-position> via [next-hop-address] [next-hop-interface] [next-hop-table <value>] [weight <value>] [preference <value>] [udp-encap-id <value>] [ip4-lookup-in-table <value>] [ip6-lookup-in-table <value>] [mpls-lookup-in-table <value>] [resolve-via-host] [resolve-via-connected] [rx-ip4 <interface>] [out-labels <value value value>]",
     133             :   .function = vnet_bier_route_cmd,
     134             : };
     135             : 
     136             : static clib_error_t *
     137           0 : show_bier_fib_command_fn (vlib_main_t * vm,
     138             :                           unformat_input_t * input,
     139             :                           vlib_cli_command_t * cmd)
     140             : {
     141             :     bier_show_flags_t flags;
     142             :     index_t bti, bei;
     143             :     bier_bp_t bp;
     144             : 
     145           0 :     bp = BIER_BP_INVALID;
     146           0 :     bti = bei = INDEX_INVALID;
     147           0 :     flags = BIER_SHOW_BRIEF;
     148             : 
     149           0 :     while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
     150           0 :         if (unformat (input, "%d %d", &bti, &bp))
     151             :         {
     152           0 :             flags = BIER_SHOW_DETAIL;
     153             :         }
     154           0 :         else if (unformat (input, "%d", &bti))
     155             :         {
     156           0 :             flags = BIER_SHOW_DETAIL;
     157             :         }
     158             :         else
     159             :         {
     160           0 :             break;
     161             :         }
     162             :     }
     163             : 
     164           0 :     if (INDEX_INVALID == bti)
     165             :     {
     166           0 :         bier_table_show_all(vm, flags);
     167             :     }
     168             :     else
     169             :     {
     170           0 :         if (!pool_is_free_index(bier_table_pool, bti))
     171             :         {
     172           0 :             if (BIER_BP_INVALID == bp)
     173             :             {
     174           0 :                 vlib_cli_output (vm, "%U", format_bier_table, bti, flags);
     175             :             }
     176             :             else
     177             :             {
     178           0 :                 vlib_cli_output (vm, "%U", format_bier_table_entry, bti, bp);
     179             :             }
     180             :         }
     181             :     }
     182           0 :     return (NULL);
     183             : }
     184             : 
     185      272887 : VLIB_CLI_COMMAND (show_bier_fib_command, static) = {
     186             :     .path = "show bier fib",
     187             :     .short_help = "show bier fib [table-index] [bit-position]",
     188             :     .function = show_bier_fib_command_fn,
     189             : };

Generated by: LCOV version 1.14