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

hermes.c

Go to the documentation of this file.
00001 /* Linux Prism II Stumbler - Utility Scan for 802_11 networks under Linux
00002  * 
00003  * File : hermes.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: hermes.c,v 1.3 2005/02/23 11:36:53 poggij Exp $
00026  */
00027 
00028 // A lot of think is get from kismet
00029 //  http://www.kismetwireless.net/
00030 
00031 #include <include.h>
00032 #include <src/hermes.h>
00033 #include <src/crt_io.h>
00034 
00035 static char *ID = "$Id: hermes.c,v 1.3 2005/02/23 11:36:53 poggij Exp $";
00036 
00037 // All extern value you want
00038 extern UINT8 SingleChannel;
00039 extern UINT8 TypeOfCard;
00040 extern p80211_caphdr_t wlan_header;
00041 
00042 static CaptureArg ca;
00043 static char errbuf[PCAP_ERRBUF_SIZE];
00044 static UINT8 wlan_payload[MAX_BUFFER_SIZE];
00045 
00046 //-------------
00047 int selectChannelHERMES(char *devname, int channel)
00048 {
00049   char str[80];
00050   int result = 0;
00051 
00052   sprintf(str, "iwpriv %s monitor 1 %d 2>/dev/null 1>/dev/null", devname,
00053           channel);
00054   //debug(3, str, "\n");
00055   result += system(str);
00056 
00057   //return result;
00058   // No error return, because it's possible to change to a forbidden channel
00059   //  So we don't wand that the program stop because of this restriction
00060   return 0;
00061 }
00062 
00063 int shutCardHERMES(char *devname)
00064 {
00065   char str[80];
00066   int result = 0;
00067 
00068   // Turn off monitor mode
00069   sprintf(str, "iwconfig %s mode managed", devname);
00070   debug(3, "%s\n", str);
00071   result += system(str);
00072   sprintf(str, "ifconfig %s -promisc down", devname);
00073   debug(3, "%s\n", str);
00074   result += system(str);
00075   sprintf(str, "iwpriv %s monitor 0 1", devname);
00076   debug(3, "%s\n", str);
00077   result += system(str);
00078 
00079   return result;
00080 }
00081 
00082 int openCardHERMES(char *devname)
00083 {
00084   char str[80];
00085   int result = 0;
00086 
00087   // Turn on monitor mode
00088   sprintf(str, "ifconfig %s promisc up 0", devname);
00089   debug(3, "%s\n", str);
00090   result += system(str);
00091   sprintf(str, "iwconfig %s essid \"\"", devname);
00092   debug(3, "%s\n", str);
00093   result += system(str);
00094   sprintf(str, "iwpriv %s monitor 1 1", devname);
00095   debug(3, "%s\n", str);
00096   result += system(str);
00097 
00098   return result;
00099 }
00100 
00101 
00102 // Get packet from card
00103 int getPacketHERMES(unsigned char *buf, int maxlen)
00104 {
00105   struct pcap_pkthdr pktHdr;
00106   u_char *ret;
00107   fd_set rs;
00108   p80211msg_lnxind_wlansniffrm_t *Sniff_Frame;
00109 
00110   FD_ZERO(&rs);
00111   FD_SET(0, &rs);
00112 
00113   ret = (u_char *) pcap_next(ca.pcap, &pktHdr);
00114   // If no problem and packet is enought big (with data)
00115   if ((ret)
00116       && (pktHdr.len >= sizeof(p80211msg_lnxind_wlansniffrm_t))) {
00117     if (memcpy_buff(buf, ret, pktHdr.len) == NULL)
00118       return 0;
00119     Sniff_Frame = (p80211msg_lnxind_wlansniffrm_t *) buf;
00120     // Fill Header
00121     wlan_header.version = 0;    // It's a reduced capture frame format
00122     wlan_header.length = 0;     // Not used for now
00123     wlan_header.mactime = Sniff_Frame->mactime.data;
00124     wlan_header.hosttime = Sniff_Frame->hosttime.data;
00125     wlan_header.phytype = phytype_dsss_dot11_b; // Not used for now
00126     wlan_header.channel = Sniff_Frame->channel.data;
00127     wlan_header.datarate = Sniff_Frame->rate.data * 5;  // datarate is in units of 100kbps.
00128     wlan_header.antenna = 0;    // Not used for now
00129     wlan_header.priority = 0;   // Not used for now
00130     wlan_header.ssi_type = 0;   // Not used for now
00131     wlan_header.ssi_signal = Sniff_Frame->signal.data;
00132     wlan_header.ssi_noise = Sniff_Frame->noise.data;
00133     wlan_header.preamble = 0;   // Not used for now
00134     wlan_header.encoding = 0;   // Not used for now
00135     // Fill data frame
00136     if (memcpy_buff(wlan_payload,
00137                     &buf[sizeof(p80211msg_lnxind_wlansniffrm_t)],
00138                     pktHdr.len - sizeof(p80211msg_lnxind_wlansniffrm_t)) ==
00139         NULL)
00140       return 0;
00141     if (memcpy_buff(buf, wlan_payload,
00142                     maxlen - sizeof(p80211msg_lnxind_wlansniffrm_t)) ==
00143         NULL)
00144       return 0;
00145 
00146     if (pktHdr.len <= sizeof(p80211msg_lnxind_wlansniffrm_t))
00147       // Don't return negative value
00148       return 0;
00149     else
00150       return (pktHdr.len - sizeof(p80211msg_lnxind_wlansniffrm_t));
00151   } else {
00152     return (0);                 /* Noting to read */
00153   }
00154 }
00155 
00156 int openPacketHERMES(char *devname)
00157 {
00158   int DataLink;
00159 
00160   ca.pcap = pcap_open_live(devname, 3000, 1, 0, errbuf);
00161   if (ca.pcap) {
00162     pcap_setnonblock(ca.pcap, 1, errbuf);
00163     DataLink = pcap_datalink(ca.pcap);
00164     switch (DataLink) {
00165     case DLT_PRISM_HEADER:
00166       debug(3,
00167             "pcap_datalink(ca.pcap) = %d = DLT_PRISM_HEADER\n", DataLink);
00168       ca.offset = 144;
00169       break;
00170     case DLT_IEEE802_11:
00171       debug(3, "pcap_datalink(ca.pcap) = %d = DLT_IEEE802_11\n", DataLink);
00172       ca.offset = 0;
00173       break;
00174     case DLT_AIRONET_HEADER:
00175       debug(3,
00176             "pcap_datalink(ca.pcap) = %d = DLT_AIRONET_HEADER:\n",
00177             DataLink);
00178       ca.offset = 0;
00179       break;
00180     default:                   //COOKED
00181       debug(3, "pcap_datalink(ca.pcap) = %d = COOKED:\n", DataLink);
00182       ca.offset = 160;
00183     }
00184     return 1;
00185   }
00186   return -1;
00187 }
00188 
00189 void closePacketHERMES(void)
00190 {
00191   pcap_close(ca.pcap);
00192 }

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