-rw-r--r-- | noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc | 122 | ||||
-rw-r--r-- | noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh | 2 |
2 files changed, 68 insertions, 56 deletions
diff --git a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc index def1a4b..1add34c 100644 --- a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc +++ b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc @@ -1,133 +1,143 @@ /* * Set card modes for sniffing * * $Id$ */ #include "cardmode.hh" #include "wl_log.hh" /* main card into monitor function */ int card_into_monitormode (pcap_t **orighandle, 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) { wl_logerr("No device given"); return 0; } /* Setting the promiscous and up flag to the interface */ if (!card_set_promisc_up(device)) { - wl_logerr("Cannot set interface to promisc mode: %s", strerror(errno)); + wl_logerr("Cannot set interface to promisc mode"); return 0; } wl_loginfo("Interface set to promisc mode"); /* Check the cardtype and executes the commands to go into monitor mode */ if (cardtype == CARD_TYPE_CISCO) { /* bring the sniffer into rfmon mode */ snprintf(CiscoRFMON, sizeof(CiscoRFMON) - 1, DEFAULT_PATH, device); if((CISCO_CONFIG_FILE = fopen(CiscoRFMON,"w")) == NULL) { wl_logerr("Cannot open config file: %s", strerror(errno)); return 0; } fputs ("Mode: r",CISCO_CONFIG_FILE); fputs ("Mode: y",CISCO_CONFIG_FILE); fputs ("XmitPower: 1",CISCO_CONFIG_FILE); fclose(CISCO_CONFIG_FILE); } else if (cardtype == CARD_TYPE_NG) { char wlanngcmd[62]; snprintf(wlanngcmd, sizeof(wlanngcmd) - 1, "%s %s lnxreq_wlansniff channel=1 enable=true", WLANCTL_PATH, device); if (system(wlanngcmd) != 0) { wl_logerr("Could not set %s in raw mode, check cardtype", device); return 0; } } else if (cardtype == CARD_TYPE_HOSTAP) { wl_logerr("Got a host-ap card, nothing is implemented now"); char hostapcmd[250]; snprintf(hostapcmd, sizeof(hostapcmd) -1, "%s %s monitor 2", IWPRIV_PATH, device); if (system(hostapcmd) !=0) { wl_logerr("Could not set %s in raw mode, check cardtype", device); return 0; } } - + + /* Setting the promiscous and up flag to the interface */ + if (!card_check_rfmon_datalink(device)) + { + wl_logerr("Cannot set interface to rfmon mode"); + return 0; + } + else + { + wl_loginfo("Interface set to rfmon mode"); + } return 1; } +/* Check card is in the rfmon mode */ +int card_check_rfmon_datalink (char *device) +{ + int datalinktype=0; + pcap_t *phandle; + phandle = pcap_open_live(device, 65,0,0,NULL); + datalinktype = pcap_datalink (phandle); + + if (datalinktype != DLT_IEEE802_11) /* Rawmode is IEEE802_11 */ + { + return 0; + } + else + { + wl_loginfo("Your successfully listen on %s in 802.11 raw mode", device); + return 1; + } +} + /* Set card into promisc mode */ int card_set_promisc_up (const char *device) { - struct ifconf ifc; - struct ifreq ifr_x[50]; - u_int i; - int sockfd, err; - err=0; - /* opening a socket for issuing the iocalls */ - sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); - - if (sockfd < 0) + 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 - mjm proove that please*/ + /* In case of an error */ perror("socket"); - return 1; + 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, "); + return 0; } - /* Define room for 50 interfaces */ - ifc.ifc_len = 50 * sizeof(struct ifreq); - ifc.ifc_req = ifr_x; - /* Get the config of the interfaces */ - err = ioctl(sockfd, SIOCGIFCONF, &ifc); - if (err == -1) return 1; - /* For each interface*/ - for (i = 0; i < ifc.ifc_len / sizeof(struct ifreq); i++) - { - /* To complete , should get the IP, if no is assigned, asign one */ - /*err = ioctl(sockfd, SIOCGIFADDR, &ifr_x[i]); - if (err == -1) perror("SIOCGIFADDR: "); - printf ("Address: %s\n",Sock_ntop_host(ifr_x[i].ifr_addr.sa_family,sizeof(ifr_x[i].ifr_addr.sa_family))); - */ - if(strncmp(ifr_x[i].ifr_name,device,5) == 0) - { - /* Get the flags */ - err = ioctl(sockfd, SIOCGIFFLAGS, &ifr_x[i]); - if (err == -1) - { - perror("SIOCGIFFLAGS: "); - return 1; - } - /* Check if the Interface is UP and PROMISC */ - if (ifr_x[i].ifr_flags & IFF_PROMISC && ifr_x[i].ifr_flags & IFF_UP) - { - /* only debug text */ - printf ("%s is PROMISC and UP \n",ifr_x[i].ifr_name); - } - else - { - /* Set the promisc flag to the interface */ - ifr_x[i].ifr_flags=ifr_x[i].ifr_flags+IFF_PROMISC; - err = ioctl(sockfd, SIOCSIFFLAGS, &ifr_x[i]); - if (err == -1) - { - /* Could not set the interface into promisc mode */ - perror("SIOCSIFFLAGS: "); - } - } - } - } - /* All is fine */ + /* Get the informations back from the interface to check if the flags are correct */ + strncpy(ifr.ifr_name, device,10); + ioctl(fd, SIOCGIFFLAGS, &ifr); + if (err < 0) + { + perror("Could not access the interface, "); return 0; + } + + if(ifr.ifr_flags && IFF_UP) + { + printf("%s is ok\n", device); + return 1; + } + else + { + printf("%s flags could not be set", device); + return 0; + } } diff --git a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh index 7750fb6..babb109 100644 --- a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh +++ b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh @@ -1,41 +1,43 @@ /* $Id$ */ #ifndef CARDMODE_HH #define CARDMODE_HH #include <string.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/time.h> #include <sys/socket.h> #include <netinet/in.h> +#include <arpa/inet.h> #include <sys/ioctl.h> #include <linux/if.h> extern "C" { #include <net/bpf.h> #include <pcap.h> } /* 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 /* only for now, until we have the daemon running */ /*the config file should provide these information */ #define CARD_TYPE CARD_TYPE_HOSTAP #define SBIN_PATH "/sbin/ifconfig %s promisc up" #define WLANCTL_PATH "/sbin/wlanctl-ng" #define IWPRIV_PATH "/sbin/iwpriv" /* Prototypes */ +int card_check_rfmon_datalink (char *device); int card_into_monitormode (pcap_t **, char *, int); int card_set_promisc_up (const char *); #endif /* CARDMODE_HH */ |