source: tools/tracereport/port_report.c @ 051618c

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 051618c was b5dc60d, checked in by Josef Vodanovich <jjv4@…>, 14 years ago

Lots of minor changes to the reports to make it look a bit nicer and tcp ss should be working.

  • Property mode set to 100644
File size: 2.5 KB
RevLine 
[d3ff1fb]1#include <netdb.h>
2#include <inttypes.h>
[e3b0188]3#include <lt_inttypes.h>
[d3ff1fb]4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7#include "libtrace.h"
8#include "tracereport.h"
[49ce177]9#include "contain.h"
[d3ff1fb]10
[b5dc60d]11stat_t ports[3][256][65536]={{{{0,0}}}};
[11c4044]12char protn[256]={0};
[b5dc60d]13static bool suppress[3] = {true,true,true};
[d3ff1fb]14
15void port_per_packet(struct libtrace_packet_t *packet)
16{
[11c4044]17        uint8_t proto;
[c3e6e47]18        int port;
[b5dc60d]19        libtrace_direction_t dir = trace_get_direction(packet);
20
[11c4044]21        if(trace_get_transport(packet,&proto,NULL)==NULL) 
[d3ff1fb]22                return;
23
[b5dc60d]24        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
25                dir = TRACE_DIR_OTHER;
26       
[11c4044]27        port = trace_get_server_port(proto,
[d3ff1fb]28                        trace_get_source_port(packet),
29                        trace_get_destination_port(packet))==USE_SOURCE
30                ? trace_get_source_port(packet)
31                : trace_get_destination_port(packet);
32
[d4336d5]33        ports[dir][proto][port].bytes+=trace_get_wire_length(packet);
34        ports[dir][proto][port].count++;
[11c4044]35        protn[proto]=1;
[d4336d5]36        suppress[dir] = false;
37}
38
39void port_suppress()
40{
41        int i;
42        printf("%-20s","Direction:");
[b5dc60d]43        for(i=0;i<3;i++){
[d4336d5]44                if(!suppress[i]){
45                        switch(i){
46                                case 0:
47                                        printf("\t%24s", "Outbound   ");
48                                        break;
49                                case 1:
50                                        printf("\t%24s", "Inbound   ");
51                                        break;
52                                case 2:
53                                        printf("\t%24s", "Undefined   ");
54                                        break;
55                                default:
56                                        break;
57                        }
58                }
59        }
60        printf("\n");
61        printf("%-20s","Port");
[b5dc60d]62        for(i=0;i<3;i++){
[d4336d5]63                if(!suppress[i]){
64                        printf("\t%12s\t%12s", "bytes","packets");
65                }
66        }
67        printf("\n");
[d3ff1fb]68}
69
[d4336d5]70void port_port(int i,char *prot, int j)
[d3ff1fb]71{
[11c4044]72        struct servent *ent = getservbyport(htons(j),prot);
[d4336d5]73        int k;
74       
75        if(ent){
76                printf("%20s:",ent->s_name);
[b5dc60d]77                for(k=0;k<3;k++){
[d4336d5]78                        if (ports[k][i][j].count==0){
79                                if(!suppress[k])
80                                        printf("\t%24s"," ");
81                                continue;
82                        }
83                        printf("\t%12" PRIu64 "\t%12" PRIu64,
84                                ports[k][i][j].bytes,
85                                ports[k][i][j].count
[d3ff1fb]86                      );
[d4336d5]87                }
88        }
89        else{
90                printf("%20i:",j);
[b5dc60d]91                for(k=0;k<3;k++){
[d4336d5]92                        if (ports[k][i][j].count==0){
93                                if(!suppress[k])
94                                        printf("\t%24s"," ");
95                                continue;
96                        }
97                        printf("\t%12" PRIu64 "\t%12" PRIu64,
98                                ports[k][i][j].bytes,
99                                ports[k][i][j].count
[d3ff1fb]100                      );
[d4336d5]101                }
102        }
103        printf("\n");
[d3ff1fb]104}
105
[d4336d5]106void port_protocol(int i)
[d3ff1fb]107{
[d4336d5]108        int j,k;
[11c4044]109        struct protoent *ent = getprotobynumber(i);
110        printf("Protocol: %i %s%s%s\n",i,
[d3ff1fb]111                        ent?"(":"",ent?ent->p_name:"",ent?")":"");
[11c4044]112        for(j=0;j<65536;++j) {
[b5dc60d]113                for(k=0;k<3;k++){
[d4336d5]114                        if (ports[k][i][j].count) {
115                                port_port(i,ent?ent->p_name:"",j);
116                                break;
117                        }
[11c4044]118                }
119        }
[d3ff1fb]120}
121
122void port_report(void)
123{
[11c4044]124        int i;
[d3ff1fb]125        printf("# Port breakdown:\n");
[d4336d5]126        port_suppress();
[d3ff1fb]127        setservent(1);
128        setprotoent(1);
[11c4044]129        for(i=0;i<256;++i) {
130                if (protn[i]) {
131                        port_protocol(i);
132                }
133        }
[d3ff1fb]134        endprotoent();
135        endservent();
136}
Note: See TracBrowser for help on using the repository browser.