Added a communication layer based on raw sockets to the Win32 port.

Note:

- The raw socket layer doesn't support ARP ! Therefor it's not for general use but a means to run, test and debug the uIP code on Win32.

- DNS is totally untested and supposed to be not working.
diff --git a/contiki-win32/conf/uip-conf.h b/contiki-win32/conf/uip-conf.h
index 9b78cbb..eb09d44 100644
--- a/contiki-win32/conf/uip-conf.h
+++ b/contiki-win32/conf/uip-conf.h
@@ -29,7 +29,7 @@
  *
  * This file is part of the Contiki Destop OS
  *
- * $Id: uip-conf.h,v 1.1 2004/07/15 00:35:49 oliverschmidt Exp $
+ * $Id: uip-conf.h,v 1.2 2004/07/31 14:50:16 oliverschmidt Exp $
  *
  */
 #ifndef __UIP_CONF_H__
@@ -37,7 +37,10 @@
 #define UIP_CONF_MAX_CONNECTIONS 40
 #define UIP_CONF_MAX_LISTENPORTS 40
 #define UIP_CONF_BUFFER_SIZE     800
+#define UIP_CONF_LLH_LEN         0
 
 #define UIP_CONF_BYTE_ORDER      LITTLE_ENDIAN
 
+#define UIP_CONF_LOGGING         1
+
 #endif /* __UIP_CONF_H__ */
diff --git a/contiki-win32/main.c b/contiki-win32/main.c
index dd3936b..c81bfba 100644
--- a/contiki-win32/main.c
+++ b/contiki-win32/main.c
@@ -32,10 +32,12 @@
  *
  * This file is part of the Contiki desktop environment 
  *
- * $Id: main.c,v 1.1 2004/07/15 00:31:10 oliverschmidt Exp $
+ * $Id: main.c,v 1.2 2004/07/31 14:49:33 oliverschmidt Exp $
  *
  */
 
+#include <stdlib.h>
+
 #include "ctk.h"
 #include "ctk-draw.h"
 #include "ek.h"
@@ -66,19 +68,52 @@
 }
 /*-----------------------------------------------------------------------------------*/
 void
-main(void)
+main(int argc)
 {
+  u16_t addr[2];
+
+  if(argc != 2) {
+    cprintf("\n"
+            "usage: Contiki <addr>\n"
+            "\n"
+            "  <addr> Host IP address of interface to be used by Contiki\n"
+	    "\n"
+            "notes:\n"
+	    "\n"
+            "  - Contiki needs Windows 2000 or later to run.\n"
+	    "\n"
+            "  - Contiki needs administrative rights to run.\n"
+	    "\n"
+            "  - The IP address to be used by Contiki has to be different from the Host IP\n"
+            "    address specified here.\n"
+	    "\n"
+            "  - Contiki doesn't respond to ARP requests for it's IP address. A workaround\n"
+            "    is to add a static entry into the ARP cache of communication peers.\n");
+    exit(EXIT_FAILURE);
+  }
+
   ek_init();
   tcpip_init(NULL);
-  
+
+  console_init();
   ctk_init();
 
   resolv_init(NULL);
-  
+
   uip_event_init();
-  
+
   program_handler_init();
 
+#if 0
+  uip_ipaddr(addr, 192,168,0,3);
+  uip_sethostaddr(addr);
+ 
+/* uip_ipaddr(addr, 192,168,0,1); */
+/* resolv_conf(addr);             */
+#endif
+
+  rawsock_service_init(NULL);
+
   program_handler_add(&netconf_dsc,   "Network setup",  1);
   program_handler_add(&www_dsc,       "Web browser",    1);
   program_handler_add(&telnet_dsc,    "Telnet",         1);
@@ -89,6 +124,7 @@
 
   while(1) {
     ek_run();
+    _sleep(0);
   }
 }
 /*-----------------------------------------------------------------------------------*/
diff --git a/contiki-win32/uip/rawsock-service.c b/contiki-win32/uip/rawsock-service.c
new file mode 100644
index 0000000..f4bb966
--- /dev/null
+++ b/contiki-win32/uip/rawsock-service.c
@@ -0,0 +1,56 @@
+
+#include "packet-service.h"
+#include "rawsock.h"
+
+static void output(u8_t *hdr, u16_t hdrlen, u8_t *data, u16_t datalen);
+
+static const struct packet_service_state state =
+  {
+    PACKET_SERVICE_VERSION,
+    output
+  };
+
+EK_EVENTHANDLER(eventhandler, ev, data);
+EK_POLLHANDLER(pollhandler);
+EK_PROCESS(proc, PACKET_SERVICE_NAME, EK_PRIO_NORMAL,
+	   eventhandler, pollhandler, (void *)&state);
+
+/*---------------------------------------------------------------------------*/
+EK_PROCESS_INIT(rawsock_service_init, arg)
+{
+  ek_service_start(PACKET_SERVICE_NAME, &proc);
+}
+/*---------------------------------------------------------------------------*/
+static void
+output(u8_t *hdr, u16_t hdrlen, u8_t *data, u16_t datalen)
+{
+  rawsock_send();
+}
+/*---------------------------------------------------------------------------*/
+EK_EVENTHANDLER(eventhandler, ev, data)
+{
+  switch(ev) {
+  case EK_EVENT_INIT:
+    rawsock_init();
+    break;
+  case EK_EVENT_REQUEST_REPLACE:
+    ek_replace((struct ek_proc *)data, NULL);
+    LOADER_UNLOAD();
+    break;
+  case EK_EVENT_REQUEST_EXIT:
+    ek_exit();
+    LOADER_UNLOAD();
+    break;
+  default:
+    break;
+  }
+}
+/*---------------------------------------------------------------------------*/
+EK_POLLHANDLER(pollhandler)
+{
+  uip_len = rawsock_poll();
+  if(uip_len > 0) {
+    tcpip_input();
+  }
+}
+/*---------------------------------------------------------------------------*/
diff --git a/contiki-win32/uip/rawsock.c b/contiki-win32/uip/rawsock.c
new file mode 100644
index 0000000..d94a173
--- /dev/null
+++ b/contiki-win32/uip/rawsock.c
@@ -0,0 +1,113 @@
+#define WIN32_LEAN_AND_MEAN
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include <stdlib.h>
+
+/* from mstcpip.h */
+#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
+
+#define htons
+#include "uip.h"
+#include "tcpip.h"
+#include "ctk.h"
+#undef htons
+
+#define BUF ((uip_tcpip_hdr *)uip_buf)
+
+static SOCKET rawsock = INVALID_SOCKET;
+
+/*-----------------------------------------------------------------------------------*/
+static void
+error_exit(char *message, int value)
+{
+  console_exit();
+  cprintf(message, value);
+  exit(EXIT_FAILURE);
+}
+/*-----------------------------------------------------------------------------------*/
+void
+rawsock_init(void)
+{
+  WSADATA wsadata;
+  struct sockaddr_in addr;
+  unsigned long on = 1;
+
+  if(WSAStartup(2, &wsadata) != 0) {
+    error_exit("WSAStartup() error\n", 0);
+  }
+
+  rawsock = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
+  if(rawsock == INVALID_SOCKET) {
+    error_exit("socket() error: %d\n", WSAGetLastError());
+  }
+
+  addr.sin_family      = AF_INET;
+  addr.sin_addr.s_addr = inet_addr(__argv[1]);
+  addr.sin_port        = 0;
+  if (bind(rawsock, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) {
+    error_exit("bind() error: %d\n", WSAGetLastError());
+  }
+
+  if(setsockopt(rawsock, IPPROTO_IP, IP_HDRINCL,
+		(char *)&on, sizeof(on)) == SOCKET_ERROR) {
+    error_exit("setsockopt(IP_HDRINCL) error: %d\n", WSAGetLastError());
+  }
+
+  if (ioctlsocket(rawsock, SIO_RCVALL, &on) == SOCKET_ERROR) {
+    error_exit("ioctlsocket(SIO_RCVALL) error: %d\n", WSAGetLastError());
+  }
+
+  if(ioctlsocket(rawsock, FIONBIO, &on) == SOCKET_ERROR) {
+    error_exit("ioctlsocket(FIONBIO) error: %d\n", WSAGetLastError());
+  }
+}
+/*-----------------------------------------------------------------------------------*/
+void
+rawsock_send(void)
+{
+  char sendbuf[UIP_BUFSIZE];
+  struct sockaddr_in addr;
+  unsigned long off = 0;
+  unsigned long on = 1;
+
+  memcpy(sendbuf,      uip_buf,     40);
+  memcpy(sendbuf + 40, uip_appdata, uip_len - 40);
+
+  if(ioctlsocket(rawsock, FIONBIO, &off) == SOCKET_ERROR) {
+    error_exit("ioctlsocket(!FIONBIO) error: %d\n", WSAGetLastError());
+  }
+
+  addr.sin_family      = AF_INET;
+  addr.sin_addr.s_addr = *(unsigned long *)BUF->destipaddr;
+  addr.sin_port        = 0;
+  if(sendto(rawsock, sendbuf, uip_len, 0,
+	    (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) {
+    error_exit("sendto() error: %d\n", WSAGetLastError());
+  }
+
+  if(ioctlsocket(rawsock, FIONBIO, &on) == SOCKET_ERROR) {
+    error_exit("ioctlsocket(FIONBIO) error: %d\n", WSAGetLastError());
+  }
+}  
+/*-----------------------------------------------------------------------------------*/
+u16_t
+rawsock_poll(void)
+{
+  int received;
+
+  if (rawsock == INVALID_SOCKET) {
+    return 0;
+  }
+
+  received = recv(rawsock, uip_buf, UIP_BUFSIZE, 0);
+  if(received == SOCKET_ERROR) {
+
+    if(WSAGetLastError() != WSAEWOULDBLOCK) {
+      error_exit("recv() error: %d\n", WSAGetLastError());
+    }
+    return 0;
+
+  }
+  return received;
+}
+/*-----------------------------------------------------------------------------------*/
diff --git a/contiki-win32/uip/rawsock.h b/contiki-win32/uip/rawsock.h
new file mode 100644
index 0000000..2e7efb7
--- /dev/null
+++ b/contiki-win32/uip/rawsock.h
@@ -0,0 +1,8 @@
+#ifndef __RAWSOCK_H__
+#define __RAWSOCK_H__
+
+void rawsock_init(void);
+void rawsock_send(void);
+u16_t rawsock_poll(void);
+
+#endif /* __RAWSOCK_H__ */
diff --git a/contiki-win32/win32.dsp b/contiki-win32/win32.dsp
index cfeafd9..6bc6a6f 100644
--- a/contiki-win32/win32.dsp
+++ b/contiki-win32/win32.dsp
@@ -50,7 +50,7 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"Release/Contiki.exe"
+# ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"Release/Contiki.exe"
 
 !ELSEIF  "$(CFG)" == "win32 - Win32 Debug"
 
@@ -74,7 +74,7 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/Contiki.exe" /pdbtype:sept
+# ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/Contiki.exe" /pdbtype:sept
 
 !ENDIF 
 
@@ -491,6 +491,18 @@
 # PROP Default_Filter ""
 # Begin Source File
 
+SOURCE=".\uip\rawsock-service.c"
+# End Source File
+# Begin Source File
+
+SOURCE=.\uip\rawsock.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\uip\rawsock.h
+# End Source File
+# Begin Source File
+
 SOURCE=.\uip\uip_arch.c
 # End Source File
 # Begin Source File