source: tools/tracereport/synopt_report.c @ 2d8a045

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 2d8a045 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
RevLine 
[051618c]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"
[466aed6]7#include "report.h"
[051618c]8
9struct tcp_opts {
10        bool mss;
11        bool sack;
12        bool winscale;
13        bool ts;
14        bool ttcp;
[3bfeb7d]15        bool other;
[051618c]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;
[3bfeb7d]25        uint64_t mt;
[051618c]26        uint64_t all_four;
[a1b899f]27        uint64_t ts_and_sack;
28        uint64_t wt;
29        uint64_t tms;
30        uint64_t tws;
31        uint64_t tmw;
[051618c]32        uint64_t ts_and_another;
33        uint64_t ttcp;
[3bfeb7d]34        uint64_t other;
[051618c]35};
36
[708f9ae]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
[051618c]40uint64_t total_syns = 0;
[708f9ae]41uint64_t total_synacks = 0;
[051618c]42
[708f9ae]43static void classify_packet(struct tcp_opts opts, struct opt_counter *counts) {
[3bfeb7d]44        if (!opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
[051618c]45        {
[708f9ae]46                counts->no_options ++;
[051618c]47                return;
48        }
49
[3bfeb7d]50        if (opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
[051618c]51        {
[708f9ae]52                counts->mss_only ++;
[051618c]53                return;
54        }
55
[3bfeb7d]56        if (!opts.mss && !opts.sack && !opts.winscale && opts.ts && !opts.ttcp && !opts.other)
[051618c]57        {
[708f9ae]58                counts->ts_only ++;
[051618c]59                return;
60        }
61
62        if (opts.mss && opts.sack && !opts.winscale && !opts.ts)
[708f9ae]63                counts->ms ++;
[051618c]64
65        if (opts.mss && opts.winscale && !opts.sack && !opts.ts)
[708f9ae]66                counts->mw ++;
[051618c]67
68        if (opts.mss && opts.winscale && opts.sack && !opts.ts)
[708f9ae]69                counts->msw ++;
[051618c]70       
[3bfeb7d]71        if (opts.mss && opts.ts && !opts.winscale && !opts.sack)
[708f9ae]72                counts->mt ++;
[a1b899f]73        if (opts.ts && opts.sack && !opts.mss && !opts.winscale)
[708f9ae]74                counts->ts_and_sack ++;
[a1b899f]75
76        if (opts.ts && opts.winscale && !opts.mss && !opts.sack)
[708f9ae]77                counts->wt ++;
[a1b899f]78
79        if (opts.ts && opts.mss && opts.winscale && !opts.sack)
[708f9ae]80                counts->tmw ++;
[a1b899f]81        if (opts.ts && opts.mss && opts.sack && !opts.winscale)
[708f9ae]82                counts->tms ++;
[a1b899f]83        if (opts.ts && opts.sack && opts.winscale && !opts.mss)
[708f9ae]84                counts->tws ++;
[a1b899f]85       
86       
[051618c]87        if (opts.mss && opts.sack && opts.winscale && opts.ts) {
[708f9ae]88                counts->all_four ++;
[051618c]89        }
90
91        if (opts.ts && (opts.mss || opts.winscale || opts.sack)) {
[708f9ae]92                counts->ts_and_another ++;
[051618c]93        }
94       
95        if (opts.ttcp)
[708f9ae]96                counts->ttcp ++;
[3bfeb7d]97        if (opts.other)
[708f9ae]98                counts->other ++;       
[051618c]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);
[a3041a4]106        int len;
[051618c]107        unsigned char type, optlen, *data;
[3bfeb7d]108        struct tcp_opts opts_seen = {false, false, false, false, false, false};
[051618c]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;
[3bfeb7d]136                        case 4:
137                                opts_seen.sack = true;
138                                break;
[051618c]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;
[3bfeb7d]150                        default:
151                                opts_seen.other = true;
[051618c]152                }
153        }
[708f9ae]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        }
[051618c]162}
163
164
165void synopt_report(void)
166{
167       
[bd4bec9]168        FILE *out = fopen("tcpopt_syn.rpt", "w");
[051618c]169        if (!out) {
170                perror("fopen");
171                return;
172        }
173
174
[708f9ae]175       
176        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]177                        "No Options",
[708f9ae]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",
[051618c]181                        "M Only",
[708f9ae]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",
[051618c]185                        "T Only",
[708f9ae]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",
[051618c]189                        "M and S",
[708f9ae]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",
[051618c]193                        "M and W",
[708f9ae]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",
[051618c]197                        "M, S and W",
[708f9ae]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",
[3bfeb7d]201                        "M, T",
[708f9ae]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",
[a1b899f]205                        "W, T",
[708f9ae]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",
[a1b899f]209                        "S, T",
[708f9ae]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",
[a1b899f]213                        "S, M, T",
[708f9ae]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",
[a1b899f]217                        "W, M, T",
[708f9ae]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",
[a1b899f]221                        "S, W, T",
[708f9ae]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",
[051618c]225                        "M, S, W and T",
[708f9ae]226                        (double)(syn_counts.all_four) / total_syns * 100.0,
227                        (double)(synack_counts.all_four) / total_synacks * 100.0);
[3bfeb7d]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);
[708f9ae]231        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]232                        "T/TCP",
[708f9ae]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",
[3bfeb7d]236                        "Other options",
[708f9ae]237                        (double)(syn_counts.other) / total_syns * 100.0,
238                        (double)(synack_counts.other) / total_synacks * 100.0);
[051618c]239       
240       
241        fclose(out);
242}
Note: See TracBrowser for help on using the repository browser.