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 @@ -8,20 +8,21 @@ #include "daemon.hh" /* should be parsed from cfg-file */ #define MAXCHANNEL 13 #define CHANINTERVAL 500000 + /* Main function of wellenreiterd */ int main(int argc, char **argv) { int sock, maxfd, retval; char buffer[WL_SOCKBUF]; struct pcap_pkthdr header; struct sockaddr_in saddr; - pcap_t *handletopcap; +// pcap_t *handletopcap; wl_cardtype_t cardtype; pthread_t sub; const unsigned char *packet; fd_set rset; @@ -37,32 +38,20 @@ int main(int argc, char **argv) /* Set card type */ cardtype.type = atoi(argv[2]); if(cardtype.type < 1 || cardtype.type > 4) usage(); - /* 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"); /* Setup socket for incoming commands */ if((sock=wl_setupsock(DAEMONADDR, DAEMONPORT, saddr)) < 0) { wl_logerr("Cannot setup socket"); exit(EXIT_FAILURE); 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 @@ -3,15 +3,15 @@ * * $Id$ */ #include "cardmode.hh" #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) { char CiscoRFMON[35] = "/proc/driver/aironet/"; FILE *CISCO_CONFIG_FILE; /* Checks if we have a device to sniff on */ if(device == NULL) @@ -149,12 +149,57 @@ int card_check_rfmon_datalink (const char *device) { wl_loginfo("Your successfully listen on %s in 802.11 raw mode", device); return 1; } } +/* 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 */ int card_set_promisc_up (const char *device) { int err; /* First generate a socket to use with iocalls */ int fd = socket(AF_INET, SOCK_DGRAM, 0); @@ -212,22 +257,12 @@ int card_remove_promisc (const char *device) perror("socket"); return 0; } /* Fill an empty an interface structure with the right flags (UP and Promsic) */ 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*/ strncpy(ifr.ifr_name, device,10); err = ioctl(fd, SIOCGIFFLAGS, &ifr); if (err < 0) { perror("Could not access 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 @@ -35,12 +35,14 @@ typedef unsigned long long u64; extern "C" { #include <net/bpf.h> #include <pcap.h> } +extern pcap_t *handletopcap; + /* Defines, used for the card setup */ #define DEFAULT_PATH "/proc/driver/aironet/%s/Config" #define CISCO_STATUS "/proc/driver/aironet/%s/Status" #define CARD_TYPE_CISCO 1 #define CARD_TYPE_NG 2 #define CARD_TYPE_HOSTAP 3 @@ -55,22 +57,22 @@ extern "C" /* only for now, until we have the daemon running */ /*the config file should provide these information */ #define CARD_TYPE CARD_TYPE_HOSTAP /* Prototypes */ 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); int card_remove_promisc (const char *device); int card_set_channel (const char *device, int channel,int cardtype); int iw_get_range_info(int skfd, const char * ifname, struct iw_range * range); double iw_freq2float(iw_freq * in); void iw_float2freq(double in, iw_freq * out); int card_detect_channels (char * device); - /*------------------------------------------------------------------*/ /* * Wrapper to push some Wireless Parameter in the driver */ static inline int iw_set_ext(int skfd, /* Socket to the kernel */ 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 @@ -7,12 +7,83 @@ #include "sniff.hh" #include "ieee802_11.hh" #include "extract.hh" #include "wl_log.hh" #include "wl_types.hh" #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; + +} + /* Main function, checks packets */ void process_packets(const struct pcap_pkthdr *pkthdr, const unsigned char *packet, char *guihost, int guiport) 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 @@ -37,17 +37,20 @@ struct packetinfo char desthwaddr[sizeof("00:00:00:00:00:00") + 1]; char sndhwaddr[sizeof("00:00:00:00:00:00") + 1]; char ssid[128]; int ssid_len; }; +/* 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); int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo); 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); /* * True if "l" bytes of "var" were captured. * * The "snapend - (l) <= snapend" checks to make sure "l" isn't so large 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 @@ -35,8 +35,9 @@ typedef struct { } wl_network_t; /* Config specific */ #define WL_CONFFILE "sample.conf" #define WL_CONFBUFF 128 + #endif /* WL_TYPES_HH */ |