void wpcap_init(void) { struct in_addr addr; FARPROC dlladdr; addr.s_addr = htonl(WCAP_IPADDR); printf("wpcap_init: IP address: %s\n", inet_ntoa(addr)); wpcap = LoadLibrary("wpcap.dll"); dlladdr = GetProcAddress(wpcap, "pcap_findalldevs"); pcap_findalldevs = (pcap_findalldevs_t)dlladdr; dlladdr = GetProcAddress(wpcap, "pcap_open_live"); pcap_open_live = (pcap_open_live_t)dlladdr; dlladdr = GetProcAddress(wpcap, "pcap_next_ex"); pcap_next_ex = (pcap_next_ex_t)dlladdr; dlladdr = GetProcAddress(wpcap, "pcap_sendpacket"); pcap_sendpacket = (pcap_sendpacket_t)dlladdr; if (pcap_findalldevs == NULL || pcap_open_live == NULL || pcap_next_ex == NULL || pcap_sendpacket == NULL) { error_exit("error on access to winpcap library\n"); } init_pcap(addr); set_ethaddr(addr); }
/*---------------------------------------------------------------------------*/ void wpcap_init(void) { struct in_addr addr; addr.s_addr = inet_addr((*__argv)[1]); if(addr.s_addr == INADDR_NONE) { error_exit("usage: <program> <ip addr of ethernet card to share>\n"); } printf("wpcap_init: cmdline address: %s\n", inet_ntoa(addr)); wpcap = LoadLibrary("wpcap.dll"); (FARPROC)pcap_findalldevs = GetProcAddress(wpcap, "pcap_findalldevs"); (FARPROC)pcap_open_live = GetProcAddress(wpcap, "pcap_open_live"); (FARPROC)pcap_next_ex = GetProcAddress(wpcap, "pcap_next_ex"); (FARPROC)pcap_sendpacket = GetProcAddress(wpcap, "pcap_sendpacket"); if(pcap_findalldevs == NULL || pcap_open_live == NULL || pcap_next_ex == NULL || pcap_sendpacket == NULL) { error_exit("error on access to winpcap library\n"); } init_pcap(addr); set_ethaddr(addr); }
/*---------------------------------------------------------------------------*/ void wpcap_init(void) { struct in_addr addr; #ifdef __CYGWIN__ addr.s_addr = inet_addr((*__argv)[1]); #else /* __CYGWIN__ */ addr.s_addr = inet_addr(__argv[1]); #endif /* __CYGWIN__ */ if(addr.s_addr == INADDR_NONE) { // error_exit("usage: <program> <ip addr of ethernet card to share>\n"); addr.s_addr = inet_addr("10.10.10.10"); log_message("usage: <program> <ip addr of ethernet card to share>\n-->I'll try guessing ", inet_ntoa(addr)); } else { log_message("wpcap_init:cmdline address: ", inet_ntoa(addr)); } wpcap = LoadLibrary("wpcap.dll"); pcap_findalldevs = (int (*)(struct pcap_if **, char *)) GetProcAddress(wpcap, "pcap_findalldevs"); pcap_open_live = (struct pcap *(*)(char *, int, int, int, char *)) GetProcAddress(wpcap, "pcap_open_live"); pcap_next_ex = (int (*)(struct pcap *, struct pcap_pkthdr **, unsigned char **)) GetProcAddress(wpcap, "pcap_next_ex"); pcap_sendpacket = (int (*)(struct pcap *, unsigned char *, int)) GetProcAddress(wpcap, "pcap_sendpacket"); if(pcap_findalldevs == NULL || pcap_open_live == NULL || pcap_next_ex == NULL || pcap_sendpacket == NULL) { error_exit("error on access to winpcap library\n"); } init_pcap(addr); set_ethaddr(addr); }
/*---------------------------------------------------------------------------*/ static void init_pcap(struct in_addr addr) { struct pcap_if *interfaces; struct pcap_addr *paddr; char error[256]; if(pcap_findalldevs(&interfaces, error) == -1) { error_exit(error); } while(interfaces != NULL) { log_message("init_pcap: found interface: ", interfaces->description); if(interfaces->addresses != NULL) { for(paddr = interfaces->addresses; paddr != NULL; paddr = paddr->next) { if(paddr->addr != NULL && paddr->addr->sa_family == AF_INET) { struct in_addr interface_addr; interface_addr = ((struct sockaddr_in *)paddr->addr)->sin_addr; log_message("init_pcap: with address: ", inet_ntoa(interface_addr)); if(interface_addr.s_addr == addr.s_addr) { pcap = pcap_open_live(interfaces->name, UIP_BUFSIZE, 0, -1, error); if(pcap == NULL) { error_exit(error); } #ifdef UIP_FALLBACK_INTERFACE log_message("init_pcap: Opened as primary interface",""); #endif // pcap_setdirection(PCAP_D_IN); //Not implemented in windows yet? set_ethaddr(addr); #ifdef UIP_FALLBACK_INTERFACE } if (pfall && pcap) return; if(interface_addr.s_addr == addrfall.s_addr) { pfall = pcap_open_live(interfaces->name, UIP_BUFSIZE, 0, -1, error); if(pfall == NULL) { error_exit(error); } log_message("init_pcap: Opened as fallback interface",""); if (pcap) return; } #else return; } #endif #if UIP_CONF_IPV6 } else if(paddr->addr != NULL && paddr->addr->sa_family == AF_INET6) { struct in6_addr interface_addr; interface_addr = ((struct sockaddr_in6 *)paddr->addr)->sin6_addr; sprint_ip6addr(interface_addr, addr6str); log_message("init_pcap: with ipv6 address: ", addr6str); if (issame_ip6addr(interface_addr, addr6)) { pcap = pcap_open_live(interfaces->name, UIP_BUFSIZE, 0, -1, error); if(pcap == NULL) { error_exit(error); } #ifdef UIP_FALLBACK_INTERFACE log_message("init_pcap: Opened as primary interface",""); #endif set_ethaddr6(addr6); // pcap_setdirection(PCAP_D_IN); //Not implemented in windows yet? #ifdef UIP_FALLBACK_INTERFACE } if (pfall && pcap) return; //exit when we have both interfaces if (issame_ip6addr(interface_addr, addrfall6)) { pfall = pcap_open_live(interfaces->name, UIP_BUFSIZE, 0, -1, error); if(pfall == NULL) { error_exit(error); } log_message("init_pcap: Opened as fallback interface",""); if (pcap) return; } #else return; } #endif #endif /* UIP_CONF_IPV6 */ } }