source: tools/tracereport/port_report.c @ 756b8f9

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 756b8f9 was 466aed6, checked in by Perry Lorier <perry@…>, 14 years ago

Flag functions as static if they're not actually used.
Include report.h too to make sure that functions have the right prototypes

  • Property mode set to 100644
File size: 2.5 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#include "report.h"
11
12stat_t *ports[3][256] = {{NULL}};
13char protn[256]={0};
14static bool suppress[3] = {true,true,true};
15
16void port_per_packet(struct libtrace_packet_t *packet)
17{
18        uint8_t proto;
19        int port;
20        libtrace_direction_t dir = trace_get_direction(packet);
21
22        if(trace_get_transport(packet,&proto,NULL)==NULL) 
23                return;
24
25        if (dir != TRACE_DIR_INCOMING && dir != TRACE_DIR_OUTGOING)
26                dir = TRACE_DIR_OTHER;
27       
28        port = trace_get_server_port(proto,
29                        trace_get_source_port(packet),
30                        trace_get_destination_port(packet))==USE_SOURCE
31                ? trace_get_source_port(packet)
32                : trace_get_destination_port(packet);
33
34        if (!ports[dir][proto])
35                ports[dir][proto]=calloc(65536,sizeof(stat_t));
36        ports[dir][proto][port].bytes+=trace_get_wire_length(packet);
37        ports[dir][proto][port].count++;
38        protn[proto]=1;
39        suppress[dir] = false;
40}
41
42
43static void port_port(int i,char *prot, int j, FILE *out)
44{
45        struct servent *ent = getservbyport(htons(j),prot);
46        int k;
47       
48        if(ent){
49                fprintf(out,"%16s:",ent->s_name);
50        }
51        else{
52                fprintf(out,"%16i:",j);
53        }
54
55        for (k = 0; k < 3; k++) {
56                if (!ports[k][i])
57                        continue;
58                if (k != 0) {
59                        fprintf(out, "%16s", " ");
60                }
61                switch (k) {
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                }
72                fprintf(out, "\t%16" PRIu64 " %16" PRIu64 "\n",
73                        ports[k][i][j].bytes,
74                        ports[k][i][j].count);
75        }
76}
77
78static void port_protocol(int i, FILE *out)
79{
80        int j,k;
81        struct protoent *ent = getprotobynumber(i);
82        fprintf(out, "Protocol: %i %s%s%s\n",i,
83                        ent?"(":"",ent?ent->p_name:"",ent?")":"");
84        for(j=0;j<65536;++j) {
85                for(k=0;k<3;k++){
86                        if (ports[k][i] && ports[k][i][j].count) {
87                                port_port(i,ent?ent->p_name:"",j, out);
88                                break;
89                        }
90                }
91        }
92}
93
94void port_report(void)
95{
96        int i;
97        FILE *out = fopen("ports.rpt", "w");
98        if (!out) {
99                perror("fopen");
100                return;
101        }
102        fprintf(out, "%-16s\t%10s\t%16s %16s\n",
103                        "PORT",
104                        "DIRECTION",
105                        "BYTES",
106                        "PACKETS");     
107
108        setservent(1);
109        setprotoent(1);
110        for(i=0;i<256;++i) {
111                if (protn[i]) {
112                        port_protocol(i, out);
113                        free(ports[0][i]);
114                        free(ports[1][i]);
115                        free(ports[2][i]);
116                }
117        }
118        endprotoent();
119        endservent();
120        fclose(out);
121}
Note: See TracBrowser for help on using the repository browser.