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