source: examples/tracedump/ip_6.cc @ 5d6ebe1

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

Added asn1 parsing
Started fixing bug with tcp option parsing

  • Property mode set to 100644
File size: 2.9 KB
Line 
1#include <stdio.h>
2#include <stdint.h>
3#include <dlfcn.h>
4#include <map>
5#include "tracedump.h"
6#include <netinet/tcp.h>
7#include <netinet/in.h>
8#include <assert.h>
9
10#define SAFE(x) \
11        ((unsigned int)len>=((char*)&tcp->x-(char*)tcp+sizeof(tcp->x)))
12#define DISPLAY_EXP(x,fmt,exp) \
13        if (SAFE(x)) \
14                printf(fmt,exp); \
15        else \
16                return;
17
18#define DISPLAY(x,fmt) DISPLAY_EXP(x,fmt,tcp->x)
19
20#define DISPLAYS(x,fmt) DISPLAY_EXP(x,fmt,htons(tcp->x))
21#define DISPLAYL(x,fmt) DISPLAY_EXP(x,fmt,htonl(tcp->x))
22#define DISPLAYIP(x,fmt) DISPLAY_EXP(x,fmt,inet_ntoa(*(struct in_addr*)&tcp->x))
23
24int get_next_option(unsigned char **ptr,int *len,
25                        unsigned char *type,
26                        unsigned char *optlen,
27                        unsigned char **data)
28{
29        if (*len<=0)
30                return 0;
31        *type=**ptr;
32        switch(*type) {
33                case 0:
34                        printf(" DEBUG: End of options\n");
35                        return 0;
36                case 1:
37                        printf(" DEBUG: NOP\n");
38                        (*ptr)++;
39                        (*len)--;
40                        return 1;
41                default:
42                        printf(" DEBUG: Type %i len %i\n",
43                                        *type,*(*ptr+1));
44                        *optlen = *(*ptr+1);
45                        assert(*optlen>0);
46                        (*len)-=*optlen;
47                        (*data)=(*ptr+2);
48                        (*ptr)+=*optlen;
49                        if (*len<0)
50                                return 0;
51                        return 1;
52        }
53}
54
55extern "C"
56void decode(int link_type,char *packet,int len)
57{
58        struct tcphdr *tcp = (struct tcphdr*)packet;
59        printf(" TCP:");
60        DISPLAYS(source," Source %i")
61        DISPLAYS(dest," Dest %i")
62        printf("\n TCP:");
63        DISPLAYL(seq," Seq %u");
64        printf("\n TCP:");
65        DISPLAYL(ack_seq," Ack %u");
66        if ((char*)&tcp->window-(char *)tcp>len) {
67                printf("\n");
68                return;
69        }
70        printf("\n TCP:");
71        printf(" DOFF %i",tcp->doff);
72        printf(" Flags:");
73        if (tcp->fin) printf(" FIN");
74        if (tcp->syn) printf(" SYN");
75        if (tcp->rst) printf(" RST");
76        if (tcp->psh) printf(" PSH");
77        if (tcp->ack) printf(" ACK");
78        if (tcp->urg) printf(" URG");
79        DISPLAYS(window," Window %i");
80        printf("\n TCP:");
81        DISPLAYS(check," Checksum %i");
82        DISPLAYS(urg_ptr," Urgent %i");
83        unsigned char *pkt = (unsigned char*)packet+sizeof(*tcp);
84        int plen = (len-sizeof *tcp) <? (tcp->doff*4);
85        unsigned char type,optlen,*data;
86        while(get_next_option(&pkt,&plen,&type,&optlen,&data)) {
87                printf("\n TCP: ");
88                switch(type) {
89                        case 0:
90                                printf("End of options");
91                                break;
92                        case 1:
93                                printf("NOP");
94                                break;
95                        case 2:
96                                printf("MSS %i",htonl(*(uint32_t *)(data)));
97                                break;
98                        case 3:
99                                printf("Winscale %i",data[0]);
100                                break;
101                        case 4:
102                                printf("SACK");
103                                break;
104                        case 5:
105                                printf("SACK Information");
106                                int i;
107                                i=0;
108                                while(i+8<optlen) {
109                                        printf("\n TCP:  %u-%u",
110                                                htonl(*(uint32_t*)&data[i]),
111                                                htonl(*(uint32_t*)&data[i+4]));
112                                        i+=8;
113                                }
114                                break;
115                        case 8:
116                                printf("Timestamp %u %u",
117                                                htonl(*(uint32_t *)&data[0]),
118                                                htonl(*(uint32_t *)&data[4])
119                                      );
120                                break;
121                        default:
122                                printf("Unknown option %i",type);
123                }
124        }
125        printf("\n");
126        if (htons(tcp->source) < htons(tcp->dest)) 
127                decode_next(packet+tcp->doff*4,len-tcp->doff*4,"tcp",htons(tcp->source));
128        else
129                decode_next(packet+tcp->doff*4,len-tcp->doff*4,"tcp",htons(tcp->dest));
130        return;
131}
Note: See TracBrowser for help on using the repository browser.