source: examples/tracedump/ip_6.cc @ b4cb91f

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since b4cb91f was b4cb91f, checked in by Shane Alcock <salcock@…>, 15 years ago

Changed makefile to allow overriding of the PREFIX that libtrace was
installed into
Ignore the errors with tcp options, it seems to be a buggy stack(?!)

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