source: tools/tracereport/synopt_report.c @ d74ca03

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivendag_formatrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since d74ca03 was ee6e802, checked in by Shane Alcock <salcock@…>, 5 years ago

Updated copyright blurb on all source files

In some cases, this meant adding copyright blurbs to files that
had never had them before.

  • Property mode set to 100644
File size: 7.0 KB
RevLine 
[ee6e802]1/*
2 *
3 * Copyright (c) 2007-2016 The University of Waikato, Hamilton, New Zealand.
4 * All rights reserved.
5 *
6 * This file is part of libtrace.
7 *
8 * This code has been developed by the University of Waikato WAND
9 * research group. For further information please see http://www.wand.net.nz/
10 *
11 * libtrace is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * libtrace is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 * GNU Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public License
22 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23 *
24 *
25 */
26
27
[051618c]28#include <netdb.h>
29#include <inttypes.h>
30#include <lt_inttypes.h>
31#include <stdio.h>
32#include "libtrace.h"
33#include "tracereport.h"
[466aed6]34#include "report.h"
[051618c]35
36struct tcp_opts {
37        bool mss;
38        bool sack;
39        bool winscale;
40        bool ts;
41        bool ttcp;
[3bfeb7d]42        bool other;
[051618c]43};
44
45struct opt_counter {
46        uint64_t no_options;
47        uint64_t mss_only;
48        uint64_t ts_only;
49        uint64_t ms;
50        uint64_t mw;
51        uint64_t msw;
[3bfeb7d]52        uint64_t mt;
[051618c]53        uint64_t all_four;
[a1b899f]54        uint64_t ts_and_sack;
55        uint64_t wt;
56        uint64_t tms;
57        uint64_t tws;
58        uint64_t tmw;
[051618c]59        uint64_t ts_and_another;
60        uint64_t ttcp;
[3bfeb7d]61        uint64_t other;
[051618c]62};
63
[708f9ae]64struct opt_counter syn_counts = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
65struct opt_counter synack_counts = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
66
[051618c]67uint64_t total_syns = 0;
[708f9ae]68uint64_t total_synacks = 0;
[051618c]69
[708f9ae]70static void classify_packet(struct tcp_opts opts, struct opt_counter *counts) {
[3bfeb7d]71        if (!opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
[051618c]72        {
[708f9ae]73                counts->no_options ++;
[051618c]74                return;
75        }
76
[3bfeb7d]77        if (opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
[051618c]78        {
[708f9ae]79                counts->mss_only ++;
[051618c]80                return;
81        }
82
[3bfeb7d]83        if (!opts.mss && !opts.sack && !opts.winscale && opts.ts && !opts.ttcp && !opts.other)
[051618c]84        {
[708f9ae]85                counts->ts_only ++;
[051618c]86                return;
87        }
88
89        if (opts.mss && opts.sack && !opts.winscale && !opts.ts)
[708f9ae]90                counts->ms ++;
[051618c]91
92        if (opts.mss && opts.winscale && !opts.sack && !opts.ts)
[708f9ae]93                counts->mw ++;
[051618c]94
95        if (opts.mss && opts.winscale && opts.sack && !opts.ts)
[708f9ae]96                counts->msw ++;
[051618c]97       
[3bfeb7d]98        if (opts.mss && opts.ts && !opts.winscale && !opts.sack)
[708f9ae]99                counts->mt ++;
[a1b899f]100        if (opts.ts && opts.sack && !opts.mss && !opts.winscale)
[708f9ae]101                counts->ts_and_sack ++;
[a1b899f]102
103        if (opts.ts && opts.winscale && !opts.mss && !opts.sack)
[708f9ae]104                counts->wt ++;
[a1b899f]105
106        if (opts.ts && opts.mss && opts.winscale && !opts.sack)
[708f9ae]107                counts->tmw ++;
[a1b899f]108        if (opts.ts && opts.mss && opts.sack && !opts.winscale)
[708f9ae]109                counts->tms ++;
[a1b899f]110        if (opts.ts && opts.sack && opts.winscale && !opts.mss)
[708f9ae]111                counts->tws ++;
[a1b899f]112       
113       
[051618c]114        if (opts.mss && opts.sack && opts.winscale && opts.ts) {
[708f9ae]115                counts->all_four ++;
[051618c]116        }
117
118        if (opts.ts && (opts.mss || opts.winscale || opts.sack)) {
[708f9ae]119                counts->ts_and_another ++;
[051618c]120        }
121       
122        if (opts.ttcp)
[708f9ae]123                counts->ttcp ++;
[3bfeb7d]124        if (opts.other)
[708f9ae]125                counts->other ++;       
[051618c]126}
127
128void synopt_per_packet(struct libtrace_packet_t *packet)
129{
130        struct libtrace_tcp *tcp = trace_get_tcp(packet);
131        unsigned char *opt_ptr;
132        libtrace_direction_t dir = trace_get_direction(packet);
[a3041a4]133        int len;
[051618c]134        unsigned char type, optlen, *data;
[3bfeb7d]135        struct tcp_opts opts_seen = {false, false, false, false, false, false};
[051618c]136       
137        if(!tcp)
138                return;
139
140        if (!tcp->syn)
141                return;
142       
143        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
144                dir = TRACE_DIR_OTHER;
145       
146        len = tcp->doff * 4 - sizeof(libtrace_tcp_t);
147        if(len == 0)
148                return;
149       
150        opt_ptr = (unsigned char *)tcp + sizeof (libtrace_tcp_t);
151       
152        while(trace_get_next_option(&opt_ptr,&len,&type,&optlen,&data)){
153                /* I don't think we need to count NO-OPs */
154                if (type == 1)
155                        continue;
156                switch(type) {
157                        case 2:
158                                opts_seen.mss = true;
159                                break;
160                        case 3:
161                                opts_seen.winscale = true;
162                                break;
[3bfeb7d]163                        case 4:
164                                opts_seen.sack = true;
165                                break;
[051618c]166                        case 5:
167                                opts_seen.sack = true;
168                                break;
169                        case 8:
170                                opts_seen.ts = true;
171                                break;
172                        case 11:
173                        case 12:
174                        case 13:
175                                opts_seen.ttcp = true;
176                                break;
[3bfeb7d]177                        default:
178                                opts_seen.other = true;
[051618c]179                }
180        }
[708f9ae]181
182        if (tcp->ack) {
183                total_synacks ++;
184                classify_packet(opts_seen, &synack_counts);
185        } else {
186                total_syns ++;
187                classify_packet(opts_seen, &syn_counts);
188        }
[051618c]189}
190
191
192void synopt_report(void)
193{
194       
[bd4bec9]195        FILE *out = fopen("tcpopt_syn.rpt", "w");
[051618c]196        if (!out) {
197                perror("fopen");
198                return;
199        }
200
201
[708f9ae]202       
203        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]204                        "No Options",
[708f9ae]205                        (double)(syn_counts.no_options) / total_syns * 100.0,
206                        (double)(synack_counts.no_options) / total_synacks * 100.0);
207        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]208                        "M Only",
[708f9ae]209                        (double)(syn_counts.mss_only) / total_syns * 100.0,
210                        (double)(synack_counts.mss_only) / total_synacks * 100.0);
211        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]212                        "T Only",
[708f9ae]213                        (double)(syn_counts.ts_only) / total_syns * 100.0,
214                        (double)(synack_counts.ts_only) / total_synacks * 100.0);
215        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]216                        "M and S",
[708f9ae]217                        (double)(syn_counts.ms) / total_syns * 100.0,
218                        (double)(synack_counts.ms) / total_synacks * 100.0);
219        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]220                        "M and W",
[708f9ae]221                        (double)(syn_counts.mw) / total_syns * 100.0,
222                        (double)(synack_counts.mw) / total_synacks * 100.0);
223        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]224                        "M, S and W",
[708f9ae]225                        (double)(syn_counts.msw) / total_syns * 100.0,
226                        (double)(synack_counts.msw) / total_synacks * 100.0);
227        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[3bfeb7d]228                        "M, T",
[708f9ae]229                        (double)(syn_counts.mt) / total_syns * 100.0,
230                        (double)(synack_counts.mt) / total_synacks * 100.0);
231        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[a1b899f]232                        "W, T",
[708f9ae]233                        (double)(syn_counts.wt) / total_syns * 100.0,
234                        (double)(synack_counts.wt) / total_synacks * 100.0);
235        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[a1b899f]236                        "S, T",
[708f9ae]237                        (double)(syn_counts.ts_and_sack) / total_syns * 100.0,
238                        (double)(synack_counts.ts_and_sack) / total_synacks * 100.0);
239        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[a1b899f]240                        "S, M, T",
[708f9ae]241                        (double)(syn_counts.tms) / total_syns * 100.0,
242                        (double)(synack_counts.tms) / total_synacks * 100.0);
243        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[a1b899f]244                        "W, M, T",
[708f9ae]245                        (double)(syn_counts.tmw) / total_syns * 100.0,
246                        (double)(synack_counts.tmw) / total_synacks * 100.0);
247        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[a1b899f]248                        "S, W, T",
[708f9ae]249                        (double)(syn_counts.tws) / total_syns * 100.0,
250                        (double)(synack_counts.tws) / total_synacks * 100.0);
251        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]252                        "M, S, W and T",
[708f9ae]253                        (double)(syn_counts.all_four) / total_syns * 100.0,
254                        (double)(synack_counts.all_four) / total_synacks * 100.0);
[3bfeb7d]255        //fprintf(out, "%-20s\t%.2f%%\n",
256        //              "T and (M or S or W)",
257        //              (double)(counts.ts_and_another) / total_syns * 100.0);
[708f9ae]258        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[051618c]259                        "T/TCP",
[708f9ae]260                        (double)(syn_counts.ttcp) / total_syns * 100.0,
261                        (double)(synack_counts.ttcp) / total_synacks * 100.0);
262        fprintf(out, "%-20s\t%.2f%%\t%.2f%%\n",
[3bfeb7d]263                        "Other options",
[708f9ae]264                        (double)(syn_counts.other) / total_syns * 100.0,
265                        (double)(synack_counts.other) / total_synacks * 100.0);
[051618c]266       
267       
268        fclose(out);
269}
Note: See TracBrowser for help on using the repository browser.