source: tools/tracereport/synopt_report.c @ 466aed6

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 466aed6 was 466aed6, checked in by Perry Lorier <perry@…>, 14 years ago

Flag functions as static if they're not actually used.
Include report.h too to make sure that functions have the right prototypes

  • Property mode set to 100644
File size: 4.9 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
[a1b899f]37struct opt_counter counts = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
[051618c]38uint64_t total_syns = 0;
39
[466aed6]40static void classify_packet(struct tcp_opts opts) {
[3bfeb7d]41        if (!opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
[051618c]42        {
43                counts.no_options ++;
44                return;
45        }
46
[3bfeb7d]47        if (opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
[051618c]48        {
49                counts.mss_only ++;
50                return;
51        }
52
[3bfeb7d]53        if (!opts.mss && !opts.sack && !opts.winscale && opts.ts && !opts.ttcp && !opts.other)
[051618c]54        {
55                counts.ts_only ++;
56                return;
57        }
58
59        if (opts.mss && opts.sack && !opts.winscale && !opts.ts)
60                counts.ms ++;
61
62        if (opts.mss && opts.winscale && !opts.sack && !opts.ts)
63                counts.mw ++;
64
65        if (opts.mss && opts.winscale && opts.sack && !opts.ts)
66                counts.msw ++;
67       
[3bfeb7d]68        if (opts.mss && opts.ts && !opts.winscale && !opts.sack)
69                counts.mt ++;
[a1b899f]70        if (opts.ts && opts.sack && !opts.mss && !opts.winscale)
71                counts.ts_and_sack ++;
72
73        if (opts.ts && opts.winscale && !opts.mss && !opts.sack)
74                counts.wt ++;
75
76        if (opts.ts && opts.mss && opts.winscale && !opts.sack)
77                counts.tmw ++;
78        if (opts.ts && opts.mss && opts.sack && !opts.winscale)
79                counts.tms ++;
80        if (opts.ts && opts.sack && opts.winscale && !opts.mss)
81                counts.tws ++;
82       
83       
[051618c]84        if (opts.mss && opts.sack && opts.winscale && opts.ts) {
85                counts.all_four ++;
86        }
87
88        if (opts.ts && (opts.mss || opts.winscale || opts.sack)) {
89                counts.ts_and_another ++;
90        }
91       
92        if (opts.ttcp)
93                counts.ttcp ++;
[3bfeb7d]94        if (opts.other)
95                counts.other ++;       
[051618c]96}
97
98void synopt_per_packet(struct libtrace_packet_t *packet)
99{
100        struct libtrace_tcp *tcp = trace_get_tcp(packet);
101        unsigned char *opt_ptr;
102        libtrace_direction_t dir = trace_get_direction(packet);
103        int tcp_payload, len;
104        unsigned char type, optlen, *data;
[3bfeb7d]105        struct tcp_opts opts_seen = {false, false, false, false, false, false};
[051618c]106       
107        if(!tcp)
108                return;
109
110        if (!tcp->syn)
111                return;
112       
113        total_syns += 1;
114        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
115                dir = TRACE_DIR_OTHER;
116       
117        len = tcp->doff * 4 - sizeof(libtrace_tcp_t);
118        if(len == 0)
119                return;
120       
121        tcp_payload = trace_get_wire_length(packet) - trace_get_capture_length(packet);
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        }
154       
155        classify_packet(opts_seen);
156}
157
158
159void synopt_report(void)
160{
161       
[bd4bec9]162        FILE *out = fopen("tcpopt_syn.rpt", "w");
[051618c]163        if (!out) {
164                perror("fopen");
165                return;
166        }
167
168
169        fprintf(out, "%-20s\t%.2f%%\n",
170                        "No Options",
171                        (double)(counts.no_options) / total_syns * 100.0);
172        fprintf(out, "%-20s\t%.2f%%\n",
173                        "M Only",
174                        (double)(counts.mss_only) / total_syns * 100.0);
175        fprintf(out, "%-20s\t%.2f%%\n",
176                        "T Only",
177                        (double)(counts.ts_only) / total_syns * 100.0);
178        fprintf(out, "%-20s\t%.2f%%\n",
179                        "M and S",
180                        (double)(counts.ms) / total_syns * 100.0);
181        fprintf(out, "%-20s\t%.2f%%\n",
182                        "M and W",
183                        (double)(counts.mw) / total_syns * 100.0);
184        fprintf(out, "%-20s\t%.2f%%\n",
185                        "M, S and W",
186                        (double)(counts.msw) / total_syns * 100.0);
187        fprintf(out, "%-20s\t%.2f%%\n",
[3bfeb7d]188                        "M, T",
189                        (double)(counts.mt) / total_syns * 100.0);
190        fprintf(out, "%-20s\t%.2f%%\n",
[a1b899f]191                        "W, T",
192                        (double)(counts.wt) / total_syns * 100.0);
193        fprintf(out, "%-20s\t%.2f%%\n",
194                        "S, T",
195                        (double)(counts.ts_and_sack) / total_syns * 100.0);
196        fprintf(out, "%-20s\t%.2f%%\n",
197                        "S, M, T",
198                        (double)(counts.tms) / total_syns * 100.0);
199        fprintf(out, "%-20s\t%.2f%%\n",
200                        "W, M, T",
201                        (double)(counts.tmw) / total_syns * 100.0);
202        fprintf(out, "%-20s\t%.2f%%\n",
203                        "S, W, T",
204                        (double)(counts.tws) / total_syns * 100.0);
205        fprintf(out, "%-20s\t%.2f%%\n",
[051618c]206                        "M, S, W and T",
207                        (double)(counts.all_four) / total_syns * 100.0);
[3bfeb7d]208        //fprintf(out, "%-20s\t%.2f%%\n",
209        //              "T and (M or S or W)",
210        //              (double)(counts.ts_and_another) / total_syns * 100.0);
[051618c]211        fprintf(out, "%-20s\t%.2f%%\n",
212                        "T/TCP",
213                        (double)(counts.ttcp) / total_syns * 100.0);
[3bfeb7d]214        fprintf(out, "%-20s\t%.2f%%\n",
215                        "Other options",
216                        (double)(counts.other) / total_syns * 100.0);
[051618c]217       
218       
219        fclose(out);
220}
Note: See TracBrowser for help on using the repository browser.