source: examples/protocol/protocol.c @ a257602

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

.

  • Property mode set to 100644
File size: 4.5 KB
RevLine 
[a79ddbe]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 */
[2c060e3]30
31#include <stdio.h> /* printf */
32#include <netinet/in.h> /* ntohs */
33#include <netdb.h>
34#include "dagformat.h"
[781cf2c]35#include <getopt.h>
36
37#include <stdlib.h>
38#include <string.h>
39
40#include <errno.h>
41
42#include <linux/types.h>
[c837874]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
[781cf2c]77#define  IN_CHKSUM(IP)  ip_fast_csum((unsigned char *)(IP), 5)
[2c060e3]78
[c837874]79
[2c060e3]80#include "libtrace.h"
81
82struct libtrace_t *trace;
[c561c76]83struct libtrace_filter_t *filter;
[2c060e3]84
85char *buffer[4096];
[781cf2c]86uint64_t badchksum = 0;
87char *uri = 0;
88char *filterstring = 0;
[2c060e3]89
[781cf2c]90int do_cksum = 0;
91int do_w_cksum = 0;
[a257602]92uint64_t rxerr = 0;
[781cf2c]93static void usage();
94static void parse_cmdline(int argc, char **argv);
95
96int main(int argc, char **argv) {
[2c060e3]97
98        struct libtrace_ip *ipptr = 0;
[a257602]99        dag_record_t *erfptr = 0;
[2c060e3]100       
[a257602]101        int status; 
[2c060e3]102        int psize;
[781cf2c]103
104        parse_cmdline(argc,argv);
[2c060e3]105
[781cf2c]106        trace = create_trace(uri);
[c792590]107        if (filterstring) {
[c561c76]108                filter = libtrace_bpf_setfilter(filterstring);
[c792590]109        }
[2c060e3]110
111        for (;;) {
112                if ((psize = libtrace_read_packet(trace, buffer,4096, &status)) <= 0) {
113                        // terminate
114                        break;
115                }
[a257602]116                erfptr = (dag_record_t *)buffer;
117               
118                if (erfptr->flags.rxerror) {
119                        rxerr ++;
120                        continue;
121                }
[c561c76]122                if (filter) {
123                        if (!libtrace_bpf_filter(trace, filter, buffer, 4096)) {
[c792590]124                        continue;
[c561c76]125                        }
[c792590]126                }
[2c060e3]127                ipptr = get_ip(trace,buffer,4096);
[781cf2c]128
[c837874]129                if (ipptr) {
130                        if(do_cksum && IN_CHKSUM(ipptr)) {
131                                badchksum ++;
132                        } else if (do_w_cksum && ipptr->ip_sum) {
133                                badchksum ++;
134                        } else {
[781cf2c]135                                printf("%d:%d\n",ipptr->ip_p,get_link_type(trace,buffer,4096));
136                        }
[2c060e3]137                }
138        }
[781cf2c]139        if (do_cksum || do_w_cksum) {
140                printf("Bad checksums seen: %llu\n",badchksum);
[a257602]141                printf("RX Errors seen: %llu\n",rxerr);
[781cf2c]142        }
[2c060e3]143        destroy_trace(trace);
144        return 0;
145}
[781cf2c]146
147
148static void usage(char *prog) {
149        printf("usage: %s [-h] [-c | -w] [-u <uri>] [-f <filterstring>]\n",prog);
150        printf("        -h              this help message\n");
151        printf("        -c              perform ip checksum test\n");
152        printf("        -w              check WDCAPd ip checksum value\n");
153        printf("        -u uri          uri to connect to\n");
154        printf("        -f filterstring BPF filterstring to apply\n");
155        printf("\n");
156        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");
157}
158
159static void parse_cmdline(int argc, char **argv){
160        int opt;
161        if (argc == 1) {
162                usage(argv[0]);
163                exit(0);
164        }
165       
166        while ((opt = getopt(argc,argv, "hcwu:f:")) != EOF) {
167                switch(opt) {
168                        case 'h':
169                                usage(argv[0]);
170                                exit(0);
171                        case 'c':
172                                do_cksum = 1;
173                                break;
174                        case 'w':
175                                do_w_cksum = 1;
176                                break;
177                        case 'u':
178                                uri = strdup(optarg);
179                                break;
180                        case 'f':
181                                filterstring = strdup(optarg);
182                                break;
183                        default:
184                                usage(argv[0]);
185                                exit(0);
186                }
187
188        }
189
190        if (do_cksum && do_w_cksum) {
191                usage(argv[0]);
192                exit(0);
193        }
194
195}
Note: See TracBrowser for help on using the repository browser.