35 #define WIN32_LEAN_AND_MEAN
36 #define _WIN32_WINNT 0x0501
52 #define PRINTF(...) printf(__VA_ARGS__)
57 #include "contiki-net.h"
60 #include "net/wpcap.h"
67 #ifdef SELECT_CALLBACK
68 #define FALLBACK_HAS_ETHERNET_HEADERS 1
73 struct in6_addr addr6;
77 issame_ip6addr(
struct in6_addr addr1,
struct in6_addr addr2)
79 return ((addr1.s6_addr32[0]==addr2.s6_addr32[0]) &&
80 (addr1.s6_addr32[1]==addr2.s6_addr32[1]) &&
81 (addr1.s6_addr32[2]==addr2.s6_addr32[2]) &&
82 (addr1.s6_addr32[3]==addr2.s6_addr32[3]) );
86 iszero_ip6addr(
struct in6_addr addr)
88 return ((addr.s6_addr32[0]==0) &&
89 (addr.s6_addr32[1]==0) &&
90 (addr.s6_addr32[2]==0) &&
91 (addr.s6_addr32[3]==0) );
95 sprint_ip6addr(
struct in6_addr addr,
char * result)
98 unsigned char zerocnt = 0;
99 unsigned char numprinted = 0;
100 char * starting = result;
103 while (numprinted < 8) {
104 if ((addr.s6_addr16[i] == 0) && (zerocnt == 0)) {
105 while(addr.s6_addr16[zerocnt + i] == 0) zerocnt++;
112 numprinted += zerocnt;
114 result += sprintf(result,
"%x", (
unsigned int) uip_ntohs(addr.s6_addr16[i]));
118 if (numprinted != 8) *result++ =
':';
122 return (result - starting);
135 struct pcap_if *next;
139 struct pcap_addr *next;
140 struct sockaddr *addr;
141 struct sockaddr *netmask;
142 struct sockaddr *broadaddr;
143 struct sockaddr *dstaddr;
156 static struct pcap *pcap;
165 static int (* pcap_findalldevs)(
struct pcap_if **,
char *);
166 static struct pcap *(* pcap_open_live)(
char *, int, int, int,
char *);
167 static int (* pcap_next_ex)(
struct pcap *,
struct pcap_pkthdr **,
unsigned char **);
168 static int (* pcap_sendpacket)(
struct pcap *,
unsigned char *, int);
170 #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
171 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
172 #define IPBUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
174 #ifdef UIP_FALLBACK_INTERFACE
175 static struct pcap *pfall;
176 struct in_addr addrfall;
178 struct in_addr6 addrfall6;
189 #if FALLBACK_HAS_ETHERNET_HEADERS
191 #define IPBUF ((struct uip_tcpip_hdr *)&uip_buf[14])
192 static uip_ipaddr_t last_sender;
198 #if FALLBACK_HAS_ETHERNET_HEADERS&&0
199 if(uip_ipaddr_cmp(&last_sender, &
UIP_IP_BUF->srcipaddr)) {
201 PRINTF(
"FUT: trapping pingpong");
210 const struct uip_fallback_interface rpl_interface = {
218 error_exit(
char *message)
220 printf(
"error_exit: %s", message);
225 set_ethaddr(
struct in_addr addr)
227 PIP_ADAPTER_ADDRESSES adapters;
230 if(GetAdaptersAddresses(AF_INET, GAA_FLAG_SKIP_ANYCAST |
231 GAA_FLAG_SKIP_MULTICAST |
232 GAA_FLAG_SKIP_DNS_SERVER,
233 NULL,
NULL, &size) != ERROR_BUFFER_OVERFLOW) {
234 error_exit(
"error on access to adapter list size\n");
236 adapters = alloca(size);
237 if(GetAdaptersAddresses(AF_INET, GAA_FLAG_SKIP_ANYCAST |
238 GAA_FLAG_SKIP_MULTICAST |
239 GAA_FLAG_SKIP_DNS_SERVER,
240 NULL, adapters, &size) != ERROR_SUCCESS) {
241 error_exit(
"error on access to adapter list\n");
244 while(adapters !=
NULL) {
247 WideCharToMultiByte(CP_ACP, 0, adapters->Description, -1,
248 buffer,
sizeof(buffer),
NULL,
NULL);
249 log_message(
"set_ethaddr: found adapter: ", buffer);
251 if(adapters->FirstUnicastAddress !=
NULL &&
252 adapters->FirstUnicastAddress->Address.lpSockaddr !=
NULL &&
253 adapters->FirstUnicastAddress->Address.lpSockaddr->sa_family == AF_INET) {
255 struct in_addr adapter_addr;
256 adapter_addr = ((
struct sockaddr_in *)adapters->FirstUnicastAddress->Address.lpSockaddr)->sin_addr;
257 log_message(
"set_ethaddr: with address: ", inet_ntoa(adapter_addr));
259 if(adapter_addr.s_addr == addr.s_addr) {
260 if(adapters->PhysicalAddressLength != 6) {
261 error_exit(
"ip addr specified on cmdline does not belong to an ethernet card\n");
263 wsprintf(buffer,
"%02X-%02X-%02X-%02X-%02X-%02X",
264 adapters->PhysicalAddress[0], adapters->PhysicalAddress[1],
265 adapters->PhysicalAddress[2], adapters->PhysicalAddress[3],
266 adapters->PhysicalAddress[4], adapters->PhysicalAddress[5]);
267 log_message(
"set_ethaddr: ethernetaddr: ", buffer);
276 adapters = adapters->Next;
279 if(adapters ==
NULL) {
280 error_exit(
"no adapter found with ip addr specified on cmdline\n");
287 set_ethaddr6(
struct in_addr6 addr)
289 PIP_ADAPTER_ADDRESSES adapters;
292 if(GetAdaptersAddresses(AF_INET6, GAA_FLAG_SKIP_ANYCAST |
293 GAA_FLAG_SKIP_MULTICAST |
294 GAA_FLAG_SKIP_DNS_SERVER,
295 NULL,
NULL, &size) != ERROR_BUFFER_OVERFLOW) {
296 error_exit(
"error on access to adapter list size\n");
298 adapters = alloca(size);
299 if(GetAdaptersAddresses(AF_INET6, GAA_FLAG_SKIP_ANYCAST |
300 GAA_FLAG_SKIP_MULTICAST |
301 GAA_FLAG_SKIP_DNS_SERVER,
302 NULL, adapters, &size) != ERROR_SUCCESS) {
303 error_exit(
"error on access to adapter list\n");
306 while(adapters !=
NULL) {
309 WideCharToMultiByte(CP_ACP, 0, adapters->Description, -1,
310 buffer,
sizeof(buffer),
NULL,
NULL);
311 log_message(
"set_ethaddr: found adapter: ", buffer);
313 if(adapters->FirstUnicastAddress !=
NULL &&
314 adapters->FirstUnicastAddress->Address.lpSockaddr !=
NULL &&
315 adapters->FirstUnicastAddress->Address.lpSockaddr->sa_family == AF_INET6) {
317 struct in_addr6 adapter_addr;
318 adapter_addr = ((
struct sockaddr_in6 *)adapters->FirstUnicastAddress->Address.lpSockaddr)->sin6_addr;
319 sprint_ip6addr(adapter_addr, addr6str);
320 log_message(
"set_ethaddr: with ipv6 address: : ", addr6str);
321 if(issame_ip6addr(adapter_addr,addr6)) {
322 if(adapters->PhysicalAddressLength != 6) {
323 error_exit(
"ip addr specified on cmdline does not belong to an ethernet card\n");
325 wsprintf(buffer,
"%02X-%02X-%02X-%02X-%02X-%02X",
326 adapters->PhysicalAddress[0], adapters->PhysicalAddress[1],
327 adapters->PhysicalAddress[2], adapters->PhysicalAddress[3],
328 adapters->PhysicalAddress[4], adapters->PhysicalAddress[5]);
329 log_message(
"set_ethaddr: ethernetaddr: ", buffer);
338 adapters = adapters->Next;
341 if(adapters ==
NULL) {
342 error_exit(
"no adapter found with ip addr specified on cmdline\n");
348 init_pcap(
struct in_addr addr)
350 struct pcap_if *interfaces;
351 struct pcap_addr *paddr;
354 if(pcap_findalldevs(&interfaces, error) == -1) {
358 while(interfaces !=
NULL) {
359 log_message(
"init_pcap: found interface: ", interfaces->description);
361 if(interfaces->addresses !=
NULL) {
362 for(paddr = interfaces->addresses;
364 paddr = paddr->next) {
365 if(paddr->addr !=
NULL && paddr->addr->sa_family == AF_INET) {
366 struct in_addr interface_addr;
367 interface_addr = ((
struct sockaddr_in *)paddr->addr)->sin_addr;
368 log_message(
"init_pcap: with address: ", inet_ntoa(interface_addr));
370 if(interface_addr.s_addr == addr.s_addr) {
371 pcap = pcap_open_live(interfaces->name,
UIP_BUFSIZE, 0, -1, error);
375 #ifdef UIP_FALLBACK_INTERFACE
376 log_message(
"init_pcap: Opened as primary interface",
"");
378 log_message(
"init_pcap: Opened as interface",
"");
383 #ifdef UIP_FALLBACK_INTERFACE
385 if (pfall && pcap)
return;
386 if(interface_addr.s_addr == addrfall.s_addr) {
387 pfall = pcap_open_live(interfaces->name,
UIP_BUFSIZE, 0, -1, error);
391 log_message(
"init_pcap: Opened as fallback interface",
"");
401 }
else if(paddr->addr !=
NULL && paddr->addr->sa_family == AF_INET6) {
402 struct in6_addr interface_addr;
403 interface_addr = ((
struct sockaddr_in6 *)paddr->addr)->sin6_addr;
405 sprint_ip6addr(interface_addr, addr6str);
406 log_message(
"init_pcap: with ipv6 address: ", addr6str);
408 if (issame_ip6addr(interface_addr, addr6)) {
409 pcap = pcap_open_live(interfaces->name,
UIP_BUFSIZE, 0, -1, error);
413 #ifdef UIP_FALLBACK_INTERFACE
414 log_message(
"init_pcap: Opened as primary interface",
"");
418 #ifdef UIP_FALLBACK_INTERFACE
420 if (pfall && pcap)
return;
422 if (issame_ip6addr(interface_addr, addrfall6)) {
423 pfall = pcap_open_live(interfaces->name,
UIP_BUFSIZE, 0, -1, error);
427 log_message(
"init_pcap: Opened as fallback interface",
"");
438 interfaces = interfaces->next;
442 if(interfaces ==
NULL) {
443 error_exit(
"no interface found with specified ip address\n");
451 addr.s_addr = INADDR_NONE;
452 #ifdef UIP_FALLBACK_INTERFACE
453 addrfall.s_addr = INADDR_NONE;
459 addr.s_addr = inet_addr((*__argv)[1]);
463 #ifdef UIP_FALLBACK_INTERFACE
465 addrfall.s_addr = inet_addr((*__argv)[2]);
475 addr.s_addr = inet_addr(__argv[1]);
480 #ifdef UIP_FALLBACK_INTERFACE
481 addrfall.s_addr = inet_addr(__argv[2]);
490 log_message(
"wpcap_init:Passed ipv4 ", inet_ntoa(addr));
491 sprint_ip6addr(addr6, addr6str);
492 log_message(
"wpcap_init:Passed ipv6 ", addr6str);
493 #ifdef UIP_FALLBACK_INTERFACE
494 log_message(
"wpcap_init:Passed fallback ipv4 ", inet_ntoa(addrfall));
495 sprint_ip6addr(addrfall6, addr6str);
496 log_message(
"wpcap_init:Passed fallback ipv6 ", addr6str);
503 #ifdef UIP_FALLBACK_INTERFACE
504 if(addrfall.s_addr == INADDR_NONE) {
505 if(iszero_ip6addr(addrfall6)) {
506 #ifdef WPCAP_FALLBACK_ADDRESS
507 addrfall.s_addr = inet_addr(WPCAP_FALLBACK_ADDRESS);
519 if(addr.s_addr == INADDR_NONE) {
520 if(iszero_ip6addr(addr6)) {
521 #ifdef WPCAP_INTERFACE_ADDRESS
522 addr.s_addr = inet_addr(WPCAP_INTERFACE_ADDRESS);
527 addr.s_addr = inet_addr(
"10.10.10.10");
531 #ifdef UIP_FALLBACK_INTERFACE
532 log_message(
"usage: <program> <ip addr of interface> <ip addr of fallback>\n",
"");
533 if(addr.s_addr != INADDR_NONE) {
534 log_message(
"-->I'll try interface address ", inet_ntoa(addr));
536 sprint_ip6addr(addr6, addr6str);
537 log_message(
"-->I'll try interface address ", addr6str);
539 if(addrfall.s_addr != INADDR_NONE) {
540 log_message(
"--> and fallback address ", inet_ntoa(addrfall));
542 sprint_ip6addr(addrfall6, addr6str);
543 log_message(
"--> and fallback address ", addr6str);
546 if(addr.s_addr != INADDR_NONE) {
547 log_message(
"usage: <program> <ip addr of ethernet card to share>\n-->I'll try guessing ", inet_ntoa(addr));
549 sprint_ip6addr(addr6, addr6str);
550 log_message(
"usage: <program> <ip addr of ethernet card to share>\n-->I'll try guessing ", addr6str);
556 if(addr.s_addr == INADDR_NONE) {
557 #ifdef WPCAP_INTERFACE_ADDRESS
558 addr.s_addr = inet_addr(WPCAP_INTERFACE_ADDRESS);
560 addr.s_addr = inet_addr(
"10.10.10.10");
562 log_message(
"usage: <program> <ip addr of ethernet card to share>\n-->I'll try guessing ", inet_ntoa(addr));
567 log_message(
"wpcap_init:Using ipv4 ", inet_ntoa(addr));
568 sprint_ip6addr(addr6, addr6str);
569 log_message(
"wpcap_init:Using ipv6 ", addr6str);
570 #ifdef UIP_FALLBACK_INTERFACE
571 log_message(
"wpcap_init:Using fallback ipv4 ", inet_ntoa(addrfall));
572 sprint_ip6addr(addrfall6, addr6str);
573 log_message(
"wpcap_init:Using fallback ipv6 ", addr6str);
580 wpcap = LoadLibrary(
"wpcap.dll");
581 pcap_findalldevs = (int (*)(
struct pcap_if **,
char *))
582 GetProcAddress(wpcap,
"pcap_findalldevs");
583 pcap_open_live = (
struct pcap *(*)(
char *, int, int, int,
char *))
584 GetProcAddress(wpcap,
"pcap_open_live");
585 pcap_next_ex = (int (*)(
struct pcap *,
struct pcap_pkthdr **,
unsigned char **))
586 GetProcAddress(wpcap,
"pcap_next_ex");
587 pcap_sendpacket = (int (*)(
struct pcap *,
unsigned char *, int))
588 GetProcAddress(wpcap,
"pcap_sendpacket");
590 if(pcap_findalldevs ==
NULL || pcap_open_live ==
NULL ||
591 pcap_next_ex ==
NULL || pcap_sendpacket ==
NULL) {
592 error_exit(
"error on access to winpcap library\n");
603 struct pcap_pkthdr *packet_header;
604 unsigned char *packet;
606 switch(pcap_next_ex(pcap, &packet_header, &packet)) {
608 error_exit(
"error on poll\n");
622 for (i=0;i<UIP_LLADDR_LEN;i++)
if (*(packet+UIP_LLADDR_LEN+i)!=
uip_lladdr.addr[i])
break;
623 if (i==UIP_LLADDR_LEN) {
624 PRINTF(
"SIN: Discarding echoed packet\n");
636 || (*(packet+11) ==0x20)
638 printf(
"i%x",*(packet+11));
643 || (*(packet+5) !=0x1)
647 printf(
"r%x",*(packet+11));
658 CopyMemory(uip_buf, packet, packet_header->caplen);
659 return (uint16_t)packet_header->caplen;
663 #ifdef UIP_FALLBACK_INTERFACE
667 struct pcap_pkthdr *packet_header;
668 unsigned char *packet;
670 switch(pcap_next_ex(pfall, &packet_header, &packet)) {
672 error_exit(
"error on fallback poll\n");
677 #if FALLBACK_HAS_ETHERNET_HEADERS
678 #define ETHERNET_LLADDR_LEN 6
680 #define ETHERNET_LLADDR_LEN UIP_LLADDR_LEN
690 for (i=0;i<ETHERNET_LLADDR_LEN;i++)
if (*(packet+ETHERNET_LLADDR_LEN+i)!=
uip_lladdr.addr[i])
break;
691 if (i==ETHERNET_LLADDR_LEN) {
692 PRINTF(
"Discarding echoed packet\n");
700 PRINTF(
"FIN: %lu\n", packet_header->caplen);
701 CopyMemory(uip_buf, packet, packet_header->caplen);
702 return (uint16_t)packet_header->caplen;
715 (&BUF->dest)->addr[0] = 0x33;
716 (&BUF->dest)->addr[1] = 0x33;
717 (&BUF->dest)->addr[2] = IPBUF->destipaddr.u8[12];
718 (&BUF->dest)->addr[3] = IPBUF->destipaddr.u8[13];
719 (&BUF->dest)->addr[4] = IPBUF->destipaddr.u8[14];
720 (&BUF->dest)->addr[5] = IPBUF->destipaddr.u8[15];
723 if ((lladdr->addr[0]==0)&&(lladdr->addr[1]==0)&&(lladdr->addr[2]==0)&&(lladdr->addr[3]==0)&&(lladdr->addr[4]==0)&&(lladdr->addr[5]==0)) {
724 (&BUF->dest)->addr[0] = 0x33;
725 (&BUF->dest)->addr[1] = 0x33;
726 (&BUF->dest)->addr[2] = IPBUF->destipaddr.u8[12];
727 (&BUF->dest)->addr[3] = IPBUF->destipaddr.u8[13];
728 (&BUF->dest)->addr[4] = IPBUF->destipaddr.u8[14];
729 (&BUF->dest)->addr[5] = IPBUF->destipaddr.u8[15];
731 memcpy(&BUF->dest, lladdr, UIP_LLADDR_LEN);
734 memcpy(&BUF->src, &
uip_lladdr, UIP_LLADDR_LEN);
736 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]);
737 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]);
738 PRINTF(
" Type=%04x\n",BUF->type);
741 if(pcap_sendpacket(pcap, uip_buf,
uip_len) == -1) {
742 error_exit(
"error on send\n");
746 #ifdef UIP_FALLBACK_INTERFACE
750 #if FALLBACK_HAS_ETHERNET_HEADERS
753 {
int i;
for(i=
uip_len;i>=0;--i) *(
char *)(uip_buf+i+14) = *(
char *)(uip_buf+i);}
758 (&BUF->dest)->addr[0] = 0x33;
759 (&BUF->dest)->addr[1] = 0x33;
760 (&BUF->dest)->addr[2] = IPBUF->destipaddr.u8[12];
761 (&BUF->dest)->addr[3] = IPBUF->destipaddr.u8[13];
762 (&BUF->dest)->addr[4] = IPBUF->destipaddr.u8[14];
763 (&BUF->dest)->addr[5] = IPBUF->destipaddr.u8[15];
765 memcpy(&BUF->dest, lladdr, UIP_LLADDR_LEN);
767 memcpy(&BUF->src, &
uip_lladdr, UIP_LLADDR_LEN);
769 PRINTF(
"Srcf= %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]);
770 PRINTF(
" Dstf= %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]);
771 PRINTF(
" Typef=%04x\n",BUF->type);
774 if(pcap_sendpacket(pfall, uip_buf,
uip_len) == -1) {
775 error_exit(
"error on fallback send\n");
791 if(pcap_sendpacket(pcap, uip_buf,
uip_len) == -1) {
792 error_exit(
"error on send\n");
uip_len
The length of the packet in the uip_buf buffer.
#define uip_setethaddr(eaddr)
Specifiy the Ethernet MAC address.
CCIF uip_lladdr_t uip_lladdr
Host L2 address.
void __attribute__((interrupt))
This ISR handles most of the business interacting with the 1-wire bus.
#define NULL
The null pointer.
#define UIP_BUFSIZE
The size of the uIP packet buffer.
#define UIP_HTONS(n)
Convert 16-bit quantity from host byte order to network byte order.
#define uiplib_ipaddrconv
Convert a textual representation of an IP address to a numerical representation.
#define UIP_IP_BUF
Pointer to IP header.
#define uip_ipaddr_copy(dest, src)
Copy an IP address from one place to another.