LCOV - code coverage report
Current view: top level - vnet/teib - teib_api.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 34 35 97.1 %
Date: 2023-07-05 22:20:52 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /*
       2             :  *------------------------------------------------------------------
       3             :  * teib_api.c - teib api
       4             :  *
       5             :  * Copyright (c) 2016 Cisco and/or its affiliates.
       6             :  * Licensed under the Apache License, Version 2.0 (the "License");
       7             :  * you may not use this file except in compliance with the License.
       8             :  * You may obtain a copy of the License at:
       9             :  *
      10             :  *     http://www.apache.org/licenses/LICENSE-2.0
      11             :  *
      12             :  * Unless required by applicable law or agreed to in writing, software
      13             :  * distributed under the License is distributed on an "AS IS" BASIS,
      14             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      15             :  * See the License for the specific language governing permissions and
      16             :  * limitations under the License.
      17             :  *------------------------------------------------------------------
      18             :  */
      19             : 
      20             : #include <vnet/vnet.h>
      21             : #include <vlibmemory/api.h>
      22             : 
      23             : #include <vnet/api_errno.h>
      24             : #include <vnet/teib/teib.h>
      25             : #include <vnet/ip/ip_types_api.h>
      26             : #include <vnet/fib/fib_table.h>
      27             : 
      28             : /* define message IDs */
      29             : #include <vnet/format_fns.h>
      30             : #include <vnet/teib/teib.api_enum.h>
      31             : #include <vnet/teib/teib.api_types.h>
      32             : 
      33             : static u32 teib_base_msg_id;
      34             : #define REPLY_MSG_ID_BASE teib_base_msg_id
      35             : 
      36             : #include <vlibapi/api_helper_macros.h>
      37             : 
      38             : static void
      39         170 : vl_api_teib_entry_add_del_t_handler (vl_api_teib_entry_add_del_t * mp)
      40             : {
      41             :   vl_api_teib_entry_add_del_reply_t *rmp;
      42             :   ip_address_t peer, nh;
      43             :   int rv;
      44             : 
      45         170 :   VALIDATE_SW_IF_INDEX ((&mp->entry));
      46             : 
      47         170 :   ip_address_decode2 (&mp->entry.peer, &peer);
      48         170 :   ip_address_decode2 (&mp->entry.nh, &nh);
      49             : 
      50         170 :   if (mp->is_add)
      51          85 :     rv = teib_entry_add (ntohl (mp->entry.sw_if_index),
      52             :                          &peer, ntohl (mp->entry.nh_table_id), &nh);
      53             :   else
      54          85 :     rv = teib_entry_del (ntohl (mp->entry.sw_if_index), &peer);
      55             : 
      56         170 :   BAD_SW_IF_INDEX_LABEL;
      57             : 
      58         170 :   REPLY_MACRO (VL_API_TEIB_ENTRY_ADD_DEL_REPLY);
      59             : }
      60             : 
      61             : typedef struct vl_api_teib_send_t_
      62             : {
      63             :   vl_api_registration_t *reg;
      64             :   u32 context;
      65             : } vl_api_teib_send_t;
      66             : 
      67             : static walk_rc_t
      68         621 : vl_api_teib_send_one (index_t nei, void *arg)
      69             : {
      70             :   vl_api_teib_details_t *mp;
      71         621 :   vl_api_teib_send_t *ctx = arg;
      72             :   const teib_entry_t *ne;
      73             :   const fib_prefix_t *pfx;
      74             : 
      75         621 :   mp = vl_msg_api_alloc_zero (sizeof (*mp));
      76         621 :   mp->_vl_msg_id = ntohs (VL_API_TEIB_DETAILS + REPLY_MSG_ID_BASE);
      77         621 :   mp->context = ctx->context;
      78             : 
      79         621 :   ne = teib_entry_get (nei);
      80         621 :   pfx = teib_entry_get_nh (ne);
      81             : 
      82         621 :   ip_address_encode2 (teib_entry_get_peer (ne), &mp->entry.peer);
      83         621 :   ip_address_encode (&pfx->fp_addr, IP46_TYPE_ANY, &mp->entry.nh);
      84         621 :   mp->entry.nh_table_id =
      85         621 :     htonl (fib_table_get_table_id
      86         621 :            (teib_entry_get_fib_index (ne), pfx->fp_proto));
      87         621 :   mp->entry.sw_if_index = htonl (teib_entry_get_sw_if_index (ne));
      88             : 
      89         621 :   vl_api_send_msg (ctx->reg, (u8 *) mp);
      90             : 
      91         621 :   return (WALK_CONTINUE);
      92             : }
      93             : 
      94             : static void
      95         102 : vl_api_teib_dump_t_handler (vl_api_teib_dump_t * mp)
      96             : {
      97             :   vl_api_registration_t *reg;
      98             : 
      99         102 :   reg = vl_api_client_index_to_registration (mp->client_index);
     100         102 :   if (!reg)
     101           0 :     return;
     102             : 
     103         102 :   vl_api_teib_send_t ctx = {
     104             :     .reg = reg,
     105         102 :     .context = mp->context,
     106             :   };
     107             : 
     108         102 :   teib_walk (vl_api_teib_send_one, &ctx);
     109             : }
     110             : 
     111             : /*
     112             :  * teib_api_hookup
     113             :  * Add vpe's API message handlers to the table.
     114             :  * vlib has already mapped shared memory and
     115             :  * added the client registration handlers.
     116             :  * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process()
     117             :  */
     118             : #include <vnet/teib/teib.api.c>
     119             : 
     120             : static clib_error_t *
     121         559 : teib_api_hookup (vlib_main_t * vm)
     122             : {
     123         559 :   teib_base_msg_id = setup_message_id_table ();
     124             : 
     125         559 :   return (NULL);
     126             : }
     127             : 
     128       20159 : VLIB_API_INIT_FUNCTION (teib_api_hookup);
     129             : 
     130             : /*
     131             :  * fd.io coding-style-patch-verification: ON
     132             :  *
     133             :  * Local Variables:
     134             :  * eval: (c-set-style "gnu")
     135             :  * End:
     136             :  */

Generated by: LCOV version 1.14