source: tools/tracereport/tcpsegment_report.c @ 666b5cf

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 666b5cf was 666b5cf, checked in by Shane Alcock <salcock@…>, 12 years ago
  • Fix segfault that can occur when processing traces that feature large TCP segments, e.g. IPLS 1
  • Property mode set to 100644
File size: 2.0 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
[666b5cf]9static stat_t tcpseg_stat[3][9000] = {{{0,0}}} ;
[b5dc60d]10static bool suppress[3] = {true,true,true};
[d4336d5]11
12void tcpseg_per_packet(struct libtrace_packet_t *packet)
13{
14        struct libtrace_tcp *tcp = trace_get_tcp(packet);
[bd4bec9]15        libtrace_ip_t *ip = trace_get_ip(packet);
[b5dc60d]16        libtrace_direction_t dir = trace_get_direction(packet);
[bd4bec9]17        int ss;
18        uint16_t ip_len ;
[b5dc60d]19       
[f898a97]20        if (!tcp || !ip)
[d4336d5]21                return;
[b5dc60d]22
23        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
24                dir = TRACE_DIR_OTHER;
[d4336d5]25       
[bd4bec9]26        ip_len = ntohs(ip->ip_len);
27        ss = ip_len - (ip->ip_hl * 4);
[09be643]28
[b5dc60d]29        tcpseg_stat[dir][ss].count++;
30        tcpseg_stat[dir][ss].bytes+=trace_get_wire_length(packet);
[d4336d5]31        suppress[dir] = false;
32}
33
34void tcpseg_report(void)
35{
36        int i,j;
[bd4bec9]37        FILE *out = fopen("tcpseg.rpt", "w");
38        if (!out) {
39                perror("fopen");
40                return;
41        }
42        fprintf(out, "%-16s\t%10s\t%16s %16s\n",
43                        "SEGMENT SIZE",
44                        "DIRECTION",
45                        "BYTES",
46                        "PACKETS");
47       
[d4336d5]48        for(i=0;i<2048;++i) {
[a8f2692]49                bool indent_needed;
[d4336d5]50                if (tcpseg_stat[0][i].count==0 && 
51                        tcpseg_stat[1][i].count==0 && tcpseg_stat[2][i].count==0)
52                        continue;
[bd4bec9]53                fprintf(out, "%16i:",i);
[a8f2692]54                indent_needed=false;
[b5dc60d]55                for(j=0;j<3;j++){
[a8f2692]56                        if (indent_needed) {
[bd4bec9]57                                fprintf(out, "%16s", " ");
[d4336d5]58                        }
[a8f2692]59                        if (suppress[j])
60                                continue;
[bd4bec9]61                        switch (j) {
62                                case 0:
63                                        fprintf(out, "\t%10s", "Outbound");
64                                        break;
65                                case 1:
66                                        fprintf(out, "\t%10s", "Inbound");
67                                        break;
68                                case 2:
69                                        fprintf(out, "\t%10s", "Unknown");
70                                        break;
71                        }
[f3576f5]72                        fprintf(out, "\t%16" PRIu64 " %16" PRIu64 "\n",
[d4336d5]73                                tcpseg_stat[j][i].bytes,
[bd4bec9]74                                tcpseg_stat[j][i].count);       
[a8f2692]75                        indent_needed=true;
[d4336d5]76                }
77        }
[bd4bec9]78        fclose(out);
[d4336d5]79}
Note: See TracBrowser for help on using the repository browser.