source: tools/tracereport/port_report.c @ d4336d5

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

Updated tracereport to include all the work Josef has done

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