author | max <max> | 2003-02-07 03:23:16 (UTC) |
---|---|---|
committer | max <max> | 2003-02-07 03:23:16 (UTC) |
commit | 2e7e176817b5d162b054f97ed6650e659730f4ae (patch) (side-by-side diff) | |
tree | 6b64a6ab7cbef944a564eabe6f63d8ac89eafefc /noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc | |
parent | 9062b40d50264bc479ee0425778c552ef20ee304 (diff) | |
download | opie-2e7e176817b5d162b054f97ed6650e659730f4ae.zip opie-2e7e176817b5d162b054f97ed6650e659730f4ae.tar.gz opie-2e7e176817b5d162b054f97ed6650e659730f4ae.tar.bz2 |
Flags and datalink
Diffstat (limited to 'noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc | 106 |
1 files changed, 58 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 @@ -25,3 +25,3 @@ int card_into_monitormode (pcap_t **orighandle, char *device, int cardtype) { - wl_logerr("Cannot set interface to promisc mode: %s", strerror(errno)); + wl_logerr("Cannot set interface to promisc mode"); return 0; @@ -67,67 +67,77 @@ int card_into_monitormode (pcap_t **orighandle, char *device, int cardtype) - 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; } +} |