Main Page | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

driver.c

Go to the documentation of this file.
00001 /* Linux Prism II Stumbler - Utility Scan for 802_11 networks under Linux
00002  * 
00003  * File : driver.c
00004  * Project : WifiScanner (c) 2002 Hervé Schauer Consultants
00005  * Usage : This utility is written for use with IEEE 802.11 adapters based
00006  * on Intersil's PRISM II chipset (PCMCIA).
00007  * 
00008  * Base code was from prismstumbler Jan Fernquist <Jan.B.Fernquist@telia.com>
00009  * and wlanctl from www.linux-wlan.com
00010  *
00011  * This program is free software; you can redistribute it and/or
00012  * modify it under the terms of the GNU General Public License
00013  * as published by the Free Software Foundation; either version 2
00014  * of the License, or (at your option) any later version.
00015  * 
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU General Public License for more details.
00020  * 
00021  * You should have received a copy of the GNU General Public License
00022  * along with this program; if not, write to the Free Software
00023  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00024  *
00025  * $Id: driver.c,v 1.13 2005/01/27 16:24:55 poggij Exp $
00026  */
00027 
00028 #include <include.h>
00029 #include <src/interface.h>
00030 #include <src/crt_io.h>
00031 #include <src/driver.h>
00032 #include <src/wlan-ng.h>        // Abstraction layer of Wlan-NG
00033 #include <src/cisco.h>          // Abstraction layer of cisco
00034 #include <src/atheros.h>        // Abstraction layer of Atheros
00035 #include <src/prism54g.h>       // Abstraction layer of Prism54g
00036 #include <src/hostap.h>         // Abstraction layer of hostap
00037 #include <src/hermes.h>         // Abstraction layer of Lucent/Orinoco/Hermes Card
00038 
00039 #define NOT_YET_ANALIZED() perror("Type of packet is not yet analysed"); exit(EXIT_FAILURE)
00040 
00041 
00042 extern unsigned int DebugLevel;
00043 extern WINDOW *Sum_WND, *RealTime_WND;
00044 extern ScanResult_t Res;
00045 extern ConfigStruct config;
00046 
00047 //extern UINT8 TypeOfCard;
00048 #ifdef WITH_THREAD
00049 extern pthread_mutex_t screen_mutex;
00050 #endif
00051 
00052 p80211_caphdr_t wlan_header;
00053 
00054 /*
00055  * Function to determine what is the next channel to scan
00056  *  and select it
00057  */
00058 int NextChannel(char *devname, unsigned int NumberOfHop)
00059 {
00060   const UINT8 ListChannel[13][14] = {
00061     {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},    /* 1 */
00062     {1, 3, 5, 7, 9, 11, 13, 14, 2, 4, 6, 8, 10, 12},    /* 2 */
00063     {1, 4, 7, 10, 13, 2, 5, 8, 11, 14, 3, 6, 9, 12},    /* 3 */
00064     {1, 5, 9, 13, 3, 7, 11, 2, 6, 10, 14, 4, 8, 12},    /* 4 */
00065     {1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14, 5, 10},    /* 5 */
00066     {1, 7, 13, 5, 11, 3, 9, 2, 8, 14, 6, 12, 4, 10},    /* 6 */
00067     {1, 8, 2, 9, 3, 10, 4, 11, 5, 12, 6, 13, 7, 14},    /* 7 */
00068     {1, 7, 13, 5, 11, 3, 9, 2, 8, 14, 6, 12, 4, 10},    /* 8 */
00069     {1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14, 5, 10},    /* 9 */
00070     {1, 5, 9, 13, 3, 7, 11, 2, 6, 10, 14, 4, 8, 12},    /* 10 */
00071     {1, 4, 7, 10, 13, 2, 5, 8, 11, 14, 3, 6, 9, 12},    /* 11 */
00072     {1, 3, 5, 7, 9, 11, 13, 14, 2, 4, 6, 8, 10, 12},    /* 12 */
00073     {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},    /* 13 */
00074 
00075   };
00076   static UINT8 ChannelIndex = 0;
00077   int channel;
00078 
00079   if (NumberOfHop <= 7)
00080     channel = ListChannel[NumberOfHop - 1][ChannelIndex];
00081   else
00082     channel = ListChannel[NumberOfHop - 1][13 - ChannelIndex];
00083 
00084   ChannelIndex++;
00085   ChannelIndex = ChannelIndex % 14;
00086 
00087   //debug(3, "selectChannel (%s,%d)\n", devname, channel);
00088   return selectChannel(devname, channel);
00089 }
00090 
00091 /*
00092  * Configure the card to listen in promiscuous mode on desired channel
00093  */
00094 #ifdef HAVE_LIBNCURSES
00095 const UINT8 Posit[15] = { 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14 };
00096 const char *Indic[15] =
00097     { "", "^-.", "-^-.", ".-^-.", ".-^-.", ".-^-.", ".-^-.", ".-^-.",
00098   ".-^-.",
00099   ".-^-.", ".-^-.", ".-^-.", ".-^-.", ".-^-.", ".-^"
00100 };
00101 
00102 void PrintScaleChannel(int channel)
00103 {
00104 #ifdef WITH_THREAD
00105   pthread_mutex_lock(&screen_mutex);
00106 #endif
00107   mvwprintw(Sum_WND, 12, 7, "%02d", channel);
00108   mvwprintw(Sum_WND, 13, 2, "|_____________  _|");
00109   mvwprintw(Sum_WND, 13, 2 + Posit[channel], (char *) Indic[channel]);
00110   //mvwprintw (Sum_WND, 13, 2 + Posit[channel], "+");
00111   //mvwprintw (Sum_WND, 10, 20, "%02d", channel);
00112   //debug (2, "%02d\n", channel);
00113   wrefresh(Sum_WND);
00114 #ifdef WITH_THREAD
00115   pthread_mutex_unlock(&screen_mutex);
00116 #endif
00117 }
00118 #else
00119 #define PrintScaleChannel(x)
00120 #endif
00121 
00122 int selectChannel(char *devname, int channel)
00123 // It's a wrapper
00124 {
00125   int ret = 1;                  // ret == 0 : All is OK
00126 
00127   PrintScaleChannel(channel);
00128   Res.SChannel = channel;
00129 
00130   switch (config.TypeOfCard) {
00131   case WLAN_NG_CARD:
00132   case WLAN_NG_CARD_AVS_CFF2:
00133     ret = selectChannelWLAN(devname, channel);
00134     break;
00135   case CISCO_CARD:
00136   case CISCO_CVS_CARD:
00137     // Nothink to do :-)
00138     //  Its done by hardware
00139     ret = 0;
00140     break;
00141   case LUCENT_CARD:
00142     ret = selectChannelHERMES(devname, channel);
00143     break;
00144   case HOSTAP_CARD:
00145     ret = selectChannelHOSTAP(devname, channel);
00146     break;
00147   case ATHEROS_CARD:
00148     ret = selectChannelATHEROS(devname, channel);
00149     break;
00150   case PRISM54G_CARD:
00151     ret = selectChannelPRISM54g(devname, channel);
00152     break;
00153   case PCAP_VIRTUAL_CARD:
00154     // Nothink to do :-)
00155     //  it's a file !
00156     ret = 0;
00157     break;
00158   default:
00159     perror("Arrrrggg, type of packet is unknowned !!!");
00160     exit(EXIT_FAILURE);
00161     break;
00162   }
00163   DEBUG_POINT;
00164   return ret;
00165 }
00166 
00167 int shutCard(char *devname)
00168 {
00169   int ret = FALSE;
00170 
00171   switch (config.TypeOfCard) {
00172   case WLAN_NG_CARD:
00173   case WLAN_NG_CARD_AVS_CFF2:
00174     ret = shutCardWLAN(devname);
00175     break;
00176   case CISCO_CARD:
00177   case CISCO_CVS_CARD:
00178     ret = shutCardCISCO(devname);
00179     break;
00180   case LUCENT_CARD:
00181     ret = shutCardHERMES(devname);
00182     break;
00183   case HOSTAP_CARD:
00184     ret = shutCardHOSTAP(devname);
00185     break;
00186   case ATHEROS_CARD:
00187     ret = shutCardATHEROS(devname);
00188     break;
00189   case PRISM54G_CARD:
00190     ret = shutCardPRISM54g(devname);
00191     break;
00192   case PCAP_VIRTUAL_CARD:
00193     NOT_YET_ANALIZED();
00194     break;
00195   default:
00196     perror("Arrrrggg, type of packet is unknowned !!!");
00197     exit(EXIT_FAILURE);
00198     break;
00199   }
00200   return ret;
00201 }
00202 
00203 int openCard(char *devname)
00204 {
00205   int ret = FALSE;
00206 
00207   switch (config.TypeOfCard) {
00208   case WLAN_NG_CARD:
00209   case WLAN_NG_CARD_AVS_CFF2:
00210     ret = openCardWLAN(devname);
00211     break;
00212   case CISCO_CARD:
00213   case CISCO_CVS_CARD:
00214     ret = openCardCISCO(devname);
00215     break;
00216   case LUCENT_CARD:
00217     ret = openCardHERMES(devname);
00218     break;
00219   case HOSTAP_CARD:
00220     ret = openCardHOSTAP(devname);
00221     break;
00222   case ATHEROS_CARD:
00223     ret = openCardATHEROS(devname);
00224     break;
00225   case PRISM54G_CARD:
00226     ret = openCardPRISM54g(devname);
00227     break;
00228   case PCAP_VIRTUAL_CARD:
00229     NOT_YET_ANALIZED();
00230     break;
00231   default:
00232     perror("Arrrrggg, type of packet is unknowned !!!");
00233     exit(EXIT_FAILURE);
00234     break;
00235   }
00236   return ret;
00237 }
00238 
00239 
00240 /*
00241  * Open the NETLINK Device
00242  */
00243 int openPacket(char *devname)
00244 {
00245   int ret = 0;
00246 
00247   switch (config.TypeOfCard) {
00248   case WLAN_NG_CARD:
00249     ret = openPacketWLAN(devname);
00250     break;
00251   case WLAN_NG_CARD_AVS_CFF2:
00252     NOT_YET_ANALIZED();
00253     break;
00254   case CISCO_CARD:
00255   case CISCO_CVS_CARD:
00256     ret = openPacketCISCO(devname);
00257     break;
00258   case LUCENT_CARD:
00259     ret = openPacketHERMES(devname);
00260     break;
00261   case HOSTAP_CARD:
00262     ret = openPacketHOSTAP(devname);
00263     break;
00264   case ATHEROS_CARD:
00265     ret = openPacketATHEROS(devname);
00266     break;
00267   case PRISM54G_CARD:
00268     ret = openPacketPRISM54g(devname);
00269     break;
00270   case PCAP_VIRTUAL_CARD:
00271     NOT_YET_ANALIZED();
00272     break;
00273   default:
00274     perror("Arrrrggg, type of packet is unknowned !!!");
00275     exit(EXIT_FAILURE);
00276     break;
00277   }
00278   return ret;
00279 }
00280 
00281 /*
00282  * Just a wrapper....
00283  */
00284 void closePacket(void)
00285 {
00286   switch (config.TypeOfCard) {
00287   case WLAN_NG_CARD:
00288     closePacketWLAN();
00289     break;
00290   case WLAN_NG_CARD_AVS_CFF2:
00291     NOT_YET_ANALIZED();
00292     break;
00293   case CISCO_CARD:
00294   case CISCO_CVS_CARD:
00295     closePacketCISCO();
00296     break;
00297   case LUCENT_CARD:
00298     closePacketHERMES();
00299     break;
00300   case HOSTAP_CARD:
00301     closePacketHOSTAP();
00302     break;
00303   case ATHEROS_CARD:
00304     closePacketATHEROS();
00305     break;
00306   case PRISM54G_CARD:
00307     closePacketPRISM54g();
00308     break;
00309   case PCAP_VIRTUAL_CARD:
00310     NOT_YET_ANALIZED();
00311     break;
00312   default:
00313     perror("Arrrrggg, type of packet is unknowned !!!");
00314     exit(EXIT_FAILURE);
00315     break;
00316   }
00317 }
00318 
00319 // I's only a wrapper :-)
00320 int getPacket(unsigned char *buf, int maxlen, unsigned int timeout)
00322 {
00323   int ret = 0;
00324 
00325   switch (config.TypeOfCard) {
00326   case WLAN_NG_CARD:
00327     ret = getPacketWLAN(buf, maxlen);
00328     break;
00329   case WLAN_NG_CARD_AVS_CFF2:
00330     NOT_YET_ANALIZED();
00331     break;
00332   case CISCO_CARD:
00333   case CISCO_CVS_CARD:
00334     ret = getPacketCISCO(buf, maxlen);
00335     break;
00336   case LUCENT_CARD:
00337     ret = getPacketHERMES(buf, maxlen);
00338     break;
00339   case HOSTAP_CARD:
00340     ret = getPacketHOSTAP(buf, maxlen);
00341     break;
00342   case ATHEROS_CARD:
00343     ret = getPacketATHEROS(buf, maxlen);
00344     break;
00345   case PRISM54G_CARD:
00346     ret = getPacketPRISM54g(buf, maxlen);
00347     break;
00348   case PCAP_VIRTUAL_CARD:
00349     NOT_YET_ANALIZED();
00350     break;
00351   default:
00352     perror("Arrrrggg, type of packet is unknowned !!!");
00353     exit(EXIT_FAILURE);
00354     break;
00355   }
00356   return ret;
00357 }

Generated on Fri Feb 25 12:02:37 2005 for WifiScanner by  doxygen 1.4.1