mirror of
https://github.com/oliverschmidt/contiki.git
synced 2024-12-21 19:29:18 +00:00
Add wpcap for cygwin/Windows native border router
This commit is contained in:
parent
777cc88872
commit
b251619a2f
@ -36,10 +36,32 @@
|
|||||||
#include "net/wpcap.h"
|
#include "net/wpcap.h"
|
||||||
|
|
||||||
#include "net/wpcap-drv.h"
|
#include "net/wpcap-drv.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
|
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
|
||||||
#define IPBUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
|
#define IPBUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||||
|
|
||||||
|
/* It is not particularly easy to install tun interfaces in Windows/cygwin, so wpcap
|
||||||
|
* is used instead. The ip4 or ip6 address of the interface to connect to is passed
|
||||||
|
* on the command line that invokes the minimal-net and native executables.
|
||||||
|
*
|
||||||
|
* The minimal-net border router uses wpcap to connect to both primary
|
||||||
|
* and fallback interfaces. It is passed two addresses, and the uip stack is compiled
|
||||||
|
* with space for the ethernet headers on both interfaces.
|
||||||
|
*
|
||||||
|
* However the native border router uses wpcap to connect to a fallback interface only.
|
||||||
|
* The primary interface is the serial connection to the slip radio, and the
|
||||||
|
* uip stack is compiled without space for ethernet headers.
|
||||||
|
* The following define adds or strips ethernet headers from the fallback interface.
|
||||||
|
* Since it is at present used only with the native border router, it is also used
|
||||||
|
* as a hack to bypass polling of the primary interface.
|
||||||
|
*
|
||||||
|
* SELECT_CALLBACK is defined in /examples/ipv6/native-border-router/project-conf.h
|
||||||
|
*/
|
||||||
|
#ifdef SELECT_CALLBACK
|
||||||
|
#define FALLBACK_HAS_ETHERNET_HEADERS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
PROCESS(wpcap_process, "WinPcap driver");
|
PROCESS(wpcap_process, "WinPcap driver");
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -57,12 +79,14 @@ wpcap_output(void)
|
|||||||
static void
|
static void
|
||||||
pollhandler(void)
|
pollhandler(void)
|
||||||
{
|
{
|
||||||
|
#if !FALLBACK_HAS_ETHERNET_HEADERS //native br is fallback only
|
||||||
process_poll(&wpcap_process);
|
process_poll(&wpcap_process);
|
||||||
uip_len = wpcap_poll();
|
uip_len = wpcap_poll();
|
||||||
|
|
||||||
if(uip_len > 0) {
|
if(uip_len > 0) {
|
||||||
#if UIP_CONF_IPV6
|
#if UIP_CONF_IPV6
|
||||||
if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) {
|
if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) {
|
||||||
|
printf("wpcap poll calls tcpip");
|
||||||
tcpip_input();
|
tcpip_input();
|
||||||
} else
|
} else
|
||||||
#endif /* UIP_CONF_IPV6 */
|
#endif /* UIP_CONF_IPV6 */
|
||||||
@ -83,14 +107,26 @@ pollhandler(void)
|
|||||||
uip_len = 0;
|
uip_len = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#ifdef UIP_FALLBACK_INTERFACE
|
#ifdef UIP_FALLBACK_INTERFACE
|
||||||
|
|
||||||
process_poll(&wpcap_process);
|
process_poll(&wpcap_process);
|
||||||
uip_len = wfall_poll();
|
uip_len = wfall_poll();
|
||||||
|
|
||||||
if(uip_len > 0) {
|
if(uip_len > 0) {
|
||||||
#if UIP_CONF_IPV6
|
#if FALLBACK_HAS_ETHERNET_HEADERS
|
||||||
|
if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) {
|
||||||
|
//remove ethernet header and pass ipv6 packet to stack
|
||||||
|
uip_len-=14;
|
||||||
|
//{int i;printf("\n0000 ");for (i=0;i<uip_len;i++) printf("%02x ",*(unsigned char*)(uip_buf+i));printf("\n");}
|
||||||
|
// memcpy(uip_buf, uip_buf+14, uip_len);
|
||||||
|
memcpy(&uip_buf[UIP_LLH_LEN], uip_buf+14, uip_len); //LLH_LEN is zero for native border router to slip radio
|
||||||
|
// CopyMemory(uip_buf, uip_buf+14, uip_len);
|
||||||
|
//{int i;printf("\n0000 ");for (i=0;i<uip_len;i++) printf("%02x ",*(char*)(uip_buf+i));printf("\n");}
|
||||||
|
tcpip_input();
|
||||||
|
} else
|
||||||
|
goto bail;
|
||||||
|
#elif UIP_CONF_IPV6
|
||||||
if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) {
|
if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) {
|
||||||
tcpip_input();
|
tcpip_input();
|
||||||
} else
|
} else
|
||||||
@ -129,7 +165,9 @@ PROCESS_THREAD(wpcap_process, ev, data)
|
|||||||
#if !UIP_CONF_IPV6
|
#if !UIP_CONF_IPV6
|
||||||
tcpip_set_outputfunc(wpcap_output);
|
tcpip_set_outputfunc(wpcap_output);
|
||||||
#else
|
#else
|
||||||
|
#if !FALLBACK_HAS_ETHERNET_HEADERS
|
||||||
tcpip_set_outputfunc(wpcap_send);
|
tcpip_set_outputfunc(wpcap_send);
|
||||||
|
#endif
|
||||||
#endif /* !UIP_CONF_IPV6 */
|
#endif /* !UIP_CONF_IPV6 */
|
||||||
|
|
||||||
process_poll(&wpcap_process);
|
process_poll(&wpcap_process);
|
||||||
|
@ -59,6 +59,15 @@
|
|||||||
|
|
||||||
#include "net/wpcap.h"
|
#include "net/wpcap.h"
|
||||||
|
|
||||||
|
/* Handle native-border-router case where the fallback has ethernet headers.
|
||||||
|
* The command line args for native-border-router conflice with the passing
|
||||||
|
* of the interface addresses to connect to, so both must be hard coded.
|
||||||
|
* See comments in wpcap-drv.c
|
||||||
|
*/
|
||||||
|
#ifdef SELECT_CALLBACK
|
||||||
|
#define FALLBACK_HAS_ETHERNET_HEADERS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#if UIP_CONF_IPV6
|
#if UIP_CONF_IPV6
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
struct in6_addr addr6;
|
struct in6_addr addr6;
|
||||||
@ -173,19 +182,27 @@ init(void)
|
|||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
u8_t wfall_send(uip_lladdr_t *lladdr);
|
u8_t wfall_send(uip_lladdr_t *lladdr);
|
||||||
|
#if FALLBACK_HAS_ETHERNET_HEADERS
|
||||||
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
|
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||||
|
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
|
||||||
|
#define IPBUF ((struct uip_tcpip_hdr *)&uip_buf[14])
|
||||||
|
static uip_ipaddr_t last_sender;
|
||||||
|
#else
|
||||||
|
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||||
|
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
|
||||||
|
#define IPBUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
output(void)
|
output(void)
|
||||||
{
|
{
|
||||||
#if 0
|
#if FALLBACK_HAS_ETHERNET_HEADERS&&0
|
||||||
if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) {
|
if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) {
|
||||||
/* Do not bounce packets back to fallback if the packet was received from it */
|
/* Do not bounce packets back to fallback if the packet was received from it */
|
||||||
PRINTF("fallback: Destination off-link but no route src=");
|
PRINTF("FUT: trapping pingpong");
|
||||||
PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
|
return;
|
||||||
PRINTF(" dst=");
|
}
|
||||||
PRINT6ADDR(&UIP_IP_BUF->destipaddr);
|
uip_ipaddr_copy(&last_sender, &UIP_IP_BUF->srcipaddr);
|
||||||
PRINTF("\n");
|
|
||||||
} else {
|
|
||||||
#endif
|
#endif
|
||||||
PRINTF("FUT: %u\n", uip_len);
|
PRINTF("FUT: %u\n", uip_len);
|
||||||
wfall_send(0);
|
wfall_send(0);
|
||||||
@ -197,9 +214,6 @@ const struct uip_fallback_interface rpl_interface = {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
|
|
||||||
#define IPBUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
error_exit(char *message)
|
error_exit(char *message)
|
||||||
@ -488,7 +502,7 @@ wpcap_init(void)
|
|||||||
#ifdef UIP_FALLBACK_INTERFACE
|
#ifdef UIP_FALLBACK_INTERFACE
|
||||||
if(addrfall.s_addr == INADDR_NONE) {
|
if(addrfall.s_addr == INADDR_NONE) {
|
||||||
if(iszero_ip6addr(addrfall6)) {
|
if(iszero_ip6addr(addrfall6)) {
|
||||||
#ifdef WPCAP_WPCAP_FALLBACK_ADDRESS
|
#ifdef WPCAP_FALLBACK_ADDRESS
|
||||||
addrfall.s_addr = inet_addr(WPCAP_FALLBACK_ADDRESS);
|
addrfall.s_addr = inet_addr(WPCAP_FALLBACK_ADDRESS);
|
||||||
// if(addrfall.s_addr == INADDR_NONE) { //use ipv6 if contiki-conf.h override
|
// if(addrfall.s_addr == INADDR_NONE) { //use ipv6 if contiki-conf.h override
|
||||||
uiplib_ipaddrconv(WPCAP_FALLBACK_ADDRESS,(uip_ipaddr_t*) &addrfall6.s6_addr);
|
uiplib_ipaddrconv(WPCAP_FALLBACK_ADDRESS,(uip_ipaddr_t*) &addrfall6.s6_addr);
|
||||||
@ -659,6 +673,11 @@ wfall_poll(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#if UIP_CONF_IPV6
|
#if UIP_CONF_IPV6
|
||||||
|
#if FALLBACK_HAS_ETHERNET_HEADERS
|
||||||
|
#define ETHERNET_LLADDR_LEN 6
|
||||||
|
#else
|
||||||
|
#define ETHERNET_LLADDR_LEN UIP_LLADDR_LEN
|
||||||
|
#endif
|
||||||
/* Since pcap_setdirection(PCAP_D_IN) is not implemented in winpcap all outgoing packets
|
/* Since pcap_setdirection(PCAP_D_IN) is not implemented in winpcap all outgoing packets
|
||||||
* will be echoed back. The stack will ignore any packets not addressed to it, but initial
|
* will be echoed back. The stack will ignore any packets not addressed to it, but initial
|
||||||
* ipv6 neighbor solicitations are addressed to everyone and the echoed NS sent on startup
|
* ipv6 neighbor solicitations are addressed to everyone and the echoed NS sent on startup
|
||||||
@ -667,8 +686,8 @@ wfall_poll(void)
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i<UIP_LLADDR_LEN;i++) if (*(packet+UIP_LLADDR_LEN+i)!=uip_lladdr.addr[i]) break;
|
for (i=0;i<ETHERNET_LLADDR_LEN;i++) if (*(packet+ETHERNET_LLADDR_LEN+i)!=uip_lladdr.addr[i]) break;
|
||||||
if (i==UIP_LLADDR_LEN) {
|
if (i==ETHERNET_LLADDR_LEN) {
|
||||||
PRINTF("Discarding echoed packet\n");
|
PRINTF("Discarding echoed packet\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -727,6 +746,12 @@ return 0;
|
|||||||
u8_t
|
u8_t
|
||||||
wfall_send(uip_lladdr_t *lladdr)
|
wfall_send(uip_lladdr_t *lladdr)
|
||||||
{
|
{
|
||||||
|
#if FALLBACK_HAS_ETHERNET_HEADERS
|
||||||
|
//make room for ethernet header
|
||||||
|
//{int i;printf("\n");for (i=0;i<uip_len;i++) printf("%02x ",*(char*)(uip_buf+i));printf("\n");}
|
||||||
|
{int i;for(i=uip_len;i>=0;--i) *(char *)(uip_buf+i+14) = *(char *)(uip_buf+i);}
|
||||||
|
//{int i;printf("\n");for (i=0;i<uip_len;i++) printf("%02x ",*(char*)(uip_buf+i));printf("\n");}
|
||||||
|
#endif
|
||||||
if(lladdr == NULL) {
|
if(lladdr == NULL) {
|
||||||
/* the dest must be multicast*/
|
/* the dest must be multicast*/
|
||||||
(&BUF->dest)->addr[0] = 0x33;
|
(&BUF->dest)->addr[0] = 0x33;
|
||||||
|
@ -269,7 +269,11 @@ write_to_serial(int outfd, const uint8_t *inbuf, int len)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
if(slip_config_verbose > 2) {
|
if(slip_config_verbose > 2) {
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
printf("Packet from WPCAP of length %d - write SLIP\n", len);
|
||||||
|
#else
|
||||||
printf("Packet from TUN of length %d - write SLIP\n", len);
|
printf("Packet from TUN of length %d - write SLIP\n", len);
|
||||||
|
#endif
|
||||||
if(slip_config_verbose > 4) {
|
if(slip_config_verbose > 4) {
|
||||||
#if WIRESHARK_IMPORT_FORMAT
|
#if WIRESHARK_IMPORT_FORMAT
|
||||||
printf("0000");
|
printf("0000");
|
||||||
|
@ -74,9 +74,6 @@ extern uint16_t slip_config_basedelay;
|
|||||||
static int tunfd;
|
static int tunfd;
|
||||||
static int initialized = 0;
|
static int initialized = 0;
|
||||||
|
|
||||||
static uint16_t delaymsec=0;
|
|
||||||
static uint32_t delaystartsec,delaystartmsec;
|
|
||||||
|
|
||||||
int ssystem(const char *fmt, ...)
|
int ssystem(const char *fmt, ...)
|
||||||
__attribute__((__format__ (__printf__, 1, 2)));
|
__attribute__((__format__ (__printf__, 1, 2)));
|
||||||
int
|
int
|
||||||
@ -175,6 +172,24 @@ tun_alloc(char *dev)
|
|||||||
return devopen(dev, O_RDWR);
|
return devopen(dev, O_RDWR);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
/*wpcap process is used to connect to host interface */
|
||||||
|
void
|
||||||
|
tun_init()
|
||||||
|
{
|
||||||
|
setvbuf(stdout, NULL, _IOLBF, 0); /* Line buffered output. */
|
||||||
|
|
||||||
|
slip_init();
|
||||||
|
|
||||||
|
initialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static uint16_t delaymsec=0;
|
||||||
|
static uint32_t delaystartsec,delaystartmsec;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
tun_init()
|
tun_init()
|
||||||
@ -235,6 +250,9 @@ output(void)
|
|||||||
const struct uip_fallback_interface rpl_interface = {
|
const struct uip_fallback_interface rpl_interface = {
|
||||||
init, output
|
init, output
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif /* __CYGWIN_ */
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* tun and slip select callback */
|
/* tun and slip select callback */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -259,6 +277,10 @@ handle_fd(fd_set *rset, fd_set *wset)
|
|||||||
if(!initialized) return;
|
if(!initialized) return;
|
||||||
|
|
||||||
slip_handle_fd(rset, wset);
|
slip_handle_fd(rset, wset);
|
||||||
|
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
/* Packets from host interface are handled by wpcap process */
|
||||||
|
#else
|
||||||
|
|
||||||
/* Optional delay between outgoing packets */
|
/* Optional delay between outgoing packets */
|
||||||
/* Base delay times number of 6lowpan fragments to be sent */
|
/* Base delay times number of 6lowpan fragments to be sent */
|
||||||
@ -290,6 +312,7 @@ handle_fd(fd_set *rset, fd_set *wset)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* __CYGWIN__ */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -13,6 +13,19 @@ CONTIKI_TARGET_SOURCEFILES = contiki-main.c clock.c leds.c leds-arch.c \
|
|||||||
button-sensor.c pir-sensor.c vib-sensor.c xmem.c \
|
button-sensor.c pir-sensor.c vib-sensor.c xmem.c \
|
||||||
sensors.c irq.c cfs-posix.c cfs-posix-dir.c
|
sensors.c irq.c cfs-posix.c cfs-posix-dir.c
|
||||||
|
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
CONTIKI_TARGET_SOURCEFILES += wpcap-drv.c wpcap.c
|
||||||
|
TARGET_LIBFILES = /lib/w32api/libws2_32.a /lib/w32api/libiphlpapi.a
|
||||||
|
else
|
||||||
|
CONTIKI_TARGET_SOURCEFILES += tapdev-drv.c
|
||||||
|
#math
|
||||||
|
ifndef UIP_CONF_IPV6
|
||||||
|
CONTIKI_TARGET_SOURCEFILES += tapdev.c
|
||||||
|
else
|
||||||
|
CONTIKI_TARGET_SOURCEFILES += tapdev6.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)
|
CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
@ -35,8 +35,9 @@
|
|||||||
#define __CONTIKI_CONF_H__
|
#define __CONTIKI_CONF_H__
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
|
#endif
|
||||||
struct select_callback {
|
struct select_callback {
|
||||||
int (* set_fd)(int maxfd, fd_set *fdr, fd_set *fdw);
|
int (* set_fd)(int maxfd, fd_set *fdr, fd_set *fdw);
|
||||||
void (* handle_fd)(fd_set *fdr, fd_set *fdw);
|
void (* handle_fd)(fd_set *fdr, fd_set *fdw);
|
||||||
|
@ -38,6 +38,10 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
|
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
#include "net/wpcap-drv.h"
|
||||||
|
#endif /* __CYGWIN__ */
|
||||||
|
|
||||||
#include "contiki.h"
|
#include "contiki.h"
|
||||||
#include "net/netstack.h"
|
#include "net/netstack.h"
|
||||||
|
|
||||||
@ -98,7 +102,15 @@ char **contiki_argv;
|
|||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
printf("Starting Contiki:\n", UIP_CONF_IPV6);
|
#if UIP_CONF_IPV6
|
||||||
|
#if UIP_CONF_IPV6_RPL
|
||||||
|
printf("Starting Contiki IPV6, RPL\n");
|
||||||
|
#else
|
||||||
|
printf("Starting Contiki IPV6\n");
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
printf("Starting Contiki IPV4\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
/* crappy way of remembering and accessing argc/v */
|
/* crappy way of remembering and accessing argc/v */
|
||||||
contiki_argc = argc;
|
contiki_argc = argc;
|
||||||
@ -113,7 +125,9 @@ main(int argc, char **argv)
|
|||||||
memcpy(&uip_lladdr.addr, serial_id, sizeof(uip_lladdr.addr));
|
memcpy(&uip_lladdr.addr, serial_id, sizeof(uip_lladdr.addr));
|
||||||
|
|
||||||
process_start(&tcpip_process, NULL);
|
process_start(&tcpip_process, NULL);
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
process_start(&wpcap_process, NULL);
|
||||||
|
#endif
|
||||||
printf("Tentative link-local IPv6 address ");
|
printf("Tentative link-local IPv6 address ");
|
||||||
{
|
{
|
||||||
uip_ds6_addr_t *lladdr;
|
uip_ds6_addr_t *lladdr;
|
||||||
|
Loading…
Reference in New Issue
Block a user