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

wlan-ng.c

Go to the documentation of this file.
00001 /* Linux Prism II Stumbler - Utility Scan for 802_11 networks under Linux
00002  * 
00003  * File : wlan-ng.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: wlan-ng.c,v 1.31 2005/02/23 11:36:53 poggij Exp $
00026  */
00027 
00028 #include <include.h>
00029 #include <src/interface.h>
00030 #include <src/crt_io.h>
00031 #include <src/wlan-ng.h>
00032 #include <src/driver.h>
00033 
00034 static char *ID = "$Id: wlan-ng.c,v 1.31 2005/02/23 11:36:53 poggij Exp $";
00035 
00036 //#define I_WANT_TO_DEBUG
00037 
00038 extern WINDOW *Sum_WND, *RealTime_WND;
00039 extern ScanResult_t Res;
00040 
00041 static CaptureArg ca;
00042 static char errbuf[PCAP_ERRBUF_SIZE];
00043 
00044 #ifdef LWNG_15
00045 extern p80211_caphdr_t wlan_header;
00046 
00047 //UINT8 wlan_payload[WLAN_A4FR_MAXLEN];
00048 static UINT8 wlan_payload[MAX_BUFFER_SIZE];
00049 #endif                          /* ifdef LWNG_15 */
00050 
00051 #ifndef WITH_SYSTEMCALL
00052 /* Why I put this data in static ? 
00053    because if it's not, ioctl can't access it !  */
00054 static p80211msg_lnxreq_wlansniff_t lnxreq_wlansniff;
00055 static p80211msg_lnxreq_ifstate_t lnxreq_ifstate;
00056 #endif
00057 
00058 #ifndef WITH_SYSTEMCALL
00059 // Function to dump in hexa the message send or sent to the driver
00060 //  Only for DEBUG
00061 void dump_msg(void *msg)
00062 {
00063   p80211msgd_t *msgp = msg;
00064   int i;
00065   int bodylen;
00066 
00067   debug(3, "  msgcode=0x%08lx  msglen=%lu  devname=%s\n",
00068         msgp->msgcode, msgp->msglen, msgp->devname);
00069   debug(3, "body: ");
00070   bodylen =
00071       msgp->msglen - (sizeof(msgp->msgcode) + sizeof(msgp->msglen) +
00072                       sizeof(msgp->devname));
00073   for (i = 0; i < bodylen; i += 4) {
00074     debug(3, "%02x%02x%02x%02x ", msgp->args[i],
00075           msgp->args[i + 1], msgp->args[i + 2], msgp->args[i + 3]);
00076   }
00077   debug(3, "\n");
00078 }
00079 
00080 /*----------------------------------------------------------------
00081 * do_ioctl
00082 *
00083 * Send command to driver with ioctl
00084 *
00085 * Arguments:
00086 *       char *devname : device name
00087 *       UINT8 * msg   : the message to send to driver
00088 *
00089 * Returns: 
00090 *       0       - success 
00091 *       ~0      - failure
00092 ----------------------------------------------------------------*/
00093 int do_ioctl(char *devname, UINT8 * msg, size_t size)
00094 {
00095   register int result = -1;
00096   register int fd;
00097   p80211ioctl_req_t req;
00098   UINT8 *msg_local = NULL;
00099 
00100   // In my config with wlan-ng 0.2.1_pre23 it's needed, because ioctl can't access
00101   //   to msg directly ... perharps some GRSEC pretections :-)
00102   msg_local = malloc(size);
00103   if (msg_local == NULL) {
00104     warning("ioctl error : malloc of %d can't be done", size);
00105     return (result);
00106   }
00107   memcpy(msg_local, msg, size);
00108 
00109   /* set the magic */
00110   req.magic = P80211_IOCTL_MAGIC;
00111 
00112   /* get a socket */
00113   fd = socket(AF_INET, SOCK_STREAM, 0);
00114   if (fd == -1) {
00115     warning("ioctl error : socket can't open\n");
00116     return (result);
00117   }
00118   // prepare request
00119   req.len = MSG_BUFF_LEN;
00120   req.data = msg_local;
00121   strncpy(req.name, devname, DEVNAME_LEN - 1);
00122   req.result = 0;
00123 
00124 #ifdef I_WANT_TO_DEBUG
00125   dump_msg(msg);
00126 #endif
00127 
00128   // Send request
00129   //debugTS(0, "Debut ioctl\n");
00130   result = ioctl(fd, P80211_IFREQ, &req);
00131   //debugTS(0, "Fin   ioctl\n");
00132 
00133   // check the result and send a warning if problem
00134   //   The caller choice what to do if error
00135   if (result == -1) {
00136     warning("ioctl error : \"%s\"(%d) - req=0x%X \n", strerror(errno),
00137             errno, &req);
00138 #ifdef I_WANT_TO_DEBUG
00139     dump_msg(msg);
00140 #endif
00141   }
00142   close(fd);
00143   free(msg_local);
00144   return result;
00145 }
00146 
00147 #endif                          // ifndef WITH_SYSTEMCALL
00148 
00149 /*----------------------------------------------------------------
00150 * selectChannelWLAN
00151 *
00152 * Select channel on a wlan-ng card
00153 *
00154 * Arguments:
00155 *       char *devname : device name
00156 *       int channel   : channel (not checked !) 
00157 *
00158 * Returns: 
00159 *       0       - success 
00160 *       ~0      - failure
00161 ----------------------------------------------------------------*/
00162 int selectChannelWLAN(char *devname, int channel)
00163 {
00164   INT result = 0;
00165 
00166 #ifdef WITH_SYSTEMCALL
00167   char CmdSystem[128];
00168 #endif
00169 
00170   debug(3, "%s#%d : devname=%s , channel=%02d\n", __FUNCTION__, __LINE__,
00171         devname, channel);
00172 
00173   PrintScaleChannel(channel);
00174 
00175   debug(3, "%s#%d : Define SChannel = %02d\n", __FUNCTION__, __LINE__,
00176         channel);
00177   Res.SChannel = channel;
00178 
00179 /*  No more stop monitor mode before change channel
00180 #ifdef LWNG_2_0
00181 
00182 #ifndef WITH_SYSTEMCALL
00183   // Stop Sniff function if wlan-ng driver version is greater or egual to 0.2.0
00184   memset (&lnxreq_wlansniff, 0, sizeof (p80211msg_lnxreq_wlansniff_t));
00185   lnxreq_wlansniff.msgcode = DIDmsg_lnxreq_wlansniff;
00186   lnxreq_wlansniff.msglen = sizeof (p80211msg_lnxreq_wlansniff_t);
00187   strncpy ((char *) lnxreq_wlansniff.devname, devname, DEVNAME_LEN - 1);
00188 
00189   lnxreq_wlansniff.enable.did = DIDmsg_lnxreq_wlansniff_enable;
00190   lnxreq_wlansniff.enable.data = P80211ENUM_truth_false;
00191   lnxreq_wlansniff.enable.len = 4;
00192 
00193   lnxreq_wlansniff.channel.did = DIDmsg_lnxreq_wlansniff_channel;
00194   lnxreq_wlansniff.channel.status = P80211ENUM_msgitem_status_no_value;
00195   lnxreq_wlansniff.channel.len = 4;
00196 
00197   lnxreq_wlansniff.prismheader.did = DIDmsg_lnxreq_wlansniff_prismheader;
00198   lnxreq_wlansniff.prismheader.status = P80211ENUM_msgitem_status_no_value;
00199   lnxreq_wlansniff.prismheader.len = 4;
00200 
00201   lnxreq_wlansniff.wlanheader.did = DIDmsg_lnxreq_wlansniff_wlanheader;
00202   lnxreq_wlansniff.wlanheader.status = P80211ENUM_msgitem_status_no_value;
00203   lnxreq_wlansniff.wlanheader.len = 4;
00204 
00205   lnxreq_wlansniff.keepwepflags.did = DIDmsg_lnxreq_wlansniff_keepwepflags;
00206   lnxreq_wlansniff.keepwepflags.status = P80211ENUM_msgitem_status_no_value;
00207   lnxreq_wlansniff.keepwepflags.len = 4;
00208 
00209   lnxreq_wlansniff.stripfcs.did = DIDmsg_lnxreq_wlansniff_stripfcs;
00210   lnxreq_wlansniff.stripfcs.status = P80211ENUM_msgitem_status_no_value;
00211   lnxreq_wlansniff.stripfcs.len = 4;
00212 
00213   lnxreq_wlansniff.packet_trunc.did = DIDmsg_lnxreq_wlansniff_packet_trunc;
00214   lnxreq_wlansniff.packet_trunc.status = P80211ENUM_msgitem_status_no_value;
00215   lnxreq_wlansniff.packet_trunc.len = 4;
00216 
00217   lnxreq_wlansniff.resultcode.did = DIDmsg_lnxreq_wlansniff_resultcode;
00218   lnxreq_wlansniff.resultcode.status = P80211ENUM_msgitem_status_no_value;
00219   lnxreq_wlansniff.resultcode.len = 4;
00220 
00221   result = do_ioctl (devname, (UINT8 *) & lnxreq_wlansniff, sizeof(p80211msg_lnxreq_wlansniff_t));
00222 #else
00223   sprintf (CmdSystem,
00224            "wlanctl-ng %s lnxreq_wlansniff enable=false > /dev/null",
00225            devname);
00226   result = system (CmdSystem);
00227 #endif  // WITH_SYSTEMCALL
00228 
00229   debug (3, "#%d : lnxreq_wlansniff enable=false\n", __LINE__);
00230 
00231   if (result) {
00232     warning ("Warning : Exit from monitor mode failed\n");
00233   }
00234 #endif  // LWNG_2_0
00235 */
00236 
00237   // Second part
00238   // put in monitor mode with the good channel
00239 
00240 #ifndef WITH_SYSTEMCALL
00241   memset(&lnxreq_wlansniff, 0, sizeof(p80211msg_lnxreq_wlansniff_t));
00242   lnxreq_wlansniff.msgcode = DIDmsg_lnxreq_wlansniff;
00243   lnxreq_wlansniff.msglen = sizeof(p80211msg_lnxreq_wlansniff_t);
00244 
00245   strncpy((char *) lnxreq_wlansniff.devname, devname, DEVNAME_LEN - 1);
00246 
00247   lnxreq_wlansniff.enable.did = DIDmsg_lnxreq_wlansniff_enable;
00248   lnxreq_wlansniff.enable.data = P80211ENUM_truth_true;
00249   lnxreq_wlansniff.enable.len = 4;
00250 
00251   lnxreq_wlansniff.channel.did = DIDmsg_lnxreq_wlansniff_channel;
00252   lnxreq_wlansniff.channel.data = channel;
00253   lnxreq_wlansniff.channel.len = 4;
00254 
00255   lnxreq_wlansniff.prismheader.did = DIDmsg_lnxreq_wlansniff_prismheader;
00256   lnxreq_wlansniff.prismheader.data = P80211ENUM_truth_true;
00257   lnxreq_wlansniff.prismheader.len = 4;
00258 
00259   lnxreq_wlansniff.keepwepflags.did = DIDmsg_lnxreq_wlansniff_keepwepflags;
00260   lnxreq_wlansniff.keepwepflags.data = P80211ENUM_truth_false;
00261   lnxreq_wlansniff.keepwepflags.len = 4;
00262 
00263   lnxreq_wlansniff.resultcode.did = DIDmsg_lnxreq_wlansniff_resultcode;
00264   lnxreq_wlansniff.resultcode.status = P80211ENUM_msgitem_status_no_value;
00265   lnxreq_wlansniff.resultcode.len = 4;
00266 
00267   result =
00268       do_ioctl(devname, (UINT8 *) & lnxreq_wlansniff,
00269                sizeof(p80211msg_lnxreq_wlansniff_t));
00270 #else
00271   sprintf(CmdSystem,
00272           "wlanctl-ng %s lnxreq_wlansniff enable=true channel=%d "
00273           "keepwepflags=false prismheader=true > /dev/null", devname,
00274           channel);
00275   result = system(CmdSystem);
00276 
00277 #endif
00278 
00279   debug(3,
00280         "%s#%d : lnxreq_wlansniff enable=true channel=%02d "
00281         "keepwepflags=false prismheader=true\n", __FUNCTION__, __LINE__,
00282         channel);
00283 
00284   // Check result
00285   if (result) {
00286     fatal
00287         ("Fatal error : change to Channel %d failed (%s:%d)\n",
00288          channel, __FUNCTION__, __LINE__);
00289   }
00290 
00291   return result;
00292 }
00293 
00294 /***
00295  * Function needed to stop correctly the monitor mode
00296  ***/
00297 int shutCardWLAN(char *devname)
00298 {
00299   INT result = 0;
00300   char CmdSystem[128];
00301 
00302   /* Down interface */
00303   snprintf(CmdSystem, 32, "ifconfig %s down", devname);
00304   system(CmdSystem);
00305 
00306 #ifndef WITH_SYSTEMCALL
00307   /* Stop Sniff function */
00308   memset(&lnxreq_wlansniff, 0, sizeof(p80211msg_lnxreq_wlansniff_t));
00309 
00310   lnxreq_wlansniff.msgcode = DIDmsg_lnxreq_wlansniff;
00311   lnxreq_wlansniff.msglen = sizeof(p80211msg_lnxreq_wlansniff_t);
00312 
00313   strncpy((char *) lnxreq_wlansniff.devname, devname, DEVNAME_LEN - 1);
00314 
00315   lnxreq_wlansniff.enable.did = DIDmsg_lnxreq_wlansniff_enable;
00316   lnxreq_wlansniff.enable.data = P80211ENUM_truth_false;
00317   lnxreq_wlansniff.enable.len = 4;
00318 
00319   lnxreq_wlansniff.channel.did = DIDmsg_lnxreq_wlansniff_channel;
00320   lnxreq_wlansniff.channel.status = P80211ENUM_msgitem_status_no_value;
00321   lnxreq_wlansniff.channel.len = 4;
00322 
00323   lnxreq_wlansniff.resultcode.did = DIDmsg_lnxreq_wlansniff_resultcode;
00324   lnxreq_wlansniff.resultcode.status = P80211ENUM_msgitem_status_no_value;
00325   lnxreq_wlansniff.resultcode.len = 4;
00326 
00327   result =
00328       do_ioctl(lnxreq_wlansniff.devname, (UINT8 *) & lnxreq_wlansniff,
00329                sizeof(p80211msg_lnxreq_wlansniff_t));
00330 #else
00331   sprintf(CmdSystem,
00332           "wlanctl-ng %s lnxreq_wlansniff enable=false > /dev/null",
00333           dev, channel);
00334   result = system(CmdSystem);
00335 #endif
00336 
00337   debug(3, "%s#%d : lnxreq_wlansniff enable=false\n", __FUNCTION__,
00338         __LINE__);
00339 
00340   return result;
00341 
00342 }
00343 
00344 int openCardWLAN(char *devname)
00345 {
00346   INT result = 0;
00347   char CmdSystem[32];
00348 
00349 #ifndef WITH_SYSTEMCALL
00350   /* put interface state UP  */
00351   memset(&lnxreq_ifstate, 0, sizeof(p80211msg_lnxreq_ifstate_t));
00352   lnxreq_ifstate.msgcode = DIDmsg_lnxreq_ifstate;
00353   lnxreq_ifstate.msglen = sizeof(p80211msg_lnxreq_ifstate_t);
00354 
00355   strncpy((char *) lnxreq_ifstate.devname, devname, DEVNAME_LEN - 1);
00356 
00357   lnxreq_ifstate.ifstate.did = DIDmsg_lnxreq_ifstate_ifstate;
00358   lnxreq_ifstate.ifstate.len = 4;
00359   lnxreq_ifstate.ifstate.data = P80211ENUM_ifstate_enable;
00360 
00361   lnxreq_ifstate.resultcode.did = DIDmsg_lnxreq_ifstate_resultcode;
00362   lnxreq_ifstate.resultcode.len = 4;
00363   lnxreq_ifstate.resultcode.status = P80211ENUM_msgitem_status_no_value;
00364 
00365   result =
00366       do_ioctl(devname, (UINT8 *) & lnxreq_ifstate,
00367                sizeof(p80211msg_lnxreq_ifstate_t));
00368 #else
00369   sprintf(CmdSystem,
00370           "wlanctl-ng %s lnxreq_ifstate ifstate=enable > /dev/null",
00371           dev, channel);
00372   result = system(CmdSystem);
00373 #endif
00374 
00375   debug(3, "%s#%d : lnxreq_ifstate ifstate=enable\n", __FUNCTION__,
00376         __LINE__);
00377   // Check result
00378   if (result) {
00379     fatal("Warning : Change state of interface to enable failed\n");
00380   }
00381 #ifndef WITH_SYSTEMCALL
00382 
00383   /* Stop Sniff function */
00384   memset(&lnxreq_wlansniff, 0, sizeof(p80211msg_lnxreq_wlansniff_t));
00385   lnxreq_wlansniff.msgcode = DIDmsg_lnxreq_wlansniff;
00386   lnxreq_wlansniff.msglen = sizeof(p80211msg_lnxreq_wlansniff_t);
00387 
00388   strncpy((char *) lnxreq_wlansniff.devname, devname, DEVNAME_LEN - 1);
00389 
00390   lnxreq_wlansniff.enable.did = DIDmsg_lnxreq_wlansniff_enable;
00391   lnxreq_wlansniff.enable.data = P80211ENUM_truth_false;
00392   lnxreq_wlansniff.enable.len = 4;
00393 
00394   lnxreq_wlansniff.channel.did = DIDmsg_lnxreq_wlansniff_channel;
00395   lnxreq_wlansniff.channel.status = P80211ENUM_msgitem_status_no_value;
00396   lnxreq_wlansniff.channel.len = 4;
00397 
00398   lnxreq_wlansniff.resultcode.did = DIDmsg_lnxreq_wlansniff_resultcode;
00399   lnxreq_wlansniff.resultcode.status = P80211ENUM_msgitem_status_no_value;
00400   lnxreq_wlansniff.resultcode.len = 4;
00401 
00402   result =
00403       do_ioctl(devname, (UINT8 *) & lnxreq_wlansniff,
00404                sizeof(p80211msg_lnxreq_wlansniff_t));
00405 #else
00406   sprintf(CmdSystem,
00407           "wlanctl-ng %s lnxreq_wlansniff enable=false channel= > /dev/null");
00408   result = system(CmdSystem);
00409 #endif
00410   debug(3, "%s#%d : lnxreq_wlansniff enable=false channel= \n",
00411         __FUNCTION__, __LINE__);
00412   if ((result)
00413       && (lnxreq_wlansniff.msgcode != P80211ENUM_resultcode_success)
00414       && (lnxreq_wlansniff.msgcode != P80211ENUM_resultcode_refused)) {
00415     warning("Warning : Exit from monitor mode failed\n");
00416   }
00417   // Put no IP, so better hide from hell ;)
00418   snprintf(CmdSystem, 32, "ifconfig %s 0", devname);
00419   system(CmdSystem);
00420   debug(3, "%s#%d : %s\n", __FUNCTION__, __LINE__, CmdSystem);
00421   // put interface up
00422   snprintf(CmdSystem, 32, "ifconfig %s up", devname);
00423   system(CmdSystem);
00424   debug(3, "%s#%d : %s\n", __FUNCTION__, __LINE__, CmdSystem);
00425 
00426   return result;
00427 }
00428 
00429 
00430 // Get packet from card and fill correctly radio structure
00431 int getPacketWLAN(unsigned char *buf, int maxlen)
00432 {
00433   struct pcap_pkthdr pktHdr;
00434   u_char *ret;
00435   fd_set rs;
00436   p80211msg_lnxind_wlansniffrm_t *Sniff_Frame;
00437 
00438   FD_ZERO(&rs);
00439   FD_SET(0, &rs);
00440 
00441   ret = (u_char *) pcap_next(ca.pcap, &pktHdr);
00442   //DEBUG 
00443   if (ret)
00444     debug(3, "Ret= %x  - pktHdr.len = %x\n", ret, pktHdr.len);
00445   // If no problem and packet is enought big (with data)
00446   if ((ret)
00447       && (pktHdr.len >= sizeof(p80211msg_lnxind_wlansniffrm_t))) {
00448     if (pktHdr.len > MAX_BUFFER_SIZE) {
00449       debug(1, "ERROR : Packet is TOOO BIG size=%d\n", pktHdr.len);
00450       // Sometimes Wlan-NG return an enormous empty packet ...
00451       //DumpHexPaquets(RealTime_WND, buf, 0x1B0);
00452       return 0;
00453     } else {
00454       if (memcpy_buff(buf, ret, pktHdr.len) == NULL)
00455         return 0;
00456       Sniff_Frame = (p80211msg_lnxind_wlansniffrm_t *) buf;
00457       // Fill Header
00458       wlan_header.version = 0;  // It's a reduced capture frame format
00459       wlan_header.length = 0;   // Not used for now
00460       wlan_header.mactime = Sniff_Frame->mactime.data;
00461       wlan_header.hosttime = Sniff_Frame->hosttime.data;
00462       wlan_header.phytype = phytype_dsss_dot11_b;       // Not used for now
00463       wlan_header.channel = Sniff_Frame->channel.data;
00464       wlan_header.datarate = Sniff_Frame->rate.data * 5;        // datarate is in units of 100kbps.
00465       wlan_header.antenna = 0;  // Not used for now
00466       wlan_header.priority = 0; // Not used for now
00467       wlan_header.ssi_type = 0; // Not used for now
00468       wlan_header.ssi_signal = Sniff_Frame->signal.data;
00469       wlan_header.ssi_noise = Sniff_Frame->noise.data;
00470       wlan_header.preamble = 0; // Not used for now
00471       wlan_header.encoding = 0; // Not used for now
00472       // Fill data frame
00473       if (memcpy_buff(wlan_payload,
00474                       &buf[sizeof(p80211msg_lnxind_wlansniffrm_t)],
00475                       pktHdr.len -
00476                       sizeof(p80211msg_lnxind_wlansniffrm_t)) == NULL)
00477         return 0;
00478       if (memcpy_buff(buf, wlan_payload,
00479                       maxlen - sizeof(p80211msg_lnxind_wlansniffrm_t)) ==
00480           NULL)
00481         return 0;
00482 
00483       if (pktHdr.len <= sizeof(p80211msg_lnxind_wlansniffrm_t))
00484         // Don't return negative value
00485         return 0;
00486       else
00487         return (pktHdr.len - sizeof(p80211msg_lnxind_wlansniffrm_t));
00488     }
00489   } else {
00490     return (0);                 /* Noting to read */
00491   }
00492 }
00493 
00494 
00495 // The packet catcher !
00496 int openPacketWLAN(char *devname)
00497 {
00498   int DataLink;
00499 
00500   ca.pcap = pcap_open_live(devname, 3000, 1, 1, errbuf);
00501   if (ca.pcap) {
00502     pcap_setnonblock(ca.pcap, 1, errbuf);
00503     DataLink = pcap_datalink(ca.pcap);
00504     switch (DataLink) {
00505     case DLT_PRISM_HEADER:
00506       debug(2,
00507             "pcap_datalink(ca.pcap) = %d = DLT_PRISM_HEADER\n", DataLink);
00508       ca.offset = 144;
00509       break;
00510     case DLT_IEEE802_11:
00511       debug(2, "pcap_datalink(ca.pcap) = %d = DLT_IEEE802_11\n", DataLink);
00512       ca.offset = 0;
00513       break;
00514     case DLT_AIRONET_HEADER:
00515       fatal
00516           ("pcap_datalink(ca.pcap) = %d = DLT_AIRONET_HEADER:\n",
00517            DataLink);
00518       break;
00519     default:                   //COOKED
00520       debug(2, "pcap_datalink(ca.pcap) = %d = COOKED:\n", DataLink);
00521       ca.offset = 160;
00522     }
00523     return 1;
00524   }
00525   return -1;
00526 }
00527 
00528 // Close pcap
00529 void closePacketWLAN(void)
00530 {
00531   pcap_close(ca.pcap);
00532 }

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