6 files changed, 135 insertions, 34 deletions
diff --git a/noncore/net/wellenreiter/daemon/source/daemon.cc b/noncore/net/wellenreiter/daemon/source/daemon.cc index 3a28217..b840f17 100644 --- a/noncore/net/wellenreiter/daemon/source/daemon.cc +++ b/noncore/net/wellenreiter/daemon/source/daemon.cc @@ -13,2 +13,3 @@ + /* Main function of wellenreiterd */ @@ -20,3 +21,3 @@ int main(int argc, char **argv) struct sockaddr_in saddr; - pcap_t *handletopcap; +// pcap_t *handletopcap; wl_cardtype_t cardtype; @@ -42,22 +43,10 @@ int main(int argc, char **argv) - /* set card into monitor mode */ - if(!card_into_monitormode(&handletopcap, cardtype.iface, - cardtype.type)) + /* Until we do not act as a read daemon, it starts the sniffer + right after startup */ + if (!start_sniffer(cardtype.iface,cardtype.type)) { - wl_logerr("Cannot initialize the wireless-card, aborting"); - exit(EXIT_FAILURE); + wl_logerr("daemon, start_sniff did not return proper, aborting"); + exit(EXIT_FAILURE); } - wl_loginfo("Set card into monitor mode"); - - /* setup pcap */ - if((handletopcap = pcap_open_live(cardtype.iface, - BUFSIZ, 1, 0, NULL)) == NULL) - { - wl_logerr("pcap_open_live() failed: %s", strerror(errno)); - exit(EXIT_FAILURE); - } - -#ifdef HAVE_PCAP_NONBLOCK - pcap_setnonblock(handletopcap, 1, NULL); -#endif + wl_loginfo ("daemon, wireless card prepared for sniffing"); diff --git a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc index 7c9fbc4..4f187c0 100644 --- a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc +++ b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc @@ -8,5 +8,5 @@ #include "wl_log.hh" - +pcap_t *handletopcap; /* main card into monitor function */ -int card_into_monitormode (pcap_t **orighandle, const char *device, int cardtype) +int card_into_monitormode (const char *device, int cardtype) { @@ -154,2 +154,47 @@ int card_check_rfmon_datalink (const char *device) +/* Ipaq running familiar does not have a loopback device, we need one */ +int check_loopback() +{ + /* Checking for a loopback interface with 127.0.0.1, otherwise the other stuff seems to fail on + familiar linux on ipaq's */ + int err; + /* First generate a socket to use with iocalls */ + int fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + { + /* In case of an error */ + wl_logerr("check_loopback, generation of a socket failed, cannot continue"); + return 0; + } + /* Fill an empty an interface structure with the right flags (UP and Promsic) */ + struct ifreq ifr; + strncpy(ifr.ifr_name, "lo",3); + + /* Get the interface flags, loopback interfaces can be detected that way */ + err = ioctl(fd, SIOCGIFFLAGS, &ifr); + if (err < 0) + { + wl_logerr("check_loopback, could not get the flags of lo, check if you got a lo loopback interface, cannot continue"); + close(fd); + return 0; + } + /* Checking the flags for IFF_LOOPBACK flags */ + if(ifr.ifr_flags && IFF_LOOPBACK) + { + /* Yes, we do have a loopback interface....sup! */ + close(fd); + wl_loginfo ("check_loopback, check for loopback interface lo successful"); + return 1; + } + else + { + wl_logerr("check_loopback, did not found an interface lo with the IFF_LOOPBACK flag set, cannot continue"); + close(fd); + return 0; + } + /* Should never be reached */ + return 0; +} /*check_loopback */ + + /* Set card into promisc mode */ @@ -217,12 +262,2 @@ int card_remove_promisc (const char *device) struct ifreq ifr; -/* strncpy(ifr.ifr_name, device,10); - ifr.ifr_flags = IFF_UP + IFF_PROMISC; - err = ioctl(fd, SIOCSIFFLAGS, &ifr); - if (err < 0) - { - perror("Could not access the interface, "); - close(fd); - return 0; - } - */ /* Get the flags from the interface*/ diff --git a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh index 58e99ac..73e0ae1 100644 --- a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh +++ b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh @@ -40,2 +40,4 @@ extern "C" +extern pcap_t *handletopcap; + /* Defines, used for the card setup */ @@ -60,3 +62,4 @@ extern "C" int card_check_rfmon_datalink (const char *device); -int card_into_monitormode (pcap_t **, const char *, int); +int card_into_monitormode (const char *, int); +int check_loopback(); int card_set_promisc_up (const char *device); @@ -69,3 +72,2 @@ int card_detect_channels (char * device); - /*------------------------------------------------------------------*/ diff --git a/noncore/net/wellenreiter/libwellenreiter/source/sniff.cc b/noncore/net/wellenreiter/libwellenreiter/source/sniff.cc index 6e512c4..0616a7e 100644 --- a/noncore/net/wellenreiter/libwellenreiter/source/sniff.cc +++ b/noncore/net/wellenreiter/libwellenreiter/source/sniff.cc @@ -12,2 +12,73 @@ #include "wl_proto.hh" +#include "cardmode.hh" + +int start_sniffer(const char *device, int cardtype ) +{ + + /* This function initialize the sniffing + 1. Check for lo interface + 2. bring it into promsicous mode and UP + 3. bring device into rfmon mode + start the pcap sniffing process. + */ + + /* Do we have the device name ? */ + if(device == NULL) + { + wl_logerr("start_sniffer, parameter \"device\" is empty, please check your config"); + return 0; + } + + /* Some Linux System does not have a loopback device lo with 127.0.0.1 so sockets could + not made correctly, let the proggie check that and proceed only if it exists. */ + if (!check_loopback()) + { + wl_logerr("start_sniffer, check_loopback failed, cannot continue without a loopback"); + return 0; + } + + /* Set the card into regulary promiscous mode first and set the UP flag, in case no ip + was given. It would work without the promisc flags but i dont like this */ + if (!card_set_promisc_up(device)) + { + wl_logerr("start_sniffer, card_set_promisc_up failed, cannot continue"); + return 0; + } + + /* Set card into the rfmon/monitoring mode */ + if (!card_into_monitormode(device,cardtype)) + { + wl_logerr("start_sniffer, cannot put wireless card into monitoring mode, aborting"); + return 0; + } + + /* setup pcap handle, used for the packet decoding etc. */ + if((handletopcap = pcap_open_live((char *) device, BUFSIZ, 1, 0, NULL)) == NULL) + { + wl_logerr("pcap_open_live() failed: %s", strerror(errno)); + return 0; + } + +#ifdef HAVE_PCAP_NONBLOCK + pcap_setnonblock(handletopcap, 1, NULL); +#endif + return 1; +} + + +int stop_sniffer(const char *device, int cardtype) +{ + /* This function terminates the sniffing + 1. get the device state + 2. remove the rfmon state + 3. Remove the promisc state + start the pcap sniffing process. + + */ + + /* Do we really have at least a lo interface with the 127.0.0.1 ? */ + return 0; + +} + diff --git a/noncore/net/wellenreiter/libwellenreiter/source/sniff.hh b/noncore/net/wellenreiter/libwellenreiter/source/sniff.hh index c7108ac..a4cf4b7 100644 --- a/noncore/net/wellenreiter/libwellenreiter/source/sniff.hh +++ b/noncore/net/wellenreiter/libwellenreiter/source/sniff.hh @@ -42,2 +42,6 @@ struct packetinfo +/* Function definitions */ +/* Used for stoping and starting the sniffer process */ +int start_sniffer(const char *device, int cardtype); +int stop_sniffer(const char *device, int cardtype); void process_packets(const struct pcap_pkthdr* pkthdr,const u_char* packet, char *, int); @@ -46,3 +50,2 @@ void etheraddr_string(register const u_char *ep,char * text); int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo); - int GetHeaderLength(u_int16_t fc); diff --git a/noncore/net/wellenreiter/libwellenreiter/source/wl_types.hh b/noncore/net/wellenreiter/libwellenreiter/source/wl_types.hh index cd482fe..afc105c 100644 --- a/noncore/net/wellenreiter/libwellenreiter/source/wl_types.hh +++ b/noncore/net/wellenreiter/libwellenreiter/source/wl_types.hh @@ -40,2 +40,3 @@ typedef struct { + #endif /* WL_TYPES_HH */ |