source: examples/options/timestamp-ip.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: 3.4 KB
Line 
1#include <stdio.h>
2#include "libtrace.h"
3#include <map>
4#include <sys/socket.h>
5#include <netinet/ip.h>
6#include <arpa/inet.h>
7
8typedef std::map<uint32_t,std::pair<uint64_t,uint64_t> > ip2with_t;
9ip2with_t ip2with;
10
11struct libtrace_packet_t packet;
12
13/** parse an option
14 * @param ptr   the pointer to the current option
15 * @param plen  the length of the remaining buffer
16 * @param type  the type of the option
17 * @param optlen the length of the option
18 * @param data  the data of the option
19 *
20 * @returns bool true if there is another option (and the fields are filled in)
21 */
22int get_next_option(unsigned char **ptr,int *len,
23                        unsigned char *type,
24                        unsigned char *optlen,
25                        unsigned char **data)
26{
27        if (*len<=0) {
28//              printf("Missing End of Options\n");
29                return 0;
30        }
31        *type=**ptr;
32        switch(*type) {
33                case 0: /* End of options */
34        //              printf("End of option\n");
35                        return 0;
36                case 1: /* Pad */
37                        (*ptr)++;
38                        (*len)--;
39                        return 1;
40                default:
41                case 6: // ECHO (obsolete)
42                case 7: // ECHO Reply (obsolete)
43                case 9: // Partial ordering
44                case 10: // Partial ordering service profile
45                case 11: // CC
46                case 13: // CC.ECHO
47                case 14: // Alternative checksum request
48                case 15: // Alternative checksum data
49                case 16: // Skeeter
50                case 17: // Bubba
51                case 18: // Trailer checksum
52                case 19: // Md5 signature
53                case 20: // SCPS capability
54                case 21: // Selective NACK
55                case 22: // Record boundary
56                case 23: // Corruption experienced
57                case 24: // SNAP
58                case 25: // Unassigned
59                case 26: // TCP Compression filter
60                        printf("Unknown option type (%i)\n",*type);
61                case 2: // MSS
62                case 3: // WS
63                case 4: // SACK permitted
64                case 5: // SACK
65                case 8: // Timestamp
66                case 12: // CC.new
67                        *optlen = *(*ptr+1);
68                        if (*optlen<2) {
69                                printf("Optlen <2?! %i\n",*optlen);
70                                return 0; // I have no idea wtf is going on
71                                          // with these packets
72                        }
73                        (*len)-=(unsigned int)*optlen;
74                        (*data)=(*ptr+2);
75                        (*ptr)+=*optlen;
76                        if (*len<0) {
77                                printf("Option longer than option area (%i > %i)\n",*optlen,*len+*optlen);
78                                return 0;
79                        }
80                        return 1;
81        }
82        assert(0);
83}
84
85int main(int argc, char *argv[])
86{
87        struct libtrace_t *trace;
88        double last = 0;
89
90        trace = trace_create(argv[1]);
91
92        for (;;) {
93                struct libtrace_tcp *tcpptr;
94                struct libtrace_ip *ipptr;
95                int psize;
96
97                if ((psize = trace_read_packet(trace, &packet)) <= 0) {
98                        break;
99                }
100
101                ipptr = trace_get_ip(&packet);
102                tcpptr = trace_get_tcp(&packet);
103
104                if (!tcpptr)
105                        continue;
106
107                if (!tcpptr->syn)
108                        continue;
109
110                double now = trace_get_seconds(&packet);
111
112                /* search for the timestamp option */   
113                unsigned char *pkt = (unsigned char *)tcpptr + sizeof(*tcpptr);
114                //int plen = (packet.size-(pkt-(unsigned char*)packet.buffer)) <? (tcpptr->doff*4-sizeof *tcpptr);
115                int plen = (tcpptr->doff*4-sizeof *tcpptr);
116                unsigned char type = 0;
117                unsigned char optlen = 0;
118                unsigned char *data = 0;
119                bool flag = false;
120
121
122                while (get_next_option(&pkt,&plen,&type,&optlen,&data) != 0) {
123                        // ignore non timestamp options
124                        if (type!=8) {
125                                continue;
126                        }
127
128                        flag=true;
129                }
130
131                if (flag) 
132                        ip2with[ipptr->ip_src.s_addr].first++;
133                else
134                        ip2with[ipptr->ip_src.s_addr].second++;
135
136
137                if (now-last>60) {
138
139                        last=now;
140
141                        printf("\n");
142
143                        for(ip2with_t::const_iterator i=ip2with.begin();
144                                        i!=ip2with.end();
145                                        i++) {
146                                if (i->second.first + i->second.second < 100)
147                                        continue;
148                                printf("%-16s: %6lli %6lli\n",
149                                                inet_ntoa(*(struct in_addr *)&i->first),
150                                                i->second.first,
151                                                i->second.second);
152                        }
153
154                }
155
156        }
157
158        return 0;
159}
Note: See TracBrowser for help on using the repository browser.