source: examples/tracedump/ip_6.cc @ d907ff5

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

Import tracedump to libtrace

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