source: examples/protocol/protocol.c @ b535184

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since b535184 was b535184, checked in by Daniel Lawson <dlawson@…>, 16 years ago

updated examples to use 1.1.0 api

  • Property mode set to 100644
File size: 4.3 KB
Line 
1/*
2 * This file is part of libtrace
3 *
4 * Copyright (c) 2004 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#include <stdio.h> /* printf */
32#include <netinet/in.h> /* ntohs */
33#include <netdb.h>
34#include "dagformat.h"
35#include <getopt.h>
36
37#include <stdlib.h>
38#include <string.h>
39
40#include <errno.h>
41
42#include <linux/types.h>
43//#include <linux/linkage.h>
44//#define  access_ok(type,addr,size) 1
45
46static inline unsigned short ip_fast_csum(unsigned char * iph,
47                                          unsigned int ihl) {
48        unsigned int sum;
49
50        __asm__ __volatile__("
51            movl (%1), %0
52            subl $4, %2
53            jbe 2f
54            addl 4(%1), %0
55            adcl 8(%1), %0
56            adcl 12(%1), %0
571:          adcl 16(%1), %0
58            lea 4(%1), %1
59            decl %2
60            jne 1b
61            adcl $0, %0
62            movl %0, %2
63            shrl $16, %0
64            addw %w2, %w0
65            adcl $0, %0
66            notl %0
672:
68            "
69        /* Since the input registers which are loaded with iph and ipl
70           are modified, we must also specify them as outputs, or gcc
71           will assume they contain their original values. */
72        : "=r" (sum), "=r" (iph), "=r" (ihl)
73        : "1" (iph), "2" (ihl));
74        return(sum);
75}
76
77#define  IN_CHKSUM(IP)  ip_fast_csum((unsigned char *)(IP), 5)
78
79
80#include "libtrace.h"
81
82struct libtrace_t *trace;
83struct libtrace_filter_t *filter;
84
85char *buffer[4096];
86uint64_t badchksum = 0;
87char *uri = 0;
88char *filterstring = 0;
89
90int do_cksum = 0;
91int do_w_cksum = 0;
92uint64_t rxerr = 0;
93static void usage();
94static void parse_cmdline(int argc, char **argv);
95
96int main(int argc, char **argv) {
97
98        struct libtrace_ip *ipptr = 0;
99        struct libtrace_packet_t packet;
100       
101        int psize;
102
103        parse_cmdline(argc,argv);
104
105        trace = trace_create(uri);
106        if (filterstring) {
107                filter = trace_bpf_setfilter(filterstring);
108        }
109
110        for (;;) {
111                if ((psize = trace_read_packet(trace, &packet)) <= 0) {
112                        // terminate
113                        break;
114                }
115
116                if (filter) {
117                        if (!trace_bpf_filter(filter,&packet)) {
118                        continue;
119                        }
120                }
121                ipptr = trace_get_ip(&packet);
122
123                if (ipptr) {
124                        if(do_cksum && IN_CHKSUM(ipptr)) {
125                                badchksum ++;
126                        } else if (do_w_cksum && ipptr->ip_sum) {
127                                badchksum ++;
128                        } else {
129                                printf("%d:%d\n",ipptr->ip_p,trace_get_link_type(&packet));
130                        }
131                }
132        }
133        if (do_cksum || do_w_cksum) {
134                printf("Bad checksums seen: %llu\n",badchksum);
135                printf("RX Errors seen: %llu\n",rxerr);
136        }
137        trace_destroy(trace);
138        return 0;
139}
140
141
142static void usage(char *prog) {
143        printf("usage: %s [-h] [-c | -w] [-u <uri>] [-f <filterstring>]\n",prog);
144        printf("        -h              this help message\n");
145        printf("        -c              perform ip checksum test\n");
146        printf("        -w              check WDCAPd ip checksum value\n");
147        printf("        -u uri          uri to connect to\n");
148        printf("        -f filterstring BPF filterstring to apply\n");
149        printf("\n");
150        printf(" The use of -c and -w are exclusive: -c is used for normal traces, while -w applies to traces taken from the Waikato Capture point\n");
151}
152
153static void parse_cmdline(int argc, char **argv){
154        int opt;
155        if (argc == 1) {
156                usage(argv[0]);
157                exit(0);
158        }
159       
160        while ((opt = getopt(argc,argv, "hcwu:f:")) != EOF) {
161                switch(opt) {
162                        case 'h':
163                                usage(argv[0]);
164                                exit(0);
165                        case 'c':
166                                do_cksum = 1;
167                                break;
168                        case 'w':
169                                do_w_cksum = 1;
170                                break;
171                        case 'u':
172                                uri = strdup(optarg);
173                                break;
174                        case 'f':
175                                filterstring = strdup(optarg);
176                                break;
177                        default:
178                                usage(argv[0]);
179                                exit(0);
180                }
181
182        }
183
184        if (do_cksum && do_w_cksum) {
185                usage(argv[0]);
186                exit(0);
187        }
188
189}
Note: See TracBrowser for help on using the repository browser.