Initial commit of vpp code.
[vpp.git] / vnet / vnet / vcgn / cnat_ports.h
1 /* 
2  *------------------------------------------------------------------
3  * cnat_ports.h - port database definitions
4  *
5  * Copyright (c) 2007-2013 Cisco and/or its affiliates.
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at:
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *------------------------------------------------------------------
18  */
19
20 #ifndef __CNAT_PORTS_H__
21 #define __CNAT_PORTS_H__
22
23 #include "platform_common.h"
24 #include "cnat_bulk_port_defs.h"
25
26 #define PORTS_PER_ADDR 65536 
27
28 #define CNAT_INSTS PLATFORM_CNAT_INSTS 
29
30 #define BITS_PER_INST (PORTS_PER_ADDR)
31
32 /*
33  * Ensure that atleast few 4 bit ports are available for RTSP
34  * in case we want to map 4 digit inside ports to 4 digit outside ports
35  */
36 #define MIN_STATIC_PORT_RANGE_FOR_RTSP (9900)
37
38 extern u8 my_instance_number;
39
40 /*
41  * Now it is a 1-to-1 mapping between bit and port values
42  */
43 static inline u16 bit2port (u32 bit)
44 {
45     return bit;
46 }
47
48 static inline uword port2bit (u16 port)
49 {
50     return port;
51 }
52
53 /*
54  * Port bitmap structure
55  * THIS structure is not used to be REMOVED....
56  */
57
58
59 typedef struct {
60     u32 ipv4_address;           /* native bit order */
61     u16 vrf;
62     u16 pad;
63     u32 threshold_crossed;
64     uword bm[(BITS_PER_INST + BITS(uword)-1)/BITS(uword)];
65 } cnat_portmap_t;
66
67 //cnat_portmap_t *cnat_portmap;
68
69
70 typedef struct {
71     u32 inuse;
72     u32 delete_time;
73     u32 ipv4_address;           /* native bit order */
74     u32 last_sent_timestamp;
75     uword bm[(BITS_PER_INST + BITS(uword)-1)/BITS(uword)];
76     u32 dyn_full;
77     u32 private_ip_users_count; /* number of private ip's(subscribers) to this
78                            public ip */
79 } cnat_portmap_v2_t;
80
81
82 typedef enum {
83     PORT_SINGLE=0,
84     PORT_PAIR=1,
85     PORT_S_EVEN=2,
86     PORT_S_ODD=3,
87 } port_pair_t;
88
89 typedef enum {
90     PORT_TYPE_DYNAMIC=0,
91     PORT_TYPE_STATIC=1,
92     PORT_TYPE_RTSP=2,
93 } port_type_t;
94
95
96 typedef enum {
97     PORT_ALLOC_ANY=1,
98     PORT_ALLOC_DIRECTED=2,
99 } port_alloc_t;
100
101 #define PORT_PROBE_LIMIT 20
102
103
104 /* 
105  * randq1
106  * Linear congruential random number generator with
107  * extensively studied properties. See Numerical Recipes in C
108  * 2nd Ed. page 284. Known to behave according to the test vector
109  * supplied in the text, on X86 and Octeon.
110  */
111 static inline u32 randq1 (u32 prev)
112 {
113     return (1664525L*prev + 1013904223L);
114 }
115
116 cnat_errno_t
117 cnat_static_port_alloc_v2(
118                   cnat_portmap_v2_t    *pm,
119                   port_alloc_t          atype,
120                   port_pair_t           pair_type,
121                   u32                  i_ipv4_address,
122                   u16                  i_port,
123                   u32                  *index,
124                   u32                  *o_ipv4_address,
125                   u16                  *o_port,
126                   u16                   static_port_range
127 #ifndef NO_BULK_LOGGING
128                   , bulk_alloc_size_t    bulk_size,
129                   int *nfv9_log_req
130 #endif /* NO_BULK_LOGGING */
131                   , u16                   ip_n_to_1
132                 );
133
134 cnat_errno_t
135 cnat_mapped_static_port_alloc_v2 (
136                      cnat_portmap_v2_t    *pm,
137                      port_alloc_t         atype,
138                      u32                  *index,
139                      u32                   ipv4_address,
140                      u16                   port
141 #ifndef NO_BULK_LOGGING
142                      , int *nfv9_log_req,
143                      bulk_alloc_size_t bulk_size
144 #endif 
145                      , u16                   ip_n_to_1
146                      );
147
148 cnat_errno_t
149 cnat_dynamic_port_alloc_v2(
150                   cnat_portmap_v2_t *pm,
151                   port_alloc_t       atype,
152                   port_pair_t        pair_type,
153                   u32               *index,
154                   u32               *o_ipv4_address,
155                   u16               *o_port,
156                   u16               static_port_range
157 #ifndef NO_BULK_LOGGING
158                     , bulk_alloc_size_t bulk_size,
159                     int *nfv9_log_req
160 #endif
161                   , u16                ip_n_to_1,
162                   u32               *rseed_ip
163                   );
164
165
166 cnat_errno_t
167 cnat_dynamic_port_alloc_rtsp (
168                   cnat_portmap_v2_t *pm,
169                   port_alloc_t       atype,
170                   port_pair_t        pair_type,
171                   u16                start_range,
172                   u16                end_range,
173                   u32               *index,
174                   u32               *o_ipv4_address,
175                   u16               *o_port
176 #ifndef NO_BULK_LOGGING
177                     , bulk_alloc_size_t bulk_size,
178                     int *nfv9_log_req
179 #endif
180                   , u32               *rseed_ip
181                   );
182
183 void cnat_port_free_v2(
184                   cnat_portmap_v2_t *pm,
185                   int                index, 
186                   port_pair_t        ptype,
187                   u16                base_port,
188                   u16               static_port_range);
189
190 void cnat_portmap_dump_v2(cnat_portmap_v2_t *pm,
191                           u16 print_limit);
192
193
194
195 cnat_errno_t
196 nat64_static_port_alloc (
197                  cnat_portmap_v2_t    *pm,
198                  port_alloc_t          atype,
199                  port_pair_t           pair_type,
200                  u32                   *i_ipv6_address,
201                  u16                   i_port,
202                  u32                  *index,
203                  u32                  *o_ipv4_address,
204                  u16                  *o_port);
205
206
207
208 #endif /* __CNAT_PORTS_H__ */