source: tools/tracereport/tcpopt_report.c @ f3576f5

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since f3576f5 was f3576f5, checked in by Shane Alcock <salcock@…>, 14 years ago

misc and port reports now write to files - all reports now do so
Changed almost all the %llu format strings to use PRIu64 which should reduce the warnings on 64 bit machines

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