source: libpacketdump/ip_6.cc @ 4e65f42

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

Fixed segmentation faults when trace_destroy is called on a trace that wasn't successfully created
libdl is now checked for and only linked against if available (BSD's don't have a libdl)
Fixed the libpacketdump .so's to use libtrace's generic protocol headers as well as trace_ether_ntoa
Added missing check for strlcpy
Added a couple of #defines to various tools that needed them under FreeBSD
Removed some needless #includes from the libpacketdump .so's

  • 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
48extern "C"
49void decode(int link_type,char *packet,int len)
50{
51        libtrace_tcp_t *tcp = (libtrace_tcp_t *)packet;
52        printf(" TCP:");
53        if (SAFE(source)) {
54                struct servent *ent=getservbyport(tcp->source,"tcp");
55                if(ent) {
56                        printf(" Source %i (%s)",htons(tcp->source),ent->s_name);
57                } else {
58                        printf(" Source %i",htons(tcp->source));
59                }
60        }
61        else {
62                printf("\n");
63                return;
64        }
65        if (SAFE(dest)) {
66                struct servent *ent=getservbyport(tcp->dest,"tcp");
67                if(ent) {
68                        printf(" Dest %i (%s)",htons(tcp->dest),ent->s_name);
69                } else {
70                        printf(" Dest %i",htons(tcp->dest));
71                }
72        }
73        else {
74                printf("\n");
75                return;
76        }
77        printf("\n TCP:");
78        DISPLAYL(seq," Seq %u");
79        printf("\n TCP:");
80        DISPLAYL(ack_seq," Ack %u");
81        if ((char*)&tcp->window-(char *)tcp>len) {
82                printf("\n");
83                return;
84        }
85        printf("\n TCP:");
86        printf(" DOFF %i",tcp->doff);
87        printf(" Flags:");
88        if (tcp->fin) printf(" FIN");
89        if (tcp->syn) printf(" SYN");
90        if (tcp->rst) printf(" RST");
91        if (tcp->psh) printf(" PSH");
92        if (tcp->ack) printf(" ACK");
93        if (tcp->urg) printf(" URG");
94        DISPLAYS(window," Window %i");
95        printf("\n TCP:");
96        DISPLAYS(check," Checksum %i");
97        DISPLAYS(urg_ptr," Urgent %i");
98        unsigned char *pkt = (unsigned char*)packet+sizeof(*tcp);
99        int plen = (len-sizeof *tcp) <? (tcp->doff*4-sizeof *tcp);
100        unsigned char type,optlen,*data;
101        while(get_next_option(&pkt,&plen,&type,&optlen,&data)) {
102                printf("\n TCP: ");
103                switch(type) {
104                        case 0:
105                                printf("End of options");
106                                break;
107                        case 1:
108                                printf("NOP");
109                                break;
110                        case 2:
111                                printf("MSS %i",htons(*(uint32_t *)(data)));
112                                break;
113                        case 3:
114                                printf("Winscale %i",data[0]);
115                                break;
116                        case 4:
117                                printf("SACK");
118                                break;
119                        case 5:
120                                printf("SACK Information");
121                                int i;
122                                i=0;
123                                while(i+8<optlen) {
124                                        printf("\n TCP:  %u-%u",
125                                                htonl(*(uint32_t*)&data[i]),
126                                                htonl(*(uint32_t*)&data[i+4]));
127                                        i+=8;
128                                }
129                                break;
130                        case 8:
131                                printf("Timestamp %u %u",
132                                                htonl(*(uint32_t *)&data[0]),
133                                                htonl(*(uint32_t *)&data[4])
134                                      );
135                                break;
136                        default:
137                                printf("Unknown option %i",type);
138                }
139        }
140        printf("\n");
141        if (htons(tcp->source) < htons(tcp->dest)) 
142                decode_next(packet+tcp->doff*4,len-tcp->doff*4,"tcp",htons(tcp->source));
143        else
144                decode_next(packet+tcp->doff*4,len-tcp->doff*4,"tcp",htons(tcp->dest));
145        return;
146}
Note: See TracBrowser for help on using the repository browser.