source: tools/tracereport/tcpopt_report.c @ 47d4f8c

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivendag_formatrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 47d4f8c 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: 3.3 KB
Line 
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
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"
34#include "report.h"
35
36static stat_t tcpopt_stat[3][256] = {{{0,0}}};
37
38void tcpopt_per_packet(struct libtrace_packet_t *packet)
39{
40        struct libtrace_tcp *tcp = trace_get_tcp(packet);
41        unsigned char *opt_ptr;
42        libtrace_direction_t dir = trace_get_direction(packet);
43        int tcp_payload, len;
44        unsigned char type, optlen, *data;
45       
46        if(!tcp)
47                return;
48       
49        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
50                dir = TRACE_DIR_OTHER;
51       
52        len = tcp->doff * 4 - sizeof(libtrace_tcp_t);
53        if(len == 0)
54                return;
55       
56        tcp_payload = trace_get_wire_length(packet) - trace_get_capture_length(packet);
57       
58        opt_ptr = (unsigned char *)tcp + sizeof (libtrace_tcp_t);
59       
60        while(trace_get_next_option(&opt_ptr,&len,&type,&optlen,&data)){
61                /* I don't think we need to count NO-OPs */
62                if (type == 1)
63                        continue;
64                tcpopt_stat[dir][type].count++;
65                tcpopt_stat[dir][type].bytes+= tcp_payload;
66        }
67       
68}
69
70
71void tcpopt_report(void)
72{
73       
74        int i,j;
75       
76        FILE *out = fopen("tcpopt.rpt", "w");
77        if (!out) {
78                perror("fopen");
79                return;
80        }
81
82        /* Put some headings up for human-readability */
83        fprintf(out, "%-12s\t%10s\t%16s %16s\n",
84                        "OPTION",
85                        "DIRECTION",
86                        "BYTES",
87                        "PACKETS");
88       
89        for(i=0;i<256;++i) {
90                if (tcpopt_stat[0][i].count==0 && 
91                        tcpopt_stat[1][i].count==0 && tcpopt_stat[2][i].count==0)
92                        continue;
93               
94                switch(i) {
95                        case 1:
96                                fprintf(out, "%12s", "NOP |");
97                                break;
98                        case 2:
99                                fprintf(out, "%12s", "MSS |");
100                                break;
101                        case 3:
102                                fprintf(out, "%12s", "Winscale |");
103                                break;
104                        case 4:
105                                fprintf(out, "%12s", "SACK Perm |");
106                                break;
107                        case 5:
108                                fprintf(out, "%12s", "SACK Info |");
109                                break;
110                        case 8:
111                                fprintf(out, "%12s", "Timestamp |");
112                                break;
113                        case 12:
114                                fprintf(out, "%12s", "CC.New |");
115                                break;
116                        case 19:
117                                fprintf(out, "%12s", "MD5 |");
118                                break;
119                        default:
120                                fprintf(out, "%10i |",i);
121                }
122               
123                for(j=0;j<3;j++){
124                        if (j != 0) {
125                                fprintf(out, "%12s", " |");
126                        }
127               
128                        switch (j) {
129                                case 0:
130                                        fprintf(out, "\t%10s", "Outbound");
131                                        break;
132                                case 1:
133                                        fprintf(out, "\t%10s", "Inbound");
134                                        break;
135                                case 2:
136                                        fprintf(out, "\t%10s", "Unknown");
137                                        break;
138                        }
139                       
140                        fprintf(out, "\t%16" PRIu64 " %16" PRIu64 "\n",
141                                tcpopt_stat[j][i].bytes,
142                                tcpopt_stat[j][i].count);
143                }
144        }
145        fclose(out);
146}
Note: See TracBrowser for help on using the repository browser.