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