source: libpacketdump/ip_6.c @ 11a7f9c

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

Constification

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