1 /* DCCP */
2 #include <stdio.h>
3 #include <inttypes.h>
4 #include <dlfcn.h>
5 #include "libpacketdump.h"
6 #include <netinet/tcp.h>
7 #include <netinet/in.h>
8
9 #define STRUCT dccp
10
11 #define SAFE(x) \
12 ((unsigned int)len>=((char*)&STRUCT->x-(char*)STRUCT+sizeof(STRUCT->x)))
13 #define DISPLAY_EXP(x,fmt,exp) \
14 if (SAFE(x)) \
15 printf(fmt,exp); \
16 else \
17 return;
18
19 #define DISPLAY(x,fmt) DISPLAY_EXP(x,fmt,STRUCT->x)
20
21 #define DISPLAYS(x,fmt) DISPLAY_EXP(x,fmt,htons(STRUCT->x))
22 #define DISPLAYL(x,fmt) DISPLAY_EXP(x,fmt,htonl(STRUCT->x))
23 #define DISPLAYIP(x,fmt) DISPLAY_EXP(x,fmt,inet_ntoa(*(struct in_addr*)&STRUCT->x))
24
25 struct dccphdr {
26 uint16_t source;
27 uint16_t dest;
28 uint8_t type:4;
29 uint8_t ccval:4;
30 uint32_t seq:24;
31 uint8_t doff;
32 uint8_t ndp:4;
33 uint8_t cslen:4;
34 uint16_t check;
35 };
36
37 static char *dccp_types[]={
38 "DCCP-Request packet",
39 "DCCP-Response packet",
40 "DCCP-Data packet",
41 "DCCP-Ack packet",
42 "DCCP-DataAck packet",
43 "DCCP-CloseReq packet",
44 "DCCP-Close packet",
45 "DCCP-Reset packet",
46 "DCCP-Move packet",
47 };
48
decode(int link_type UNUSED,const char * packet,unsigned len)49 DLLEXPORT void decode(int link_type UNUSED,const char *packet,unsigned len)
50 {
51 struct dccphdr *dccp = (struct dccphdr*)packet;
52 DISPLAYS(source," DCCP: Source %i");
53 DISPLAYS(dest," Dest %i");
54 if (len>4) {
55 printf("\n DCCP: Type %i",dccp->type);
56 if (dccp->type<sizeof(dccp_types)) {
57 printf(" (%s)\n",dccp_types[dccp->type]);
58 } else {
59 printf(" (Unknown)\n");
60 }
61 printf(" DCCP: CcVal %i\n",dccp->ccval);
62 }
63 else {
64 printf("\n");
65 return;
66 }
67 if (len>7)
68 printf(" DCCP: Seq %u\n",dccp->seq); // htonwhat?
69 else
70 return;
71 DISPLAY(doff," DCCP: Dataoff: %i\n");
72 if (len>9)
73 printf(" DCCP: NDP %i CsLen: %i\n",dccp->ndp,dccp->cslen);
74 else {
75 return;
76 }
77 DISPLAY(check," DCCP: Checksum: %i\n");
78 if (htons(dccp->source) < htons(dccp->dest))
79 decode_next(packet+dccp->doff*4,len-dccp->doff*4,"dccp",htons(dccp->source));
80 else
81 decode_next(packet+dccp->doff*4,len-dccp->doff*4,"dccp",htons(dccp->dest));
82 return;
83 }
84