source: tools/tracereport/tcpopt_report.c @ c549d3f

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since c549d3f 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: 2.3 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
9static stat_t tcpopt_stat[3][256] = {{{0,0}}};
10
11void tcpopt_per_packet(struct libtrace_packet_t *packet)
12{
13        struct libtrace_tcp *tcp = trace_get_tcp(packet);
14        unsigned char *opt_ptr;
15        libtrace_direction_t dir = trace_get_direction(packet);
16        int tcp_payload, len;
17        unsigned char type, optlen, *data;
18       
19        if(!tcp)
20                return;
21       
22        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
23                dir = TRACE_DIR_OTHER;
24       
25        len = tcp->doff * 4 - sizeof(libtrace_tcp_t);
26        if(len == 0)
27                return;
28       
29        tcp_payload = trace_get_wire_length(packet) - trace_get_capture_length(packet);
30       
31        opt_ptr = (unsigned char *)tcp + sizeof (libtrace_tcp_t);
32       
33        while(trace_get_next_option(&opt_ptr,&len,&type,&optlen,&data)){
34                /* I don't think we need to count NO-OPs */
35                if (type == 1)
36                        continue;
37                tcpopt_stat[dir][type].count++;
38                tcpopt_stat[dir][type].bytes+= tcp_payload;
39        }
40       
41}
42
43
44void tcpopt_report(void)
45{
46       
47        int i,j;
48       
49        FILE *out = fopen("tcpopt.rpt", "w");
50        if (!out) {
51                perror("fopen");
52                return;
53        }
54
55        /* Put some headings up for human-readability */
56        fprintf(out, "%-12s\t%10s\t%16s %16s\n",
57                        "OPTION",
58                        "DIRECTION",
59                        "BYTES",
60                        "PACKETS");
61       
62        for(i=0;i<256;++i) {
63                if (tcpopt_stat[0][i].count==0 && 
64                        tcpopt_stat[1][i].count==0 && tcpopt_stat[2][i].count==0)
65                        continue;
66               
67                switch(i) {
68                        case 1:
69                                fprintf(out, "%12s", "NOP |");
70                                break;
71                        case 2:
72                                fprintf(out, "%12s", "MSS |");
73                                break;
74                        case 3:
75                                fprintf(out, "%12s", "Winscale |");
76                                break;
77                        case 4:
78                                fprintf(out, "%12s", "SACK Perm |");
79                                break;
80                        case 5:
81                                fprintf(out, "%12s", "SACK Info |");
82                                break;
83                        case 8:
84                                fprintf(out, "%12s", "Timestamp |");
85                                break;
86                        case 12:
87                                fprintf(out, "%12s", "CC.New |");
88                                break;
89                        case 19:
90                                fprintf(out, "%12s", "MD5 |");
91                                break;
92                        default:
93                                fprintf(out, "%10i |",i);
94                }
95               
96                for(j=0;j<3;j++){
97                        if (j != 0) {
98                                fprintf(out, "%12s", " |");
99                        }
100               
101                        switch (j) {
102                                case 0:
103                                        fprintf(out, "\t%10s", "Outbound");
104                                        break;
105                                case 1:
106                                        fprintf(out, "\t%10s", "Inbound");
107                                        break;
108                                case 2:
109                                        fprintf(out, "\t%10s", "Unknown");
110                                        break;
111                        }
112                       
113                        fprintf(out, "\t%16" PRIu64 " %16" PRIu64 "\n",
114                                tcpopt_stat[j][i].bytes,
115                                tcpopt_stat[j][i].count);
116                }
117        }
118        fclose(out);
119}
Note: See TracBrowser for help on using the repository browser.