From 38f0ac4a361a5dd9d8766e2b12aae6d5ae1971df Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Thu, 19 Jun 2008 07:52:28 +0000 Subject: [PATCH] Made wpcapslip work with IPv6 enabled. Added -l option to turn on logging. --- tools/wpcapslip/wpcap.c | 62 ++++++++++++++++++++++--------------- tools/wpcapslip/wpcapslip.c | 14 ++++++--- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/tools/wpcapslip/wpcap.c b/tools/wpcapslip/wpcap.c index 4d89f7e97..f6bdb427b 100644 --- a/tools/wpcapslip/wpcap.c +++ b/tools/wpcapslip/wpcap.c @@ -30,7 +30,7 @@ * * Author: Oliver Schmidt * - * $Id: wpcap.c,v 1.2 2008/02/24 21:14:25 adamdunkels Exp $ + * $Id: wpcap.c,v 1.3 2008/06/19 07:52:28 adamdunkels Exp $ */ @@ -78,17 +78,19 @@ static void raw_send(void *buf, int len); struct pcap; +struct pcap_addr { + struct pcap_addr *next; + struct sockaddr *addr; + struct sockaddr *netmask; + struct sockaddr *broadaddr; + struct sockaddr *dstaddr; +}; + struct pcap_if { struct pcap_if *next; char *name; char *description; - struct pcap_addr { - struct pcap_addr *next; - struct sockaddr *addr; - struct sockaddr *netmask; - struct sockaddr *broadaddr; - struct sockaddr *dstaddr; - } *addresses; + struct pcap_addr *addresses; DWORD flags; }; @@ -165,10 +167,14 @@ static uip_ipaddr_t ifaddr, netaddr, netmask; static int arptime; +static int logging; + static void log_message(char *msg1, char *msg2) { - /* printf("Log: %s %s\n", msg1, msg2);*/ + if(logging) { + printf("Log: %s %s\n", msg1, msg2); + } } /*---------------------------------------------------------------------------*/ static void @@ -182,6 +188,7 @@ 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) { @@ -191,16 +198,24 @@ init_pcap(struct in_addr addr) while(interfaces != NULL) { log_message("init_pcap: found interface: ", interfaces->description); - if(interfaces->addresses != NULL && - interfaces->addresses->addr != NULL && - interfaces->addresses->addr->sa_family == AF_INET) { - - struct in_addr interface_addr; - interface_addr = ((struct sockaddr_in *)interfaces->addresses->addr)->sin_addr; - log_message("init_pcap: with address: ", inet_ntoa(interface_addr)); - - if(interface_addr.s_addr == addr.s_addr) { - break; + 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, BUFSIZE, 0, -1, error); + if(pcap == NULL) { + error_exit(error); + } + return; + } + } } } interfaces = interfaces->next; @@ -209,11 +224,6 @@ init_pcap(struct in_addr addr) if(interfaces == NULL) { error_exit("no interface found with ip addr specified on cmdline\n"); } - - pcap = pcap_open_live(interfaces->name, BUFSIZE, 0, -1, error); - if(pcap == NULL) { - error_exit(error); - } } /*---------------------------------------------------------------------------*/ static void @@ -530,11 +540,13 @@ remove_route(int s) } /*---------------------------------------------------------------------------*/ void -wpcap_start(char *ethcardaddr, char *slipnetaddr, char *slipnetmask) +wpcap_start(char *ethcardaddr, char *slipnetaddr, char *slipnetmask, int log) { struct in_addr addr; char buf[4000]; + logging = log; + addr.s_addr = inet_addr(ethcardaddr); ifaddr.u32[0] = inet_addr(ethcardaddr); netaddr.u32[0] = inet_addr(slipnetaddr); diff --git a/tools/wpcapslip/wpcapslip.c b/tools/wpcapslip/wpcapslip.c index 660ec17d5..eb465ac08 100644 --- a/tools/wpcapslip/wpcapslip.c +++ b/tools/wpcapslip/wpcapslip.c @@ -30,7 +30,7 @@ * * Author: Oliver Schmidt * - * $Id: wpcapslip.c,v 1.2 2008/02/24 21:14:25 adamdunkels Exp $ + * $Id: wpcapslip.c,v 1.3 2008/06/19 07:52:28 adamdunkels Exp $ */ @@ -65,7 +65,7 @@ #define PROGRESS(x) -void wpcap_start(char *ethifaddr, char *netaddr, char *netmask); +void wpcap_start(char *ethifaddr, char *netaddr, char *netmask, int logging); void wpcap_send(void *buf, int len); @@ -663,13 +663,13 @@ main(int argc, char **argv) /* u_int16_t myport = BOOTPS, dhport = BOOTPS;*/ int baudrate = -2; char buf[4000]; - + int logging = 0; ip_id = getpid() * time(NULL); setvbuf(stdout, NULL, _IOLBF, 0); /* Line buffered output. */ - while((c = getopt(argc, argv, "B:D:hs:t:T")) != -1) { + while((c = getopt(argc, argv, "B:D:hls:t:T")) != -1) { switch (c) { case 'B': baudrate = atoi(optarg); @@ -700,6 +700,10 @@ main(int argc, char **argv) case 'T': should_print = 1; break; + + case 'l': + logging = 1; + break; case '?': case 'h': @@ -716,7 +720,7 @@ main(int argc, char **argv) } /* ipaddr = argv[1]; netmask = argv[2];*/ - wpcap_start(argv[1], argv[2], argv[3]); + wpcap_start(argv[1], argv[2], argv[3], logging); /* netaddr = inet_addr(ipaddr) & inet_addr(netmask);*/ switch(baudrate) {