source: examples/options/ipoptions.cc @ dca0810

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

Add the various ip option modules

  • Property mode set to 100644
File size: 2.4 KB
Line 
1#include <stdio.h>
2#include "libtrace.h"
3#include <map>
4
5uint64_t with_ts[4][65536];
6uint64_t without_ts[4][65536];
7
8struct libtrace_packet_t packet;
9
10/** parse an option
11 * @param ptr   the pointer to the current option
12 * @param plen  the length of the remaining buffer
13 * @param type  the type of the option
14 * @param optlen the length of the option
15 * @param data  the data of the option
16 *
17 * @returns bool true if there is another option (and the fields are filled in)
18 */
19int get_next_option(unsigned char **ptr,int *len,
20                        unsigned char *type,
21                        unsigned char *optlen,
22                        unsigned char **data)
23{
24        if (*len<=0) {
25//              printf("Missing End of Options\n");
26                return 0;
27        }
28        *type=**ptr;
29        switch(*type) {
30                case 0: /* End of options */
31        //              printf("End of option\n");
32                        return 0;
33                case 1: /* Pad */
34                        (*ptr)++;
35                        (*len)--;
36                        return 1;
37                default:
38                case 6: // ECHO (obsolete)
39                case 7: // ECHO Reply (obsolete)
40                case 9: // Partial ordering
41                case 10: // Partial ordering service profile
42                case 11: // CC
43                case 13: // CC.ECHO
44                case 14: // Alternative checksum request
45                case 15: // Alternative checksum data
46                case 16: // Skeeter
47                case 17: // Bubba
48                case 18: // Trailer checksum
49                case 19: // Md5 signature
50                case 20: // SCPS capability
51                case 21: // Selective NACK
52                case 22: // Record boundary
53                case 23: // Corruption experienced
54                case 24: // SNAP
55                case 25: // Unassigned
56                case 26: // TCP Compression filter
57                        printf("Unknown option type (%i)\n",*type);
58                case 2: // MSS
59                case 3: // WS
60                case 4: // SACK permitted
61                case 5: // SACK
62                case 8: // Timestamp
63                case 12: // CC.new
64                        *optlen = *(*ptr+1);
65                        if (*optlen<2) {
66                                printf("Optlen <2?! %i\n",*optlen);
67                                return 0; // I have no idea wtf is going on
68                                          // with these packets
69                        }
70                        (*len)-=(unsigned int)*optlen;
71                        (*data)=(*ptr+2);
72                        (*ptr)+=*optlen;
73                        if (*len<0) {
74                                printf("Option longer than option area (%i > %i)\n",*optlen,*len+*optlen);
75                                return 0;
76                        }
77                        return 1;
78        }
79        assert(0);
80}
81
82int main(int argc, char *argv[])
83{
84        struct libtrace_t *trace;
85        double last = 0;
86
87        trace = trace_create(argv[1]);
88
89        for (;;) {
90                int psize;
91
92                if ((psize = trace_read_packet(trace, &packet)) <= 0) {
93                        break;
94                }
95
96                struct libtrace_ip *ipptr = trace_get_ip(&packet);
97
98                if (!ipptr) 
99                        continue;
100
101                if (ipptr->ip_hl!=5) {
102                        printf("*");
103                        fflush(stdout);
104                }
105
106                double now=trace_get_seconds(&packet);
107
108                if (now-last>60) {
109                        printf(".");
110                        fflush(stdout);
111                        last=now;
112                }
113
114        }
115
116        return 0;
117}
Note: See TracBrowser for help on using the repository browser.