cnat: Add DHCP support
[vpp.git] / src / plugins / cnat / cnat_translation.h
1 /*
2  * Copyright (c) 2020 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 #ifndef __CNAT_TRANSLATION_H__
17 #define __CNAT_TRANSLATION_H__
18
19 #include <cnat/cnat_types.h>
20 #include <vnet/ip/ip_types.h>
21 #include <vppinfra/bihash_8_8.h>
22
23 /**
24  * Counters for each translation
25  */
26 extern vlib_combined_counter_main_t cnat_translation_counters;
27
28 /**
29  * Data used to track an EP in the FIB
30  */
31 typedef struct cnat_ep_trk_t_
32 {
33   /**
34    * The EP being tracked
35    */
36   cnat_endpoint_t ct_ep[VLIB_N_DIR];
37
38   /**
39    * The FIB entry for the EP
40    */
41   fib_node_index_t ct_fei;
42
43   /**
44    * The sibling on the entry's child list
45    */
46   u32 ct_sibling;
47
48   /**
49    * The forwarding contributed by the entry
50    */
51   dpo_id_t ct_dpo;
52
53   /**
54    * Allows to disable if not resolved yet
55    */
56   u8 is_active;
57 } cnat_ep_trk_t;
58
59 typedef enum cnat_translation_flag_t_
60 {
61   CNAT_TRANSLATION_FLAG_ALLOCATE_PORT = (1 << 0),
62 } cnat_translation_flag_t;
63
64 typedef enum
65 {
66   CNAT_RESOLV_ADDR_ANY,
67   CNAT_RESOLV_ADDR_BACKEND,
68   CNAT_RESOLV_ADDR_SNAT,
69   CNAT_RESOLV_ADDR_TRANSLATION,
70   CNAT_ADDR_N_RESOLUTIONS,
71 } cnat_addr_resol_type_t;
72
73 /**
74  * Entry used to account for a translation's backend
75  * waiting for address resolution
76  */
77 typedef struct addr_resolution_t_
78 {
79   /**
80    * The interface index to resolve
81    */
82   u32 sw_if_index;
83   /**
84    * ip4 or ip6 resolution
85    */
86   ip_address_family_t af;
87   /**
88    * The cnat_addr_resolution_t
89    */
90   cnat_addr_resol_type_t type;
91   /**
92    * Translation index
93    */
94   index_t cti;
95   /**
96    * Callback data
97    */
98   u64 opaque;
99 } addr_resolution_t;
100
101 /**
102  * A Translation represents the translation of a VEP to one of a set
103  * of real server addresses
104  */
105 typedef struct cnat_translation_t_
106 {
107   /**
108    * Linkage into the FIB graph
109    */
110   fib_node_t ct_node;
111
112   /**
113    * The LB used to forward to the backends
114    */
115   dpo_id_t ct_lb;
116
117   /**
118    * The Virtual end point
119    */
120   cnat_endpoint_t ct_vip;
121
122   /**
123    * The vector of tracked back-ends
124    */
125   cnat_ep_trk_t *ct_paths;
126
127   /**
128    * The ip protocol for the translation
129    */
130   ip_protocol_t ct_proto;
131
132   /**
133    * The client object this translation belongs on
134    * INDEX_INVALID if vip is unresolved
135    */
136   index_t ct_cci;
137
138   /**
139    * Own index (if copied for trace)
140    */
141   index_t index;
142
143   /**
144    * Translation flags
145    */
146   u8 flags;
147 } cnat_translation_t;
148
149 extern cnat_translation_t *cnat_translation_pool;
150
151 extern u8 *format_cnat_translation (u8 * s, va_list * args);
152
153 /**
154  * create or update a translation
155  *
156  * @param vip The Virtual Endpoint
157  * @param ip_proto The ip protocol to translate
158  * @param backends the backends to choose from
159  *
160  * @return the ID of the translation. used to delete and gather stats
161  */
162 extern u32 cnat_translation_update (cnat_endpoint_t * vip,
163                                     ip_protocol_t ip_proto,
164                                     cnat_endpoint_tuple_t *
165                                     backends, u8 flags);
166
167 /**
168  * Delete a translation
169  *
170  * @param id the ID as returned from the create
171  */
172 extern int cnat_translation_delete (u32 id);
173
174 /**
175  * Callback function invoked during a walk of all translations
176  */
177 typedef walk_rc_t (*cnat_translation_walk_cb_t) (index_t index, void *ctx);
178
179 /**
180  * Walk/visit each of the translations
181  */
182 extern void cnat_translation_walk (cnat_translation_walk_cb_t cb, void *ctx);
183
184 /**
185  * Purge all the trahslations
186  */
187 extern int cnat_translation_purge (void);
188
189 /**
190  * Add an address resolution request
191  */
192 extern void cnat_translation_watch_addr (index_t cti, u64 opaque,
193                                          cnat_endpoint_t * ep,
194                                          cnat_addr_resol_type_t type);
195
196 /**
197  * Cleanup matching addr resolution requests
198  */
199 extern void cnat_translation_unwatch_addr (u32 cti,
200                                            cnat_addr_resol_type_t type);
201
202 /*
203  * Data plane functions
204  */
205 extern clib_bihash_8_8_t cnat_translation_db;
206
207 static_always_inline cnat_translation_t *
208 cnat_translation_get (index_t cti)
209 {
210   return (pool_elt_at_index (cnat_translation_pool, cti));
211 }
212
213 static_always_inline cnat_translation_t *
214 cnat_find_translation (index_t cti, u16 port, ip_protocol_t proto)
215 {
216   clib_bihash_kv_8_8_t bkey, bvalue;
217   u64 key;
218   int rv;
219
220   key = (proto << 24) | port;
221   key = key << 32 | (u32) cti;
222
223   bkey.key = key;
224   rv = clib_bihash_search_inline_2_8_8 (&cnat_translation_db, &bkey, &bvalue);
225   if (!rv)
226     return (pool_elt_at_index (cnat_translation_pool, bvalue.value));
227
228   return (NULL);
229 }
230
231 /*
232  * fd.io coding-style-patch-verification: ON
233  *
234  * Local Variables:
235  * eval: (c-set-style "gnu")
236  * End:
237  */
238
239 #endif