blob: 226dda8eeeec84f2d11c4448f7e609301e1b9440 [file] [log] [blame]
adamdunkelsbb2c3ff2004-09-17 20:43:39 +00001
adamdunkels79a8e6f2004-09-19 15:27:03 +00002#include "cc.h"
adamdunkelsbb2c3ff2004-09-17 20:43:39 +00003#include "uip.h"
4
adamdunkels79a8e6f2004-09-19 15:27:03 +00005#include <string.h>
adamdunkelsbb2c3ff2004-09-17 20:43:39 +00006#include <stdio.h>
7
8 struct ip_hdr {
9 /* IP header. */
10 u8_t vhl,
11 tos,
12 len[2],
13 ipid[2],
14 ipoffset[2],
15 ttl,
16 proto;
17 u16_t ipchksum;
18 u8_t srcipaddr[4],
19 destipaddr[4];
20 };
21
22#define TCP_FIN 0x01
23#define TCP_SYN 0x02
24#define TCP_RST 0x04
25#define TCP_PSH 0x08
26#define TCP_ACK 0x10
27#define TCP_URG 0x20
28#define TCP_CTL 0x3f
29
30struct tcpip_hdr {
31 /* IP header. */
32 u8_t vhl,
33 tos,
34 len[2],
35 ipid[2],
36 ipoffset[2],
37 ttl,
38 proto;
39 u16_t ipchksum;
40 u8_t srcipaddr[4],
41 destipaddr[4];
42 /* TCP header. */
43 u16_t srcport,
44 destport;
45 u8_t seqno[4],
46 ackno[4],
47 tcpoffset,
48 flags,
49 wnd[2];
50 u16_t tcpchksum;
51 u8_t urgp[2];
52 u8_t optdata[4];
53};
54
55#define ICMP_ECHO_REPLY 0
56#define ICMP_ECHO 8
57
58struct icmpip_hdr {
59 /* IP header. */
60 u8_t vhl,
61 tos,
62 len[2],
63 ipid[2],
64 ipoffset[2],
65 ttl,
66 proto;
67 u16_t ipchksum;
68 u8_t srcipaddr[4],
69 destipaddr[4];
70 /* The ICMP and IP headers. */
71 /* ICMP (echo) header. */
72 u8_t type, icode;
73 u16_t icmpchksum;
74 u16_t id, seqno;
75};
76
77
78/* The UDP and IP headers. */
79struct udpip_hdr {
80 /* IP header. */
81 u8_t vhl,
82 tos,
83 len[2],
84 ipid[2],
85 ipoffset[2],
86 ttl,
87 proto;
88 u16_t ipchksum;
89 u8_t srcipaddr[4],
90 destipaddr[4];
91
92 /* UDP header. */
93 u16_t srcport,
94 destport;
95 u16_t udplen;
96 u16_t udpchksum;
97};
98
99#define ETHBUF ((struct eth_hdr *)&uip_buf[0])
100#define IPBUF ((struct ip_hdr *)&uip_buf[UIP_LLH_LEN])
101#define UDPBUF ((struct udpip_hdr *)&uip_buf[UIP_LLH_LEN])
102#define ICMPBUF ((struct icmpip_hdr *)&uip_buf[UIP_LLH_LEN])
103#define TCPBUF ((struct tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
104
105
106/*---------------------------------------------------------------------------*/
107static void
108tcpflags(unsigned char flags, char *flagsstr)
109{
110 if(flags & TCP_FIN) {
111 *flagsstr++ = 'F';
112 }
113 if(flags & TCP_SYN) {
114 *flagsstr++ = 'S';
115 }
116 if(flags & TCP_RST) {
117 *flagsstr++ = 'R';
118 }
119 if(flags & TCP_ACK) {
120 *flagsstr++ = 'A';
121 }
122 if(flags & TCP_URG) {
123 *flagsstr++ = 'U';
124 }
125
126 *flagsstr = 0;
127}
128/*---------------------------------------------------------------------------*/
adamdunkels79a8e6f2004-09-19 15:27:03 +0000129static char * CC_FASTCALL
130n(u16_t num, char *ptr)
131{
132 u16_t d;
133 u8_t a, f;
134
135 if(num == 0) {
136 *ptr = '0';
137 return ptr + 1;
138 } else {
139 f = 0;
140 for(d = 10000; d >= 1; d /= 10) {
141 a = (num / d) % 10;
142 if(f == 1 || a > 0) {
143 *ptr = a + '0';
144 ++ptr;
145 f = 1;
146 }
147 }
148 }
149 return ptr;
150}
151/*---------------------------------------------------------------------------*/
152static char * CC_FASTCALL
153d(char *ptr)
154{
155 *ptr = '.';
156 return ptr + 1;
157}
158/*---------------------------------------------------------------------------*/
159static char * CC_FASTCALL
160s(char *str, char *ptr)
161{
162 strcpy(ptr, str);
163 return ptr + strlen(str);
164}
165/*---------------------------------------------------------------------------*/
adamdunkelsbb2c3ff2004-09-17 20:43:39 +0000166int
167tcpdump_print(char *buf, u16_t buflen)
168{
169 char flags[8];
170 if(IPBUF->proto == UIP_PROTO_ICMP) {
171 if(ICMPBUF->type == ICMP_ECHO) {
adamdunkels79a8e6f2004-09-19 15:27:03 +0000172 return s(" ping",
173 n(IPBUF->destipaddr[3], d(
174 n(IPBUF->destipaddr[2], d(
175 n(IPBUF->destipaddr[1], d(
176 n(IPBUF->destipaddr[0],
177 s(" ",
178 n(IPBUF->srcipaddr[3], d(
179 n(IPBUF->srcipaddr[2], d(
180 n(IPBUF->srcipaddr[1], d(
181 n(IPBUF->srcipaddr[0],
182 buf)))))))))))))))) - buf;
183
184 /* return sprintf(buf, "%d.%d.%d.%d %d.%d.%d.%d ping",
adamdunkelsbb2c3ff2004-09-17 20:43:39 +0000185 IPBUF->srcipaddr[0], IPBUF->srcipaddr[1],
186 IPBUF->srcipaddr[2], IPBUF->srcipaddr[3],
187 IPBUF->destipaddr[0], IPBUF->destipaddr[1],
adamdunkels79a8e6f2004-09-19 15:27:03 +0000188 IPBUF->destipaddr[2], IPBUF->destipaddr[3]);*/
adamdunkelsbb2c3ff2004-09-17 20:43:39 +0000189 } else if(ICMPBUF->type == ICMP_ECHO_REPLY) {
adamdunkels79a8e6f2004-09-19 15:27:03 +0000190 return s(" pong",
191 n(IPBUF->destipaddr[3], d(
192 n(IPBUF->destipaddr[2], d(
193 n(IPBUF->destipaddr[1], d(
194 n(IPBUF->destipaddr[0],
195 s(" ",
196 n(IPBUF->srcipaddr[3], d(
197 n(IPBUF->srcipaddr[2], d(
198 n(IPBUF->srcipaddr[1], d(
199 n(IPBUF->srcipaddr[0],
200 buf)))))))))))))))) - buf;
201 /* return sprintf(buf, "%d.%d.%d.%d %d.%d.%d.%d pong",
adamdunkelsbb2c3ff2004-09-17 20:43:39 +0000202 IPBUF->srcipaddr[0], IPBUF->srcipaddr[1],
203 IPBUF->srcipaddr[2], IPBUF->srcipaddr[3],
204 IPBUF->destipaddr[0], IPBUF->destipaddr[1],
adamdunkels79a8e6f2004-09-19 15:27:03 +0000205 IPBUF->destipaddr[2], IPBUF->destipaddr[3]);*/
adamdunkelsbb2c3ff2004-09-17 20:43:39 +0000206 }
207 } else if(IPBUF->proto == UIP_PROTO_UDP) {
adamdunkels79a8e6f2004-09-19 15:27:03 +0000208 return s(" UDP",
209 n(htons(UDPBUF->destport), d(
210 n(IPBUF->destipaddr[3], d(
211 n(IPBUF->destipaddr[2], d(
212 n(IPBUF->destipaddr[1], d(
213 n(IPBUF->destipaddr[0],
214 s(" ",
215 n(htons(UDPBUF->srcport), d(
216 n(IPBUF->srcipaddr[3], d(
217 n(IPBUF->srcipaddr[2], d(
218 n(IPBUF->srcipaddr[1], d(
219 n(IPBUF->srcipaddr[0],
220 buf)))))))))))))))))))) - buf;
221 /* return sprintf(buf, "%d.%d.%d.%d.%d %d.%d.%d.%d.%d UDP",
adamdunkelsbb2c3ff2004-09-17 20:43:39 +0000222 IPBUF->srcipaddr[0], IPBUF->srcipaddr[1],
223 IPBUF->srcipaddr[2], IPBUF->srcipaddr[3],
224 htons(UDPBUF->srcport),
225 IPBUF->destipaddr[0], IPBUF->destipaddr[1],
226 IPBUF->destipaddr[2], IPBUF->destipaddr[3],
adamdunkels79a8e6f2004-09-19 15:27:03 +0000227 htons(UDPBUF->destport));*/
adamdunkelsbb2c3ff2004-09-17 20:43:39 +0000228 } else if(IPBUF->proto == UIP_PROTO_TCP) {
229 tcpflags(TCPBUF->flags, flags);
adamdunkels79a8e6f2004-09-19 15:27:03 +0000230 return s(flags,
231 s(" ",
232 n(htons(TCPBUF->destport), d(
233 n(IPBUF->destipaddr[3], d(
234 n(IPBUF->destipaddr[2], d(
235 n(IPBUF->destipaddr[1], d(
236 n(IPBUF->destipaddr[0],
237 s(" ",
238 n(htons(TCPBUF->srcport), d(
239 n(IPBUF->srcipaddr[3], d(
240 n(IPBUF->srcipaddr[2], d(
241 n(IPBUF->srcipaddr[1], d(
242 n(IPBUF->srcipaddr[0],
243 buf))))))))))))))))))))) - buf;
244 /* return sprintf(buf, "%d.%d.%d.%d.%d %d.%d.%d.%d.%d %s",
adamdunkelsbb2c3ff2004-09-17 20:43:39 +0000245 IPBUF->srcipaddr[0], IPBUF->srcipaddr[1],
246 IPBUF->srcipaddr[2], IPBUF->srcipaddr[3],
247 htons(TCPBUF->srcport),
248 IPBUF->destipaddr[0], IPBUF->destipaddr[1],
249 IPBUF->destipaddr[2], IPBUF->destipaddr[3],
250 htons(TCPBUF->destport),
adamdunkels79a8e6f2004-09-19 15:27:03 +0000251 flags); */
adamdunkelsbb2c3ff2004-09-17 20:43:39 +0000252 }
253}
254/*---------------------------------------------------------------------------*/