FD.io VPP  v21.06
Vector Packet Processing
pnat.h
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 
16 #ifndef included_pnat_h
17 #define included_pnat_h
18 
19 #include <stdbool.h>
20 #include <vnet/ip/ip4_packet.h>
21 #include <vppinfra/bihash_16_8.h>
22 
23 #define PNAT_FLOW_HASH_BUCKETS 256
24 
25 /* Definitions from pnat.api */
26 #include <pnat/pnat.api_types.h>
27 typedef vl_api_pnat_match_tuple_t pnat_match_tuple_t;
28 typedef vl_api_pnat_rewrite_tuple_t pnat_rewrite_tuple_t;
29 typedef vl_api_pnat_mask_t pnat_mask_t;
30 typedef vl_api_pnat_attachment_point_t pnat_attachment_point_t;
31 
32 /* Rewrite instructions */
33 typedef enum {
34  PNAT_INSTR_NONE = 1 << 0,
42 
43 typedef struct {
44  u64 as_u64[2];
46 
47 /* Session cache entries */
48 typedef struct {
49  /* What to translate to */
51 
52  /* Stored in network byte order */
57 
58  /* Byte copy inside of packet */
61 
62  u8 clear_offset; /* Clear byte */
63 
64  /* Used for trace/show commands */
68 
69 /* Interface object */
70 typedef struct {
74 
75  /* Feature chain enabled on interface */
77 
80 
81 /* Globals */
82 typedef struct {
83  bool enabled;
84 
85  clib_bihash_16_8_t flowhash; /* Bi-directional */
86 
87  /* Interface pool */
90 
91  /* Translations pool */
93 
95 } pnat_main_t;
96 extern pnat_main_t pnat_main;
97 
99 
100 /* Packet trace information */
101 typedef struct {
105 } pnat_trace_t;
106 
108  u32 *binding_index);
109 int pnat_binding_del(u32 binding_index);
111  u32 binding_index);
113  u32 binding_index);
115  pnat_match_tuple_t *match);
116 
117 static inline void
121  kv->key[0] = (u64)src.as_u32 << 32 | dst.as_u32;
122  kv->key[0] &= mask.as_u64[0];
123  kv->key[1] =
124  (u64)protocol << 56 | (u64)sw_if_index << 36 | (u64)attachment << 32;
125  kv->key[1] |= (u32)sport << 16 | dport;
126  kv->key[1] &= mask.as_u64[1];
127 }
128 
129 #endif
pnat_rewrite_tuple_t rewrite
Definition: pnat.h:104
int pnat_binding_detach(u32 sw_if_index, pnat_attachment_point_t attachment, u32 binding_index)
Definition: pnat.c:364
u32 refcount
Definition: pnat.h:78
u32 pool_index
Definition: pnat.h:102
u32 sw_if_index
Definition: pnat.h:71
pnat_rewrite_tuple_t rewrite
Definition: pnat.h:66
u64 as_u64
Definition: bihash_doc.h:63
ip4_address_t post_sa
Definition: pnat.h:53
unsigned long u64
Definition: types.h:89
vl_api_ip_proto_t protocol
Definition: lb_types.api:72
vl_api_address_t src
Definition: gre.api:54
unsigned char u8
Definition: types.h:56
unsigned int u32
Definition: types.h:88
clib_bihash_16_8_t flowhash
Definition: pnat.h:85
pnat_instructions_t instructions
Definition: pnat.h:50
vl_api_pnat_attachment_point_t pnat_attachment_point_t
Definition: pnat.h:30
vl_api_pnat_mask_t pnat_mask_t
Definition: pnat.h:29
pnat_translation_t * translations
Definition: pnat.h:92
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
u32 pnat_flow_lookup(u32 sw_if_index, pnat_attachment_point_t attachment, pnat_match_tuple_t *match)
Definition: pnat.c:310
unsigned short u16
Definition: types.h:57
u16 sport
Definition: pnat.api:43
vl_api_pnat_rewrite_tuple_t pnat_rewrite_tuple_t
Definition: pnat.h:28
vl_api_pnat_mask_t mask
Definition: pnat.api:45
pnat_match_tuple_t match
Definition: pnat.h:65
u16 dport
Definition: pnat.api:44
pnat_interface_t * pnat_interface_by_sw_if_index(u32 sw_if_index)
Definition: pnat.c:38
vl_api_pnat_match_tuple_t pnat_match_tuple_t
Definition: pnat.h:27
pnat_main_t pnat_main
Definition: pnat.c:32
static void pnat_calc_key(u32 sw_if_index, pnat_attachment_point_t attachment, ip4_address_t src, ip4_address_t dst, u8 protocol, u16 sport, u16 dport, pnat_mask_fast_t mask, clib_bihash_kv_16_8_t *kv)
Definition: pnat.h:118
ip4_address_t post_da
Definition: pnat.h:54
pnat_instructions_t
Definition: pnat.h:33
int pnat_binding_del(u32 binding_index)
Definition: pnat.c:392
pnat_match_tuple_t match
Definition: pnat.h:103
u16 msg_id_base
Definition: pnat.h:94
vl_api_ip4_address_t dst
Definition: pnat.api:41
pnat_interface_t * interfaces
Definition: pnat.h:88
bool enabled
Definition: pnat.h:83
int pnat_binding_add(pnat_match_tuple_t *match, pnat_rewrite_tuple_t *rewrite, u32 *binding_index)
Definition: pnat.c:271
u64 as_u64[2]
Definition: pnat.h:44
u32 * interface_by_sw_if_index
Definition: pnat.h:89
int pnat_binding_attach(u32 sw_if_index, pnat_attachment_point_t attachment, u32 binding_index)
Definition: pnat.c:329
rewrite
Definition: pnat.api:158