00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "contiki-net.h"
00035
00036 #include <string.h>
00037 #include <stdio.h>
00038
00039 struct ip_hdr {
00040
00041 u8_t vhl,
00042 tos,
00043 len[2],
00044 ipid[2],
00045 ipoffset[2],
00046 ttl,
00047 proto;
00048 u16_t ipchksum;
00049 u8_t srcipaddr[4],
00050 destipaddr[4];
00051 };
00052
00053 #define TCP_FIN 0x01
00054 #define TCP_SYN 0x02
00055 #define TCP_RST 0x04
00056 #define TCP_PSH 0x08
00057 #define TCP_ACK 0x10
00058 #define TCP_URG 0x20
00059 #define TCP_CTL 0x3f
00060
00061 struct tcpip_hdr {
00062
00063 u8_t vhl,
00064 tos,
00065 len[2],
00066 ipid[2],
00067 ipoffset[2],
00068 ttl,
00069 proto;
00070 u16_t ipchksum;
00071 u8_t srcipaddr[4],
00072 destipaddr[4];
00073
00074 u16_t srcport,
00075 destport;
00076 u8_t seqno[4],
00077 ackno[4],
00078 tcpoffset,
00079 flags,
00080 wnd[2];
00081 u16_t tcpchksum;
00082 u8_t urgp[2];
00083 u8_t optdata[4];
00084 };
00085
00086 #define ICMP_ECHO_REPLY 0
00087 #define ICMP_ECHO 8
00088
00089 struct icmpip_hdr {
00090
00091 u8_t vhl,
00092 tos,
00093 len[2],
00094 ipid[2],
00095 ipoffset[2],
00096 ttl,
00097 proto;
00098 u16_t ipchksum;
00099 u8_t srcipaddr[4],
00100 destipaddr[4];
00101
00102
00103 u8_t type, icode;
00104 u16_t icmpchksum;
00105 u16_t id, seqno;
00106 };
00107
00108
00109
00110 struct udpip_hdr {
00111
00112 u8_t vhl,
00113 tos,
00114 len[2],
00115 ipid[2],
00116 ipoffset[2],
00117 ttl,
00118 proto;
00119 u16_t ipchksum;
00120 u8_t srcipaddr[4],
00121 destipaddr[4];
00122
00123
00124 u16_t srcport,
00125 destport;
00126 u16_t udplen;
00127 u16_t udpchksum;
00128 };
00129
00130 #define ETHBUF ((struct eth_hdr *)&packet[0])
00131 #define IPBUF ((struct ip_hdr *)&packet[0])
00132 #define UDPBUF ((struct udpip_hdr *)&packet[0])
00133 #define ICMPBUF ((struct icmpip_hdr *)&packet[0])
00134 #define TCPBUF ((struct tcpip_hdr *)&packet[0])
00135
00136
00137
00138 static void
00139 tcpflags(unsigned char flags, char *flagsstr)
00140 {
00141 if(flags & TCP_FIN) {
00142 *flagsstr++ = 'F';
00143 }
00144 if(flags & TCP_SYN) {
00145 *flagsstr++ = 'S';
00146 }
00147 if(flags & TCP_RST) {
00148 *flagsstr++ = 'R';
00149 }
00150 if(flags & TCP_ACK) {
00151 *flagsstr++ = 'A';
00152 }
00153 if(flags & TCP_URG) {
00154 *flagsstr++ = 'U';
00155 }
00156
00157 *flagsstr = 0;
00158 }
00159
00160 static char * CC_FASTCALL
00161 n(u16_t num, char *ptr)
00162 {
00163 u16_t d;
00164 u8_t a, f;
00165
00166 if(num == 0) {
00167 *ptr = '0';
00168 return ptr + 1;
00169 } else {
00170 f = 0;
00171 for(d = 10000; d >= 1; d /= 10) {
00172 a = (num / d) % 10;
00173 if(f == 1 || a > 0) {
00174 *ptr = a + '0';
00175 ++ptr;
00176 f = 1;
00177 }
00178 }
00179 }
00180 return ptr;
00181 }
00182
00183 static char * CC_FASTCALL
00184 d(char *ptr)
00185 {
00186 *ptr = '.';
00187 return ptr + 1;
00188 }
00189
00190 static char * CC_FASTCALL
00191 s(char *str, char *ptr)
00192 {
00193 strcpy(ptr, str);
00194 return ptr + strlen(str);
00195 }
00196
00197 int
00198 tcpdump_format(u8_t *packet, u16_t packetlen,
00199 char *buf, u16_t buflen)
00200 {
00201 char flags[8];
00202 if(IPBUF->proto == UIP_PROTO_ICMP) {
00203 if(ICMPBUF->type == ICMP_ECHO) {
00204 return s(" ping",
00205 n(IPBUF->destipaddr[3], d(
00206 n(IPBUF->destipaddr[2], d(
00207 n(IPBUF->destipaddr[1], d(
00208 n(IPBUF->destipaddr[0],
00209 s(" ",
00210 n(IPBUF->srcipaddr[3], d(
00211 n(IPBUF->srcipaddr[2], d(
00212 n(IPBUF->srcipaddr[1], d(
00213 n(IPBUF->srcipaddr[0],
00214 buf)))))))))))))))) - buf;
00215
00216
00217
00218
00219
00220
00221 } else if(ICMPBUF->type == ICMP_ECHO_REPLY) {
00222 return s(" pong",
00223 n(IPBUF->destipaddr[3], d(
00224 n(IPBUF->destipaddr[2], d(
00225 n(IPBUF->destipaddr[1], d(
00226 n(IPBUF->destipaddr[0],
00227 s(" ",
00228 n(IPBUF->srcipaddr[3], d(
00229 n(IPBUF->srcipaddr[2], d(
00230 n(IPBUF->srcipaddr[1], d(
00231 n(IPBUF->srcipaddr[0],
00232 buf)))))))))))))))) - buf;
00233
00234
00235
00236
00237
00238 }
00239 } else if(IPBUF->proto == UIP_PROTO_UDP) {
00240 return s(" UDP",
00241 n(uip_htons(UDPBUF->destport), d(
00242 n(IPBUF->destipaddr[3], d(
00243 n(IPBUF->destipaddr[2], d(
00244 n(IPBUF->destipaddr[1], d(
00245 n(IPBUF->destipaddr[0],
00246 s(" ",
00247 n(uip_htons(UDPBUF->srcport), d(
00248 n(IPBUF->srcipaddr[3], d(
00249 n(IPBUF->srcipaddr[2], d(
00250 n(IPBUF->srcipaddr[1], d(
00251 n(IPBUF->srcipaddr[0],
00252 buf)))))))))))))))))))) - buf;
00253
00254
00255
00256
00257
00258
00259
00260 } else if(IPBUF->proto == UIP_PROTO_TCP) {
00261 tcpflags(TCPBUF->flags, flags);
00262 return s(flags,
00263 s(" ",
00264 n(uip_htons(TCPBUF->destport), d(
00265 n(IPBUF->destipaddr[3], d(
00266 n(IPBUF->destipaddr[2], d(
00267 n(IPBUF->destipaddr[1], d(
00268 n(IPBUF->destipaddr[0],
00269 s(" ",
00270 n(uip_htons(TCPBUF->srcport), d(
00271 n(IPBUF->srcipaddr[3], d(
00272 n(IPBUF->srcipaddr[2], d(
00273 n(IPBUF->srcipaddr[1], d(
00274 n(IPBUF->srcipaddr[0],
00275 buf))))))))))))))))))))) - buf;
00276
00277
00278
00279
00280
00281
00282
00283
00284 } else {
00285 strcpy(buf, "Unrecognized protocol");
00286 }
00287
00288 return 0;
00289 }
00290