Diffstat (limited to 'noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc | 122 |
1 files changed, 66 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 @@ -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"); @@ -63,71 +63,81 @@ int card_into_monitormode (pcap_t **orighandle, char *device, int cardtype) 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; + } } |