source: libpacketdump/ip_6.c @ 4f55f69

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

More warning fixes -- convert the length to be an unsigned number

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