source: examples/stats/stats.c @ 4249aa5

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

Add example stats program

  • Property mode set to 100644
File size: 3.7 KB
Line 
1#include "libtrace.h"
2#include <inttypes.h>
3#include <stdio.h>
4#include <getopt.h>
5#include <stdlib.h>
6#include <string.h>
7
8double lastts = 0.0;
9uint64_t v4=0;
10uint64_t v6=0;
11uint64_t udp=0;
12uint64_t tcp=0;
13uint64_t icmp=0;
14uint64_t ok=0;
15
16void per_packet(libtrace_packet_t *packet)
17{
18        /* Packet data */
19        uint32_t remaining;
20        /* L3 data */
21        void *l3;
22        uint16_t ethertype;
23        /* Transport data */
24        void *transport;
25        uint8_t proto;
26        /* Payload data */
27        void *payload;
28
29        if (lastts < 1)
30                lastts = trace_get_seconds(packet);
31
32        if (lastts+1.0 < trace_get_seconds(packet)) {
33                ++lastts;
34                printf("%.03f,",lastts);
35                printf("%"PRIu64",%"PRIu64",",v4,v6);
36                printf("%"PRIu64",%"PRIu64",%"PRIu64,icmp,tcp,udp);
37                printf("\n");
38                v4=v6=0;
39                icmp=tcp=udp=0;
40        }
41
42        l3 = trace_get_layer3(packet,&ethertype,&remaining);
43
44        if (!l3)
45                /* Probable ARP or something */
46                return;
47
48        /* Get the UDP/TCP/ICMP header from the IPv4/IPv6 packet */
49        switch (ethertype) {
50                case 0x0800:
51                        transport = trace_get_payload_from_ip(
52                                        (libtrace_ip_t*)l3,
53                                        &proto,
54                                        &remaining);
55                        if (!transport)
56                                return;
57                        ++v4;
58                        break;
59                case 0x86DD:
60                        transport = trace_get_payload_from_ip6(
61                                        (libtrace_ip6_t*)l3,
62                                        &proto,
63                                        &remaining);
64                        if (!transport)
65                                return;
66                        ++v6;
67                        break;
68                default:
69                        return;
70        }
71
72        /* Parse the udp/tcp/icmp payload */
73        switch(proto) {
74                case 1:
75                        ++icmp;
76                        return;
77                case 6:
78                        payload = trace_get_payload_from_tcp(
79                                        (libtrace_tcp_t*)transport,
80                                        &remaining);
81                        if (!payload)
82                                return;
83
84                        ++tcp;
85                        break;
86                case 17:
87
88                        payload = trace_get_payload_from_udp(
89                                        (libtrace_udp_t*)transport,
90                                        &remaining);
91                        if (!payload)
92                                return;
93                        ++udp;
94                        break;
95                default:
96                        return;
97        }
98        ++ok;
99}
100
101void usage(char *argv0)
102{
103        fprintf(stderr,"usage: %s [ --filter | -f bpfexp ]  [ --snaplen | -s snap ]\n\t\t[ --promisc | -p flag] [ --help | -h ] [ --libtrace-help | -H ] libtraceuri...\n",argv0);
104}
105
106int main(int argc, char *argv[])
107{
108        libtrace_t *trace;
109        libtrace_packet_t *packet;
110        libtrace_filter_t *filter=NULL;
111        int snaplen=-1;
112        int promisc=-1;
113
114        while(1) {
115                int option_index;
116                struct option long_options[] = {
117                        { "filter",             1, 0, 'f' },
118                        { "snaplen",            1, 0, 's' },
119                        { "promisc",            1, 0, 'p' },
120                        { "help",               0, 0, 'h' },
121                        { "libtrace-help",      0, 0, 'H' },
122                        { NULL,                 0, 0, 0 }
123                };
124
125                int c= getopt_long(argc, argv, "f:s:p:hH",
126                                long_options, &option_index);
127
128                if (c==-1)
129                        break;
130
131                switch (c) {
132                        case 'f':
133                                filter=trace_create_filter(optarg);
134                                break;
135                        case 's':
136                                snaplen=atoi(optarg);
137                                break;
138                        case 'p':
139                                promisc=atoi(optarg);
140                                break;
141                        case 'H':
142                                trace_help();
143                                return 1;
144                        default:
145                                fprintf(stderr,"Unknown option: %c\n",c);
146                                /* FALL THRU */
147                        case 'h':
148                                usage(argv[0]);
149                                return 1;
150                }
151        }
152
153        if (optind>=argc) {
154                fprintf(stderr,"Missing input uri\n");
155                usage(argv[0]);
156                return 1;
157        }
158
159        while (optind<argc) {
160                trace = trace_create(argv[optind]);
161                ++optind;
162
163                if (trace_is_err(trace)) {
164                        trace_perror(trace,"Opening trace file");
165                        return 1;
166                }
167
168                if (snaplen>0)
169                        if (trace_config(trace,TRACE_OPTION_SNAPLEN,&snaplen)) {
170                                trace_perror(trace,"ignoring: ");
171                        }
172                if (filter)
173                        if (trace_config(trace,TRACE_OPTION_FILTER,filter)) {
174                                trace_perror(trace,"ignoring: ");
175                        }
176                if (promisc!=-1) {
177                        if (trace_config(trace,TRACE_OPTION_PROMISC,&promisc)) {
178                                trace_perror(trace,"ignoring: ");
179                        }
180                }
181
182                if (trace_start(trace)) {
183                        trace_perror(trace,"Starting trace");
184                        trace_destroy(trace);
185                        return 1;
186                }
187
188                packet = trace_create_packet();
189
190                while (trace_read_packet(trace,packet)>0) {
191                        per_packet(packet);
192                }
193
194                trace_destroy_packet(packet);
195
196                if (trace_is_err(trace)) {
197                        trace_perror(trace,"Reading packets");
198                }
199
200                trace_destroy(trace);
201        }
202
203        return 0;
204}
Note: See TracBrowser for help on using the repository browser.