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 | |
parent | 9062b40d50264bc479ee0425778c552ef20ee304 (diff) | |
download | opie-2e7e176817b5d162b054f97ed6650e659730f4ae.zip opie-2e7e176817b5d162b054f97ed6650e659730f4ae.tar.gz opie-2e7e176817b5d162b054f97ed6650e659730f4ae.tar.bz2 |
Flags and datalink
-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 @@ -2,132 +2,142 @@ * 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; } } - 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 @@ -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 */ |