source: tools/tracereport/tcpsegment_report.c @ 2d8a045

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 2d8a045 was d99c759, checked in by Shane Alcock <salcock@…>, 11 years ago
  • Increased maximum TCP segment size supported by tracereport *again*
  • Fixed tracereport to not segfault when it gets a segment larger than it supports - now it prints an error message and carries on
  • Property mode set to 100644
File size: 2.1 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
9#define MAX_SEG_SIZE 10000
10
11static stat_t tcpseg_stat[3][MAX_SEG_SIZE + 1] = {{{0,0}}} ;
12static bool suppress[3] = {true,true,true};
13
14void tcpseg_per_packet(struct libtrace_packet_t *packet)
15{
16        struct libtrace_tcp *tcp = trace_get_tcp(packet);
17        libtrace_ip_t *ip = trace_get_ip(packet);
18        libtrace_direction_t dir = trace_get_direction(packet);
19        int ss;
20        uint16_t ip_len ;
21       
22        if (!tcp || !ip)
23                return;
24
25        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
26                dir = TRACE_DIR_OTHER;
27       
28        ip_len = ntohs(ip->ip_len);
29        ss = ip_len - (ip->ip_hl * 4);
30
31        if (ss > MAX_SEG_SIZE) {
32                fprintf(stderr, "Maximum segment size %u exceeded - size was %u\n",
33                                MAX_SEG_SIZE, ss);
34                return;
35        }
36
37
38        tcpseg_stat[dir][ss].count++;
39        tcpseg_stat[dir][ss].bytes+=trace_get_wire_length(packet);
40        suppress[dir] = false;
41}
42
43void tcpseg_report(void)
44{
45        int i,j;
46        FILE *out = fopen("tcpseg.rpt", "w");
47        if (!out) {
48                perror("fopen");
49                return;
50        }
51        fprintf(out, "%-16s\t%10s\t%16s %16s\n",
52                        "SEGMENT SIZE",
53                        "DIRECTION",
54                        "BYTES",
55                        "PACKETS");
56       
57        for(i=0;i<2048;++i) {
58                bool indent_needed;
59                if (tcpseg_stat[0][i].count==0 && 
60                        tcpseg_stat[1][i].count==0 && tcpseg_stat[2][i].count==0)
61                        continue;
62                fprintf(out, "%16i:",i);
63                indent_needed=false;
64                for(j=0;j<3;j++){
65                        if (indent_needed) {
66                                fprintf(out, "%16s", " ");
67                        }
68                        if (suppress[j])
69                                continue;
70                        switch (j) {
71                                case 0:
72                                        fprintf(out, "\t%10s", "Outbound");
73                                        break;
74                                case 1:
75                                        fprintf(out, "\t%10s", "Inbound");
76                                        break;
77                                case 2:
78                                        fprintf(out, "\t%10s", "Unknown");
79                                        break;
80                        }
81                        fprintf(out, "\t%16" PRIu64 " %16" PRIu64 "\n",
82                                tcpseg_stat[j][i].bytes,
83                                tcpseg_stat[j][i].count);       
84                        indent_needed=true;
85                }
86        }
87        fclose(out);
88}
Note: See TracBrowser for help on using the repository browser.