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@…>, 15 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
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 counts = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
38uint64_t total_syns = 0;
39
40static void classify_packet(struct tcp_opts opts) {
41        if (!opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
42        {
43                counts.no_options ++;
44                return;
45        }
46
47        if (opts.mss && !opts.sack && !opts.winscale && !opts.ts && !opts.ttcp && !opts.other)
48        {
49                counts.mss_only ++;
50                return;
51        }
52
53        if (!opts.mss && !opts.sack && !opts.winscale && opts.ts && !opts.ttcp && !opts.other)
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       
68        if (opts.mss && opts.ts && !opts.winscale && !opts.sack)
69                counts.mt ++;
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       
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 ++;
94        if (opts.other)
95                counts.other ++;       
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;
105        struct tcp_opts opts_seen = {false, false, false, false, false, false};
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;
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        classify_packet(opts_seen);
156}
157
158
159void synopt_report(void)
160{
161       
162        FILE *out = fopen("tcpopt_syn.rpt", "w");
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",
188                        "M, T",
189                        (double)(counts.mt) / total_syns * 100.0);
190        fprintf(out, "%-20s\t%.2f%%\n",
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",
206                        "M, S, W and T",
207                        (double)(counts.all_four) / total_syns * 100.0);
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);
211        fprintf(out, "%-20s\t%.2f%%\n",
212                        "T/TCP",
213                        (double)(counts.ttcp) / total_syns * 100.0);
214        fprintf(out, "%-20s\t%.2f%%\n",
215                        "Other options",
216                        (double)(counts.other) / total_syns * 100.0);
217       
218       
219        fclose(out);
220}
Note: See TracBrowser for help on using the repository browser.