FD.io VPP  v21.06-3-gbb25fbf28
Vector Packet Processing
pnat_api.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 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 #include "pnat.h"
16 #include <pnat/pnat.api_enum.h>
17 #include <pnat/pnat.api_types.h>
18 #include <vlibmemory/api.h>
19 #include <vnet/fib/fib_table.h>
20 #include <vnet/ip/ip.h>
21 #include <vnet/ip/ip_types_api.h>
25 
26 /*
27  * This file contains the API handlers for the pnat.api
28  */
29 
30 #define REPLY_MSG_ID_BASE pm->msg_id_base
32 
34  pnat_main_t *pm = &pnat_main;
36  u32 binding_index;
37  int rv = pnat_binding_add(&mp->match, &mp->rewrite, &binding_index);
38  REPLY_MACRO2_END(VL_API_PNAT_BINDING_ADD_REPLY,
39  ({ rmp->binding_index = binding_index; }));
40 }
41 
42 static void
44  pnat_main_t *pm = &pnat_main;
45  vl_api_pnat_binding_attach_reply_t *rmp;
46  int rv;
47 
48  /* Ensure that the interface exists */
50  rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
51  goto bad_sw_if_index;
52  }
53 
54  rv =
56 
57 bad_sw_if_index:
58  REPLY_MACRO_END(VL_API_PNAT_BINDING_ATTACH_REPLY);
59 }
60 
61 static void
63  pnat_main_t *pm = &pnat_main;
64  vl_api_pnat_binding_detach_reply_t *rmp;
65  int rv;
66 
67  /* Ensure that the interface exists */
69  rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
70  goto bad_sw_if_index;
71  }
72 
73  rv =
75 
76 bad_sw_if_index:
77  REPLY_MACRO_END(VL_API_PNAT_BINDING_DETACH_REPLY);
78 }
79 
81  pnat_main_t *pm = &pnat_main;
82  vl_api_pnat_binding_del_reply_t *rmp;
84  REPLY_MACRO_END(VL_API_PNAT_BINDING_DEL_REPLY);
85 }
86 
87 /*
88  * Workaround for a bug in vppapigen that doesn't register the endian handler
89  * for _details messages. When that's fixed it should be possible to use
90  * REPLY_MACRO_DETAILS4_END and not have to care about endian-ness in the
91  * handler itself.
92  */
93 #define vl_endianfun
94 #include <pnat/pnat.api.h>
95 #undef vl_endianfun
97  u32 context) {
98  pnat_main_t *pm = &pnat_main;
101 
102  /* Make sure every field is initiated (or don't skip the clib_memset()) */
103 
104  REPLY_MACRO_DETAILS4(VL_API_PNAT_BINDINGS_DETAILS, rp, context, ({
105  rmp->match = t->match;
106  rmp->rewrite = t->rewrite;
107 
108  /* Endian hack until apigen registers _details
109  * endian functions */
110  vl_api_pnat_bindings_details_t_endian(rmp);
111  rmp->_vl_msg_id = htons(rmp->_vl_msg_id);
112  rmp->context = htonl(rmp->context);
113  }));
114 }
115 
117  pnat_main_t *pm = &pnat_main;
119 
120  i32 rv = 0;
121 
122  if (pool_elts(pm->translations) == 0) {
123  REPLY_MACRO(VL_API_PNAT_BINDINGS_GET_REPLY);
124  return;
125  }
126 
127  /*
128  * "cursor" comes from the get call, and allows client to continue a dump
129  */
130  REPLY_AND_DETAILS_MACRO(VL_API_PNAT_BINDINGS_GET_REPLY, pm->translations, ({
131  send_bindings_details(cursor, rp, mp->context);
132  }));
133 }
134 
136  u32 context) {
137  pnat_main_t *pm = &pnat_main;
140 
141  /* Make sure every field is initiated (or don't skip the clib_memset()) */
142 
144  VL_API_PNAT_INTERFACES_DETAILS, rp, context, ({
145  rmp->sw_if_index = i->sw_if_index;
146  clib_memcpy(rmp->enabled, i->enabled, sizeof(rmp->enabled));
147  clib_memcpy(rmp->lookup_mask, i->lookup_mask,
148  sizeof(rmp->lookup_mask));
149 
150  /* Endian hack until apigen registers _details
151  * endian functions */
152  vl_api_pnat_interfaces_details_t_endian(rmp);
153  rmp->_vl_msg_id = htons(rmp->_vl_msg_id);
154  rmp->context = htonl(rmp->context);
155  }));
156 }
157 
158 static void
160  pnat_main_t *pm = &pnat_main;
162 
163  i32 rv = 0;
164 
165  if (pool_elts(pm->interfaces) == 0) {
166  REPLY_MACRO(VL_API_PNAT_INTERFACES_GET_REPLY);
167  return;
168  }
169 
170  /*
171  * "cursor" comes from the get call, and allows client to continue a dump
172  */
174  VL_API_PNAT_INTERFACES_GET_REPLY, pm->interfaces,
175  ({ send_interfaces_details(cursor, rp, mp->context); }));
176 }
177 
178 /* API definitions */
179 #include <vnet/format_fns.h>
180 #include <pnat/pnat.api.c>
181 
182 /* Set up the API message handling tables */
184  pnat_main_t *pm = &pnat_main;
185 
187 
188  return 0;
189 }
190 
191 /*
192  * Register the plugin and hook up the API
193  */
194 #include <vnet/plugin/plugin.h>
196  .version = "0.0.1",
197  .description = "Policy 1:1 NAT",
198 };
199 
201  pnat_main_t *pm = &pnat_main;
202  memset(pm, 0, sizeof(*pm));
203 
204  return pnat_plugin_api_hookup(vm);
205 }
206 
vl_api_pnat_bindings_details_t::context
u32 context
Definition: pnat.api:123
api.h
REPLY_MACRO_END
#define REPLY_MACRO_END(t)
Definition: api_helper_macros.h:46
ip6_full_reass.h
IPv6 Reassembly.
REPLY_MACRO2_END
#define REPLY_MACRO2_END(t, body)
Definition: api_helper_macros.h:81
pnat_binding_attach
int pnat_binding_attach(u32 sw_if_index, pnat_attachment_point_t attachment, u32 binding_index)
Definition: pnat.c:329
clib_memcpy
#define clib_memcpy(d, s, n)
Definition: string.h:197
pnat_binding_del
int pnat_binding_del(u32 index)
Definition: pnat.c:392
vl_api_pnat_binding_detach_t::sw_if_index
vl_api_interface_index_t sw_if_index
Definition: pnat.api:95
pool_elt_at_index
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:553
vl_api_pnat_bindings_details_t
Definition: pnat.api:121
vl_api_pnat_binding_add_t_handler
static void vl_api_pnat_binding_add_t_handler(vl_api_pnat_binding_add_t *mp)
Definition: pnat_api.c:33
vl_api_pnat_interfaces_get_reply_t
Definition: pnat.api:135
pnat_translation_t::rewrite
pnat_rewrite_tuple_t rewrite
Definition: pnat.h:66
vl_api_pnat_binding_attach_t_handler
static void vl_api_pnat_binding_attach_t_handler(vl_api_pnat_binding_attach_t *mp)
Definition: pnat_api.c:43
vl_api_pnat_bindings_get_t
Definition: pnat.api:107
fib_table.h
vl_api_pnat_bindings_get_reply_t
Definition: pnat.api:114
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
vl_api_pnat_binding_add_reply_t
Definition: pnat.api:68
vl_api_pnat_binding_add_t::rewrite
vl_api_pnat_rewrite_tuple_t rewrite
Definition: pnat.api:65
vl_api_pnat_binding_detach_t_handler
static void vl_api_pnat_binding_detach_t_handler(vl_api_pnat_binding_detach_t *mp)
Definition: pnat_api.c:62
vl_api_pnat_binding_detach_t::binding_index
u32 binding_index
Definition: pnat.api:97
pnat_main_t
Definition: pnat.h:82
i32
signed int i32
Definition: types.h:77
vl_api_pnat_binding_add_t::match
vl_api_pnat_match_tuple_t match
Definition: pnat.api:64
setup_message_id_table
static void setup_message_id_table(api_main_t *am)
Definition: bfd_api.c:451
vl_api_pnat_binding_add_reply_t::binding_index
u32 binding_index
Definition: pnat.api:72
vl_api_pnat_interfaces_get_t_handler
static void vl_api_pnat_interfaces_get_t_handler(vl_api_pnat_interfaces_get_t *mp)
Definition: pnat_api.c:159
pnat_init
clib_error_t * pnat_init(vlib_main_t *vm)
Definition: pnat_api.c:200
vl_api_pnat_interfaces_get_t
Definition: pnat.api:128
pnat.h
ip6_sv_reass.h
IPv6 shallow virtual reassembly.
ip4_sv_reass.h
IPv4 shallow virtual reassembly.
pnat_binding_detach
int pnat_binding_detach(u32 sw_if_index, pnat_attachment_point_t attachment, u32 binding_index)
Definition: pnat.c:364
pnat_main
pnat_main_t pnat_main
Definition: pnat.c:32
pnat_main_t::translations
pnat_translation_t * translations
Definition: pnat.h:92
vl_api_registration_
An API client registration, only in vpp/vlib.
Definition: api_common.h:47
REPLY_MACRO
#define REPLY_MACRO(t)
Definition: api_helper_macros.h:30
vl_api_pnat_binding_add_t
Definition: pnat.api:60
vl_api_pnat_binding_del_t_handler
static void vl_api_pnat_binding_del_t_handler(vl_api_pnat_binding_del_t *mp)
Definition: pnat_api.c:80
REPLY_MACRO_DETAILS4
#define REPLY_MACRO_DETAILS4(t, rp, context, body)
Definition: api_helper_macros.h:132
vl_api_pnat_binding_attach_t::binding_index
u32 binding_index
Definition: pnat.api:88
vl_api_pnat_binding_del_t
Definition: pnat.api:75
vl_api_pnat_bindings_details_t::match
vl_api_pnat_match_tuple_t match
Definition: pnat.api:124
i
sll srl srl sll sra u16x4 i
Definition: vector_sse42.h:261
vl_api_pnat_bindings_details_t::rewrite
vl_api_pnat_rewrite_tuple_t rewrite
Definition: pnat.api:125
vl_api_pnat_interfaces_details_t
Definition: pnat.api:142
vl_api_pnat_binding_attach_t
Definition: pnat.api:82
REPLY_AND_DETAILS_MACRO
#define REPLY_AND_DETAILS_MACRO(t, p, body)
Definition: api_helper_macros.h:204
pnat_main_t::msg_id_base
u16 msg_id_base
Definition: pnat.h:94
vl_api_pnat_binding_del_t::binding_index
u32 binding_index
Definition: pnat.api:79
vl_api_pnat_interfaces_details_t::enabled
bool enabled[2]
Definition: pnat.api:146
plugin.h
vl_api_pnat_interfaces_details_t::lookup_mask
vl_api_pnat_mask_t lookup_mask[2]
Definition: pnat.api:147
vnet_sw_if_index_is_api_valid
static uword vnet_sw_if_index_is_api_valid(u32 sw_if_index)
Definition: api_helper_macros.h:276
VLIB_PLUGIN_REGISTER
VLIB_PLUGIN_REGISTER()
index
u32 index
Definition: flow_types.api:221
vl_api_pnat_binding_attach_t::attachment
vl_api_pnat_attachment_point_t attachment
Definition: pnat.api:87
vl_api_pnat_binding_attach_t::sw_if_index
vl_api_interface_index_t sw_if_index
Definition: pnat.api:86
pnat_translation_t
Definition: pnat.h:48
format_fns.h
vl_api_pnat_binding_detach_t::attachment
vl_api_pnat_attachment_point_t attachment
Definition: pnat.api:96
vl_api_pnat_interfaces_details_t::sw_if_index
vl_api_interface_index_t sw_if_index
Definition: pnat.api:145
pnat_interface_t
Definition: pnat.h:70
ip.h
u32
unsigned int u32
Definition: types.h:88
VLIB_INIT_FUNCTION
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:172
send_interfaces_details
static void send_interfaces_details(u32 index, vl_api_registration_t *rp, u32 context)
Definition: pnat_api.c:135
api_helper_macros.h
pool_elts
static uword pool_elts(void *v)
Number of active elements in a pool.
Definition: pool.h:127
vl_api_pnat_interfaces_details_t::context
u32 context
Definition: pnat.api:144
vlib_main_t
Definition: main.h:102
vl_api_pnat_binding_detach_t
Definition: pnat.api:91
clib_error_t
Definition: clib_error.h:21
vlib_init_function_t
clib_error_t *() vlib_init_function_t(struct vlib_main_t *vm)
Definition: init.h:51
pnat_plugin_api_hookup
clib_error_t * pnat_plugin_api_hookup(vlib_main_t *vm)
Definition: pnat_api.c:183
pnat_translation_t::match
pnat_match_tuple_t match
Definition: pnat.h:65
context
u32 context
Definition: ip.api:780
rv
int __clib_unused rv
Definition: application.c:491
pnat_main_t::interfaces
pnat_interface_t * interfaces
Definition: pnat.h:88
ip_types_api.h
pnat_binding_add
int pnat_binding_add(pnat_match_tuple_t *match, pnat_rewrite_tuple_t *rewrite, u32 *index)
Definition: pnat.c:271
send_bindings_details
static void send_bindings_details(u32 index, vl_api_registration_t *rp, u32 context)
Definition: pnat_api.c:96
vl_api_pnat_bindings_get_t_handler
static void vl_api_pnat_bindings_get_t_handler(vl_api_pnat_bindings_get_t *mp)
Definition: pnat_api.c:116