source: tools/tracereport/synopt_report.c @ 051618c

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 051618c was 051618c, checked in by Shane Alcock <salcock@…>, 14 years ago

Added a new report type which reports the various option combinations seen on TCP SYN packets

  • Property mode set to 100644
File size: 3.4 KB
Line 
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
8
9struct tcp_opts {
10        bool mss;
11        bool sack;
12        bool winscale;
13        bool ts;
14        bool ttcp;
15};
16
17struct opt_counter {
18        uint64_t no_options;
19        uint64_t mss_only;
20        uint64_t ts_only;
21        uint64_t ms;
22        uint64_t mw;
23        uint64_t msw;
24        uint64_t all_four;
25        uint64_t ts_and_another;
26        uint64_t ttcp;
27};
28
29struct opt_counter counts = {0,0,0,0,0,0,0,0,0};
30uint64_t total_syns = 0;
31
32void classify_packet(struct tcp_opts opts) {
33        if (!opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp)
34        {
35                counts.no_options ++;
36                return;
37        }
38
39        if (opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp)
40        {
41                counts.mss_only ++;
42                return;
43        }
44
45        if (!opts.mss && !opts.sack && !opts.winscale && opts.ts && !opts.ttcp)
46        {
47                counts.ts_only ++;
48                return;
49        }
50
51        if (opts.mss && opts.sack && !opts.winscale && !opts.ts)
52                counts.ms ++;
53
54        if (opts.mss && opts.winscale && !opts.sack && !opts.ts)
55                counts.mw ++;
56
57        if (opts.mss && opts.winscale && opts.sack && !opts.ts)
58                counts.msw ++;
59       
60        if (opts.mss && opts.sack && opts.winscale && opts.ts) {
61                counts.all_four ++;
62        }
63
64        if (opts.ts && (opts.mss || opts.winscale || opts.sack)) {
65                counts.ts_and_another ++;
66        }
67       
68        if (opts.ttcp)
69                counts.ttcp ++;
70       
71}
72
73void synopt_per_packet(struct libtrace_packet_t *packet)
74{
75        struct libtrace_tcp *tcp = trace_get_tcp(packet);
76        unsigned char *opt_ptr;
77        libtrace_direction_t dir = trace_get_direction(packet);
78        int tcp_payload, len;
79        unsigned char type, optlen, *data;
80        struct tcp_opts opts_seen = {false, false, false, false, false};
81       
82        if(!tcp)
83                return;
84
85        if (!tcp->syn)
86                return;
87       
88        total_syns += 1;
89        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
90                dir = TRACE_DIR_OTHER;
91       
92        len = tcp->doff * 4 - sizeof(libtrace_tcp_t);
93        if(len == 0)
94                return;
95       
96        tcp_payload = trace_get_wire_length(packet) - trace_get_capture_length(packet);
97       
98        opt_ptr = (unsigned char *)tcp + sizeof (libtrace_tcp_t);
99       
100        while(trace_get_next_option(&opt_ptr,&len,&type,&optlen,&data)){
101                /* I don't think we need to count NO-OPs */
102                if (type == 1)
103                        continue;
104                switch(type) {
105                        case 2:
106                                opts_seen.mss = true;
107                                break;
108                        case 3:
109                                opts_seen.winscale = true;
110                                break;
111                        case 5:
112                                opts_seen.sack = true;
113                                break;
114                        case 8:
115                                opts_seen.ts = true;
116                                break;
117                        case 11:
118                        case 12:
119                        case 13:
120                                opts_seen.ttcp = true;
121                                break;
122                }
123        }
124       
125        classify_packet(opts_seen);
126}
127
128
129void synopt_report(void)
130{
131       
132        FILE *out = fopen("tcpopt_syn.out", "w");
133        if (!out) {
134                perror("fopen");
135                return;
136        }
137
138
139        fprintf(out, "%-20s\t%.2f%%\n",
140                        "No Options",
141                        (double)(counts.no_options) / total_syns * 100.0);
142        fprintf(out, "%-20s\t%.2f%%\n",
143                        "M Only",
144                        (double)(counts.mss_only) / total_syns * 100.0);
145        fprintf(out, "%-20s\t%.2f%%\n",
146                        "T Only",
147                        (double)(counts.ts_only) / total_syns * 100.0);
148        fprintf(out, "%-20s\t%.2f%%\n",
149                        "M and S",
150                        (double)(counts.ms) / total_syns * 100.0);
151        fprintf(out, "%-20s\t%.2f%%\n",
152                        "M and W",
153                        (double)(counts.mw) / total_syns * 100.0);
154        fprintf(out, "%-20s\t%.2f%%\n",
155                        "M, S and W",
156                        (double)(counts.msw) / total_syns * 100.0);
157        fprintf(out, "%-20s\t%.2f%%\n",
158                        "M, S, W and T",
159                        (double)(counts.all_four) / total_syns * 100.0);
160        fprintf(out, "%-20s\t%.2f%%\n",
161                        "T and (M or S or W)",
162                        (double)(counts.ts_and_another) / total_syns * 100.0);
163        fprintf(out, "%-20s\t%.2f%%\n",
164                        "T/TCP",
165                        (double)(counts.ttcp) / total_syns * 100.0);
166       
167       
168        fclose(out);
169}
Note: See TracBrowser for help on using the repository browser.