Functions for converting IP packets into textual repressentations
diff --git a/contiki/uip/tcpdump.c b/contiki/uip/tcpdump.c
new file mode 100644
index 0000000..aa94f90
--- /dev/null
+++ b/contiki/uip/tcpdump.c
@@ -0,0 +1,165 @@
+
+#include "uip.h"
+
+#include <stdio.h>
+
+ struct ip_hdr {
+  /* IP header. */
+   u8_t vhl,
+    tos,          
+     len[2],       
+     ipid[2],        
+     ipoffset[2],  
+     ttl,          
+     proto;     
+   u16_t ipchksum;
+   u8_t srcipaddr[4], 
+     destipaddr[4];
+ };
+
+#define TCP_FIN 0x01
+#define TCP_SYN 0x02
+#define TCP_RST 0x04
+#define TCP_PSH 0x08
+#define TCP_ACK 0x10
+#define TCP_URG 0x20
+#define TCP_CTL 0x3f
+
+struct tcpip_hdr {
+  /* IP header. */
+   u8_t vhl,
+    tos,          
+     len[2],       
+     ipid[2],        
+     ipoffset[2],  
+     ttl,          
+     proto;     
+   u16_t ipchksum;
+   u8_t srcipaddr[4], 
+     destipaddr[4];
+  /* TCP header. */
+  u16_t srcport,
+    destport;
+  u8_t seqno[4],  
+    ackno[4],
+    tcpoffset,
+    flags,
+    wnd[2];     
+  u16_t tcpchksum;
+  u8_t urgp[2];
+  u8_t optdata[4];
+};
+
+#define ICMP_ECHO_REPLY 0
+#define ICMP_ECHO       8     
+
+struct icmpip_hdr {
+  /* IP header. */
+   u8_t vhl,
+    tos,          
+     len[2],       
+     ipid[2],        
+     ipoffset[2],  
+     ttl,          
+     proto;     
+  u16_t ipchksum;
+  u8_t srcipaddr[4], 
+    destipaddr[4];
+  /* The ICMP and IP headers. */
+  /* ICMP (echo) header. */
+  u8_t type, icode;
+  u16_t icmpchksum;
+  u16_t id, seqno;  
+};
+
+
+/* The UDP and IP headers. */
+struct udpip_hdr {
+  /* IP header. */
+   u8_t vhl,
+    tos,          
+     len[2],       
+     ipid[2],        
+     ipoffset[2],  
+     ttl,          
+     proto;     
+   u16_t ipchksum;
+  u8_t srcipaddr[4], 
+    destipaddr[4];
+  
+  /* UDP header. */
+  u16_t srcport,
+    destport;
+  u16_t udplen;
+  u16_t udpchksum;
+};
+
+#define ETHBUF    ((struct eth_hdr *)&uip_buf[0])
+#define IPBUF     ((struct ip_hdr *)&uip_buf[UIP_LLH_LEN])
+#define UDPBUF  ((struct udpip_hdr *)&uip_buf[UIP_LLH_LEN])
+#define ICMPBUF ((struct icmpip_hdr *)&uip_buf[UIP_LLH_LEN])
+#define TCPBUF  ((struct tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
+
+
+/*---------------------------------------------------------------------------*/
+static void
+tcpflags(unsigned char flags, char *flagsstr)
+{
+  if(flags & TCP_FIN) {
+    *flagsstr++ = 'F';
+  }
+  if(flags & TCP_SYN) {
+    *flagsstr++ = 'S';
+  }
+  if(flags & TCP_RST) {
+    *flagsstr++ = 'R';
+  }
+  if(flags & TCP_ACK) {
+    *flagsstr++ = 'A';
+  }
+  if(flags & TCP_URG) {
+    *flagsstr++ = 'U';
+  }
+
+  *flagsstr = 0;
+}
+/*---------------------------------------------------------------------------*/
+int
+tcpdump_print(char *buf, u16_t buflen)
+{
+  char flags[8];
+  if(IPBUF->proto == UIP_PROTO_ICMP) {
+    if(ICMPBUF->type == ICMP_ECHO) {
+      return sprintf(buf, "%d.%d.%d.%d %d.%d.%d.%d ping",
+		     IPBUF->srcipaddr[0], IPBUF->srcipaddr[1],
+		     IPBUF->srcipaddr[2], IPBUF->srcipaddr[3],
+		     IPBUF->destipaddr[0], IPBUF->destipaddr[1],
+		     IPBUF->destipaddr[2], IPBUF->destipaddr[3]);
+    } else if(ICMPBUF->type == ICMP_ECHO_REPLY) {
+      return sprintf(buf, "%d.%d.%d.%d %d.%d.%d.%d pong",
+		     IPBUF->srcipaddr[0], IPBUF->srcipaddr[1],
+		     IPBUF->srcipaddr[2], IPBUF->srcipaddr[3],
+		     IPBUF->destipaddr[0], IPBUF->destipaddr[1],
+		     IPBUF->destipaddr[2], IPBUF->destipaddr[3]);
+    }
+  } else if(IPBUF->proto == UIP_PROTO_UDP) {
+    return sprintf(buf, "%d.%d.%d.%d.%d %d.%d.%d.%d.%d UDP",
+		   IPBUF->srcipaddr[0], IPBUF->srcipaddr[1],
+		   IPBUF->srcipaddr[2], IPBUF->srcipaddr[3],
+		   htons(UDPBUF->srcport),
+		   IPBUF->destipaddr[0], IPBUF->destipaddr[1],
+		   IPBUF->destipaddr[2], IPBUF->destipaddr[3],
+		   htons(UDPBUF->destport));
+  } else if(IPBUF->proto == UIP_PROTO_TCP) {
+    tcpflags(TCPBUF->flags, flags);
+    return sprintf(buf, "%d.%d.%d.%d.%d %d.%d.%d.%d.%d %s",
+		   IPBUF->srcipaddr[0], IPBUF->srcipaddr[1],
+		   IPBUF->srcipaddr[2], IPBUF->srcipaddr[3],
+		   htons(TCPBUF->srcport),
+		   IPBUF->destipaddr[0], IPBUF->destipaddr[1],
+		   IPBUF->destipaddr[2], IPBUF->destipaddr[3],
+		   htons(TCPBUF->destport),
+		   flags);  
+  }
+}
+/*---------------------------------------------------------------------------*/