source: tools/tracereport/synopt_report.c @ a0ec6f1

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since a0ec6f1 was 708f9ae, checked in by Shane Alcock <salcock@…>, 14 years ago
  • Updated a number of formats to not set the libtrace error for config options they didn't understand. trace_config will attempt to set the option upon their return and should be trusted to set the error appropriately if it also fails.
  • Updated the synopt report to report percentages of option combos in SYNs and SYNACKs separately
  • Property mode set to 100644
File size: 6.1 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#include "report.h"
8
9struct tcp_opts {
10        bool mss;
11        bool sack;
12        bool winscale;
13        bool ts;
14        bool ttcp;
15        bool other;
16};
17
18struct opt_counter {
19        uint64_t no_options;
20        uint64_t mss_only;
21        uint64_t ts_only;
22        uint64_t ms;
23        uint64_t mw;
24        uint64_t msw;
25        uint64_t mt;
26        uint64_t all_four;
27        uint64_t ts_and_sack;
28        uint64_t wt;
29        uint64_t tms;
30        uint64_t tws;
31        uint64_t tmw;
32        uint64_t ts_and_another;
33        uint64_t ttcp;
34        uint64_t other;
35};
36
37struct opt_counter syn_counts = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
38struct opt_counter synack_counts = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
39
40uint64_t total_syns = 0;
41uint64_t total_synacks = 0;
42
43static void classify_packet(struct tcp_opts opts, struct opt_counter *counts) {
44        if (!opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
45        {
46                counts->no_options ++;
47                return;
48        }
49
50        if (opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
51        {
52                counts->mss_only ++;
53                return;
54        }
55
56        if (!opts.mss && !opts.sack && !opts.winscale && opts.ts && !opts.ttcp && !opts.other)
57        {
58                counts->ts_only ++;
59                return;
60        }
61
62        if (opts.mss && opts.sack && !opts.winscale && !opts.ts)
63                counts->ms ++;
64
65        if (opts.mss && opts.winscale && !opts.sack && !opts.ts)
66                counts->mw ++;
67
68        if (opts.mss && opts.winscale && opts.sack && !opts.ts)
69                counts->msw ++;
70       
71        if (opts.mss && opts.ts && !opts.winscale && !opts.sack)
72                counts->mt ++;
73        if (opts.ts && opts.sack && !opts.mss && !opts.winscale)
74                counts->ts_and_sack ++;
75
76        if (opts.ts && opts.winscale && !opts.mss && !opts.sack)
77                counts->wt ++;
78
79        if (opts.ts && opts.mss && opts.winscale && !opts.sack)
80                counts->tmw ++;
81        if (opts.ts && opts.mss && opts.sack && !opts.winscale)
82                counts->tms ++;
83        if (opts.ts && opts.sack && opts.winscale && !opts.mss)
84                counts->tws ++;
85       
86       
87        if (opts.mss && opts.sack && opts.winscale && opts.ts) {
88                counts->all_four ++;
89        }
90
91        if (opts.ts && (opts.mss || opts.winscale || opts.sack)) {
92                counts->ts_and_another ++;
93        }
94       
95        if (opts.ttcp)
96                counts->ttcp ++;
97        if (opts.other)
98                counts->other ++;       
99}
100
101void synopt_per_packet(struct libtrace_packet_t *packet)
102{
103        struct libtrace_tcp *tcp = trace_get_tcp(packet);
104        unsigned char *opt_ptr;
105        libtrace_direction_t dir = trace_get_direction(packet);
106        int tcp_payload, len;
107        unsigned char type, optlen, *data;
108        struct tcp_opts opts_seen = {false, false, false, false, false, false};
109       
110        if(!tcp)
111                return;
112
113        if (!tcp->syn)
114                return;
115       
116        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
117                dir = TRACE_DIR_OTHER;
118       
119        len = tcp->doff * 4 - sizeof(libtrace_tcp_t);
120        if(len == 0)
121                return;
122       
123        tcp_payload = trace_get_wire_length(packet) - trace_get_capture_length(packet);
124       
125        opt_ptr = (unsigned char *)tcp + sizeof (libtrace_tcp_t);
126       
127        while(trace_get_next_option(&opt_ptr,&len,&type,&optlen,&data)){
128                /* I don't think we need to count NO-OPs */
129                if (type == 1)
130                        continue;
131                switch(type) {
132                        case 2:
133                                opts_seen.mss = true;
134                                break;
135                        case 3:
136                                opts_seen.winscale = true;
137                                break;
138                        case 4:
139                                opts_seen.sack = true;
140                                break;
141                        case 5:
142                                opts_seen.sack = true;
143                                break;
144                        case 8:
145                                opts_seen.ts = true;
146                                break;
147                        case 11:
148                        case 12:
149                        case 13:
150                                opts_seen.ttcp = true;
151                                break;
152                        default:
153                                opts_seen.other = true;
154                }
155        }
156
157        if (tcp->ack) {
158                total_synacks ++;
159                classify_packet(opts_seen, &synack_counts);
160        } else {
161                total_syns ++;
162                classify_packet(opts_seen, &syn_counts);
163        }
164}
165
166
167void synopt_report(void)
168{
169       
170        FILE *out = fopen("tcpopt_syn.rpt", "w");
171        if (!out) {
172                perror("fopen");
173                return;
174        }
175
176
177       
178        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
179                        "No Options",
180                        (double)(syn_counts.no_options) / total_syns * 100.0,
181                        (double)(synack_counts.no_options) / total_synacks * 100.0);
182        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
183                        "M Only",
184                        (double)(syn_counts.mss_only) / total_syns * 100.0,
185                        (double)(synack_counts.mss_only) / total_synacks * 100.0);
186        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
187                        "T Only",
188                        (double)(syn_counts.ts_only) / total_syns * 100.0,
189                        (double)(synack_counts.ts_only) / total_synacks * 100.0);
190        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
191                        "M and S",
192                        (double)(syn_counts.ms) / total_syns * 100.0,
193                        (double)(synack_counts.ms) / total_synacks * 100.0);
194        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
195                        "M and W",
196                        (double)(syn_counts.mw) / total_syns * 100.0,
197                        (double)(synack_counts.mw) / total_synacks * 100.0);
198        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
199                        "M, S and W",
200                        (double)(syn_counts.msw) / total_syns * 100.0,
201                        (double)(synack_counts.msw) / total_synacks * 100.0);
202        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
203                        "M, T",
204                        (double)(syn_counts.mt) / total_syns * 100.0,
205                        (double)(synack_counts.mt) / total_synacks * 100.0);
206        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
207                        "W, T",
208                        (double)(syn_counts.wt) / total_syns * 100.0,
209                        (double)(synack_counts.wt) / total_synacks * 100.0);
210        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
211                        "S, T",
212                        (double)(syn_counts.ts_and_sack) / total_syns * 100.0,
213                        (double)(synack_counts.ts_and_sack) / total_synacks * 100.0);
214        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
215                        "S, M, T",
216                        (double)(syn_counts.tms) / total_syns * 100.0,
217                        (double)(synack_counts.tms) / total_synacks * 100.0);
218        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
219                        "W, M, T",
220                        (double)(syn_counts.tmw) / total_syns * 100.0,
221                        (double)(synack_counts.tmw) / total_synacks * 100.0);
222        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
223                        "S, W, T",
224                        (double)(syn_counts.tws) / total_syns * 100.0,
225                        (double)(synack_counts.tws) / total_synacks * 100.0);
226        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
227                        "M, S, W and T",
228                        (double)(syn_counts.all_four) / total_syns * 100.0,
229                        (double)(synack_counts.all_four) / total_synacks * 100.0);
230        //fprintf(out, "%-20s\t%.2f%%\n",
231        //              "T and (M or S or W)",
232        //              (double)(counts.ts_and_another) / total_syns * 100.0);
233        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
234                        "T/TCP",
235                        (double)(syn_counts.ttcp) / total_syns * 100.0,
236                        (double)(synack_counts.ttcp) / total_synacks * 100.0);
237        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
238                        "Other options",
239                        (double)(syn_counts.other) / total_syns * 100.0,
240                        (double)(synack_counts.other) / total_synacks * 100.0);
241       
242       
243        fclose(out);
244}
Note: See TracBrowser for help on using the repository browser.