Initial commit of vpp code.
[vpp.git] / vnet / vnet / vcgn / cnat_logging.h
1 /*
2  *------------------------------------------------------------------
3  * cnat_logging.h
4  *
5  * Copyright (c) 2009, 2012 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_LOGGING_H__ 
21 #define __CNAT_LOGGING_H__ 
22
23 #include <stdio.h>
24 #include <vlib/vlib.h>
25 #include <vnet/vnet.h>
26 #include <vppinfra/vec.h>
27 #include <vppinfra/bitmap.h>
28 #include <vppinfra/hash.h>
29 #include <vppinfra/pool.h>
30 #include <vppinfra/clib.h>
31
32 #include "nat64_db.h"
33 #include "cnat_log_common.h"
34 #include "dslite_defs.h"
35
36 #define NFV9_DEF_PATH_MTU   1500
37 #define NFV9_VRF_NAME_LEN   12
38
39 /* one time call at the beginning */
40 void cnat_nfv9_logging_init();
41
42 /* 
43  * unconditional call
44  * will check logging config inside
45  */
46 void cnat_nfv9_log_mapping_create(cnat_main_db_entry_t * db,
47                                   cnat_vrfmap_t *vrfmap
48 #ifndef NO_BULK_LOGGING
49                                   , int bulk_alloc
50 #endif
51                                   );
52
53 void cnat_nfv9_nat44_log_session_create(cnat_main_db_entry_t * db,
54                                   cnat_session_entry_t * sdb,
55                                   cnat_vrfmap_t *vrfmap);
56
57 void cnat_nfv9_nat44_log_session_delete(cnat_main_db_entry_t * db,
58                                   cnat_session_entry_t * sdb,
59                                   cnat_vrfmap_t *vrfmap);
60
61
62 /* 
63  * unconditional call
64  * will check logging config inside
65  */
66 void cnat_nfv9_log_mapping_delete(cnat_main_db_entry_t * db,
67                                   cnat_vrfmap_t *vrfmap
68 #ifndef NO_BULK_LOGGING
69                                   , int bulk_alloc
70 #endif
71                                   );
72
73 /* nat44 syslog APIs */
74 void cnat_syslog_nat44_mapping_create(cnat_main_db_entry_t *db,
75                         cnat_vrfmap_t *vrfmap, cnat_session_entry_t * sdb
76 #ifndef NO_BULK_LOGGING
77                        , int bulk_alloc
78 #endif
79                        );
80
81 void cnat_syslog_nat44_mapping_delete(cnat_main_db_entry_t *db,
82         cnat_vrfmap_t *vrfmap, cnat_session_entry_t *sdb
83 #ifndef NO_BULK_LOGGING
84         , int bulk_alloc
85 #endif
86         );
87
88 /* 
89  * dslite
90  */
91 void cnat_nfv9_ds_lite_mapping_create(cnat_main_db_entry_t *db,
92                            dslite_table_entry_t *dslite_entry
93 #ifndef NO_BULK_LOGGING
94                            , int bulk_alloc
95 #endif
96                               );
97
98 void cnat_nfv9_ds_lite_mapping_delete(cnat_main_db_entry_t *db,
99                            dslite_table_entry_t *dslite_entry
100 #ifndef NO_BULK_LOGGING
101                            , int bulk_alloc
102 #endif
103                               );
104 void cnat_nfv9_ds_lite_log_session_create(cnat_main_db_entry_t * db,
105                                 dslite_table_entry_t *dslite_entry,
106                                 cnat_session_entry_t * sdb);
107
108 void cnat_nfv9_ds_lite_log_session_delete(cnat_main_db_entry_t * db,
109                                 dslite_table_entry_t *dslite_entry,
110                                 cnat_session_entry_t * sdb); 
111
112 /* 
113  * nat64
114  */
115
116 void cnat_nfv9_bib_mapping_create (nat64_bib_entry_t *db,
117                        nat64_table_entry_t *nat64_entry);
118
119 void cnat_nfv9_session_mapping_create (nat64_bib_entry_t *bdb,
120                        nat64_session_entry_t *sdb,
121                        nat64_table_entry_t *nat64_entry_ptr);
122
123 void cnat_nfv9_bib_mapping_delete (nat64_bib_entry_t *db,
124                        nat64_table_entry_t *nat64_entry);
125
126 void cnat_nfv9_session_mapping_delete (nat64_bib_entry_t *bdb,
127                        nat64_session_entry_t *sdb,
128                        nat64_table_entry_t *nat64_entry_ptr);
129
130 typedef enum {
131     RECORD_INVALID = 0,
132     NAT44_ADD_RECORD,
133     NAT44_DEL_RECORD,
134     NAT64_ADD_BIB_RECORD,
135     NAT64_DEL_BIB_RECORD,
136     NAT64_ADD_SESSION_RECORD,
137     NAT64_DEL_SESSION_RECORD,
138     DS_LITE_ADD_RECORD,
139     DS_LITE_DEL_RECORD,
140     NAT44_BULK_ADD_RECORD,
141     NAT44_BULK_DEL_RECORD,
142     DS_LITE_BULK_ADD_RECORD,
143     DS_LITE_BULK_DEL_RECORD,
144     INGRESS_VRF_ID_NAME_RECORD,
145     NAT44_ADD_SESSION_RECORD,
146     NAT44_DEL_SESSION_RECORD,
147     DS_LITE_ADD_SESSION_RECORD,
148     DS_LITE_DEL_SESSION_RECORD,
149     MAX_RECORDS
150 } netflow_record;
151
152 typedef enum {
153     TEMPLATE_SENT_FALSE = 0,
154     TEMPLATE_SENT_TRUE = 1
155 } netflow_template_sent;
156
157 #define cnat_nfv9_get_sys_up_time_in_ms cnat_get_sys_up_time_in_ms
158
159 #define cnat_nfv9_get_unix_time_in_seconds cnat_get_unix_time_in_seconds
160
161 #define cnat_nfv9_dump_time_change_logs cnat_dump_time_change_logs
162
163
164 /*
165  * Netflow V9 Specific Defines and structures
166  */
167
168 #define CNAT_NFV9_VERSION_NUMBER                        9
169
170 #define CNAT_NFV9_TEMPLATE_FLOWSET_ID                   0
171 #define CNAT_NFV9_OPTION_TEMPLATE_FLOWSET_ID            1
172
173 #define CNAT_NFV9_ADD_FIELD_COUNT                       7
174 #define CNAT_NFV9_DEL_FIELD_COUNT                       4
175 #define CNAT_NFV9_DS_LITE_ADD_FIELD_COUNT               8
176 #define CNAT_NFV9_DS_LITE_DEL_FIELD_COUNT               5
177 #define CNAT_NFV9_NAT64_ADD_BIB_FIELD_COUNT             5
178 #define CNAT_NFV9_NAT64_DEL_BIB_FIELD_COUNT             3
179 #define CNAT_NFV9_NAT64_ADD_SESSION_FIELD_COUNT         8
180 #define CNAT_NFV9_NAT64_DEL_SESSION_FIELD_COUNT         5
181 #define CNAT_NFV9_NAT44_ADD_SESSION_FIELD_COUNT         9
182 #define CNAT_NFV9_NAT44_DEL_SESSION_FIELD_COUNT         6
183 #define CNAT_NFV9_DS_LITE_ADD_SESSION_FIELD_COUNT       10
184 #define CNAT_NFV9_DS_LITE_DEL_SESSION_FIELD_COUNT       7
185
186 #define CNAT_NFV9_ADD_TEMPLATE_ID                       256
187 #define CNAT_NFV9_DEL_TEMPLATE_ID                       257
188 #define CNAT_NFV9_NAT64_ADD_BIB_TEMPLATE_ID             258
189 #define CNAT_NFV9_NAT64_DEL_BIB_TEMPLATE_ID             259
190 #define CNAT_NFV9_NAT64_ADD_SESSION_TEMPLATE_ID         260
191 #define CNAT_NFV9_NAT64_DEL_SESSION_TEMPLATE_ID         261
192 #define CNAT_NFV9_INGRESS_VRF_ID_NAME_TEMPLATE_ID       262
193 #define CNAT_NFV9_DS_LITE_ADD_TEMPLATE_ID               267
194 #define CNAT_NFV9_DS_LITE_DEL_TEMPLATE_ID               268 
195 #define CNAT_NFV9_NAT44_ADD_SESSION_TEMPLATE_ID         271
196 #define CNAT_NFV9_NAT44_DEL_SESSION_TEMPLATE_ID         272
197 #define CNAT_NFV9_DS_LITE_ADD_SESSION_TEMPLATE_ID       273
198 #define CNAT_NFV9_DS_LITE_DEL_SESSION_TEMPLATE_ID       274
199
200 #ifndef NO_BULK_LOGGING
201 #define CNAT_NFV9_NAT44_BULK_ADD_TEMPLATE_ID            265
202 #define CNAT_NFV9_NAT44_BULK_DEL_TEMPLATE_ID            266
203 #define CNAT_NFV9_DS_LITE_BULK_ADD_TEMPLATE_ID          269 
204 #define CNAT_NFV9_DS_LITE_BULK_DEL_TEMPLATE_ID          270
205
206 #define CNAT_NFV9_NAT44_BULK_ADD_FIELD_COUNT            6
207 #define CNAT_NFV9_NAT44_BULK_DEL_FIELD_COUNT            3
208 #define CNAT_NFV9_DS_LITE_BULK_ADD_FIELD_COUNT          7
209 #define CNAT_NFV9_DS_LITE_BULK_DEL_FIELD_COUNT          4
210
211 #define CNAT_NFV9_OUTSIDE_IP_PORT_START_FIELD_TYPE      361
212 #define CNAT_NFV9_OUTSIDE_IP_PORT_START_FIELD_SIZE      2
213
214 #define CNAT_NFV9_OUTSIDE_IP_PORT_END_FIELD_TYPE        362
215 #define CNAT_NFV9_OUTSIDE_IP_PORT_END_FIELD_SIZE        2
216
217 #endif /* #ifndef NO_BULK_LOGGING */
218
219 #define CNAT_NFV9_INGRESS_VRF_NAME_FIELD_TYPE           236
220 #define CNAT_NFV9_INGRESS_VRF_NAME_FIELD_SIZE           12
221 /* 4 byte for vrf_id + 4 byte for vrf_name (option fields) */
222 #define CNAT_NFV9_INGRESS_VRF_ID_NAME_OPTION_LEN        8 
223 extern u16 cnat_template_id[MAX_RECORDS]; 
224
225 #define CNAT_NFV9_INSIDE_VRFID_FIELD_TYPE               234
226 #define CNAT_NFV9_INSIDE_VRFID_FIELD_SIZE               4
227
228 #define CNAT_NFV9_OUTSIDE_VRFID_FIELD_TYPE              235
229 #define CNAT_NFV9_OUTSIDE_VRFID_FIELD_SIZE              4
230
231 #define CNAT_NFV9_INSIDE_IP_ADDR_FIELD_TYPE             8
232 #define CNAT_NFV9_INSIDE_IP_ADDR_FIELD_SIZE             4
233
234 #define CNAT_NFV9_OUTSIDE_IP_ADDR_FIELD_TYPE            225
235 #define CNAT_NFV9_OUTSIDE_IP_ADDR_FIELD_SIZE            4
236
237 #define CNAT_NFV9_INSIDE_IP_PORT_FIELD_TYPE             7
238 #define CNAT_NFV9_INSIDE_IP_PORT_FIELD_SIZE             2
239
240 #define CNAT_NFV9_OUTSIDE_IP_PORT_FIELD_TYPE            227
241 #define CNAT_NFV9_OUTSIDE_IP_PORT_FIELD_SIZE            2
242
243 #define CNAT_NFV9_PROTOCOL_FIELD_TYPE                   4
244 #define CNAT_NFV9_PROTOCOL_FIELD_SIZE                   1
245
246 /* IPv6 related info */
247
248 #define CNAT_NFV9_INSIDE_IPV6_SRC_ADDR_FIELD_TYPE       27
249 #define CNAT_NFV9_INSIDE_IPV6_SRC_ADDR_FIELD_SIZE       16
250     
251 #define CNAT_NFV9_INSIDE_IPV6_DST_ADDR_FIELD_TYPE       28
252 #define CNAT_NFV9_INSIDE_IPV6_DST_ADDR_FIELD_SIZE       16
253
254 #define CNAT_NFV9_OUTSIDE_IP_DST_ADDR_FIELD_TYPE        226
255 #define CNAT_NFV9_OUTSIDE_IP_DST_ADDR_FIELD_SIZE        4
256     
257 #define CNAT_NFV9_INSIDE_DST_PORT_FIELD_TYPE            11
258 #define CNAT_NFV9_INSIDE_DST_PORT_FIELD_SIZE            2
259
260 #define CNAT_NFV9_DESTINATION_IP_ADDR_FIELD_TYPE        12
261 #define CNAT_NFV9_DESTINATION_IP_ADDR_FIELD_SIZE        4
262
263
264 typedef struct {
265     u16 version;
266     u16 count;
267     u32 sys_up_time; /* time in ms since system was booted */
268     u32 timestamp;   /* UNIX time in seconds since 1970 */
269     u32 sequence_num;
270     u32 source_id;
271 } nfv9_header_t;
272
273 /*
274  * Hardcoded - need to be fixed 
275  */
276 #define CNAT_NFV9_SOURCE_ID_VALUE  0x1234
277
278 typedef struct {
279     u16 flowset_id;
280     u16 length;
281
282     u16 ingress_vrfid_name_map_template_id;
283     u16 ingress_vrfid_name_map_scope_len;
284     u16 ingress_vrfid_name_map_option_len;
285     u16 ingress_vrfid_name_map_vrfid_option_type;
286     u16 ingress_vrfid_name_map_vrfid_option_len;
287     u16 ingress_vrfid_name_map_vrfname_option_type;
288     u16 ingress_vrfid_name_map_vrfname_option_len;
289     /*
290      * Adding the padding so as to make the tempalate 
291      * structure end on a 4 byte boundary
292      */
293     u16 padding1;
294
295 } cnat_nfv9_option_template_t;
296
297 /*
298  * The following structure defines the Netflow Template that
299  * will be exported to the Netflow Collector
300  */
301
302 typedef struct {
303     u16 flowset_id;
304     u16 length;
305
306     u16 add_template_id;
307     u16 add_field_count;
308     u16 add_inside_vrf_id_field_type;
309     u16 add_inside_vrf_id_field_size;
310     u16 add_outside_vrf_id_field_type;
311     u16 add_outside_vrf_id_field_size;
312     u16 add_inside_ip_addr_field_type;
313     u16 add_inside_ip_addr_field_size;
314     u16 add_outside_ip_addr_field_type;
315     u16 add_outside_ip_addr_field_size;
316     u16 add_inside_ip_port_field_type;
317     u16 add_inside_ip_port_field_size;
318     u16 add_outside_ip_port_field_type;
319     u16 add_outside_ip_port_field_size;
320     u16 add_protocol_field_type;
321     u16 add_protocol_field_size;
322
323     u16 del_template_id;
324     u16 del_field_count;
325     u16 del_inside_vrf_id_field_type;
326     u16 del_inside_vrf_id_field_size;
327     u16 del_inside_ip_addr_field_type;
328     u16 del_inside_ip_addr_field_size;
329     u16 del_inside_ip_port_field_type;
330     u16 del_inside_ip_port_field_size;
331     u16 del_protocol_field_type;
332     u16 del_protocol_field_size;
333 #if 0
334     /* NAT64 related info */
335     u16 nat64_add_bib_template_id;
336     u16 nat64_add_bib_field_count;
337     u16 nat64_add_bib_inside_ipv6_addr_field_type;
338     u16 nat64_add_bib_inside_ipv6_addr_field_size;
339     u16 nat64_add_bib_outside_ip_addr_field_type;
340     u16 nat64_add_bib_outside_ip_addr_field_size;
341     u16 nat64_add_bib_inside_ip_port_field_type;
342     u16 nat64_add_bib_inside_ip_port_field_size;
343     u16 nat64_add_bib_outside_ip_port_field_type;
344     u16 nat64_add_bib_outside_ip_port_field_size;
345     u16 nat64_add_bib_protocol_field_type;
346     u16 nat64_add_bib_protocol_field_size;
347
348     u16 nat64_del_bib_template_id;
349     u16 nat64_del_bib_field_count;
350     u16 nat64_del_bib_inside_ip_addr_field_type;
351     u16 nat64_del_bib_inside_ip_addr_field_size;
352     u16 nat64_del_bib_inside_ip_port_field_type;
353     u16 nat64_del_bib_inside_ip_port_field_size;
354     u16 nat64_del_bib_protocol_field_type;
355     u16 nat64_del_bib_protocol_field_size;
356
357
358     u16 nat64_add_session_template_id;
359     u16 nat64_add_session_field_count;
360     u16 nat64_add_session_inside_ipv6_src_addr_field_type;
361     u16 nat64_add_session_inside_ipv6_src_addr_field_size;
362     u16 nat64_add_session_outside_ip_src_addr_field_type;
363     u16 nat64_add_session_outside_ip_src_addr_field_size;
364     u16 nat64_add_session_inside_ipv6_dst_addr_field_type;
365     u16 nat64_add_session_inside_ipv6_dst_addr_field_size;
366     u16 nat64_add_session_outside_ip_dst_addr_field_type;
367     u16 nat64_add_session_outside_ip_dst_addr_field_size;
368     u16 nat64_add_session_inside_ip_src_port_field_type;
369     u16 nat64_add_session_inside_ip_src_port_field_size;
370     u16 nat64_add_session_outside_ip_src_port_field_type;
371     u16 nat64_add_session_outside_ip_src_port_field_size;
372     u16 nat64_add_session_ip_dest_port_field_type;
373     u16 nat64_add_session_ip_dest_port_field_size;
374     u16 nat64_add_session_protocol_field_type;
375     u16 nat64_add_session_protocol_field_size;
376
377     u16 nat64_del_session_template_id;
378     u16 nat64_del_session_field_count;
379     u16 nat64_del_session_inside_ip_src_addr_field_type;
380     u16 nat64_del_session_inside_ip_src_addr_field_size;
381     u16 nat64_del_session_inside_ip_dst_addr_field_type;
382     u16 nat64_del_session_inside_ip_dst_addr_field_size;
383     u16 nat64_del_session_inside_ip_src_port_field_type;
384     u16 nat64_del_session_inside_ip_src_port_field_size;
385     u16 nat64_del_session_inside_ip_dst_port_field_type;
386     u16 nat64_del_session_inside_ip_dst_port_field_size;
387     u16 nat64_del_session_protocol_field_type;
388     u16 nat64_del_session_protocol_field_size;
389
390     /*
391      * Ds-Lite specific info
392      */
393     u16 add_dslite_template_id;
394     u16 add_dslite_field_count;
395     u16 add_dslite_inside_vrf_id_field_type;
396     u16 add_dslite_inside_vrf_id_field_size;
397     u16 add_dslite_outside_vrf_id_field_type;
398     u16 add_dslite_outside_vrf_id_field_size;
399     u16 add_dslite_inside_ip_addr_field_type;
400     u16 add_dslite_inside_ip_addr_field_size;
401     u16 add_dslite_inside_ipv6_addr_field_type;
402     u16 add_dslite_inside_ipv6_addr_field_size;
403     u16 add_dslite_outside_ip_addr_field_type;
404     u16 add_dslite_outside_ip_addr_field_size;
405     u16 add_dslite_inside_ip_port_field_type;
406     u16 add_dslite_inside_ip_port_field_size;
407     u16 add_dslite_outside_ip_port_field_type;
408     u16 add_dslite_outside_ip_port_field_size;
409     u16 add_dslite_protocol_field_type;
410     u16 add_dslite_protocol_field_size;
411
412     u16 del_dslite_template_id;
413     u16 del_dslite_field_count;
414     u16 del_dslite_inside_vrf_id_field_type;
415     u16 del_dslite_inside_vrf_id_field_size;
416     u16 del_dslite_inside_ip_addr_field_type;
417     u16 del_dslite_inside_ip_addr_field_size;
418     u16 del_dslite_inside_ipv6_addr_field_type;
419     u16 del_dslite_inside_ipv6_addr_field_size;
420     u16 del_dslite_inside_ip_port_field_type;
421     u16 del_dslite_inside_ip_port_field_size;
422     u16 del_dslite_protocol_field_type;
423     u16 del_dslite_protocol_field_size;
424 #endif
425     
426 //#ifndef NO_BULK_LOGGING /* commenting for time being */
427 #if 0
428     u16 bulk_add_template_id;
429     u16 bulk_add_field_count;
430     u16 bulk_add_inside_vrf_id_field_type;
431     u16 bulk_add_inside_vrf_id_field_size;
432     u16 bulk_add_outside_vrf_id_field_type;
433     u16 bulk_add_outside_vrf_id_field_size;
434     u16 bulk_add_inside_ip_addr_field_type;
435     u16 bulk_add_inside_ip_addr_field_size;
436     u16 bulk_add_outside_ip_addr_field_type;
437     u16 bulk_add_outside_ip_addr_field_size;
438     u16 bulk_add_outside_start_port_field_type;
439     u16 bulk_add_outside_start_port_field_size;
440     u16 bulk_add_outside_end_port_field_type;
441     u16 bulk_add_outside_end_port_field_size;
442
443     u16 bulk_del_template_id;
444     u16 bulk_del_field_count;
445     u16 bulk_del_inside_vrf_id_field_type;
446     u16 bulk_del_inside_vrf_id_field_size;
447     u16 bulk_del_inside_ip_addr_field_type;
448     u16 bulk_del_inside_ip_addr_field_size;
449     u16 bulk_del_outside_start_port_field_type;
450     u16 bulk_del_outside_start_port_field_size;
451
452     /* ds-lite bulk logging create delete event */
453
454     u16 bulk_dslite_add_template_id;
455     u16 bulk_dslite_add_field_count;
456     u16 bulk_dslite_add_inside_vrf_id_field_type;
457     u16 bulk_dslite_add_inside_vrf_id_field_size;
458     u16 bulk_dslite_add_outside_vrf_id_field_type;
459     u16 bulk_dslite_add_outside_vrf_id_field_size;
460     u16 bulk_dslite_add_inside_ip_addr_field_type;
461     u16 bulk_dslite_add_inside_ip_addr_field_size;
462     u16 bulk_dslite_add_inside_ipv6_addr_field_type;
463     u16 bulk_dslite_add_inside_ipv6_addr_field_size;
464     u16 bulk_dslite_add_outside_ip_addr_field_type;
465     u16 bulk_dslite_add_outside_ip_addr_field_size;
466     u16 bulk_dslite_add_outside_start_port_field_type;
467     u16 bulk_dslite_add_outside_start_port_field_size;
468     u16 bulk_dslite_add_outside_end_port_field_type;
469     u16 bulk_dslite_add_outside_end_port_field_size;
470
471     u16 bulk_dslite_del_template_id;
472     u16 bulk_dslite_del_field_count;
473     u16 bulk_dslite_del_inside_vrf_id_field_type;
474     u16 bulk_dslite_del_inside_vrf_id_field_size;
475     u16 bulk_dslite_del_inside_ip_addr_field_type;
476     u16 bulk_dslite_del_inside_ip_addr_field_size;
477     u16 bulk_dslite_del_inside_ipv6_addr_field_type;
478     u16 bulk_dslite_del_inside_ipv6_addr_field_size;
479     u16 bulk_dslite_del_outside_start_port_field_type;
480     u16 bulk_dslite_del_outside_start_port_field_size;
481
482 #endif /* NO_BULK_LOGGING */
483
484     u16 nat44_session_add_template_id;
485     u16 nat44_session_add_field_count;
486     u16 nat44_session_add_inside_vrf_id_field_type;
487     u16 nat44_session_add_inside_vrf_id_field_size;
488     u16 nat44_session_add_outside_vrf_id_field_type;
489     u16 nat44_session_add_outside_vrf_id_field_size;
490     u16 nat44_session_add_inside_ip_addr_field_type;
491     u16 nat44_session_add_inside_ip_addr_field_size;
492     u16 nat44_session_add_outside_ip_addr_field_type;
493     u16 nat44_session_add_outside_ip_addr_field_size;
494     u16 nat44_session_add_inside_ip_port_field_type;
495     u16 nat44_session_add_inside_ip_port_field_size;
496     u16 nat44_session_add_outside_ip_port_field_type;
497     u16 nat44_session_add_outside_ip_port_field_size;
498     u16 nat44_session_add_dest_ip_addr_field_type;
499     u16 nat44_session_add_dest_ip_addr_field_size;
500     u16 nat44_session_add_dest_port_field_type;
501     u16 nat44_session_add_dest_port_field_size;
502     u16 nat44_session_add_protocol_field_type;
503     u16 nat44_session_add_protocol_field_size;
504
505     u16 nat44_session_del_template_id;
506     u16 nat44_session_del_field_count;
507     u16 nat44_session_del_inside_vrf_id_field_type;
508     u16 nat44_session_del_inside_vrf_id_field_size;
509     u16 nat44_session_del_inside_ip_addr_field_type;
510     u16 nat44_session_del_inside_ip_addr_field_size;
511     u16 nat44_session_del_dest_ip_addr_field_type;
512     u16 nat44_session_del_dest_ip_addr_field_size;
513     u16 nat44_session_del_inside_ip_port_field_type;
514     u16 nat44_session_del_inside_ip_port_field_size;
515     u16 nat44_session_del_dest_port_field_type;
516     u16 nat44_session_del_dest_port_field_size;
517     u16 nat44_session_del_protocol_field_type;
518     u16 nat44_session_del_protocol_field_size;
519
520 #if 0
521     u16 add_dslite_session_template_id;
522     u16 add_dslite_session_field_count;
523     u16 add_dslite_session_inside_vrf_id_field_type;
524     u16 add_dslite_session_inside_vrf_id_field_size;
525     u16 add_dslite_session_outside_vrf_id_field_type;
526     u16 add_dslite_session_outside_vrf_id_field_size;
527     u16 add_dslite_session_inside_ip_addr_field_type;
528     u16 add_dslite_session_inside_ip_addr_field_size;
529     u16 add_dslite_session_inside_ipv6_addr_field_type;
530     u16 add_dslite_session_inside_ipv6_addr_field_size;
531     u16 add_dslite_session_outside_ip_addr_field_type;
532     u16 add_dslite_session_outside_ip_addr_field_size;
533     u16 add_dslite_session_inside_ip_port_field_type;
534     u16 add_dslite_session_inside_ip_port_field_size;
535     u16 add_dslite_session_outside_ip_port_field_type;
536     u16 add_dslite_session_outside_ip_port_field_size;
537     u16 add_dslite_session_dest_ip_addr_field_type;
538     u16 add_dslite_session_dest_ip_addr_field_size;
539     u16 add_dslite_session_dest_port_field_type;
540     u16 add_dslite_session_dest_port_field_size;
541     u16 add_dslite_session_protocol_field_type;
542     u16 add_dslite_session_protocol_field_size;
543     
544     u16 del_dslite_session_template_id;
545     u16 del_dslite_session_field_count;
546     u16 del_dslite_session_inside_vrf_id_field_type;
547     u16 del_dslite_session_inside_vrf_id_field_size;
548     u16 del_dslite_session_inside_ip_addr_field_type;
549     u16 del_dslite_session_inside_ip_addr_field_size;
550     u16 del_dslite_session_inside_ipv6_addr_field_type;
551     u16 del_dslite_session_inside_ipv6_addr_field_size;
552     u16 del_dslite_session_dest_ip_addr_field_type;
553     u16 del_dslite_session_dest_ip_addr_field_size;
554     u16 del_dslite_session_inside_ip_port_field_type;
555     u16 del_dslite_session_inside_ip_port_field_size;
556     u16 del_dslite_session_dest_port_field_type;
557     u16 del_dslite_session_dest_port_field_size;
558     u16 del_dslite_session_protocol_field_type;
559     u16 del_dslite_session_protocol_field_size;
560 #endif
561
562     /*
563      * Netflow option template
564      * Ingress VRF ID - Name mapping
565      * This template will be sent under flowset id 1
566      */
567     cnat_nfv9_option_template_t cnat_nfv9_option_template;
568 } cnat_nfv9_template_t;
569
570 /*
571  * The Dataflow header for each add/delete record group
572  */
573 typedef struct {
574     u16 dataflow_template_id;
575     u16 dataflow_length;
576 } nfv9_dataflow_record_header_t;
577
578 /*
579  * NFv9 Add record definition
580  */
581  
582 /* 
583  * pad bytes needed to make the structure a multiple of 4 bytes
584  */
585 #define CNAT_NFV9_ADD_RECORD_PAD_BYTES (3)
586 #define CNAT_NFV9_DEL_RECORD_PAD_BYTES (1)
587
588 #define CNAT_NFV9_NAT64_ADD_BIB_RECORD_PAD_BYTES (3)
589 #define CNAT_NFV9_NAT64_DEL_BIB_RECORD_PAD_BYTES (1)
590 #define CNAT_NFV9_NAT64_ADD_SESSION_RECORD_PAD_BYTES (1)
591 #define CNAT_NFV9_NAT64_DEL_SESSION_RECORD_PAD_BYTES (3)
592 #define CNAT_NFV9_NAT44_ADD_SESSION_RECORD_PAD_BYTES (1)
593 #define CNAT_NFV9_NAT44_DEL_SESSION_RECORD_PAD_BYTES (3)
594
595 #define CNAT_NFV9_DS_LITE_ADD_RECORD_PAD_BYTES (3)
596 #define CNAT_NFV9_DS_LITE_DEL_RECORD_PAD_BYTES (1)
597 #define CNAT_NFV9_DS_LITE_ADD_SESSION_RECORD_PAD_BYTES (1)
598 #define CNAT_NFV9_DS_LITE_DEL_SESSION_RECORD_PAD_BYTES (3)
599
600 #define CNAT_NFV9_INGRESS_VRFID_NAME_RECORD_PAD_BYTES (0)
601
602 typedef struct {
603     u32 inside_vrf_id;
604     u32 outside_vrf_id;
605     u32 inside_ip_addr;
606     u32 outside_ip_addr;
607     u16 inside_ip_port;
608     u16 outside_ip_port;
609     u8  protocol;
610     u8  pad[CNAT_NFV9_ADD_RECORD_PAD_BYTES]; 
611 } nfv9_add_record_t;
612
613 /*
614  * NFv9 Delete record definition
615  */
616 typedef struct {
617     u32 inside_vrf_id;
618     u32 inside_ip_addr;
619     u16 inside_ip_port;
620     u8  protocol;
621     u8  pad[CNAT_NFV9_DEL_RECORD_PAD_BYTES];
622 } nfv9_del_record_t;
623
624 #ifndef NO_BULK_LOGGING
625
626 #define CNAT_NFV9_BULK_ADD_RECORD_PAD_BYTES (0)
627 #define CNAT_NFV9_BULK_DEL_RECORD_PAD_BYTES (2)
628
629 typedef struct {
630     u32 inside_vrf_id;
631     u32 outside_vrf_id;
632     u32 inside_ip_addr;
633     u32 outside_ip_addr;
634     u16 outside_ip_port_start;
635     u16 outside_ip_port_end;
636     u8  pad[CNAT_NFV9_BULK_ADD_RECORD_PAD_BYTES]; 
637 } nfv9_bulk_add_record_t;
638
639 /*
640  * NFv9 Delete record definition
641  */
642 typedef struct {
643     u32 inside_vrf_id;
644     u32 inside_ip_addr;
645     u16 outside_ip_port_start;
646     u8  pad[CNAT_NFV9_BULK_DEL_RECORD_PAD_BYTES];
647 } nfv9_bulk_del_record_t;
648
649 /*
650  * DS-lite bulk port (user based) add record definition
651  */
652
653 #define CNAT_NFV9_DS_LITE_BULK_ADD_RECORD_PAD_BYTES (0)
654 #define CNAT_NFV9_DS_LITE_BULK_DEL_RECORD_PAD_BYTES (2)
655
656 typedef struct {
657     u32 inside_vrf_id;
658     u32 outside_vrf_id;
659     u32 inside_ip_addr;
660     u32 inside_v6_src_addr[4];
661     u32 outside_ip_addr;
662     u16 outside_ip_port_start;
663     u16 outside_ip_port_end;
664     u8  pad[CNAT_NFV9_DS_LITE_BULK_ADD_RECORD_PAD_BYTES]; 
665 } nfv9_ds_lite_bulk_add_record_t;
666
667
668 /*
669  * DS-lite bulk port (user based) delete record definition
670  */
671
672 typedef struct {
673     u32 inside_vrf_id;
674     u32 inside_ip_addr;
675     u32 inside_v6_src_addr[4];
676     u16 outside_ip_port_start;
677     u8  pad[CNAT_NFV9_DS_LITE_BULK_DEL_RECORD_PAD_BYTES];
678 } nfv9_ds_lite_bulk_del_record_t;
679
680 #endif /* NO_BULK_LOGGING */
681
682 /* NAT64 related structures */
683
684 typedef struct {
685     u32 inside_v6_src_addr[4];
686     u32 outside_v4_src_addr;
687     u16 inside_src_port;
688     u16 outside_src_port;
689     u8  protocol;
690     u8  pad[CNAT_NFV9_NAT64_ADD_BIB_RECORD_PAD_BYTES];
691 } nfv9_nat64_add_bib_record_t;
692
693
694 typedef struct {
695     u32 inside_v6_src_addr[4];
696     u32 outside_v4_src_addr;
697     u32 inside_v6_dest_addr[4];
698     u32 outside_v4_dest_addr;
699     u16 inside_src_port;
700     u16 outside_src_port;
701     u16 dest_port;
702     u8  protocol;
703     u8  pad[CNAT_NFV9_NAT64_ADD_SESSION_RECORD_PAD_BYTES];
704 } nfv9_nat64_add_session_record_t;
705
706
707 typedef struct {
708     u32 inside_v6_src_addr[4];
709     u16 inside_src_port;
710     u8  protocol;
711     u8  pad[CNAT_NFV9_NAT64_DEL_BIB_RECORD_PAD_BYTES];
712 } nfv9_nat64_del_bib_record_t;
713
714
715 typedef struct {
716     u32 inside_v6_src_addr[4];
717     u32 inside_v6_dest_addr[4];
718     u16 inside_src_port;
719     u16 dest_port;
720     u8  protocol;
721     u8  pad[CNAT_NFV9_NAT64_DEL_SESSION_RECORD_PAD_BYTES];
722 } nfv9_nat64_del_session_record_t;
723
724 /*
725  * NFv9 Session based Add record definition
726  */
727 typedef struct {
728     u32 inside_vrf_id;
729     u32 outside_vrf_id;
730     u32 inside_ip_addr;
731     u32 outside_ip_addr;
732     u16 inside_ip_port;
733     u16 outside_ip_port;
734     u32 dest_ip_addr;
735     u16 dest_port;
736     u8  protocol;
737     u8  pad[CNAT_NFV9_NAT44_ADD_SESSION_RECORD_PAD_BYTES];
738 } nfv9_add_session_record_t;
739
740 /*
741  * NFv9 Session based del record definition
742  */
743 typedef struct {
744     u32 inside_vrf_id;
745     u32 inside_ip_addr;
746     u32 dest_ip_addr;
747     u16 inside_ip_port;
748     u16 dest_port;
749     u8  protocol;
750     u8  pad[CNAT_NFV9_NAT44_DEL_SESSION_RECORD_PAD_BYTES];
751 } nfv9_del_session_record_t;
752
753 /*
754  * DS-lite NFv9 create record structure
755  */
756 typedef struct {
757     u32 inside_vrf_id;
758     u32 outside_vrf_id;
759     u32 inside_ip_addr;
760     u32 inside_v6_src_addr[4];
761     u32 outside_ip_addr;
762     u16 inside_ip_port;
763     u16 outside_ip_port;
764     u8  protocol;
765     u8  pad[CNAT_NFV9_DS_LITE_ADD_RECORD_PAD_BYTES]; 
766 } nfv9_ds_lite_add_record_t;
767
768 typedef struct {
769     u32 inside_vrf_id;
770     u32 inside_ip_addr;
771     u32 inside_v6_src_addr[4];
772     u16 inside_ip_port;
773     u8  protocol;
774     u8  pad[CNAT_NFV9_DS_LITE_DEL_RECORD_PAD_BYTES];
775 } nfv9_ds_lite_del_record_t;
776
777 /*
778  * NFv9 Session based Add record definition
779  */
780 typedef struct {
781     u32 inside_vrf_id;
782     u32 outside_vrf_id;
783     u32 inside_ip_addr;
784     u32 inside_v6_src_addr[4];
785     u32 outside_ip_addr;
786     u16 inside_ip_port;
787     u16 outside_ip_port;
788     u32 dest_ip_addr;
789     u16 dest_port;
790     u8  protocol;
791     u8  pad[CNAT_NFV9_DS_LITE_ADD_SESSION_RECORD_PAD_BYTES];
792 } nfv9_ds_lite_add_session_record_t;
793
794 /*
795  * NFv9 Session based del record definition
796  */
797 typedef struct {
798     u32 inside_vrf_id;
799     u32 inside_ip_addr;
800     u32 inside_v6_src_addr[4];
801     u32 dest_ip_addr;
802     u16 inside_ip_port;
803     u16 dest_port;
804     u8  protocol;
805     u8  pad[CNAT_NFV9_DS_LITE_DEL_SESSION_RECORD_PAD_BYTES];
806 } nfv9_ds_lite_del_session_record_t;
807
808
809 typedef struct {
810     u32 ingress_vrf_id;
811     u8  ingress_vrf_name[NFV9_VRF_NAME_LEN];
812     u8  pad[CNAT_NFV9_INGRESS_VRFID_NAME_RECORD_PAD_BYTES];
813 } nfv9_ingress_vrfid_name_record_t;
814
815 #define CNAT_NFV9_TEMPLATE_OFFSET \
816     (CNAT_NFV9_HDR_OFFSET + sizeof(nfv9_header_t))
817
818 #define CNAT_NFV9_TEMPLATE_LENGTH (sizeof(cnat_nfv9_template_t))
819 #define CNAT_NFV9_OPTION_TEMPLATE_LENGTH (sizeof(cnat_nfv9_option_template_t))
820
821 #define CNAT_NFV9_DATAFLOW_RECORD_HEADER_LENGTH \
822             (sizeof(nfv9_dataflow_record_header_t))
823
824 /*
825  * No padding is needed for the add/delete records - reduce padding bytes
826  */
827
828 #define CNAT_NFV9_ADD_RECORD_LENGTH (sizeof(nfv9_add_record_t) - \
829                                      CNAT_NFV9_ADD_RECORD_PAD_BYTES)
830
831 #define CNAT_NFV9_DEL_RECORD_LENGTH (sizeof(nfv9_del_record_t) - \
832                                      CNAT_NFV9_DEL_RECORD_PAD_BYTES)
833
834 #define CNAT_NFV9_DS_LITE_ADD_RECORD_LENGTH (sizeof(nfv9_ds_lite_add_record_t) - \
835                                      CNAT_NFV9_DS_LITE_ADD_RECORD_PAD_BYTES)
836 #define CNAT_NFV9_DS_LITE_DEL_RECORD_LENGTH (sizeof(nfv9_ds_lite_del_record_t) - \
837                                      CNAT_NFV9_DS_LITE_DEL_RECORD_PAD_BYTES)
838 #ifndef NO_BULK_LOGGING
839 #define CNAT_NFV9_BULK_ADD_RECORD_LENGTH (sizeof(nfv9_bulk_add_record_t) - \
840                                     CNAT_NFV9_BULK_ADD_RECORD_PAD_BYTES)
841 #define CNAT_NFV9_BULK_DEL_RECORD_LENGTH (sizeof(nfv9_bulk_del_record_t) - \
842                                       CNAT_NFV9_BULK_DEL_RECORD_PAD_BYTES)
843
844 #define CNAT_NFV9_DS_LITE_BULK_ADD_RECORD_LENGTH (sizeof(nfv9_ds_lite_bulk_add_record_t) - \
845                                     CNAT_NFV9_DS_LITE_BULK_ADD_RECORD_PAD_BYTES)
846 #define CNAT_NFV9_DS_LITE_BULK_DEL_RECORD_LENGTH (sizeof(nfv9_ds_lite_bulk_del_record_t) - \
847                                       CNAT_NFV9_DS_LITE_BULK_DEL_RECORD_PAD_BYTES)
848
849
850 #endif /* NO_BULK_LOGGING */
851
852 #define CNAT_NFV9_INGRESS_VRFID_NAME_RECORD_LENGTH (sizeof(nfv9_ingress_vrfid_name_record_t) - \
853                                       CNAT_NFV9_INGRESS_VRFID_NAME_RECORD_PAD_BYTES)
854                                                                 
855 #define CNAT_NFV9_NAT64_ADD_BIB_RECORD_LENGTH  \
856     (sizeof(nfv9_nat64_add_bib_record_t) -  \
857      CNAT_NFV9_NAT64_ADD_BIB_RECORD_PAD_BYTES)
858
859 #define CNAT_NFV9_NAT64_DEL_BIB_RECORD_LENGTH  \
860     (sizeof(nfv9_nat64_del_bib_record_t) - \
861      CNAT_NFV9_NAT64_DEL_BIB_RECORD_PAD_BYTES)
862
863 #define CNAT_NFV9_NAT64_ADD_SESSION_RECORD_LENGTH  \
864     (sizeof(nfv9_nat64_add_session_record_t) -  \
865      CNAT_NFV9_NAT64_ADD_SESSION_RECORD_PAD_BYTES)
866
867 #define CNAT_NFV9_NAT64_DEL_SESSION_RECORD_LENGTH  \
868     (sizeof(nfv9_nat64_del_session_record_t) - \
869      CNAT_NFV9_NAT64_DEL_SESSION_RECORD_PAD_BYTES)
870
871 #define CNAT_NFV9_MAX_SINGLE_RECORD_LENGTH \
872     (sizeof(nfv9_ds_lite_add_session_record_t) - \
873      CNAT_NFV9_DS_LITE_ADD_SESSION_RECORD_PAD_BYTES)
874      
875 #define CNAT_NFV9_NAT44_ADD_SESSION_RECORD_LENGTH \
876                     (sizeof(nfv9_add_session_record_t) -\
877                     CNAT_NFV9_NAT44_ADD_SESSION_RECORD_PAD_BYTES)
878
879 #define CNAT_NFV9_NAT44_DEL_SESSION_RECORD_LENGTH \
880                     (sizeof(nfv9_del_session_record_t) -\
881                     CNAT_NFV9_NAT44_DEL_SESSION_RECORD_PAD_BYTES)
882
883 #define CNAT_NFV9_DS_LITE_ADD_SESSION_RECORD_LENGTH \
884                     (sizeof(nfv9_ds_lite_add_session_record_t) -\
885                     CNAT_NFV9_DS_LITE_ADD_SESSION_RECORD_PAD_BYTES)
886
887 #define CNAT_NFV9_DS_LITE_DEL_SESSION_RECORD_LENGTH \
888                     (sizeof(nfv9_ds_lite_del_session_record_t) -\
889                     CNAT_NFV9_DS_LITE_DEL_SESSION_RECORD_PAD_BYTES)
890
891 /*
892  * Minimum value of the path MTU value
893  */
894 #define CNAT_NFV9_MIN_RECORD_SIZE (60 +                                      \
895                                    CNAT_NFV9_DATAFLOW_RECORD_HEADER_LENGTH + \
896                                    CNAT_NFV9_TEMPLATE_LENGTH  +              \
897                                    CNAT_NFV9_MAX_SINGLE_RECORD_LENGTH)
898
899 /*
900  * Let us put the maximum length of the netflow data to be 1400
901  */
902 #define CNAT_NFV9_MAX_PKT_LENGTH 1400
903
904 /*
905  * Data structures and defines to store NFV9 specific info
906  */
907 #define CNAT_NFV9_INVALID_LOGGING_INDEX  0xffffffff
908
909 /*
910  * Padding value between ADD and DELETE records.  This can be atmost 3 bytes
911  */
912 #define NFV9_PAD_VALUE (3)
913
914 typedef struct {
915     /* NFV9 server specific info
916      * For now, it will maintain only package sequence count.
917      * Later it will maintain server address, port, etc.
918      * Though it currently has server address and port, it is only for 
919      * cross refernce
920      */
921     u32 ipv4_address; /* Destination IP address of the collector */
922     u16 port;     /* Destination port number of the collector */
923     u16 refresh_rate; /* Refresh rate in packets after which template is sent */
924     u16 timeout_rate; /* Timeout rate in seconds after which template is sent */
925     u16 ref_count; /* Num of instances using this data */
926     u32 sequence_num; /* Sequence number of the logging packet */
927     /*
928      * Keep track of the time and packets since last template send
929      */
930     u32 last_template_sent_time;
931     u32 pkts_since_last_template;
932     u8  template_sent; /* used while sending vrfid-name mapping */
933
934 } nfv9_server_info_t;
935
936 /*
937  * This structure store the Netflow Logging information on per NFv9
938  * collector basis. This structure is allocated from a pool and index
939  * to this structure is stored VRF MAP structures
940  */
941 typedef struct {
942     /* 
943      * nat64_id will be 0 for nat44 config and i_vrf_id, i_vrf will be 0
944      * for nat64 config. Nat64_id will be used while nat64 collector is 
945      * search and i_vrf* for nat44 collector
946      */
947      /* Similarly for ds_lite, ds_lite_id will be used and nat64_id, 
948       * ivrf_id shall be set to 0 
949       */
950     u32 i_vrf_id; /* Inside VRF ID corresponding to this collector */
951     u16 i_vrf;    /* Inside VRF (uidb_index) corresponding to this collector */
952     u16 nat64_id; /* NAT64 instance for to this collector */
953     u16 ds_lite_id; /* DS Lite instance for this collector */
954
955     /*
956      * This field determines the maximum size of the Netflow V9 information
957      * that can be stored in a logging packet
958      */
959     u16 max_length_minus_max_record_size;
960
961     /*
962      * Indicates if the entry is already deleted
963      */
964     u16 deleted;
965
966     u16 pkt_length;         /* Length of the currently NFv9 information */
967     u16 record_length[MAX_RECORDS];  /* Length of delete record */
968     u16 total_record_count; /* Total number of records including templates */
969
970     u8  logging_policy;
971
972     /*
973      * Keep track of the time and packets since last template send
974      */
975     u32 last_template_sent_time;
976     u32 pkts_since_last_template;
977
978     /* Server info */
979     u32 server_index;
980
981     /*
982      * current logging context
983      */
984     vlib_buffer_t *current_logging_context;
985
986     /*
987      * Timestamp in UNIX seconds corresponding to when the current
988      * logging packet was created
989      */
990     u32 current_logging_context_timestamp;
991
992     /*
993      * Queued logging context waiting to be sent to the l3 infra node
994      */
995     vlib_buffer_t *queued_logging_context;
996
997     /*
998      * Headers corresponding to various records in this
999      * current nfv9 logging context
1000      */
1001     nfv9_header_t                  *nfv9_header;
1002     cnat_nfv9_template_t           *nfv9_template_header;
1003     nfv9_dataflow_record_header_t  *dataflow_header;
1004     u8                             *record[MAX_RECORDS];
1005     u8                             *next_data_ptr;
1006     u8                             last_record;
1007     u32                            nfv9_logging_next_index;
1008     u32 ip4_input_node_index; 
1009     vlib_frame_t                 *f;
1010     u32                          *to_next;
1011 } cnat_nfv9_logging_info_t;
1012
1013
1014 /*
1015  * Global structure for CGN APP configuration
1016  */
1017 typedef struct {
1018     /*
1019      * Global NFv9 Logging Collector Index
1020      */
1021     u32 cnat_nfv9_global_collector_index;
1022
1023     /*
1024      * Node index corresponding to the infra L3 output node
1025      * to which the nfv9 logging node will send the packet
1026      */
1027     u16 cnat_nfv9_disp_node_index;
1028
1029     /*
1030      * Whether we have initialized the NFv9 information
1031      */
1032     u8 cnat_nfv9_init_done;
1033 } cnat_nfv9_global_info_t;
1034
1035 typedef enum {
1036     cnat_nfv9_template_add_default,
1037     cnat_nfv9_template_add_always
1038 } cnat_nfv9_template_add_flag_t;
1039
1040 extern cnat_nfv9_template_t cnat_nfv9_template_info;
1041
1042 extern cnat_nfv9_logging_info_t cnat_default_nfv9_logging_info;
1043 extern cnat_nfv9_logging_info_t *cnat_nfv9_logging_info_pool;
1044
1045 extern cnat_nfv9_global_info_t  cnat_nfv9_global_info;
1046 extern nfv9_server_info_t *nfv9_server_info_pool;
1047
1048 /* #define DEBUG_NF_SERVER_CONFIG 1 */
1049 static inline void nfv9_delete_server_info(cnat_nfv9_logging_info_t *nfv9_info)
1050 {
1051     nfv9_server_info_t *server =  nfv9_server_info_pool +
1052         nfv9_info->server_index;
1053     if(nfv9_info->server_index == EMPTY) {
1054 #ifdef DEBUG_NF_SERVER_CONFIG
1055         if(my_instance_number == 1) { 
1056             PLATFORM_DEBUG_PRINT("Deleting empty server info\n");
1057         }
1058 #endif /* #ifdef DEBUG_NF_SERVER_CONFIG */
1059         return;
1060     }
1061
1062     /* Check if this server is not used by anyone.. if not delete */
1063     /* Caller of this function does not need it..so decrement ref count */
1064     server->ref_count--;
1065     if(!(server->ref_count)) {
1066 #ifdef DEBUG_NF_SERVER_CONFIG
1067         if(my_instance_number == 1) { 
1068             PLATFORM_DEBUG_PRINT("Deleting nfv9 server %x, %d at %d\n",
1069             server->ipv4_address, 
1070             server->port,
1071             nfv9_info->server_index);
1072         }
1073 #endif /* #ifdef DEBUG_NF_SERVER_CONFIG */
1074         pool_put(nfv9_server_info_pool, server);
1075         nfv9_info->server_index = EMPTY; 
1076     }
1077 #ifdef DEBUG_NF_SERVER_CONFIG
1078     else {  
1079         if(my_instance_number == 1) { 
1080             PLATFORM_DEBUG_PRINT("Not Deleting nfv9 server %x, %d rc %d\n",
1081             server->ipv4_address,
1082             server->port,
1083             server->ref_count);
1084         }
1085     }
1086 #endif /* #ifdef DEBUG_NF_SERVER_CONFIG */
1087     return;
1088 }
1089
1090 void handle_pending_nfv9_pkts();
1091 #endif /* __CNAT_LOGGING_H__ */