-rw-r--r-- | noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc | 106 | ||||
-rw-r--r-- | noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh | 2 |
2 files changed, 60 insertions, 48 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 @@ -22,9 +22,9 @@ int card_into_monitormode (pcap_t **orighandle, char *device, int cardtype) /* 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"); @@ -64,70 +64,80 @@ int card_into_monitormode (pcap_t **orighandle, char *device, int cardtype) return 0; } } - return 1; -} - -/* Set card into promisc mode */ -int card_set_promisc_up (const char *device) + /* Setting the promiscous and up flag to the interface */ + if (!card_check_rfmon_datalink(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) + wl_logerr("Cannot set interface to rfmon mode"); + return 0; + } + else { - /* In case of an error - mjm proove that please*/ - perror("socket"); + wl_loginfo("Interface set to rfmon mode"); + } return 1; } - /* 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++) +/* Check card is in the rfmon mode */ +int card_check_rfmon_datalink (char *device) { - /* 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) + 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 */ { - /* Get the flags */ - err = ioctl(sockfd, SIOCGIFFLAGS, &ifr_x[i]); - if (err == -1) + return 0; + } + else { - perror("SIOCGIFFLAGS: "); + wl_loginfo("Your successfully listen on %s in 802.11 raw mode", device); 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 card into promisc mode */ +int card_set_promisc_up (const char *device) { - /* 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) + int err; + /* First generate a socket to use with iocalls */ + int fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) { - /* Could not set the interface into promisc mode */ - perror("SIOCSIFFLAGS: "); + /* In case of an error */ + 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, "); + return 0; } + + /* 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; } - /* All is fine */ + 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 @@ -9,8 +9,9 @@ #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> @@ -34,8 +35,9 @@ extern "C" #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 */ |