source: examples/options/timestamp.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@…>, 17 years ago

Add the various ip option modules

  • Property mode set to 100644
File size: 4.0 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                struct libtrace_tcp *tcpptr;
91                int psize;
92
93                if ((psize = trace_read_packet(trace, &packet)) <= 0) {
94                        break;
95                }
96
97                tcpptr = trace_get_tcp(&packet);
98
99                int dir = trace_get_direction(&packet);
100
101                if (!tcpptr)
102                        continue;
103
104                double now = trace_get_seconds(&packet);
105
106                /* search for the timestamp option */   
107                unsigned char *pkt = (unsigned char *)tcpptr + sizeof(*tcpptr);
108                //int plen = (packet.size-(pkt-(unsigned char*)packet.buffer)) <? (tcpptr->doff*4-sizeof *tcpptr);
109                int plen = (tcpptr->doff*4-sizeof *tcpptr);
110                unsigned char type = 0;
111                unsigned char optlen = 0;
112                unsigned char *data = 0;
113                bool flag = false;
114
115                while (get_next_option(&pkt,&plen,&type,&optlen,&data) != 0) {
116                        // ignore non timestamp options
117                        if (type!=8) {
118                                continue;
119                        }
120
121                        flag=true;
122                }
123
124                if (flag) {
125                        if (htons(tcpptr->dest) < htons(tcpptr->source))
126                                with_ts[dir][htons(tcpptr->dest)]++;
127                        else
128                                with_ts[dir][htons(tcpptr->source)]++;
129                }
130                else {
131                        if (htons(tcpptr->dest) < htons(tcpptr->source))
132                                without_ts[dir][htons(tcpptr->dest)]++;
133                        else
134                                without_ts[dir][htons(tcpptr->source)]++;
135                }
136
137                if (now-last>60) {
138                        int i=0;
139
140                        last=now;
141
142                        printf("\n");
143                        uint64_t with=0;
144                        uint64_t without=0;
145                        for(i=0;i<65535;i++) {
146                                if (with_ts[0][i]+without_ts[0][i]+
147                                with_ts[1][i]+without_ts[1][i]          <20)
148                                        continue;
149                                printf("%6i: %6lli %6lli  %6lli %6lli (%6.02f%%)\n",
150                                                i,
151                                                with_ts[0][i],
152                                                without_ts[0][i],
153                                                with_ts[1][i],
154                                                without_ts[1][i],
155                                                (with_ts[0][i]+with_ts[1][i])*100.0/(
156                                                        with_ts[0][i]+without_ts[0][i]+
157                                                        with_ts[1][i]+without_ts[1][i])
158                                                );
159                                with+=with_ts[0][i]+with_ts[1][i];
160                                without+=without_ts[0][i]+without_ts[1][i];
161                                with_ts[0][i]=0;
162                                without_ts[0][i]=0;
163                                with_ts[1][i]=0;
164                                without_ts[1][i]=0;
165                        }
166                        printf("%6s: %6lli %6lli (%6.02f%%)\n",
167                                        "",
168                                        with,
169                                        without,
170                                        with*100.0/(with+without)
171                              );
172                }
173
174        }
175
176        return 0;
177}
Note: See TracBrowser for help on using the repository browser.