source: libpacketdump/ip_6.c @ 2b0eae9

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivelibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 2b0eae9 was 387d299, checked in by Shane Alcock <salcock@…>, 7 years ago

Remove duplicate macros in libpacketdump

Ensure OSPF libpacketdump module won't segfault or print garbage
if a truncated OSPF header is passed into it.

Renamed 'len' field in OSPF header to 'ospf_len' to avoid
potential conflict with variables named len in libpacketdump
code.

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