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 : */