source: tools/tracereport/tcpopt_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: 2.3 KB
RevLine 
[d4336d5]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"
[d4336d5]8
[f7953ac]9static stat_t tcpopt_stat[3][256] = {{{0,0}}};
[d4336d5]10
11void tcpopt_per_packet(struct libtrace_packet_t *packet)
12{
13        struct libtrace_tcp *tcp = trace_get_tcp(packet);
[2d99bd2]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;
[d4336d5]18       
19        if(!tcp)
20                return;
21       
[2d99bd2]22        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
23                dir = TRACE_DIR_OTHER;
[d4336d5]24       
[2d99bd2]25        len = tcp->doff * 4 - sizeof(libtrace_tcp_t);
[d4336d5]26        if(len == 0)
27                return;
28       
[2d99bd2]29        tcp_payload = trace_get_wire_length(packet) - trace_get_capture_length(packet);
[d4336d5]30       
[2d99bd2]31        opt_ptr = (unsigned char *)tcp + sizeof (libtrace_tcp_t);
[d4336d5]32       
[2d99bd2]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;
[d4336d5]37                tcpopt_stat[dir][type].count++;
[2d99bd2]38                tcpopt_stat[dir][type].bytes+= tcp_payload;
[d4336d5]39        }
40       
41}
42
43
44void tcpopt_report(void)
45{
[f7953ac]46       
[d4336d5]47        int i,j;
[f7953ac]48       
[bd4bec9]49        FILE *out = fopen("tcpopt.rpt", "w");
[f7953ac]50        if (!out) {
51                perror("fopen");
52                return;
53        }
54
55        /* Put some headings up for human-readability */
[013d3692]56        fprintf(out, "%-12s\t%10s\t%16s %16s\n",
[f7953ac]57                        "OPTION",
58                        "DIRECTION",
59                        "BYTES",
60                        "PACKETS");
[d4336d5]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:
[f7953ac]69                                fprintf(out, "%12s", "NOP |");
[d4336d5]70                                break;
71                        case 2:
[f7953ac]72                                fprintf(out, "%12s", "MSS |");
[d4336d5]73                                break;
74                        case 3:
[f7953ac]75                                fprintf(out, "%12s", "Winscale |");
[d4336d5]76                                break;
77                        case 4:
[f7953ac]78                                fprintf(out, "%12s", "SACK Perm |");
[d4336d5]79                                break;
80                        case 5:
[f7953ac]81                                fprintf(out, "%12s", "SACK Info |");
[d4336d5]82                                break;
83                        case 8:
[f7953ac]84                                fprintf(out, "%12s", "Timestamp |");
[d4336d5]85                                break;
[013d3692]86                        case 12:
87                                fprintf(out, "%12s", "CC.New |");
88                                break;
[d4336d5]89                        case 19:
[f7953ac]90                                fprintf(out, "%12s", "MD5 |");
[013d3692]91                                break;
[d4336d5]92                        default:
[013d3692]93                                fprintf(out, "%10i |",i);
[d4336d5]94                }
95               
[f7953ac]96                for(j=0;j<3;j++){
97                        if (j != 0) {
98                                fprintf(out, "%12s", " |");
99                        }
100               
101                        switch (j) {
102                                case 0:
[013d3692]103                                        fprintf(out, "\t%10s", "Outbound");
[f7953ac]104                                        break;
105                                case 1:
[013d3692]106                                        fprintf(out, "\t%10s", "Inbound");
[f7953ac]107                                        break;
108                                case 2:
[013d3692]109                                        fprintf(out, "\t%10s", "Unknown");
[f7953ac]110                                        break;
[d4336d5]111                        }
[f7953ac]112                       
[f3576f5]113                        fprintf(out, "\t%16" PRIu64 " %16" PRIu64 "\n",
[d4336d5]114                                tcpopt_stat[j][i].bytes,
115                                tcpopt_stat[j][i].count);
116                }
117        }
[f7953ac]118        fclose(out);
[d4336d5]119}
Note: See TracBrowser for help on using the repository browser.