source: tools/tracereport/synopt_report.c @ 5478d3d

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 5478d3d was a3041a4, checked in by Shane Alcock <salcock@…>, 10 years ago
  • Fixed "unused but set" warnings that new gcc now likes to report
  • Property mode set to 100644
File size: 6.0 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 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        opt_ptr = (unsigned char *)tcp + sizeof (libtrace_tcp_t);
124       
125        while(trace_get_next_option(&opt_ptr,&len,&type,&optlen,&data)){
126                /* I don't think we need to count NO-OPs */
127                if (type == 1)
128                        continue;
129                switch(type) {
130                        case 2:
131                                opts_seen.mss = true;
132                                break;
133                        case 3:
134                                opts_seen.winscale = true;
135                                break;
136                        case 4:
137                                opts_seen.sack = true;
138                                break;
139                        case 5:
140                                opts_seen.sack = true;
141                                break;
142                        case 8:
143                                opts_seen.ts = true;
144                                break;
145                        case 11:
146                        case 12:
147                        case 13:
148                                opts_seen.ttcp = true;
149                                break;
150                        default:
151                                opts_seen.other = true;
152                }
153        }
154
155        if (tcp->ack) {
156                total_synacks ++;
157                classify_packet(opts_seen, &synack_counts);
158        } else {
159                total_syns ++;
160                classify_packet(opts_seen, &syn_counts);
161        }
162}
163
164
165void synopt_report(void)
166{
167       
168        FILE *out = fopen("tcpopt_syn.rpt", "w");
169        if (!out) {
170                perror("fopen");
171                return;
172        }
173
174
175       
176        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
177                        "No Options",
178                        (double)(syn_counts.no_options) / total_syns * 100.0,
179                        (double)(synack_counts.no_options) / total_synacks * 100.0);
180        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
181                        "M Only",
182                        (double)(syn_counts.mss_only) / total_syns * 100.0,
183                        (double)(synack_counts.mss_only) / total_synacks * 100.0);
184        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
185                        "T Only",
186                        (double)(syn_counts.ts_only) / total_syns * 100.0,
187                        (double)(synack_counts.ts_only) / total_synacks * 100.0);
188        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
189                        "M and S",
190                        (double)(syn_counts.ms) / total_syns * 100.0,
191                        (double)(synack_counts.ms) / total_synacks * 100.0);
192        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
193                        "M and W",
194                        (double)(syn_counts.mw) / total_syns * 100.0,
195                        (double)(synack_counts.mw) / total_synacks * 100.0);
196        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
197                        "M, S and W",
198                        (double)(syn_counts.msw) / total_syns * 100.0,
199                        (double)(synack_counts.msw) / total_synacks * 100.0);
200        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
201                        "M, T",
202                        (double)(syn_counts.mt) / total_syns * 100.0,
203                        (double)(synack_counts.mt) / total_synacks * 100.0);
204        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
205                        "W, T",
206                        (double)(syn_counts.wt) / total_syns * 100.0,
207                        (double)(synack_counts.wt) / total_synacks * 100.0);
208        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
209                        "S, T",
210                        (double)(syn_counts.ts_and_sack) / total_syns * 100.0,
211                        (double)(synack_counts.ts_and_sack) / total_synacks * 100.0);
212        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
213                        "S, M, T",
214                        (double)(syn_counts.tms) / total_syns * 100.0,
215                        (double)(synack_counts.tms) / total_synacks * 100.0);
216        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
217                        "W, M, T",
218                        (double)(syn_counts.tmw) / total_syns * 100.0,
219                        (double)(synack_counts.tmw) / total_synacks * 100.0);
220        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
221                        "S, W, T",
222                        (double)(syn_counts.tws) / total_syns * 100.0,
223                        (double)(synack_counts.tws) / total_synacks * 100.0);
224        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
225                        "M, S, W and T",
226                        (double)(syn_counts.all_four) / total_syns * 100.0,
227                        (double)(synack_counts.all_four) / total_synacks * 100.0);
228        //fprintf(out, "%-20s\t%.2f%%\n",
229        //              "T and (M or S or W)",
230        //              (double)(counts.ts_and_another) / total_syns * 100.0);
231        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
232                        "T/TCP",
233                        (double)(syn_counts.ttcp) / total_syns * 100.0,
234                        (double)(synack_counts.ttcp) / total_synacks * 100.0);
235        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
236                        "Other options",
237                        (double)(syn_counts.other) / total_syns * 100.0,
238                        (double)(synack_counts.other) / total_synacks * 100.0);
239       
240       
241        fclose(out);
242}
Note: See TracBrowser for help on using the repository browser.