source: tools/tracestats/tracestats.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 d242ea8, checked in by Shane Alcock <salcock@…>, 15 years ago

Some of tracesummary's bpf filters were incorrect - however the new correct filters don't work so well with the output format so that will need fixing at some point
Improved error reporting for bpf filters
tracestats will now ignore a filter that fails and print a single warning. It also no longer increments the counter for filters that fail.

  • Property mode set to 100644
File size: 4.3 KB
Line 
1/*
2 * This file is part of libtrace
3 *
4 * Copyright (c) 2007 The University of Waikato, Hamilton, New Zealand.
5 * Authors: Daniel Lawson
6 *          Perry Lorier
7 *         
8 * All rights reserved.
9 *
10 * This code has been developed by the University of Waikato WAND
11 * research group. For further information please see http://www.wand.net.nz/
12 *
13 * libtrace is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * libtrace is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with libtrace; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 *
27 * $Id$
28 *
29 */
30
31/*
32 * This program takes a series of traces and bpf filters and outputs how many
33 * bytes/packets
34 */
35
36#include <stdio.h>
37#include <stdlib.h>
38#include <assert.h>
39#include <string.h>
40#include <sys/time.h>
41#include <sys/types.h>
42#include <time.h>
43
44#include <netinet/in.h>
45#include <netinet/in_systm.h>
46#include <netinet/tcp.h>
47#include <netinet/ip.h>
48#include <netinet/ip_icmp.h>
49#include <arpa/inet.h>
50#include <sys/socket.h>
51#include <getopt.h>
52#include <inttypes.h>
53
54#include "libtrace.h"
55
56#ifndef PRIu64
57        #define PRIu64 "llu"
58#endif
59
60struct libtrace_t *trace;
61
62struct filter_t {
63        char *expr;
64        struct libtrace_filter_t *filter;
65        uint64_t count;
66        uint64_t bytes;
67} *filters = NULL;
68int filter_count=0;
69uint64_t totcount;
70uint64_t totbytes;
71
72/* Process a trace, counting packets that match filter(s) */
73static void run_trace(char *uri) 
74{
75        struct libtrace_packet_t *packet = trace_create_packet();
76        int i;
77        uint64_t count = 0;
78        uint64_t bytes = 0;
79
80        fprintf(stderr,"%s:\n",uri);
81
82        trace = trace_create(uri);
83
84        if (trace_is_err(trace)) {
85                trace_perror(trace,"");
86                return;
87        }
88
89        if (trace_start(trace)==-1) {
90                trace_perror(trace,"");
91                return;
92        }
93
94
95        for (;;) {
96                int psize;
97                if ((psize = trace_read_packet(trace, packet)) <1) {
98                        break;
99                }
100
101                for(i=0;i<filter_count;++i) {
102                        if (filters[i].filter == NULL)
103                                continue;
104                        if(trace_apply_filter(filters[i].filter,packet) > 0) {
105                                ++filters[i].count;
106                                filters[i].bytes+=trace_get_wire_length(packet);
107                        }
108                        if (trace_is_err(trace)) {
109                                trace_perror(trace, "trace_apply_filter");
110                                fprintf(stderr, "Removing filter from filterlist\n");
111                                filters[i].filter = NULL;
112                        }
113                }
114
115                ++count;
116                bytes+=trace_get_wire_length(packet);
117        }
118
119        printf("%-30s\t%12s\t%12s\t%7s\n","filter","count","bytes","%");
120        for(i=0;i<filter_count;++i) {
121                printf("%30s:\t%12"PRIu64"\t%12"PRIu64"\t%7.03f\n",filters[i].expr,filters[i].count,filters[i].bytes,filters[i].count*100.0/count);
122                filters[i].bytes=0;
123                filters[i].count=0;
124        }
125        printf("%30s:\t%12"PRIu64"\t%12" PRIu64 "\n","Total",count,bytes);
126        totcount+=count;
127        totbytes+=bytes;
128
129        trace_destroy(trace);
130}
131
132static void usage(char *argv0)
133{
134        fprintf(stderr,"Usage: %s [-H|--libtrace-help] [--filter|-f bpf ]... libtraceuri...\n",argv0);
135}
136
137int main(int argc, char *argv[]) {
138
139        int i;
140
141        while(1) {
142                int option_index;
143                struct option long_options[] = {
144                        { "filter",        1, 0, 'f' },
145                        { "libtrace-help", 0, 0, 'H' },
146                        { NULL,            0, 0, 0   },
147                };
148
149                int c=getopt_long(argc, argv, "f:H",
150                                long_options, &option_index);
151
152                if (c==-1)
153                        break;
154
155                switch (c) {
156                        case 'f':
157                                ++filter_count;
158                                filters=realloc(filters,filter_count*sizeof(struct filter_t));
159                                filters[filter_count-1].expr=strdup(optarg);
160                                filters[filter_count-1].filter=trace_create_filter(optarg);
161                                filters[filter_count-1].count=0;
162                                filters[filter_count-1].bytes=0;
163                                break;
164                        case 'H':
165                                trace_help();
166                                exit(1);
167                                break;
168                        default:
169                                fprintf(stderr,"Unknown option: %c\n",c);
170                                usage(argv[0]);
171                                return 1;
172                }
173        }
174
175        for(i=optind;i<argc;++i) {
176                run_trace(argv[i]);
177        }
178        if (optind+1<argc) {
179                printf("Grand total:\n");
180                printf("%30s:\t%12"PRIu64"\t%12" PRIu64 "\n","Total",totcount,totbytes);
181        }
182
183
184        return 0;
185}
Note: See TracBrowser for help on using the repository browser.