source: libpacketdump/ip_6.c @ d1cb537

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since d1cb537 was 9ca0b29, checked in by Shane Alcock <salcock@…>, 10 years ago
  • Add support for ECN bits in the TCP header - note that this does change the makeup of the libtrace_tcp_t struct which will be a problem for people referencing the reserved bits or trying to work out ECN manually. Long term, I think the benefits outweigh the slight discomfort that might be caused by this change.
  • Property mode set to 100644
File size: 3.0 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
22DLLEXPORT void decode(int link_type UNUSED,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->ecn_ns) printf(" ECN_NS");
65        if (tcp->cwr) printf(" CWR");
66        if (tcp->ece) printf(" ECE");
67        if (tcp->fin) printf(" FIN");
68        if (tcp->syn) printf(" SYN");
69        if (tcp->rst) printf(" RST");
70        if (tcp->psh) printf(" PSH");
71        if (tcp->ack) printf(" ACK");
72        if (tcp->urg) printf(" URG");
73        DISPLAYS(window," Window %i");
74        printf("\n TCP:");
75        DISPLAYS(check," Checksum %i");
76        DISPLAYS(urg_ptr," Urgent %i");
77        pkt = (unsigned char*)packet+sizeof(*tcp);
78        plen = (len-sizeof *tcp) < (tcp->doff*4-sizeof(*tcp))?(len-sizeof(*tcp)):(tcp->doff*4-sizeof *tcp);
79        while(trace_get_next_option(&pkt,&plen,&type,&optlen,&data)) {
80                printf("\n TCP: ");
81                switch(type) {
82                        case 0:
83                                printf("End of options");
84                                break;
85                        case 1:
86                                printf("NOP");
87                                break;
88                        case 2:
89                                printf("MSS %i",htons(*(uint32_t *)(data)));
90                                break;
91                        case 3:
92                                printf("Winscale %i",data[0]);
93                                break;
94                        case 4:
95                                printf("SACK");
96                                break;
97                        case 5:
98                                printf("SACK Information");
99                                i=0;
100                                while(i+8<optlen) {
101                                        printf("\n TCP:  %u-%u",
102                                                htonl(*(uint32_t*)&data[i]),
103                                                htonl(*(uint32_t*)&data[i+4]));
104                                        i+=8;
105                                }
106                                break;
107                        case 8:
108                                printf("Timestamp %u %u",
109                                                htonl(*(uint32_t *)&data[0]),
110                                                htonl(*(uint32_t *)&data[4])
111                                      );
112                                break;
113                        default:
114                                printf("Unknown option %i",type);
115                }
116        }
117        printf("\n");
118        if (htons(tcp->source) < htons(tcp->dest)) 
119                decode_next(packet+tcp->doff*4,len-tcp->doff*4,"tcp",htons(tcp->source));
120        else
121                decode_next(packet+tcp->doff*4,len-tcp->doff*4,"tcp",htons(tcp->dest));
122        return;
123}
Note: See TracBrowser for help on using the repository browser.