1 #include <netdb.h>
2 #include <inttypes.h>
3 #include <lt_inttypes.h>
4 #include <stdio.h>
5 #include "libtrace.h"
6 #include "tracereport.h"
7 #include "report.h"
8 
9 static stat_t ttl_stat[3][256] = {{{0,0}}} ;
10 static bool suppress[3] = {true,true,true};
11 
ttl_per_packet(struct libtrace_packet_t * packet)12 void ttl_per_packet(struct libtrace_packet_t *packet)
13 {
14 	struct libtrace_ip *ip = trace_get_ip(packet);
15 	libtrace_direction_t dir = trace_get_direction(packet);
16 
17 	if (!ip)
18 		return;
19 
20 	if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
21 		dir = TRACE_DIR_OTHER;
22 
23 	ttl_stat[dir][ip->ip_ttl].count++;
24 	ttl_stat[dir][ip->ip_ttl].bytes+=trace_get_wire_length(packet);
25 	suppress[dir] = false;
26 }
27 
28 
29 
ttl_report(void)30 void ttl_report(void)
31 {
32 	int i,j;
33 	FILE *out = fopen("ttl.rpt", "w");
34 	if (!out) {
35 		perror("fopen");
36 		return;
37 	}
38 	fprintf(out, "%-12s\t%10s\t%16s %16s\n",
39 			"TTL",
40 			"DIRECTION",
41 			"BYTES",
42 			"PACKETS");
43 	for(i=0;i<256;++i) {
44 		if (ttl_stat[0][i].count==0 &&
45 			ttl_stat[1][i].count==0 && ttl_stat[2][i].count==0)
46 			continue;
47 		fprintf(out, "%12i:",i);
48 		for(j=0;j<3;j++){
49 			if (j != 0) {
50 				fprintf(out, "%12s", " ");
51 			}
52 			switch (j) {
53 				case 0:
54 					fprintf(out, "\t%10s", "Outbound");
55 					break;
56 				case 1:
57 					fprintf(out, "\t%10s", "Inbound");
58 					break;
59 				case 2:
60 					fprintf(out, "\t%10s", "Unknown");
61 					break;
62 			}
63 
64 			fprintf(out, "\t%16" PRIu64 " %16" PRIu64 "\n",
65 					ttl_stat[j][i].bytes,
66 					ttl_stat[j][i].count);
67 		}
68 	}
69 	fclose(out);
70 }
71