diff --git a/cpu/native/net/wpcap.c b/cpu/native/net/wpcap.c
index d5b7ed9f5..810d94682 100644
--- a/cpu/native/net/wpcap.c
+++ b/cpu/native/net/wpcap.c
@@ -30,7 +30,7 @@
*
* Author: Oliver Schmidt
*
- * $Id: wpcap.c,v 1.17 2009/08/11 16:06:17 dak664 Exp $
+ * $Id: wpcap.c,v 1.18 2009/08/13 18:41:00 dak664 Exp $
*/
#define WIN32_LEAN_AND_MEAN
@@ -145,6 +145,7 @@ init_pcap(struct in_addr addr)
if(pcap == NULL) {
error_exit(error);
}
+// pcap_setdirection(PCAP_D_IN); //Not implemented in windows yet?
return;
}
}
@@ -255,6 +256,7 @@ wpcap_init(void)
set_ethaddr(addr);
}
+
/*---------------------------------------------------------------------------*/
u16_t
wpcap_poll(void)
@@ -269,19 +271,36 @@ wpcap_poll(void)
return 0;
}
+#if UIP_CONF_IPV6
+/* 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
+ * ipv6 neighbor solicitations are addressed to everyone and the echoed NS sent on startup
+ * would be processed as a conflicting NS race which would cause a stack shutdown.
+ * So discard all packets with our source address (packet starts destaddr, srcaddr, ...)
+ *
+ */
+ int i;
+ for (i=0;icaplen > UIP_BUFSIZE) {
return 0;
}
CopyMemory(uip_buf, packet, packet_header->caplen);
return (u16_t)packet_header->caplen;
+
}
+
/*---------------------------------------------------------------------------*/
#if UIP_CONF_IPV6
u8_t
wpcap_send(uip_lladdr_t *lladdr)
{
- static char cludge=0;
if(lladdr == NULL) {
/* the dest must be multicast*/
(&BUF->dest)->addr[0] = 0x33;
@@ -295,15 +314,6 @@ wpcap_send(uip_lladdr_t *lladdr)
}
memcpy(&BUF->src, &uip_lladdr, UIP_LLADDR_LEN);
-/* TODO:After sending the initial NS a NS is received from 0 to me with my target address.
- * This causes program exit -1 via uip_netif_dad_failed() from uip-nd6-io.c.
- * It is OK once it receives an incoming packet
- * Swallowing the first few output packets will (usually) get it going
- * This is a cludge until the NS processing is resolved!
- */
-if (cludge<3) {
- cludge++; //gulp
-} else {
PRINTF("Src= %02x %02x %02x %02x %02x %02x",(&BUF->src)->addr[0],(&BUF->src)->addr[1],(&BUF->src)->addr[2],(&BUF->src)->addr[3],(&BUF->src)->addr[4],(&BUF->src)->addr[5]);
PRINTF(" Dst= %02x %02x %02x %02x %02x %02x",(&BUF->dest)->addr[0],(&BUF->dest)->addr[1],(&BUF->dest)->addr[2],(&BUF->dest)->addr[3],(&BUF->dest)->addr[4],(&BUF->dest)->addr[5]);
PRINTF(" Type=%04x\n",BUF->type);
@@ -312,9 +322,8 @@ if (cludge<3) {
if(pcap_sendpacket(pcap, uip_buf, uip_len) == -1) {
error_exit("error on send\n");
}
-}
return 0;
-} /* cludge */
+}
#else /* UIP_CONF_IPV6 */
void
wpcap_send(void)