source: examples/tracedump/ip_33.cc @ d907ff5

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

Import tracedump to libtrace

  • Property mode set to 100644
File size: 2.3 KB
Line 
1/* DCCP */
2#include <stdio.h>
3#include <stdint.h>
4#include <dlfcn.h>
5#include <map>
6#include "tracedump.h"
7#include <netinet/tcp.h>
8#include <netinet/in.h>
9
10#define STRUCT dccp
11
12#define SAFE(x) \
13        ((unsigned int)len>=((char*)&STRUCT->x-(char*)STRUCT+sizeof(STRUCT->x)))
14#define DISPLAY_EXP(x,fmt,exp) \
15        if (SAFE(x)) \
16                printf(fmt,exp); \
17        else \
18                return;
19
20#define DISPLAY(x,fmt) DISPLAY_EXP(x,fmt,STRUCT->x)
21
22#define DISPLAYS(x,fmt) DISPLAY_EXP(x,fmt,htons(STRUCT->x))
23#define DISPLAYL(x,fmt) DISPLAY_EXP(x,fmt,htonl(STRUCT->x))
24#define DISPLAYIP(x,fmt) DISPLAY_EXP(x,fmt,inet_ntoa(*(struct in_addr*)&STRUCT->x))
25
26struct dccphdr {
27        uint16_t source;
28        uint16_t dest;
29        uint8_t type:4;
30        uint8_t ccval:4;
31        uint32_t seq:24;
32        uint8_t doff;
33        uint8_t ndp:4;
34        uint8_t cslen:4;
35        uint16_t check;
36};
37
38static char *dccp_types[]={
39        "DCCP-Request packet",
40        "DCCP-Response packet",
41        "DCCP-Data packet",
42        "DCCP-Ack packet",
43        "DCCP-DataAck packet",
44        "DCCP-CloseReq packet",
45        "DCCP-Close packet",
46        "DCCP-Reset packet",
47        "DCCP-Move packet",
48        };
49
50int get_next_option(unsigned char **ptr,int *len,
51                        unsigned char *type,
52                        unsigned char *optlen,
53                        unsigned char **data)
54{
55        if (*len<=0)
56                return 0;
57        *type=**ptr;
58        switch(*type) {
59                case 0:
60                        return 0;
61                case 1:
62                        (*ptr)++;
63                        (*len)--;
64                        return 1;
65                default:
66                        *optlen = *(*ptr+1);
67                        (*len)-=*optlen;
68                        (*data)=(*ptr+2);
69                        (*ptr)+=*optlen;
70                        if (*len<0)
71                                return 0;
72                        return 1;
73        }
74}
75
76extern "C"
77void decode(int link_type,char *packet,int len)
78{
79        struct dccphdr *dccp = (struct dccphdr*)packet;
80        DISPLAYS(source," DCCP: Source %i");
81        DISPLAYS(dest," Dest %i");
82        if (len>4) {
83                printf("\n DCCP: Type %i",dccp->type);
84                if (dccp->type<sizeof(dccp_types)) {
85                        printf(" (%s)\n",dccp_types[dccp->type]);
86                } else {
87                        printf(" (Unknown)\n");
88                }
89                printf(" DCCP: CcVal %i\n",dccp->ccval);
90        }
91        else  {
92                printf("\n"); 
93                return;
94        }
95        if (len>7)
96                printf(" DCCP: Seq %u\n",dccp->seq); // htonwhat?
97        else
98                return;
99        DISPLAY(doff," DCCP: Dataoff: %i\n");
100        if (len>9)
101                printf(" DCCP: NDP %i CsLen: %i\n",dccp->ndp,dccp->cslen);
102        else {
103                return;
104        }
105        DISPLAY(check," DCCP: Checksum: %i\n");
106        if (htons(dccp->source) < htons(dccp->dest)) 
107                decode_next(packet+dccp->doff*4,len-dccp->doff*4,"dccp",htons(dccp->source));
108        else
109                decode_next(packet+dccp->doff*4,len-dccp->doff*4,"dccp",htons(dccp->dest));
110        return;
111}
Note: See TracBrowser for help on using the repository browser.