source: libpacketdump/ip_6.c @ fab1d42

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

New automake infrastructure
Moved a lot of C++ libpacketdump parsers to C (they weren't using any C++ features and it makes automake happier)

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