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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 #ifndef __CNAT_SESSION_H__
17 #define __CNAT_SESSION_H__
19 #include <vnet/udp/udp_packet.h>
21 #include <cnat/cnat_types.h>
22 #include <cnat/cnat_client.h>
23 #include <cnat/bihash_40_48.h>
27 * A session represents the memory of a translation.
28 * In the tx direction (from behind to in front of the NAT), the
29 * session is preserved so subsequent packets follow the same path
30 * even if the translation has been updated. In the tx direction
31 * the session represents the swap from the VIP to the server address
32 * In the RX direction the swap is from the server address/port to VIP.
34 * A session exists only as key and value in the bihash, there is no
35 * pool for this object. If there were a pool, one would need to be
36 * concerned about what worker is using it.
38 typedef struct cnat_session_t_
41 * this key sits in the same memory location a 'key' in the bihash kvp
46 * IP 4/6 address in the rx/tx direction
48 ip46_address_t cs_ip[VLIB_N_DIR];
53 u16 cs_port[VLIB_N_DIR];
56 * The IP protocol TCP or UDP only supported
58 ip_protocol_t cs_proto;
61 * The address family describing the IP addresses
71 * this value sits in the same memory location a 'value' in the bihash kvp
76 * The IP address to translate to.
78 ip46_address_t cs_ip[VLIB_N_DIR];
81 * the port to translate to.
83 u16 cs_port[VLIB_N_DIR];
86 * The load balance object to use to forward
91 * Timestamp index this session was last used
98 * session flags if cs_lbi == INDEX_INVALID
102 * Persist translation->ct_lb.dpoi_next_node
103 * when cs_lbi != INDEX_INVALID
110 typedef enum cnat_session_flag_t_
113 * Indicates a return path session that was source NATed
116 CNAT_SESSION_FLAG_HAS_SNAT = (1 << 0),
118 * This session source port was allocated, free it on cleanup
120 CNAT_SESSION_FLAG_ALLOC_PORT = (1 << 1),
122 * This session doesn't have a client, do not attempt to free it
124 CNAT_SESSION_FLAG_NO_CLIENT = (1 << 2),
125 } cnat_session_flag_t;
127 extern u8 *format_cnat_session (u8 * s, va_list * args);
130 * Ensure the session object correctly overlays the bihash key/value pair
132 STATIC_ASSERT (STRUCT_OFFSET_OF (cnat_session_t, key) ==
133 STRUCT_OFFSET_OF (clib_bihash_kv_40_48_t, key),
135 STATIC_ASSERT (STRUCT_OFFSET_OF (cnat_session_t, value) ==
136 STRUCT_OFFSET_OF (clib_bihash_kv_40_48_t, value),
138 STATIC_ASSERT (sizeof (cnat_session_t) == sizeof (clib_bihash_kv_40_48_t),
144 extern clib_bihash_40_48_t cnat_session_db;
147 * Callback function invoked during a walk of all translations
149 typedef walk_rc_t (*cnat_session_walk_cb_t) (const cnat_session_t *
153 * Walk/visit each of the cnat session
155 extern void cnat_session_walk (cnat_session_walk_cb_t cb, void *ctx);
158 * Scan the session DB for expired sessions
160 extern u64 cnat_session_scan (vlib_main_t * vm, f64 start_time, int i);
163 * Purge all the sessions
165 extern int cnat_session_purge (void);
168 * Free a session & update refcounts
170 extern void cnat_session_free (cnat_session_t * session);
173 * Port cleanup callback
175 extern void (*cnat_free_port_cb) (u16 port, ip_protocol_t iproto);
178 * fd.io coding-style-patch-verification: ON
181 * eval: (c-set-style "gnu")