blob: 2cd56327efbfaacfd396a7ccee57310238c8f3d1 [file] [log] [blame]
Neale Ranns5f8f6172019-04-18 10:23:56 +00001/*
2 *------------------------------------------------------------------
Neale Ranns03ce4622020-02-03 10:55:09 +00003 * teib_api.c - teib api
Neale Ranns5f8f6172019-04-18 10:23:56 +00004 *
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>
Neale Ranns03ce4622020-02-03 10:55:09 +000024#include <vnet/teib/teib.h>
Neale Ranns5f8f6172019-04-18 10:23:56 +000025#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>
Neale Ranns03ce4622020-02-03 10:55:09 +000030#include <vnet/teib/teib.api_enum.h>
31#include <vnet/teib/teib.api_types.h>
Neale Ranns5f8f6172019-04-18 10:23:56 +000032
Neale Ranns03ce4622020-02-03 10:55:09 +000033static u32 teib_base_msg_id;
34#define REPLY_MSG_ID_BASE teib_base_msg_id
Neale Ranns5f8f6172019-04-18 10:23:56 +000035
36#include <vlibapi/api_helper_macros.h>
37
38static void
Neale Ranns03ce4622020-02-03 10:55:09 +000039vl_api_teib_entry_add_del_t_handler (vl_api_teib_entry_add_del_t * mp)
Neale Ranns5f8f6172019-04-18 10:23:56 +000040{
Neale Ranns03ce4622020-02-03 10:55:09 +000041 vl_api_teib_entry_add_del_reply_t *rmp;
Neale Rannse6b83052020-09-17 12:56:47 +000042 ip_address_t peer, nh;
Neale Ranns5f8f6172019-04-18 10:23:56 +000043 int rv;
44
45 VALIDATE_SW_IF_INDEX ((&mp->entry));
46
Neale Ranns256b67b2020-09-02 14:46:53 +000047 ip_address_decode2 (&mp->entry.peer, &peer);
Neale Rannse6b83052020-09-17 12:56:47 +000048 ip_address_decode2 (&mp->entry.nh, &nh);
Neale Ranns5f8f6172019-04-18 10:23:56 +000049
50 if (mp->is_add)
Neale Ranns256b67b2020-09-02 14:46:53 +000051 rv = teib_entry_add (ntohl (mp->entry.sw_if_index),
Neale Rannse6b83052020-09-17 12:56:47 +000052 &peer, ntohl (mp->entry.nh_table_id), &nh);
Neale Ranns5f8f6172019-04-18 10:23:56 +000053 else
Neale Rannse6b83052020-09-17 12:56:47 +000054 rv = teib_entry_del (ntohl (mp->entry.sw_if_index), &peer);
Neale Ranns5f8f6172019-04-18 10:23:56 +000055
56 BAD_SW_IF_INDEX_LABEL;
57
Neale Ranns03ce4622020-02-03 10:55:09 +000058 REPLY_MACRO (VL_API_TEIB_ENTRY_ADD_DEL_REPLY);
Neale Ranns5f8f6172019-04-18 10:23:56 +000059}
60
Neale Ranns03ce4622020-02-03 10:55:09 +000061typedef struct vl_api_teib_send_t_
Neale Ranns5f8f6172019-04-18 10:23:56 +000062{
63 vl_api_registration_t *reg;
64 u32 context;
Neale Ranns03ce4622020-02-03 10:55:09 +000065} vl_api_teib_send_t;
Neale Ranns5f8f6172019-04-18 10:23:56 +000066
67static walk_rc_t
Neale Ranns03ce4622020-02-03 10:55:09 +000068vl_api_teib_send_one (index_t nei, void *arg)
Neale Ranns5f8f6172019-04-18 10:23:56 +000069{
Neale Ranns03ce4622020-02-03 10:55:09 +000070 vl_api_teib_details_t *mp;
71 vl_api_teib_send_t *ctx = arg;
72 const teib_entry_t *ne;
Neale Ranns4c16d802019-12-17 20:15:03 +000073 const fib_prefix_t *pfx;
Neale Ranns5f8f6172019-04-18 10:23:56 +000074
Neale Ranns28287212019-12-16 00:53:11 +000075 mp = vl_msg_api_alloc_zero (sizeof (*mp));
Neale Ranns03ce4622020-02-03 10:55:09 +000076 mp->_vl_msg_id = ntohs (VL_API_TEIB_DETAILS + REPLY_MSG_ID_BASE);
Neale Ranns5f8f6172019-04-18 10:23:56 +000077 mp->context = ctx->context;
78
Neale Ranns03ce4622020-02-03 10:55:09 +000079 ne = teib_entry_get (nei);
80 pfx = teib_entry_get_nh (ne);
Neale Ranns5f8f6172019-04-18 10:23:56 +000081
Neale Rannse6b83052020-09-17 12:56:47 +000082 ip_address_encode2 (teib_entry_get_peer (ne), &mp->entry.peer);
Neale Ranns4c16d802019-12-17 20:15:03 +000083 ip_address_encode (&pfx->fp_addr, IP46_TYPE_ANY, &mp->entry.nh);
Neale Ranns5f8f6172019-04-18 10:23:56 +000084 mp->entry.nh_table_id =
Neale Ranns4c16d802019-12-17 20:15:03 +000085 htonl (fib_table_get_table_id
Neale Ranns03ce4622020-02-03 10:55:09 +000086 (teib_entry_get_fib_index (ne), pfx->fp_proto));
87 mp->entry.sw_if_index = htonl (teib_entry_get_sw_if_index (ne));
Neale Ranns5f8f6172019-04-18 10:23:56 +000088
89 vl_api_send_msg (ctx->reg, (u8 *) mp);
90
91 return (WALK_CONTINUE);
92}
93
94static void
Neale Ranns03ce4622020-02-03 10:55:09 +000095vl_api_teib_dump_t_handler (vl_api_teib_dump_t * mp)
Neale Ranns5f8f6172019-04-18 10:23:56 +000096{
97 vl_api_registration_t *reg;
98
99 reg = vl_api_client_index_to_registration (mp->client_index);
100 if (!reg)
101 return;
102
Neale Ranns03ce4622020-02-03 10:55:09 +0000103 vl_api_teib_send_t ctx = {
Neale Ranns5f8f6172019-04-18 10:23:56 +0000104 .reg = reg,
105 .context = mp->context,
106 };
107
Neale Ranns03ce4622020-02-03 10:55:09 +0000108 teib_walk (vl_api_teib_send_one, &ctx);
Neale Ranns5f8f6172019-04-18 10:23:56 +0000109}
110
111/*
Neale Ranns03ce4622020-02-03 10:55:09 +0000112 * teib_api_hookup
Neale Ranns5f8f6172019-04-18 10:23:56 +0000113 * 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 */
Neale Ranns03ce4622020-02-03 10:55:09 +0000118#include <vnet/teib/teib.api.c>
Neale Ranns5f8f6172019-04-18 10:23:56 +0000119
120static clib_error_t *
Neale Ranns03ce4622020-02-03 10:55:09 +0000121teib_api_hookup (vlib_main_t * vm)
Neale Ranns5f8f6172019-04-18 10:23:56 +0000122{
Neale Ranns03ce4622020-02-03 10:55:09 +0000123 teib_base_msg_id = setup_message_id_table ();
Neale Ranns5f8f6172019-04-18 10:23:56 +0000124
125 return (NULL);
126}
127
Neale Ranns03ce4622020-02-03 10:55:09 +0000128VLIB_API_INIT_FUNCTION (teib_api_hookup);
Neale Ranns5f8f6172019-04-18 10:23:56 +0000129
130/*
131 * fd.io coding-style-patch-verification: ON
132 *
133 * Local Variables:
134 * eval: (c-set-style "gnu")
135 * End:
136 */