1 /*
2  *  Copyright (c) 2009-2020, Peter Haag
3  *  Copyright (c) 2004-2008, SWITCH - Teleinformatikdienste fuer Lehre und Forschung
4  *  All rights reserved.
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions are met:
8  *
9  *   * Redistributions of source code must retain the above copyright notice,
10  *     this list of conditions and the following disclaimer.
11  *   * Redistributions in binary form must reproduce the above copyright notice,
12  *     this list of conditions and the following disclaimer in the documentation
13  *     and/or other materials provided with the distribution.
14  *   * Neither the name of the author nor the names of its contributors may be
15  *     used to endorse or promote products derived from this software without
16  *     specific prior written permission.
17  *
18  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  *  POSSIBILITY OF SUCH DAMAGE.
29  *
30  */
31 
32 #include "config.h"
33 
34 #include <stdio.h>
35 #include <stddef.h>
36 #include <sys/types.h>
37 #include <sys/socket.h>
38 #include <netinet/in.h>
39 #include <arpa/inet.h>
40 #include <time.h>
41 #include <string.h>
42 #include <ctype.h>
43 #include <stdlib.h>
44 #include <errno.h>
45 
46 #ifdef HAVE_STDINT_H
47 #include <stdint.h>
48 #endif
49 
50 #include "util.h"
51 #include "nfdump.h"
52 #include "nffile.h"
53 #include "nfx.h"
54 #include "output_util.h"
55 #include "output_fmt.h"
56 
57 typedef void (*string_function_t)(master_record_t *, char *);
58 
59 static struct token_list_s {
60 	string_function_t	string_function;	// function generation output string
61 	char				*string_buffer;		// buffer for output string
62 } *token_list;
63 
64 static int	max_token_index	= 0;
65 static int	token_index		= 0;
66 
67 #define BLOCK_SIZE	32
68 
69 static char **format_list;		// ordered list of all individual strings formating the output line
70 static int	max_format_index	= 0;
71 static int	format_index		= 0;
72 
73 static int		do_tag 		 = 0;
74 static int 		long_v6 	 = 0;
75 static int		printPlain	 = 0;
76 static double	duration;
77 
78 #define STRINGSIZE 10240
79 #define IP_STRING_LEN (INET6_ADDRSTRLEN)
80 
81 static char header_string[STRINGSIZE];
82 static char data_string[STRINGSIZE];
83 
84 // tag
85 static char tag_string[2];
86 
87 /* prototypes */
88 static char *ICMP_Port_decode(master_record_t *r);
89 
90 static void InitFormatParser(void);
91 
92 static void AddToken(int index);
93 
94 static void AddString(char *string);
95 
96 static void String_FlowFlags(master_record_t *r, char *string);
97 
98 static void String_FirstSeen(master_record_t *r, char *string);
99 
100 static void String_LastSeen(master_record_t *r, char *string);
101 
102 static void String_Received(master_record_t *r, char *string);
103 
104 static void String_FirstSeenRaw(master_record_t *r, char *string);
105 
106 static void String_LastSeenRaw(master_record_t *r, char *string);
107 
108 static void String_ReceivedRaw(master_record_t *r, char *string);
109 
110 static void String_Duration(master_record_t *r, char *string);
111 
112 static void String_Protocol(master_record_t *r, char *string);
113 
114 static void String_SrcAddr(master_record_t *r, char *string);
115 
116 static void String_DstAddr(master_record_t *r, char *string);
117 
118 static void String_SrcAddrPort(master_record_t *r, char *string);
119 
120 static void String_DstAddrPort(master_record_t *r, char *string);
121 
122 static void String_SrcNet(master_record_t *r, char *string);
123 
124 static void String_DstNet(master_record_t *r, char *string);
125 
126 static void String_NextHop(master_record_t *r, char *string);
127 
128 static void String_BGPNextHop(master_record_t *r, char *string);
129 
130 static void String_RouterIP(master_record_t *r, char *string);
131 
132 static void String_SrcPort(master_record_t *r, char *string);
133 
134 static void String_DstPort(master_record_t *r, char *string);
135 
136 static void String_ICMP_code(master_record_t *r, char *string);
137 
138 static void String_ICMP_type(master_record_t *r, char *string);
139 
140 static void String_SrcAS(master_record_t *r, char *string);
141 
142 static void String_DstAS(master_record_t *r, char *string);
143 
144 static void String_NextAS(master_record_t *r, char *string);
145 
146 static void String_PrevAS(master_record_t *r, char *string);
147 
148 static void String_Input(master_record_t *r, char *string);
149 
150 static void String_Output(master_record_t *r, char *string);
151 
152 static void String_InPackets(master_record_t *r, char *string);
153 
154 static void String_OutPackets(master_record_t *r, char *string);
155 
156 static void String_InBytes(master_record_t *r, char *string);
157 
158 static void String_OutBytes(master_record_t *r, char *string);
159 
160 static void String_Flows(master_record_t *r, char *string);
161 
162 static void String_Tos(master_record_t *r, char *string);
163 
164 static void String_Dir(master_record_t *r, char *string);
165 
166 static void String_SrcTos(master_record_t *r, char *string);
167 
168 static void String_DstTos(master_record_t *r, char *string);
169 
170 static void String_SrcMask(master_record_t *r, char *string);
171 
172 static void String_DstMask(master_record_t *r, char *string);
173 
174 static void String_SrcVlan(master_record_t *r, char *string);
175 
176 static void String_DstVlan(master_record_t *r, char *string);
177 
178 static void String_FwdStatus(master_record_t *r, char *string);
179 
180 static void String_Flags(master_record_t *r, char *string);
181 
182 static void String_InSrcMac(master_record_t *r, char *string);
183 
184 static void String_OutDstMac(master_record_t *r, char *string);
185 
186 static void String_InDstMac(master_record_t *r, char *string);
187 
188 static void String_OutSrcMac(master_record_t *r, char *string);
189 
190 static void String_MPLS_1(master_record_t *r, char *string);
191 
192 static void String_MPLS_2(master_record_t *r, char *string);
193 
194 static void String_MPLS_3(master_record_t *r, char *string);
195 
196 static void String_MPLS_4(master_record_t *r, char *string);
197 
198 static void String_MPLS_5(master_record_t *r, char *string);
199 
200 static void String_MPLS_6(master_record_t *r, char *string);
201 
202 static void String_MPLS_7(master_record_t *r, char *string);
203 
204 static void String_MPLS_8(master_record_t *r, char *string);
205 
206 static void String_MPLS_9(master_record_t *r, char *string);
207 
208 static void String_MPLS_10(master_record_t *r, char *string);
209 
210 static void String_MPLSs(master_record_t *r, char *string);
211 
212 static void String_Engine(master_record_t *r, char *string);
213 
214 static void String_Label(master_record_t *r, char *string);
215 
216 static void String_ClientLatency(master_record_t *r, char *string);
217 
218 static void String_ServerLatency(master_record_t *r, char *string);
219 
220 static void String_AppLatency(master_record_t *r, char *string);
221 
222 static void String_bps(master_record_t *r, char *string);
223 
224 static void String_pps(master_record_t *r, char *string);
225 
226 static void String_bpp(master_record_t *r, char *string);
227 
228 static void String_ExpSysID(master_record_t *r, char *string);
229 
230 #ifdef NSEL
231 static void String_EventTime(master_record_t *r, char *string);
232 
233 static void String_nfc(master_record_t *r, char *string);
234 
235 static void String_evt(master_record_t *r, char *string);
236 
237 static void String_xevt(master_record_t *r, char *string);
238 
239 static void String_sgt(master_record_t *r, char *string);
240 
241 static void String_msec(master_record_t *r, char *string);
242 
243 static void String_iacl(master_record_t *r, char *string);
244 
245 static void String_eacl(master_record_t *r, char *string);
246 
247 static void String_xlateSrcAddr(master_record_t *r, char *string);
248 
249 static void String_xlateDstAddr(master_record_t *r, char *string);
250 
251 static void String_xlateSrcPort(master_record_t *r, char *string);
252 
253 static void String_xlateDstPort(master_record_t *r, char *string);
254 
255 static void String_xlateSrcAddrPort(master_record_t *r, char *string);
256 
257 static void String_xlateDstAddrPort(master_record_t *r, char *string);
258 
259 static void String_userName(master_record_t *r, char *string);
260 
261 static void String_ivrf(master_record_t *r, char *string);
262 
263 static void String_evrf(master_record_t *r, char *string);
264 
265 static void String_PortBlockStart(master_record_t *r, char *string);
266 
267 static void String_PortBlockEnd(master_record_t *r, char *string);
268 
269 static void String_PortBlockStep(master_record_t *r, char *string);
270 
271 static void String_PortBlockSize(master_record_t *r, char *string);
272 
273 #endif
274 
275 static struct format_token_list_s {
276 	char				*token;				// token
277 	int					is_address;			// is an IP address
278 	char				*header;			// header line description
279 	string_function_t	string_function;	// function generation output string
280 } format_token_list[] = {
281 	{ "%ff", 0, "Flow Flags", 				String_FlowFlags }, 	// flow flags in hex
282 	{ "%tfs", 0, "Date first seen        ", String_FirstSeen },		// Start Time - first seen
283 	{ "%ts",  0, "Date first seen        ", String_FirstSeen },		// Start Time - first seen
284 	{ "%tsr",  0, "Date first seen (raw)    ", String_FirstSeenRaw },		// Start Time - first seen, seconds
285 	{ "%te",  0, "Date last seen         ", String_LastSeen },		// End Time	- last seen
286 	{ "%ter",  0, "Date last seen (raw)     ", String_LastSeenRaw },		// End Time - first seen, seconds
287 	{ "%tr",  0, "Date flow received     ", String_Received },		// Received Time
288 	{ "%trr",  0, "Date flow received (raw)  ", String_ReceivedRaw },		// Received Time, seconds
289 	{ "%td",  0, " Duration", 				String_Duration },		// Duration
290 	{ "%exp", 0, "Exp ID", 				 	String_ExpSysID },		// Exporter SysID
291 	{ "%pr",  0, "Proto", 					String_Protocol },		// Protocol
292 	{ "%sa",  1, "     Src IP Addr", 		String_SrcAddr },		// Source Address
293 	{ "%da",  1, "     Dst IP Addr", 		String_DstAddr },		// Destination Address
294 	{ "%sn",  1, "        Src Network",		String_SrcNet },		// Source Address applied source netmask
295 	{ "%dn",  1, "        Dst Network",		String_DstNet },		// Destination Address applied source netmask
296 	{ "%nh",  1, "     Next-hop IP", 		String_NextHop },		// Next-hop IP Address
297 	{ "%nhb", 1, " BGP next-hop IP", 		String_BGPNextHop },	// BGP Next-hop IP Address
298 	{ "%ra",  1, "       Router IP", 		String_RouterIP },		// Router IP Address
299 	{ "%sap", 1, "     Src IP Addr:Port ",	String_SrcAddrPort },	// Source Address:Port
300 	{ "%dap", 1, "     Dst IP Addr:Port ",  String_DstAddrPort },	// Destination Address:Port
301 	{ "%sp",  0, "Src Pt", 				 	String_SrcPort },		// Source Port
302 	{ "%dp",  0, "Dst Pt", 				 	String_DstPort },		// Destination Port
303 	{ "%it",  0, "ICMP-T", 					String_ICMP_type },		// ICMP type
304 	{ "%ic",  0, "ICMP-C", 					String_ICMP_code },		// ICMP code
305 	{ "%sas", 0, "Src AS",				 	String_SrcAS },			// Source AS
306 	{ "%das", 0, "Dst AS",				 	String_DstAS },			// Destination AS
307 	{ "%nas", 0, "Next AS",				 	String_NextAS },		// Next AS
308 	{ "%pas", 0, "Prev AS",				 	String_PrevAS },		// Previous AS
309 	{ "%in",  0, " Input", 				 	String_Input },			// Input Interface num
310 	{ "%out", 0, "Output", 				 	String_Output },		// Output Interface num
311 	{ "%pkt", 0, " Packets", 			 	String_InPackets },		// Packets - default input - compat
312 	{ "%ipkt", 0, "  In Pkt", 			 	String_InPackets },		// In Packets
313 	{ "%opkt", 0, " Out Pkt", 			 	String_OutPackets },	// Out Packets
314 	{ "%byt", 0, "   Bytes", 			 	String_InBytes },		// Bytes - default input - compat
315 	{ "%ibyt", 0, " In Byte", 			 	String_InBytes },		// In Bytes
316 	{ "%obyt", 0, "Out Byte", 			 	String_OutBytes },		// In Bytes
317 	{ "%fl",  0, "Flows", 				 	String_Flows },			// Flows
318 	{ "%flg", 0,  "   Flags", 			 	String_Flags },			// TCP Flags
319 	{ "%tos", 0, "Tos", 				 	String_Tos },			// Tos - compat
320 	{ "%stos", 0, "STos", 				 	String_SrcTos },		// Tos - Src tos
321 	{ "%dtos", 0, "DTos", 				 	String_DstTos },		// Tos - Dst tos
322 	{ "%dir", 0, "Dir", 				 	String_Dir },			// Direction: ingress, egress
323 	{ "%smk", 0, "SMask", 				 	String_SrcMask },		// Src mask
324 	{ "%dmk", 0, "DMask", 				 	String_DstMask },		// Dst mask
325 	{ "%fwd", 0, "Fwd", 				 	String_FwdStatus },		// Forwarding Status
326 	{ "%svln", 0, "SVlan", 				 	String_SrcVlan },		// Src Vlan
327 	{ "%dvln", 0, "DVlan", 				 	String_DstVlan },		// Dst Vlan
328 	{ "%ismc", 0, "  In src MAC Addr", 	 	String_InSrcMac },		// Input Src Mac Addr
329 	{ "%odmc", 0, " Out dst MAC Addr", 	 	String_OutDstMac },		// Output Dst Mac Addr
330 	{ "%idmc", 0, "  In dst MAC Addr", 	 	String_InDstMac },		// Input Dst Mac Addr
331 	{ "%osmc", 0, " Out src MAC Addr", 	 	String_OutSrcMac },		// Output Src Mac Addr
332 	{ "%mpls1", 0, " MPLS lbl 1 ", 			String_MPLS_1 },		// MPLS Label 1
333 	{ "%mpls2", 0, " MPLS lbl 2 ", 			String_MPLS_2 },		// MPLS Label 2
334 	{ "%mpls3", 0, " MPLS lbl 3 ", 			String_MPLS_3 },		// MPLS Label 3
335 	{ "%mpls4", 0, " MPLS lbl 4 ", 			String_MPLS_4 },		// MPLS Label 4
336 	{ "%mpls5", 0, " MPLS lbl 5 ", 			String_MPLS_5 },		// MPLS Label 5
337 	{ "%mpls6", 0, " MPLS lbl 6 ", 			String_MPLS_6 },		// MPLS Label 6
338 	{ "%mpls7", 0, " MPLS lbl 7 ", 			String_MPLS_7 },		// MPLS Label 7
339 	{ "%mpls8", 0, " MPLS lbl 8 ", 			String_MPLS_8 },		// MPLS Label 8
340 	{ "%mpls9", 0, " MPLS lbl 9 ", 			String_MPLS_9 },		// MPLS Label 9
341 	{ "%mpls10", 0, " MPLS lbl 10",			String_MPLS_10 },		// MPLS Label 10
342 	{ "%mpls", 0, "                                               MPLS labels 1-10                                                                   ", 			String_MPLSs },			// All MPLS labels
343 	//
344 	{ "%bps", 0, "     bps", 	 		 	String_bps },			// bps - bits per second
345 	{ "%pps", 0, "     pps", 			 	String_pps },			// pps - packets per second
346 	{ "%bpp", 0, "   Bpp", 				 	String_bpp },			// bpp - Bytes per package
347 	{ "%eng", 0, " engine", 			 	String_Engine },		// Engine Type/ID
348 	{ "%lbl", 0, "           label", 		String_Label },			// Flow Label
349 
350 #ifdef NSEL
351 // NSEL specifics
352 	{ "%nfc",   0, "   Conn-ID", 			String_nfc },				// NSEL connection ID
353 	{ "%tevt", 	0, "Event time             ",String_EventTime },		// NSEL Flow start time
354 	{ "%evt",   0, " Event", 				String_evt },				// NSEL event
355 	{ "%xevt",  0, " XEvent", 				String_xevt },				// NSEL xevent
356 	{ "%sgt",   0, "  SGT  ", 				String_sgt },				// NSEL xevent
357 	{ "%msec",  0, "   Event Time", 		String_msec},				// NSEL event time in msec
358 	{ "%iacl",  0, "Ingress ACL                     ", String_iacl}, 	// NSEL ingress ACL
359 	{ "%eacl",  0, "Egress ACL                      ", String_eacl}, 	// NSEL egress ACL
360 	{ "%xsa",   0, "   X-late Src IP", 		String_xlateSrcAddr},		// NSEL XLATE src IP
361 	{ "%xda",   0, "   X-late Dst IP", 		String_xlateDstAddr},		// NSEL XLATE dst IP
362 	{ "%xsp",   0, "XsPort", 				String_xlateSrcPort},		// NSEL XLATE src port
363 	{ "%xdp",   0, "XdPort", 				String_xlateDstPort},		// NSEL SLATE dst port
364 	{ "%xsap", 1, "   X-Src IP Addr:Port ",	String_xlateSrcAddrPort },	// Xlate Source Address:Port
365 	{ "%xdap", 1, "   X-Dst IP Addr:Port ", String_xlateDstAddrPort },	// Xlate Destination Address:Port
366 	{ "%uname", 0, "UserName", 				String_userName},			// NSEL user name
367 
368 // NEL
369 // for v.1.6.10 compatibility, keep NEL specific addr/port format tokens
370 	{ "%nevt",   0, " Event", 				  String_evt },				// NAT event
371 	{ "%vrf",    0, "  I-VRF-ID", 			  String_ivrf },			// NAT ivrf ID - compatible
372 	{ "%ivrf",   0, "  I-VRF-ID", 			  String_ivrf },			// NAT ivrf ID
373 	{ "%evrf",   0, "  E-VRF-ID", 			  String_evrf },			// NAT ivrf ID
374 	{ "%nsa",    0, "   X-late Src IP", 	  String_xlateSrcAddr},		// NAT XLATE src IP
375 	{ "%nda",    0, "   X-late Dst IP", 	  String_xlateDstAddr},		// NAT XLATE dst IP
376 	{ "%nsp",    0, "XsPort", 				  String_xlateSrcPort},		// NAT XLATE src port
377 	{ "%ndp",    0, "XdPort", 				  String_xlateDstPort},		// NAT SLATE dst port
378 	{ "%nsap",   1, "   X-Src IP Addr:Port ", String_xlateSrcAddrPort },// NAT Xlate Source Address:Port
379 	{ "%ndap",   1, "   X-Dst IP Addr:Port ", String_xlateDstAddrPort },// NAT Xlate Destination Address:Port
380 
381 	// Port block allocation
382 	{ "%pbstart", 0, "Pb-Start", 			  String_PortBlockStart},	// Port block start
383 	{ "%pbend",   0, "Pb-End", 				  String_PortBlockEnd},		// Port block end
384 	{ "%pbstep",  0, "Pb-Step", 			  String_PortBlockStep},	// Port block step
385 	{ "%pbsize",  0, "Pb-Size", 			  String_PortBlockSize},	// Port block size
386 #endif
387 
388 	// latency extension for nfpcapd and nprobe
389 	{ "%cl", 0, "C Latency", 	 		 	String_ClientLatency },	// client latency
390 	{ "%sl", 0, "S latency", 	 		 	String_ServerLatency },	// server latency
391 	{ "%al", 0, "A latency", 			 	String_AppLatency },	// app latency
392 
393 	{ NULL, 0, NULL, NULL }
394 };
395 
396 /* each of the tokens above must not generate output strings larger than this */
397 #define MAX_STRING_LENGTH	256
398 
399 
400 #include "applybits_inline.c"
401 
402 /* functions */
403 
404 
Setv6Mode(int mode)405 void Setv6Mode(int mode) {
406 	long_v6 += mode;
407 }
408 
Getv6Mode(void)409 int Getv6Mode(void) {
410 	return long_v6;
411 }
412 
format_special(void * record,char ** s,int tag)413 void format_special(void *record, char ** s, int tag) {
414 master_record_t *r 		  = (master_record_t *)record;
415 int	i, index;
416 
417 	do_tag		  = tag;
418 	tag_string[0] = do_tag ? TAG_CHAR : '\0';
419 	tag_string[1] = '\0';
420 
421 	duration = r->last - r->first;
422 	duration += ((double)r->msec_last - (double)r->msec_first) / 1000.0;
423 	for ( i=0; i<token_index; i++ ) {
424 		token_list[i].string_function(r, token_list[i].string_buffer);
425 	}
426 
427 	// concat all strings together for the output line
428 	i = 0;
429 	for ( index=0; index<format_index; index++ ) {
430 		int j = 0;
431 		while ( format_list[index][j] && i < STRINGSIZE )
432 			data_string[i++] = format_list[index][j++];
433 	}
434 	if ( i < STRINGSIZE )
435 		data_string[i] = '\0';
436 
437 	data_string[STRINGSIZE-1] = '\0';
438 	*s = data_string;
439 
440 } // End of format_special
441 
text_prolog(void)442 void text_prolog(void) {
443 	printf("%s\n", header_string);
444 } // End of text_prolog
445 
text_epilog(void)446 void text_epilog(void) {
447 	// empty
448 } // End of text_epilog
449 
InitFormatParser(void)450 static void InitFormatParser(void) {
451 
452 	max_format_index = max_token_index = BLOCK_SIZE;
453 	format_list = (char **)malloc(max_format_index * sizeof(char *));
454 	token_list  = (struct token_list_s *)malloc(max_token_index * sizeof(struct token_list_s));
455 	if ( !format_list || !token_list ) {
456 		fprintf(stderr, "Memory allocation error in %s line %d: %s\n", __FILE__, __LINE__, strerror(errno) );
457 		exit(255);
458 	}
459 
460 } // End of InitFormatParser
461 
AddToken(int index)462 static void AddToken(int index) {
463 
464 	if ( token_index >= max_token_index ) { // no slot available - expand table
465 		max_token_index += BLOCK_SIZE;
466 		token_list = (struct token_list_s *)realloc(token_list, max_token_index * sizeof(struct token_list_s));
467 		if ( !token_list ) {
468 			fprintf(stderr, "Memory allocation error in %s line %d: %s\n", __FILE__, __LINE__, strerror(errno) );
469 			exit(255);
470 		}
471 	}
472 	token_list[token_index].string_function	 = format_token_list[index].string_function;
473 	token_list[token_index].string_buffer = malloc(MAX_STRING_LENGTH);
474 	if ( !token_list[token_index].string_buffer ) {
475 		fprintf(stderr, "Memory allocation error in %s line %d: %s\n", __FILE__, __LINE__, strerror(errno) );
476 		exit(255);
477 	}
478 
479 	AddString(token_list[token_index].string_buffer);
480 	token_index++;
481 
482 } // End of AddToken
483 
484 /* Add either a static string or the memory for a variable string from a token to the list */
AddString(char * string)485 static void AddString(char *string) {
486 
487 	if ( !string ) {
488 		fprintf(stderr, "Panic! NULL string in %s line %d: %s\n", __FILE__, __LINE__, strerror(errno) );
489 		exit(255);
490 	}
491 
492 	if ( format_index >= max_format_index ) { // no slot available - expand table
493 		max_format_index += BLOCK_SIZE;
494 		format_list = (char **)realloc(format_list, max_format_index * sizeof(char *));
495 		if ( !format_list ) {
496 			fprintf(stderr, "Memory allocation error in %s line %d: %s\n", __FILE__, __LINE__, strerror(errno) );
497 			exit(255);
498 		}
499 	}
500 	format_list[format_index++] = string;
501 
502 } // End of AddString
503 
RecursiveReplace(char * format,printmap_t * printmap)504 static char* RecursiveReplace(char *format, printmap_t *printmap) {
505 int i = 0;
506 
507 	while ( printmap[i].printmode ) {
508 		char *s, *r;
509 		// check for printmode string
510 		s = strstr(format, printmap[i].printmode);
511 		if ( s && printmap[i].Format && s != format ) {
512 			int len = strlen(printmap[i].printmode);
513 			if ( !isalpha((int)s[len]) ) {
514 				s--;
515 				if ( s[0] == '%' ) {
516 					int newlen = strlen(format) + strlen(printmap[i].Format);
517 					r = malloc(newlen);
518 					if ( !r ) {
519 						LogError("malloc() allocation error in %s line %d: %s\n", __FILE__, __LINE__, strerror(errno) );
520 						exit(255);
521 					}
522 					s[0] = '\0';
523 					snprintf(r, newlen, "%s%s%s", format, printmap[i].Format, &(s[len+1]) );
524 					r[newlen-1] = '\0';
525 					free(format);
526 					format = r;
527 				}
528 			}
529 		}
530 		i++;
531 	}
532 
533 	return format;
534 
535 } // End of RecursiveReplace
536 
ParseOutputFormat(char * format,int plain_numbers,printmap_t * printmap)537 int ParseOutputFormat(char *format, int plain_numbers, printmap_t *printmap) {
538 char *c, *s, *h;
539 int	i, remaining;
540 
541 	printPlain = plain_numbers;
542 
543 	InitFormatParser();
544 
545 	s = strdup(format);
546 	if ( !s ) {
547 		fprintf(stderr, "Memory allocation error in %s line %d: %s\n", __FILE__, __LINE__, strerror(errno) );
548 		exit(255);
549 	}
550 	s = RecursiveReplace(s, printmap);
551 	c = s;
552 
553 	h = header_string;
554 	*h = '\0';
555 	while ( *c ) {
556 		if ( *c == '%' ) {	// it's a token from format_token_list
557 			i = 0;
558 			remaining = strlen(c);
559 			while ( format_token_list[i].token ) {	// sweep through the list
560 				int len = strlen(format_token_list[i].token);
561 
562 				// a token is separated by either a space, another token, or end of string
563 				if ( remaining >= len &&  !isalpha((int)c[len]) ) {
564 					// separator found a expected position
565 					char p = c[len]; 	// save separator;
566 					c[len] = '\0';
567 					if ( strncmp(format_token_list[i].token, c, len) == 0 ) {	// token found
568 						AddToken(i);
569 						if ( long_v6 && format_token_list[i].is_address )
570 							snprintf(h, STRINGSIZE-1-strlen(h), "%23s%s", "", format_token_list[i].header);
571 						else
572 							snprintf(h, STRINGSIZE-1-strlen(h), "%s", format_token_list[i].header);
573 						h += strlen(h);
574 						c[len] = p;
575 						c += len;
576 						break;
577 					} else {
578 						c[len] = p;
579 					}
580 				}
581 				i++;
582 			}
583 			if ( format_token_list[i].token == NULL ) {
584 				fprintf(stderr, "Output format parse error at: %s\n", c);
585 				free(s);
586 				return 0;
587 			}
588 		} else {			// it's a static string
589 			/* a static string goes up to next '%' or end of string */
590 			char *p = strchr(c, '%');
591 			char format[32];
592 			if ( p ) {
593 				// p points to next '%' token
594 				*p = '\0';
595 				AddString(strdup(c));
596 				snprintf(format, 31, "%%%zus", strlen(c));
597 				format[31] = '\0';
598 				snprintf(h, STRINGSIZE-1-strlen(h), format, "");
599 				h += strlen(h);
600 				*p = '%';
601 				c = p;
602 			} else {
603 				// static string up to end of format string
604 				AddString(strdup(c));
605 				snprintf(format, 31, "%%%zus", strlen(c));
606 				format[31] = '\0';
607 				snprintf(h, STRINGSIZE-1-strlen(h), format, "");
608 				h += strlen(h);
609 				*c = '\0';
610 			}
611 		}
612 	}
613 
614 	free(s);
615 	return 1;
616 
617 } // End of ParseOutputFormat
618 
ICMP_Port_decode(master_record_t * r)619 static char *ICMP_Port_decode(master_record_t *r) {
620 #define ICMPSTRLEN 16
621 static char icmp_string[ICMPSTRLEN];
622 
623 	if ( r->prot == IPPROTO_ICMP || r->prot == IPPROTO_ICMPV6 ) { // ICMP
624 		snprintf(icmp_string, ICMPSTRLEN-1, "%u.%u",  r->icmp_type, r->icmp_code);
625 	} else { 	// dst port
626 		snprintf(icmp_string, ICMPSTRLEN-1, "%u",  r->dstport);
627 	}
628 	icmp_string[ICMPSTRLEN-1] = '\0';
629 
630 	return icmp_string;
631 
632 } // End of ICMP_Port_decode
633 
634 /* functions, which create the individual strings for the output line */
String_FlowFlags(master_record_t * r,char * string)635 static void String_FlowFlags(master_record_t *r, char *string) {
636 
637 	snprintf(string, MAX_STRING_LENGTH-1, "0x%.2x", r->flags);
638 	string[MAX_STRING_LENGTH-1] = '\0';
639 
640 } // End of String_FlowFlags
641 
String_FirstSeen(master_record_t * r,char * string)642 static void String_FirstSeen(master_record_t *r, char *string) {
643 time_t 	tt;
644 struct tm * ts;
645 char 	*s;
646 
647 	tt = r->first;
648 	ts = localtime(&tt);
649 	strftime(string, MAX_STRING_LENGTH-1, "%Y-%m-%d %H:%M:%S", ts);
650 	s = string + strlen(string);
651 	snprintf(s, MAX_STRING_LENGTH-strlen(string)-1,".%03u", r->msec_first);
652 	string[MAX_STRING_LENGTH-1] = '\0';
653 
654 } // End of String_FirstSeen
655 
String_LastSeen(master_record_t * r,char * string)656 static void String_LastSeen(master_record_t *r, char *string) {
657 time_t 	tt;
658 struct tm * ts;
659 char 	*s;
660 
661 	tt = r->last;
662 	ts = localtime(&tt);
663 	strftime(string, MAX_STRING_LENGTH-1, "%Y-%m-%d %H:%M:%S", ts);
664 	s = string + strlen(string);
665 	snprintf(s, MAX_STRING_LENGTH-strlen(string)-1,".%03u", r->msec_last);
666 	string[MAX_STRING_LENGTH-1] = '\0';
667 
668 } // End of String_LastSeen
669 
String_Received(master_record_t * r,char * string)670 static void String_Received(master_record_t *r, char *string) {
671 time_t 	tt;
672 struct tm * ts;
673 char 	*s;
674 
675 	tt = r->received / 1000LL;
676 	ts = localtime(&tt);
677 	strftime(string, MAX_STRING_LENGTH-1, "%Y-%m-%d %H:%M:%S", ts);
678 	s = string + strlen(string);
679 	snprintf(s, MAX_STRING_LENGTH-strlen(string)-1,".%03llu", r->received % 1000LL);
680 	string[MAX_STRING_LENGTH-1] = '\0';
681 
682 } // End of String_Received
683 
String_ReceivedRaw(master_record_t * r,char * string)684 static void String_ReceivedRaw(master_record_t *r, char *string) {
685 
686 	 /* snprintf does write \0, and the max is INCL the terminating \0 */
687 	 snprintf(string, MAX_STRING_LENGTH, "%.3f", r->received/1000.0);
688 
689 } // End of String_ReceivedRaw
690 
String_FirstSeenRaw(master_record_t * r,char * string)691 static void String_FirstSeenRaw(master_record_t *r, char *string) {
692 
693 	 /* snprintf does write \0, and the max is INCL the terminating \0 */
694 	 snprintf(string, MAX_STRING_LENGTH, "%u.%03u", r->first, r->msec_first);
695 
696 } // End of String_FirstSeenRaw
697 
String_LastSeenRaw(master_record_t * r,char * string)698 static void String_LastSeenRaw(master_record_t *r, char *string) {
699 
700 	 /* snprintf does write \0, and the max is INCL the terminating \0 */
701 	 snprintf(string, MAX_STRING_LENGTH, "%u.%03u", r->last, r->msec_last);
702 
703 } // End of String_LastSeenRaw
704 
705 
706 #ifdef NSEL
String_EventTime(master_record_t * r,char * string)707 static void String_EventTime(master_record_t *r, char *string) {
708 time_t 	tt;
709 struct tm * ts;
710 char 	*s;
711 
712 	tt = r->event_time / 1000LL;
713 	ts = localtime(&tt);
714 	strftime(string, MAX_STRING_LENGTH-1, "%Y-%m-%d %H:%M:%S", ts);
715 	s = string + strlen(string);
716 	snprintf(s, MAX_STRING_LENGTH-strlen(string)-1,".%03llu", r->event_time % 1000LL);
717 	string[MAX_STRING_LENGTH-1] = '\0';
718 
719 } // End of String_EventTime
720 #endif
721 
String_Duration(master_record_t * r,char * string)722 static void String_Duration(master_record_t *r, char *string) {
723 
724 	snprintf(string, MAX_STRING_LENGTH-1 ,"%9.3f", duration);
725 	string[MAX_STRING_LENGTH-1] = '\0';
726 
727 } // End of String_Duration
728 
String_Protocol(master_record_t * r,char * string)729 static void String_Protocol(master_record_t *r, char *string) {
730 
731 	snprintf(string, MAX_STRING_LENGTH-1 ,"%-5s", ProtoString(r->prot, printPlain));
732 	string[MAX_STRING_LENGTH-1] = '\0';
733 
734 } // End of String_Protocol
735 
String_SrcAddr(master_record_t * r,char * string)736 static void String_SrcAddr(master_record_t *r, char *string) {
737 char tmp_str[IP_STRING_LEN];
738 
739 	tmp_str[0] = 0;
740 	if ( (r->flags & FLAG_IPV6_ADDR ) != 0 ) { // IPv6
741 		uint64_t	ip[2];
742 
743 		ip[0] = htonll(r->V6.srcaddr[0]);
744 		ip[1] = htonll(r->V6.srcaddr[1]);
745 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
746 		if ( ! long_v6 ) {
747 			CondenseV6(tmp_str);
748 		}
749 	} else {	// IPv4
750 		uint32_t	ip;
751 		ip = htonl(r->V4.srcaddr);
752 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
753 	}
754 	tmp_str[IP_STRING_LEN-1] = 0;
755 	if ( long_v6 )
756 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s", tag_string, tmp_str);
757 	else
758 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s", tag_string, tmp_str);
759 
760 	string[MAX_STRING_LENGTH-1] = 0;
761 
762 
763 } // End of String_SrcAddr
764 
String_SrcAddrPort(master_record_t * r,char * string)765 static void String_SrcAddrPort(master_record_t *r, char *string) {
766 char 	tmp_str[IP_STRING_LEN], portchar;
767 
768 	tmp_str[0] = 0;
769 	if ( (r->flags & FLAG_IPV6_ADDR ) != 0 ) { // IPv6
770 		uint64_t	ip[2];
771 
772 		ip[0] = htonll(r->V6.srcaddr[0]);
773 		ip[1] = htonll(r->V6.srcaddr[1]);
774 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
775 		if ( ! long_v6 ) {
776 			CondenseV6(tmp_str);
777 		}
778 		portchar = '.';
779 	} else {	// IPv4
780 		uint32_t	ip;
781 		ip = htonl(r->V4.srcaddr);
782 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
783 		portchar = ':';
784 	}
785 	tmp_str[IP_STRING_LEN-1] = 0;
786 
787 	if ( long_v6 )
788 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s%c%-5i", tag_string, tmp_str, portchar, r->srcport);
789 	else
790 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s%c%-5i", tag_string, tmp_str, portchar, r->srcport);
791 
792 	string[MAX_STRING_LENGTH-1] = 0;
793 
794 } // End of String_SrcAddrPort
795 
String_DstAddr(master_record_t * r,char * string)796 static void String_DstAddr(master_record_t *r, char *string) {
797 char tmp_str[IP_STRING_LEN];
798 
799 	tmp_str[0] = 0;
800 	if ( (r->flags & FLAG_IPV6_ADDR ) != 0 ) { // IPv6
801 		uint64_t	ip[2];
802 
803 		ip[0] = htonll(r->V6.dstaddr[0]);
804 		ip[1] = htonll(r->V6.dstaddr[1]);
805 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
806 		if ( ! long_v6 ) {
807 			CondenseV6(tmp_str);
808 		}
809 	} else {	// IPv4
810 		uint32_t	ip;
811 		ip = htonl(r->V4.dstaddr);
812 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
813 	}
814 	tmp_str[IP_STRING_LEN-1] = 0;
815 	if ( long_v6 )
816 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s", tag_string, tmp_str);
817 	else
818 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s", tag_string, tmp_str);
819 
820 	string[MAX_STRING_LENGTH-1] = 0;
821 
822 
823 } // End of String_DstAddr
824 
825 
String_NextHop(master_record_t * r,char * string)826 static void String_NextHop(master_record_t *r, char *string) {
827 char tmp_str[IP_STRING_LEN];
828 
829 	tmp_str[0] = 0;
830 	if ( (r->flags & FLAG_IPV6_NH ) != 0 ) { // IPv6
831 		uint64_t	ip[2];
832 
833 		ip[0] = htonll(r->ip_nexthop.V6[0]);
834 		ip[1] = htonll(r->ip_nexthop.V6[1]);
835 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
836 		if ( ! long_v6 ) {
837 			CondenseV6(tmp_str);
838 		}
839 	} else {	// IPv4
840 		uint32_t	ip;
841 		ip = htonl(r->ip_nexthop.V4);
842 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
843 	}
844 	tmp_str[IP_STRING_LEN-1] = 0;
845 	if ( long_v6 )
846 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s", tag_string, tmp_str);
847 	else
848 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s", tag_string, tmp_str);
849 
850 	string[MAX_STRING_LENGTH-1] = 0;
851 
852 
853 } // End of String_NextHop
854 
String_BGPNextHop(master_record_t * r,char * string)855 static void String_BGPNextHop(master_record_t *r, char *string) {
856 char tmp_str[IP_STRING_LEN];
857 
858 	tmp_str[0] = 0;
859 	if ( (r->flags & FLAG_IPV6_NHB ) != 0 ) { // IPv6
860 		uint64_t	ip[2];
861 
862 		ip[0] = htonll(r->bgp_nexthop.V6[0]);
863 		ip[1] = htonll(r->bgp_nexthop.V6[1]);
864 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
865 		if ( ! long_v6 ) {
866 			CondenseV6(tmp_str);
867 		}
868 	} else {	// IPv4
869 		uint32_t	ip;
870 		ip = htonl(r->bgp_nexthop.V4);
871 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
872 	}
873 	tmp_str[IP_STRING_LEN-1] = 0;
874 	if ( long_v6 )
875 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s", tag_string, tmp_str);
876 	else
877 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s", tag_string, tmp_str);
878 
879 	string[MAX_STRING_LENGTH-1] = 0;
880 
881 
882 } // End of String_NextHop
883 
String_RouterIP(master_record_t * r,char * string)884 static void String_RouterIP(master_record_t *r, char *string) {
885 char tmp_str[IP_STRING_LEN];
886 
887 	tmp_str[0] = 0;
888 	if ( (r->flags & FLAG_IPV6_EXP ) != 0 ) { // IPv6
889 		uint64_t	ip[2];
890 
891 		ip[0] = htonll(r->ip_router.V6[0]);
892 		ip[1] = htonll(r->ip_router.V6[1]);
893 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
894 		if ( ! long_v6 ) {
895 			CondenseV6(tmp_str);
896 		}
897 	} else {	// IPv4
898 		uint32_t	ip;
899 		ip = htonl(r->ip_router.V4);
900 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
901 	}
902 	tmp_str[IP_STRING_LEN-1] = 0;
903 	if ( long_v6 )
904 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s", tag_string, tmp_str);
905 	else
906 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s", tag_string, tmp_str);
907 
908 	string[MAX_STRING_LENGTH-1] = 0;
909 
910 
911 } // End of String_RouterIP
912 
913 
String_DstAddrPort(master_record_t * r,char * string)914 static void String_DstAddrPort(master_record_t *r, char *string) {
915 char 	tmp_str[IP_STRING_LEN], portchar;
916 
917 	tmp_str[0] = 0;
918 	if ( (r->flags & FLAG_IPV6_ADDR ) != 0 ) { // IPv6
919 		uint64_t	ip[2];
920 
921 		ip[0] = htonll(r->V6.dstaddr[0]);
922 		ip[1] = htonll(r->V6.dstaddr[1]);
923 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
924 		if ( ! long_v6 ) {
925 			CondenseV6(tmp_str);
926 		}
927 		portchar = '.';
928 	} else {	// IPv4
929 		uint32_t	ip;
930 		ip = htonl(r->V4.dstaddr);
931 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
932 		portchar = ':';
933 	}
934 	tmp_str[IP_STRING_LEN-1] = 0;
935 
936 	if ( long_v6 )
937 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s%c%-5s", tag_string, tmp_str, portchar, ICMP_Port_decode(r));
938 	else
939 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s%c%-5s", tag_string, tmp_str, portchar, ICMP_Port_decode(r));
940 
941 	string[MAX_STRING_LENGTH-1] = 0;
942 
943 } // End of String_DstAddrPort
944 
String_SrcNet(master_record_t * r,char * string)945 static void String_SrcNet(master_record_t *r, char *string) {
946 char tmp_str[IP_STRING_LEN];
947 
948 	ApplyNetMaskBits(r, 1);
949 
950 	tmp_str[0] = 0;
951 	if ( (r->flags & FLAG_IPV6_ADDR ) != 0 ) { // IPv6
952 		uint64_t	ip[2];
953 
954 		ip[0] = htonll(r->V6.srcaddr[0]);
955 		ip[1] = htonll(r->V6.srcaddr[1]);
956 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
957 		if ( ! long_v6 ) {
958 			CondenseV6(tmp_str);
959 		}
960 	} else {	// IPv4
961 		uint32_t	ip;
962 		ip = htonl(r->V4.srcaddr);
963 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
964 	}
965 	tmp_str[IP_STRING_LEN-1] = 0;
966 	if ( long_v6 )
967 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s/%-2u", tag_string, tmp_str, r->src_mask );
968 	else
969 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s/%-2u", tag_string, tmp_str, r->src_mask );
970 
971 	string[MAX_STRING_LENGTH-1] = 0;
972 
973 
974 } // End of String_SrcNet
975 
String_DstNet(master_record_t * r,char * string)976 static void String_DstNet(master_record_t *r, char *string) {
977 char tmp_str[IP_STRING_LEN];
978 
979 	ApplyNetMaskBits(r, 2);
980 
981 	tmp_str[0] = 0;
982 	if ( (r->flags & FLAG_IPV6_ADDR ) != 0 ) { // IPv6
983 		uint64_t	ip[2];
984 
985 		ip[0] = htonll(r->V6.dstaddr[0]);
986 		ip[1] = htonll(r->V6.dstaddr[1]);
987 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
988 		if ( ! long_v6 ) {
989 			CondenseV6(tmp_str);
990 		}
991 	} else {	// IPv4
992 		uint32_t	ip;
993 		ip = htonl(r->V4.dstaddr);
994 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
995 	}
996 	tmp_str[IP_STRING_LEN-1] = 0;
997 	if ( long_v6 )
998 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s/%-2u", tag_string, tmp_str, r->dst_mask );
999 	else
1000 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s/%-2u", tag_string, tmp_str, r->dst_mask );
1001 
1002 	string[MAX_STRING_LENGTH-1] = 0;
1003 
1004 
1005 } // End of String_DstNet
1006 
String_SrcPort(master_record_t * r,char * string)1007 static void String_SrcPort(master_record_t *r, char *string) {
1008 
1009 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6u", r->srcport);
1010 	string[MAX_STRING_LENGTH-1] = '\0';
1011 
1012 } // End of String_SrcPort
1013 
String_DstPort(master_record_t * r,char * string)1014 static void String_DstPort(master_record_t *r, char *string) {
1015 
1016 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6s", ICMP_Port_decode(r));
1017 	string[MAX_STRING_LENGTH-1] = '\0';
1018 
1019 } // End of String_DstPort
1020 
String_ICMP_type(master_record_t * r,char * string)1021 static void String_ICMP_type(master_record_t *r, char *string) {
1022 	uint8_t type;
1023 
1024 	type =  ( r->prot == IPPROTO_ICMP || r->prot == IPPROTO_ICMPV6 ) ? r->icmp_type : 0;
1025 	snprintf(string, MAX_STRING_LENGTH-1, "%6u", type);
1026 	string[MAX_STRING_LENGTH-1] = 0;
1027 
1028 } // End of String_ICMP_type
1029 
String_ICMP_code(master_record_t * r,char * string)1030 static void String_ICMP_code(master_record_t *r, char *string) {
1031 	uint8_t code;
1032 
1033 	code =  ( r->prot == IPPROTO_ICMP || r->prot == IPPROTO_ICMPV6 ) ? r->icmp_code : 0;
1034 	snprintf(string, MAX_STRING_LENGTH-1, "%6u", code);
1035 	string[MAX_STRING_LENGTH-1] = 0;
1036 
1037 } // End of String_ICMP_code
1038 
String_SrcAS(master_record_t * r,char * string)1039 static void String_SrcAS(master_record_t *r, char *string) {
1040 
1041 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6u", r->srcas);
1042 	string[MAX_STRING_LENGTH-1] = '\0';
1043 
1044 } // End of String_SrcAS
1045 
String_DstAS(master_record_t * r,char * string)1046 static void String_DstAS(master_record_t *r, char *string) {
1047 
1048 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6u", r->dstas);
1049 	string[MAX_STRING_LENGTH-1] = '\0';
1050 
1051 } // End of String_DstAS
1052 
String_NextAS(master_record_t * r,char * string)1053 static void String_NextAS(master_record_t *r, char *string) {
1054 
1055 	snprintf(string, MAX_STRING_LENGTH-1 ," %6u", r->bgpNextAdjacentAS);
1056 	string[MAX_STRING_LENGTH-1] = '\0';
1057 
1058 } // End of String_NextAS
1059 
String_PrevAS(master_record_t * r,char * string)1060 static void String_PrevAS(master_record_t *r, char *string) {
1061 
1062 	snprintf(string, MAX_STRING_LENGTH-1 ," %6u", r->bgpPrevAdjacentAS);
1063 	string[MAX_STRING_LENGTH-1] = '\0';
1064 
1065 } // End of String_PrevAS
1066 
String_Input(master_record_t * r,char * string)1067 static void String_Input(master_record_t *r, char *string) {
1068 
1069 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6u", r->input);
1070 	string[MAX_STRING_LENGTH-1] = '\0';
1071 
1072 } // End of String_Input
1073 
String_Output(master_record_t * r,char * string)1074 static void String_Output(master_record_t *r, char *string) {
1075 
1076 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6u", r->output);
1077 	string[MAX_STRING_LENGTH-1] = '\0';
1078 
1079 } // End of String_Output
1080 
String_InPackets(master_record_t * r,char * string)1081 static void String_InPackets(master_record_t *r, char *string) {
1082 char s[NUMBER_STRING_SIZE];
1083 
1084 	format_number(r->dPkts, s, printPlain, FIXED_WIDTH);
1085 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8s", s);
1086 	string[MAX_STRING_LENGTH-1] = '\0';
1087 
1088 } // End of String_InPackets
1089 
String_OutPackets(master_record_t * r,char * string)1090 static void String_OutPackets(master_record_t *r, char *string) {
1091 char s[NUMBER_STRING_SIZE];
1092 
1093 	format_number(r->out_pkts, s, printPlain, FIXED_WIDTH);
1094 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8s", s);
1095 	string[MAX_STRING_LENGTH-1] = '\0';
1096 
1097 } // End of String_OutPackets
1098 
String_InBytes(master_record_t * r,char * string)1099 static void String_InBytes(master_record_t *r, char *string) {
1100 char s[NUMBER_STRING_SIZE];
1101 
1102 	format_number(r->dOctets, s, printPlain, FIXED_WIDTH);
1103 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8s", s);
1104 	string[MAX_STRING_LENGTH-1] = '\0';
1105 
1106 } // End of String_InBytes
1107 
String_OutBytes(master_record_t * r,char * string)1108 static void String_OutBytes(master_record_t *r, char *string) {
1109 char s[NUMBER_STRING_SIZE];
1110 
1111 	format_number(r->out_bytes, s, printPlain, FIXED_WIDTH);
1112 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8s", s);
1113 	string[MAX_STRING_LENGTH-1] = '\0';
1114 
1115 } // End of String_OutBytes
1116 
String_Flows(master_record_t * r,char * string)1117 static void String_Flows(master_record_t *r, char *string) {
1118 
1119 	// snprintf(string, MAX_STRING_LENGTH-1 ,"%5llu", r->aggr_flows ? (unsigned long long)r->aggr_flows : 1 );
1120 	snprintf(string, MAX_STRING_LENGTH-1 ,"%5llu", (unsigned long long)r->aggr_flows );
1121 	string[MAX_STRING_LENGTH-1] = '\0';
1122 
1123 } // End of String_Flows
1124 
String_Tos(master_record_t * r,char * string)1125 static void String_Tos(master_record_t *r, char *string) {
1126 
1127 	snprintf(string, MAX_STRING_LENGTH-1 ,"%3u", r->tos);
1128 	string[MAX_STRING_LENGTH-1] = '\0';
1129 
1130 } // End of String_Tos
1131 
String_SrcTos(master_record_t * r,char * string)1132 static void String_SrcTos(master_record_t *r, char *string) {
1133 
1134 	snprintf(string, MAX_STRING_LENGTH-1 ,"%4u", r->tos);
1135 	string[MAX_STRING_LENGTH-1] = '\0';
1136 
1137 } // End of String_SrcTos
1138 
String_DstTos(master_record_t * r,char * string)1139 static void String_DstTos(master_record_t *r, char *string) {
1140 
1141 	snprintf(string, MAX_STRING_LENGTH-1 ,"%4u", r->dst_tos);
1142 	string[MAX_STRING_LENGTH-1] = '\0';
1143 
1144 } // End of String_DstTos
1145 
String_SrcMask(master_record_t * r,char * string)1146 static void String_SrcMask(master_record_t *r, char *string) {
1147 
1148 	snprintf(string, MAX_STRING_LENGTH-1 ,"%5u", r->src_mask);
1149 	string[MAX_STRING_LENGTH-1] = '\0';
1150 
1151 } // End of String_SrcMask
1152 
String_DstMask(master_record_t * r,char * string)1153 static void String_DstMask(master_record_t *r, char *string) {
1154 
1155 	snprintf(string, MAX_STRING_LENGTH-1 ,"%5u", r->dst_mask);
1156 	string[MAX_STRING_LENGTH-1] = '\0';
1157 
1158 } // End of String_DstMask
1159 
String_SrcVlan(master_record_t * r,char * string)1160 static void String_SrcVlan(master_record_t *r, char *string) {
1161 
1162 	snprintf(string, MAX_STRING_LENGTH-1 ,"%5u", r->src_vlan);
1163 	string[MAX_STRING_LENGTH-1] = '\0';
1164 
1165 } // End of String_SrcVlan
1166 
String_DstVlan(master_record_t * r,char * string)1167 static void String_DstVlan(master_record_t *r, char *string) {
1168 
1169 	snprintf(string, MAX_STRING_LENGTH-1 ,"%5u", r->dst_vlan);
1170 	string[MAX_STRING_LENGTH-1] = '\0';
1171 
1172 } // End of String_DstVlan
1173 
String_Dir(master_record_t * r,char * string)1174 static void String_Dir(master_record_t *r, char *string) {
1175 
1176 	snprintf(string, MAX_STRING_LENGTH-1 ,"%3c", r->dir ? 'E' : 'I' );
1177 	string[MAX_STRING_LENGTH-1] = '\0';
1178 
1179 } // End of String_Dir
1180 
String_FwdStatus(master_record_t * r,char * string)1181 static void String_FwdStatus(master_record_t *r, char *string) {
1182 
1183 	snprintf(string, MAX_STRING_LENGTH-1 ,"%3u", r->fwd_status);
1184 	string[MAX_STRING_LENGTH-1] = '\0';
1185 
1186 } // End of String_FwdStatus
1187 
String_Flags(master_record_t * r,char * string)1188 static void String_Flags(master_record_t *r, char *string) {
1189 
1190 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8s", FlagsString(r->tcp_flags));
1191 	string[MAX_STRING_LENGTH-1] = '\0';
1192 
1193 } // End of String_Flags
1194 
String_InSrcMac(master_record_t * r,char * string)1195 static void String_InSrcMac(master_record_t *r, char *string) {
1196 int i;
1197 uint8_t mac[6];
1198 
1199 	for ( i=0; i<6; i++ ) {
1200 		mac[i] = (r->in_src_mac >> ( i*8 )) & 0xFF;
1201 	}
1202 	snprintf(string, MAX_STRING_LENGTH-1 ,"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);
1203 	string[MAX_STRING_LENGTH-1] = '\0';
1204 
1205 } // End of String_InSrcMac
1206 
String_OutDstMac(master_record_t * r,char * string)1207 static void String_OutDstMac(master_record_t *r, char *string) {
1208 int i;
1209 uint8_t mac[6];
1210 
1211 	for ( i=0; i<6; i++ ) {
1212 		mac[i] = (r->out_dst_mac >> ( i*8 )) & 0xFF;
1213 	}
1214 	snprintf(string, MAX_STRING_LENGTH-1 ,"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);
1215 	string[MAX_STRING_LENGTH-1] = '\0';
1216 
1217 } // End of String_OutDstMac
1218 
String_InDstMac(master_record_t * r,char * string)1219 static void String_InDstMac(master_record_t *r, char *string) {
1220 int i;
1221 uint8_t mac[6];
1222 
1223 	for ( i=0; i<6; i++ ) {
1224 		mac[i] = (r->in_dst_mac >> ( i*8 )) & 0xFF;
1225 	}
1226 	snprintf(string, MAX_STRING_LENGTH-1 ,"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);
1227 	string[MAX_STRING_LENGTH-1] = '\0';
1228 
1229 } // End of String_InDstMac
1230 
String_OutSrcMac(master_record_t * r,char * string)1231 static void String_OutSrcMac(master_record_t *r, char *string) {
1232 int i;
1233 uint8_t mac[6];
1234 
1235 	for ( i=0; i<6; i++ ) {
1236 		mac[i] = (r->out_src_mac >> ( i*8 )) & 0xFF;
1237 	}
1238 	snprintf(string, MAX_STRING_LENGTH-1 ,"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);
1239 	string[MAX_STRING_LENGTH-1] = '\0';
1240 
1241 } // End of String_OutSrcMac
1242 
String_MPLS_1(master_record_t * r,char * string)1243 static void String_MPLS_1(master_record_t *r, char *string) {
1244 
1245 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1246 		r->mpls_label[0] >> 4 , (r->mpls_label[0] & 0xF ) >> 1, r->mpls_label[0] & 1);
1247 	string[MAX_STRING_LENGTH-1] = '\0';
1248 
1249 } // End of String_MPLS
1250 
String_MPLS_2(master_record_t * r,char * string)1251 static void String_MPLS_2(master_record_t *r, char *string) {
1252 
1253 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1254 		r->mpls_label[1] >> 4 , (r->mpls_label[1] & 0xF ) >> 1, r->mpls_label[1] & 1);
1255 	string[MAX_STRING_LENGTH-1] = '\0';
1256 
1257 } // End of String_MPLS
1258 
String_MPLS_3(master_record_t * r,char * string)1259 static void String_MPLS_3(master_record_t *r, char *string) {
1260 
1261 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1262 		r->mpls_label[2] >> 4 , (r->mpls_label[2] & 0xF ) >> 1, r->mpls_label[2] & 1);
1263 	string[MAX_STRING_LENGTH-1] = '\0';
1264 
1265 } // End of String_MPLS
1266 
String_MPLS_4(master_record_t * r,char * string)1267 static void String_MPLS_4(master_record_t *r, char *string) {
1268 
1269 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1270 		r->mpls_label[3] >> 4 , (r->mpls_label[3] & 0xF ) >> 1, r->mpls_label[3] & 1);
1271 	string[MAX_STRING_LENGTH-1] = '\0';
1272 
1273 } // End of String_MPLS
1274 
String_MPLS_5(master_record_t * r,char * string)1275 static void String_MPLS_5(master_record_t *r, char *string) {
1276 
1277 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1278 		r->mpls_label[4] >> 4 , (r->mpls_label[4] & 0xF ) >> 1, r->mpls_label[4] & 1);
1279 	string[MAX_STRING_LENGTH-1] = '\0';
1280 
1281 } // End of String_MPLS
1282 
String_MPLS_6(master_record_t * r,char * string)1283 static void String_MPLS_6(master_record_t *r, char *string) {
1284 
1285 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1286 		r->mpls_label[5] >> 4 , (r->mpls_label[5] & 0xF ) >> 1, r->mpls_label[5] & 1);
1287 	string[MAX_STRING_LENGTH-1] = '\0';
1288 
1289 } // End of String_MPLS
1290 
String_MPLS_7(master_record_t * r,char * string)1291 static void String_MPLS_7(master_record_t *r, char *string) {
1292 
1293 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1294 		r->mpls_label[6] >> 4 , (r->mpls_label[6] & 0xF ) >> 1, r->mpls_label[6] & 1);
1295 	string[MAX_STRING_LENGTH-1] = '\0';
1296 
1297 } // End of String_MPLS
1298 
String_MPLS_8(master_record_t * r,char * string)1299 static void String_MPLS_8(master_record_t *r, char *string) {
1300 
1301 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1302 		r->mpls_label[7] >> 4 , (r->mpls_label[7] & 0xF ) >> 1, r->mpls_label[7] & 1);
1303 	string[MAX_STRING_LENGTH-1] = '\0';
1304 
1305 } // End of String_MPLS
1306 
String_MPLS_9(master_record_t * r,char * string)1307 static void String_MPLS_9(master_record_t *r, char *string) {
1308 
1309 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1310 		r->mpls_label[8] >> 4 , (r->mpls_label[8] & 0xF ) >> 1, r->mpls_label[8] & 1);
1311 	string[MAX_STRING_LENGTH-1] = '\0';
1312 
1313 } // End of String_MPLS
1314 
String_MPLS_10(master_record_t * r,char * string)1315 static void String_MPLS_10(master_record_t *r, char *string) {
1316 
1317 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u",
1318 		r->mpls_label[9] >> 4 , (r->mpls_label[9] & 0xF ) >> 1, r->mpls_label[9] & 1);
1319 	string[MAX_STRING_LENGTH-1] = '\0';
1320 
1321 } // End of String_MPLS
1322 
String_MPLSs(master_record_t * r,char * string)1323 static void String_MPLSs(master_record_t *r, char *string) {
1324 
1325 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8u-%1u-%1u %8u-%1u-%1u %8u-%1u-%1u %8u-%1u-%1u %8u-%1u-%1u %8u-%1u-%1u %8u-%1u-%1u %8u-%1u-%1u %8u-%1u-%1u %8u-%1u-%1u ",
1326 		r->mpls_label[0] >> 4 , (r->mpls_label[0] & 0xF ) >> 1, r->mpls_label[0] & 1,
1327 		r->mpls_label[1] >> 4 , (r->mpls_label[1] & 0xF ) >> 1, r->mpls_label[1] & 1,
1328 		r->mpls_label[2] >> 4 , (r->mpls_label[2] & 0xF ) >> 1, r->mpls_label[2] & 1,
1329 		r->mpls_label[3] >> 4 , (r->mpls_label[3] & 0xF ) >> 1, r->mpls_label[3] & 1,
1330 		r->mpls_label[4] >> 4 , (r->mpls_label[4] & 0xF ) >> 1, r->mpls_label[4] & 1,
1331 		r->mpls_label[5] >> 4 , (r->mpls_label[5] & 0xF ) >> 1, r->mpls_label[5] & 1,
1332 		r->mpls_label[6] >> 4 , (r->mpls_label[6] & 0xF ) >> 1, r->mpls_label[6] & 1,
1333 		r->mpls_label[7] >> 4 , (r->mpls_label[7] & 0xF ) >> 1, r->mpls_label[7] & 1,
1334 		r->mpls_label[8] >> 4 , (r->mpls_label[8] & 0xF ) >> 1, r->mpls_label[8] & 1,
1335 		r->mpls_label[9] >> 4 , (r->mpls_label[9] & 0xF ) >> 1, r->mpls_label[9] & 1
1336 	);
1337 	string[MAX_STRING_LENGTH-1] = '\0';
1338 
1339 } // End of String_MPLSs
1340 
String_Engine(master_record_t * r,char * string)1341 static void String_Engine(master_record_t *r, char *string) {
1342 
1343 	snprintf(string, MAX_STRING_LENGTH-1 ,"%3u/%-3u", r->engine_type, r->engine_id);
1344 	string[MAX_STRING_LENGTH-1] = '\0';
1345 
1346 } // End of String_Engine
1347 
String_Label(master_record_t * r,char * string)1348 static void String_Label(master_record_t *r, char *string) {
1349 
1350 	if ( r->label )
1351 		snprintf(string, MAX_STRING_LENGTH-1 ,"%16s", r->label);
1352 	else
1353 		snprintf(string, MAX_STRING_LENGTH-1 ,"<none>");
1354 
1355 	string[MAX_STRING_LENGTH-1] = '\0';
1356 
1357 } // End of String_Label
1358 
String_ClientLatency(master_record_t * r,char * string)1359 static void String_ClientLatency(master_record_t *r, char *string) {
1360 double latency;
1361 
1362 	latency = (double)r->client_nw_delay_usec / 1000.0;
1363 	snprintf(string, MAX_STRING_LENGTH-1 ,"%9.3f", latency);
1364 	string[MAX_STRING_LENGTH-1] = '\0';
1365 
1366 } // End of String_ClientLatency
1367 
String_ServerLatency(master_record_t * r,char * string)1368 static void String_ServerLatency(master_record_t *r, char *string) {
1369 double latency;
1370 
1371 	latency = (double)r->server_nw_delay_usec / 1000.0;
1372 	snprintf(string, MAX_STRING_LENGTH-1 ,"%9.3f", latency);
1373 	string[MAX_STRING_LENGTH-1] = '\0';
1374 
1375 } // End of String_ServerLatency
1376 
String_AppLatency(master_record_t * r,char * string)1377 static void String_AppLatency(master_record_t *r, char *string) {
1378 double latency;
1379 
1380 	latency = (double)r->appl_latency_usec / 1000.0;
1381 	snprintf(string, MAX_STRING_LENGTH-1 ,"%9.3f", latency);
1382 	string[MAX_STRING_LENGTH-1] = '\0';
1383 
1384 } // End of String_AppLatency
1385 
String_bps(master_record_t * r,char * string)1386 static void String_bps(master_record_t *r, char *string) {
1387 uint64_t	bps;
1388 char s[NUMBER_STRING_SIZE];
1389 
1390 	if ( duration ) {
1391 		bps = (( r->dOctets << 3 ) / duration);	// bits per second. ( >> 3 ) -> * 8 to convert octets into bits
1392 	} else {
1393 		bps = 0;
1394 	}
1395 	format_number(bps, s, printPlain, FIXED_WIDTH);
1396 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8s", s);
1397 	string[MAX_STRING_LENGTH-1] = '\0';
1398 
1399 } // End of String_bps
1400 
String_pps(master_record_t * r,char * string)1401 static void String_pps(master_record_t *r, char *string) {
1402 uint64_t	pps;
1403 char s[NUMBER_STRING_SIZE];
1404 
1405 	if ( duration ) {
1406 		pps = r->dPkts / duration;				// packets per second
1407 	} else {
1408 		pps = 0;
1409 	}
1410 	format_number(pps, s, printPlain, FIXED_WIDTH);
1411 	snprintf(string, MAX_STRING_LENGTH-1 ,"%8s", s);
1412 	string[MAX_STRING_LENGTH-1] = '\0';
1413 
1414 } // End of String_Duration
1415 
String_bpp(master_record_t * r,char * string)1416 static void String_bpp(master_record_t *r, char *string) {
1417 uint32_t 	Bpp;
1418 
1419 	string[MAX_STRING_LENGTH-1] = '\0';
1420 
1421 	if ( r->dPkts )
1422 		Bpp = r->dOctets / r->dPkts;			// Bytes per Packet
1423 	else
1424 		Bpp = 0;
1425 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6u", Bpp);
1426 	string[MAX_STRING_LENGTH-1] = '\0';
1427 
1428 } // End of String_bpp
1429 
String_ExpSysID(master_record_t * r,char * string)1430 static void String_ExpSysID(master_record_t *r, char *string) {
1431 
1432 	string[MAX_STRING_LENGTH-1] = '\0';
1433 
1434 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6u", r->exporter_sysid);
1435 	string[MAX_STRING_LENGTH-1] = '\0';
1436 
1437 } // End of String_ExpSysID
1438 
1439 #ifdef NSEL
String_nfc(master_record_t * r,char * string)1440 static void String_nfc(master_record_t *r, char *string) {
1441 
1442  	snprintf(string, MAX_STRING_LENGTH-1, "%10u", r->conn_id);
1443 	string[MAX_STRING_LENGTH-1] = '\0';
1444 
1445 } // End of String_nfc
1446 
String_evt(master_record_t * r,char * string)1447 static void String_evt(master_record_t *r, char *string) {
1448 
1449 	if (r->fw_xevent) {
1450 		snprintf(string, MAX_STRING_LENGTH-1 ,"%7s", FwEventString(r->event));
1451 	} else {
1452 		snprintf(string, MAX_STRING_LENGTH-1 ,"%7s", EventString(r->event));
1453 	}
1454 
1455 } // End of String_evt
1456 
String_xevt(master_record_t * r,char * string)1457 static void String_xevt(master_record_t *r, char *string) {
1458 
1459 	snprintf(string, MAX_STRING_LENGTH-1 ,"%7s", EventXString(r->fw_xevent));
1460 
1461 } // End of String_xevt
1462 
String_sgt(master_record_t * r,char * string)1463 static void String_sgt(master_record_t *r, char *string) {
1464 
1465 	snprintf(string, MAX_STRING_LENGTH-1 ,"%5u", r->sec_group_tag);
1466 
1467 } // End of String_sgt
1468 
String_msec(master_record_t * r,char * string)1469 static void String_msec(master_record_t *r, char *string) {
1470 	unsigned long long etime;
1471 
1472 	etime = 1000LL * (unsigned long long)r->first + (unsigned long long)r->msec_first;
1473 	snprintf(string, MAX_STRING_LENGTH-1,"%13llu",  etime);
1474 	string[MAX_STRING_LENGTH-1] = '\0';
1475 
1476 } // End of String_msec
1477 
String_iacl(master_record_t * r,char * string)1478 static void String_iacl(master_record_t *r, char *string) {
1479 
1480 	snprintf(string, MAX_STRING_LENGTH-1, "0x%-8x 0x%-8x 0x%-8x",
1481 		r->ingress_acl_id[0], r->ingress_acl_id[1], r->ingress_acl_id[2]);
1482 	string[MAX_STRING_LENGTH-1] = 0;
1483 
1484 } // End of String_iacl
1485 
String_eacl(master_record_t * r,char * string)1486 static void String_eacl(master_record_t *r, char *string) {
1487 
1488 	snprintf(string, MAX_STRING_LENGTH-1, "%10u %10u %10u",
1489 		r->egress_acl_id[0], r->egress_acl_id[1], r->egress_acl_id[2]);
1490 
1491 	string[MAX_STRING_LENGTH-1] = 0;
1492 
1493 } // End of String_eacl
1494 
String_xlateSrcAddr(master_record_t * r,char * string)1495 static void String_xlateSrcAddr(master_record_t *r, char *string) {
1496 char tmp_str[IP_STRING_LEN];
1497 
1498 	tmp_str[0] = 0;
1499 	if ( (r->xlate_flags & 1 ) != 0 ) { // IPv6
1500 		uint64_t	ip[2];
1501 
1502 		ip[0] = htonll(r->xlate_src_ip.V6[0]);
1503 		ip[1] = htonll(r->xlate_src_ip.V6[1]);
1504 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
1505 		if ( ! long_v6 ) {
1506 			CondenseV6(tmp_str);
1507 		}
1508 	} else {	// IPv4
1509 		uint32_t	ip;
1510 		ip = htonl(r->xlate_src_ip.V4);
1511 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
1512 	}
1513 	tmp_str[IP_STRING_LEN-1] = 0;
1514 	if ( long_v6 )
1515 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s", tag_string, tmp_str);
1516 	else
1517 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s", tag_string, tmp_str);
1518 
1519 	string[MAX_STRING_LENGTH-1] = 0;
1520 
1521 } // End of String_xlateSrcAddr
1522 
String_xlateDstAddr(master_record_t * r,char * string)1523 static void String_xlateDstAddr(master_record_t *r, char *string) {
1524 char tmp_str[IP_STRING_LEN];
1525 
1526 	tmp_str[0] = 0;
1527 	if ( (r->xlate_flags & 1 ) != 0 ) { // IPv6
1528 		uint64_t	ip[2];
1529 
1530 		ip[0] = htonll(r->xlate_dst_ip.V6[0]);
1531 		ip[1] = htonll(r->xlate_dst_ip.V6[1]);
1532 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
1533 		if ( ! long_v6 ) {
1534 			CondenseV6(tmp_str);
1535 		}
1536 	} else {	// IPv4
1537 		uint32_t	ip;
1538 		ip = htonl(r->xlate_dst_ip.V4);
1539 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
1540 	}
1541 	tmp_str[IP_STRING_LEN-1] = 0;
1542 	if ( long_v6 )
1543 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s", tag_string, tmp_str);
1544 	else
1545 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s", tag_string, tmp_str);
1546 
1547 	string[MAX_STRING_LENGTH-1] = 0;
1548 
1549 } // End of String_xlateDstAddr
1550 
String_xlateSrcPort(master_record_t * r,char * string)1551 static void String_xlateSrcPort(master_record_t *r, char *string) {
1552 
1553 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6u", r->xlate_src_port);
1554 	string[MAX_STRING_LENGTH-1] = '\0';
1555 
1556 } // End of String_xlateSrcPort
1557 
String_xlateDstPort(master_record_t * r,char * string)1558 static void String_xlateDstPort(master_record_t *r, char *string) {
1559 
1560 	snprintf(string, MAX_STRING_LENGTH-1 ,"%6u", r->xlate_dst_port);
1561 	string[MAX_STRING_LENGTH-1] = '\0';
1562 
1563 } // End of String_xlateDstPort
1564 
String_xlateSrcAddrPort(master_record_t * r,char * string)1565 static void String_xlateSrcAddrPort(master_record_t *r, char *string) {
1566 char 	tmp_str[IP_STRING_LEN], portchar;
1567 
1568 	tmp_str[0] = 0;
1569 	if ( (r->xlate_flags & 1 ) != 0 ) { // IPv6
1570 		uint64_t	ip[2];
1571 
1572 		ip[0] = htonll(r->xlate_src_ip.V6[0]);
1573 		ip[1] = htonll(r->xlate_src_ip.V6[1]);
1574 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
1575 		if ( ! long_v6 ) {
1576 			CondenseV6(tmp_str);
1577 		}
1578 
1579 		portchar = '.';
1580 	} else {	// IPv4
1581 		uint32_t	ip;
1582 		ip = htonl(r->xlate_src_ip.V4);
1583 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
1584 
1585 		portchar = ':';
1586 	}
1587 	tmp_str[IP_STRING_LEN-1] = 0;
1588 
1589 	if ( long_v6 )
1590 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s%c%-5i", tag_string, tmp_str, portchar, r->xlate_src_port);
1591 	else
1592 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s%c%-5i", tag_string, tmp_str, portchar, r->xlate_src_port);
1593 
1594 	string[MAX_STRING_LENGTH-1] = 0;
1595 
1596 } // End of String_xlateSrcAddrPort
1597 
String_xlateDstAddrPort(master_record_t * r,char * string)1598 static void String_xlateDstAddrPort(master_record_t *r, char *string) {
1599 char 	tmp_str[IP_STRING_LEN], portchar;
1600 
1601 	tmp_str[0] = 0;
1602 	if ( (r->xlate_flags & 1 ) != 0 ) { // IPv6
1603 		uint64_t	ip[2];
1604 
1605 		ip[0] = htonll(r->xlate_dst_ip.V6[0]);
1606 		ip[1] = htonll(r->xlate_dst_ip.V6[1]);
1607 		inet_ntop(AF_INET6, ip, tmp_str, sizeof(tmp_str));
1608 		if ( ! long_v6 ) {
1609 			CondenseV6(tmp_str);
1610 		}
1611 
1612 		portchar = '.';
1613 	} else {	// IPv4
1614 		uint32_t	ip;
1615 		ip = htonl(r->xlate_dst_ip.V4);
1616 		inet_ntop(AF_INET, &ip, tmp_str, sizeof(tmp_str));
1617 
1618 		portchar = ':';
1619 	}
1620 	tmp_str[IP_STRING_LEN-1] = 0;
1621 
1622 	if ( long_v6 )
1623 		snprintf(string, MAX_STRING_LENGTH-1, "%s%39s%c%-5i", tag_string, tmp_str, portchar, r->xlate_dst_port);
1624 	else
1625 		snprintf(string, MAX_STRING_LENGTH-1, "%s%16s%c%-5i", tag_string, tmp_str, portchar, r->xlate_dst_port);
1626 
1627 	string[MAX_STRING_LENGTH-1] = 0;
1628 
1629 
1630 } // End of String_xlateDstAddrPort
1631 
String_userName(master_record_t * r,char * string)1632 static void String_userName(master_record_t *r, char *string) {
1633 
1634 	if ( r->username[0] == '\0' )
1635 		snprintf(string, MAX_STRING_LENGTH-1 ,"%s", "<empty>");
1636 	else
1637 		snprintf(string, MAX_STRING_LENGTH-1 ,"%s", r->username);
1638 
1639 	string[MAX_STRING_LENGTH-1] = '\0';
1640 
1641 } // End of String_userName
1642 
String_ivrf(master_record_t * r,char * string)1643 static void String_ivrf(master_record_t *r, char *string) {
1644 
1645  	snprintf(string, MAX_STRING_LENGTH-1, "%10u", r->ingress_vrfid);
1646 	string[MAX_STRING_LENGTH-1] = '\0';
1647 
1648 } // End of String_ivrf
1649 
String_evrf(master_record_t * r,char * string)1650 static void String_evrf(master_record_t *r, char *string) {
1651 
1652  	snprintf(string, MAX_STRING_LENGTH-1, "%10u", r->egress_vrfid);
1653 	string[MAX_STRING_LENGTH-1] = '\0';
1654 
1655 } // End of String_evrf
1656 
String_PortBlockStart(master_record_t * r,char * string)1657 static void String_PortBlockStart(master_record_t *r, char *string) {
1658 
1659 	snprintf(string, MAX_STRING_LENGTH-1 ,"%7u", r->block_start);
1660 	string[MAX_STRING_LENGTH-1] = '\0';
1661 
1662 } // End of String_PortBlockStart
1663 
String_PortBlockEnd(master_record_t * r,char * string)1664 static void String_PortBlockEnd(master_record_t *r, char *string) {
1665 
1666 	snprintf(string, MAX_STRING_LENGTH-1 ,"%7u", r->block_end);
1667 	string[MAX_STRING_LENGTH-1] = '\0';
1668 
1669 } // End of String_PortBlockEnd
1670 
String_PortBlockStep(master_record_t * r,char * string)1671 static void String_PortBlockStep(master_record_t *r, char *string) {
1672 
1673 	snprintf(string, MAX_STRING_LENGTH-1 ,"%7u", r->block_step);
1674 	string[MAX_STRING_LENGTH-1] = '\0';
1675 
1676 } // End of String_PortBlockStep
1677 
String_PortBlockSize(master_record_t * r,char * string)1678 static void String_PortBlockSize(master_record_t *r, char *string) {
1679 
1680 	snprintf(string, MAX_STRING_LENGTH-1 ,"%7u", r->block_size);
1681 	string[MAX_STRING_LENGTH-1] = '\0';
1682 
1683 } // End of String_PortBlockSize
1684 
1685 
1686 #endif
1687