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