blob: 170bace2b0a1db4a91af6f889177c4eb1b27f2bd [file] [log] [blame]
Neale Rannscbe25aa2019-09-30 10:53:31 +00001/*
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 <stddef.h>
17
18#include <vnet/arp/arp.h>
19
20#include <vnet/fib/fib_table.h>
21#include <vnet/ip/ip_types_api.h>
22
23#include <vpp/app/version.h>
24
25#include <vlibapi/api.h>
26#include <vlibmemory/api.h>
27
28/* define message IDs */
29#include <vnet/format_fns.h>
30#include <vnet/arp/arp.api_enum.h>
31#include <vnet/arp/arp.api_types.h>
32
33/**
34 * Base message ID fot the plugin
35 */
36static u32 arp_base_msg_id;
37#define REPLY_MSG_ID_BASE arp_base_msg_id
38
39#include <vlibapi/api_helper_macros.h>
40
41static void
42vl_api_proxy_arp_add_del_t_handler (vl_api_proxy_arp_add_del_t * mp)
43{
44 vl_api_proxy_arp_add_del_reply_t *rmp;
45 ip4_address_t lo, hi;
46 u32 fib_index;
47 int rv;
48
49 fib_index = fib_table_find (FIB_PROTOCOL_IP4, ntohl (mp->proxy.table_id));
50
51 if (~0 == fib_index)
52 {
53 rv = VNET_API_ERROR_NO_SUCH_FIB;
54 goto out;
55 }
56
57 ip4_address_decode (mp->proxy.low, &lo);
58 ip4_address_decode (mp->proxy.hi, &hi);
59
60 if (mp->is_add)
61 rv = arp_proxy_add (fib_index, &lo, &hi);
62 else
63 rv = arp_proxy_del (fib_index, &lo, &hi);
64
65out:
66 REPLY_MACRO (VL_API_PROXY_ARP_ADD_DEL_REPLY);
67}
68
69typedef struct proxy_arp_walk_ctx_t_
70{
71 vl_api_registration_t *reg;
72 u32 context;
73} proxy_arp_walk_ctx_t;
74
75static walk_rc_t
76send_proxy_arp_details (const ip4_address_t * lo_addr,
77 const ip4_address_t * hi_addr,
78 u32 fib_index, void *data)
79{
80 vl_api_proxy_arp_details_t *mp;
81 proxy_arp_walk_ctx_t *ctx;
82
83 ctx = data;
84
85 mp = vl_msg_api_alloc (sizeof (*mp));
86 clib_memset (mp, 0, sizeof (*mp));
87 mp->_vl_msg_id = ntohs (VL_API_PROXY_ARP_DETAILS + REPLY_MSG_ID_BASE);
88 mp->context = ctx->context;
89 mp->proxy.table_id = htonl (fib_index);
90
91 ip4_address_encode (lo_addr, mp->proxy.low);
92 ip4_address_encode (hi_addr, mp->proxy.hi);
93
94 vl_api_send_msg (ctx->reg, (u8 *) mp);
95
96 return (WALK_CONTINUE);
97}
98
99static void
100vl_api_proxy_arp_dump_t_handler (vl_api_proxy_arp_dump_t * mp)
101{
102 vl_api_registration_t *reg;
103
104 reg = vl_api_client_index_to_registration (mp->client_index);
105 if (!reg)
106 return;
107
108 proxy_arp_walk_ctx_t wctx = {
109 .reg = reg,
110 .context = mp->context,
111 };
112
113 proxy_arp_walk (send_proxy_arp_details, &wctx);
114}
115
116static walk_rc_t
117send_proxy_arp_intfc_details (u32 sw_if_index, void *data)
118{
119 vl_api_proxy_arp_intfc_details_t *mp;
120 proxy_arp_walk_ctx_t *ctx;
121
122 ctx = data;
123
124 mp = vl_msg_api_alloc (sizeof (*mp));
125 clib_memset (mp, 0, sizeof (*mp));
126 mp->_vl_msg_id = ntohs (VL_API_PROXY_ARP_INTFC_DETAILS + REPLY_MSG_ID_BASE);
127 mp->context = ctx->context;
128 mp->sw_if_index = htonl (sw_if_index);
129
130 vl_api_send_msg (ctx->reg, (u8 *) mp);
131
132 return (WALK_CONTINUE);
133}
134
135static void
136vl_api_proxy_arp_intfc_dump_t_handler (vl_api_proxy_arp_intfc_dump_t * mp)
137{
138 vl_api_registration_t *reg;
139
140 reg = vl_api_client_index_to_registration (mp->client_index);
141 if (!reg)
142 return;
143
144 proxy_arp_walk_ctx_t wctx = {
145 .reg = reg,
146 .context = mp->context,
147 };
148
149 proxy_arp_intfc_walk (send_proxy_arp_intfc_details, &wctx);
150}
151
152static void
153 vl_api_proxy_arp_intfc_enable_disable_t_handler
154 (vl_api_proxy_arp_intfc_enable_disable_t * mp)
155{
156 vl_api_proxy_arp_intfc_enable_disable_reply_t *rmp;
157 int rv;
158
159 VALIDATE_SW_IF_INDEX (mp);
160
161 if (mp->enable)
162 rv = arp_proxy_enable (ntohl (mp->sw_if_index));
163 else
164 rv = arp_proxy_disable (ntohl (mp->sw_if_index));
165
166 BAD_SW_IF_INDEX_LABEL;
167
168 REPLY_MACRO (VL_API_PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY);
169}
170
171#include <vnet/arp/arp.api.c>
172
173static clib_error_t *
174arp_api_init (vlib_main_t * vm)
175{
176 /* Ask for a correctly-sized block of API message decode slots */
177 arp_base_msg_id = setup_message_id_table ();
178
179 return 0;
180}
181
182VLIB_INIT_FUNCTION (arp_api_init);
183
184/*
185 * fd.io coding-style-patch-verification: ON
186 *
187 * Local Variables:
188 * eval: (c-set-style "gnu")
189 * End:
190 */