00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <include.h>
00032 #include <src/hostap.h>
00033 #include <src/crt_io.h>
00034
00035 static char *ID = "$Id: hostap.c,v 1.9 2005/02/23 11:36:53 poggij Exp $";
00036
00037
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 selectChannelHOSTAP(char *devname, int channel)
00048 {
00049 char str[80];
00050 int result = 0;
00051
00052 sprintf(str, "iwconfig %s channel %d 2> /dev/null", devname, channel);
00053 debug(3, str, "\n");
00054 result += system(str);
00055
00056
00057
00058
00059 return 0;
00060 }
00061
00062 int shutCardHOSTAP(char *devname)
00063 {
00064 char str[80];
00065 int result = 0;
00066
00067
00068 sprintf(str, "iwconfig %s mode managed", devname);
00069 debug(3, "%s\n", str);
00070 result += system(str);
00071
00072 sprintf(str, "iwconfig %s channel 1", devname);
00073 debug(3, "%s\n", str);
00074 result += system(str);
00075
00076 sprintf(str, "ifconfig %s -promisc up", devname);
00077 debug(3, "%s\n", str);
00078 result += system(str);
00079
00080 return result;
00081 }
00082
00083 int openCardHOSTAP(char *devname)
00084 {
00085 char str[80];
00086 int result = 0;
00087
00088
00089 sprintf(str, "prism2_param %s monitor_type 1", devname);
00090 debug(3, "%s\n", str);
00091 result += system(str);
00092
00093 sprintf(str, "iwconfig %s mode monitor_type", devname);
00094 debug(3, "%s\n", str);
00095 result += system(str);
00096
00097 sprintf(str, "iwconfig %s channel 1", devname);
00098 debug(3, "%s\n", str);
00099 result += system(str);
00100
00101 sprintf(str, "ifconfig %s promisc up", devname);
00102 debug(3, "%s\n", str);
00103 result += system(str);
00104
00105 return result;
00106 }
00107
00108
00109
00110 int getPacketHOSTAP(unsigned char *buf, int maxlen)
00111 {
00112 struct pcap_pkthdr pktHdr;
00113 u_char *ret;
00114 fd_set rs;
00115 p80211msg_lnxind_wlansniffrm_t *Sniff_Frame;
00116
00117 FD_ZERO(&rs);
00118 FD_SET(0, &rs);
00119
00120 ret = (u_char *) pcap_next(ca.pcap, &pktHdr);
00121
00122 if ((ret)
00123 && (pktHdr.len >= sizeof(p80211msg_lnxind_wlansniffrm_t))) {
00124 if (memcpy_buff(buf, ret, pktHdr.len) == NULL)
00125 return 0;
00126 Sniff_Frame = (p80211msg_lnxind_wlansniffrm_t *) buf;
00127
00128 wlan_header.version = 0;
00129 wlan_header.length = 0;
00130 wlan_header.mactime = Sniff_Frame->mactime.data;
00131 wlan_header.hosttime = Sniff_Frame->hosttime.data;
00132 wlan_header.phytype = phytype_dsss_dot11_b;
00133 wlan_header.channel = Sniff_Frame->channel.data;
00134 wlan_header.datarate = Sniff_Frame->rate.data * 5;
00135 wlan_header.antenna = 0;
00136 wlan_header.priority = 0;
00137 wlan_header.ssi_type = 0;
00138 wlan_header.ssi_signal = Sniff_Frame->signal.data;
00139 wlan_header.ssi_noise = Sniff_Frame->noise.data;
00140 wlan_header.preamble = 0;
00141 wlan_header.encoding = 0;
00142
00143 if (memcpy_buff(wlan_payload,
00144 &buf[sizeof(p80211msg_lnxind_wlansniffrm_t)],
00145 pktHdr.len - sizeof(p80211msg_lnxind_wlansniffrm_t)) ==
00146 NULL)
00147 return 0;
00148 if (memcpy_buff(buf, wlan_payload,
00149 maxlen - sizeof(p80211msg_lnxind_wlansniffrm_t)) ==
00150 NULL)
00151 return 0;
00152
00153 if (pktHdr.len <= sizeof(p80211msg_lnxind_wlansniffrm_t))
00154
00155 return 0;
00156 else
00157 return (pktHdr.len - sizeof(p80211msg_lnxind_wlansniffrm_t));
00158 } else {
00159 return (0);
00160 }
00161 }
00162
00163 int openPacketHOSTAP(char *devname)
00164 {
00165 int DataLink;
00166
00167 ca.pcap = pcap_open_live(devname, 3000, 1, 0, errbuf);
00168 if (ca.pcap) {
00169 pcap_setnonblock(ca.pcap, 1, errbuf);
00170 DataLink = pcap_datalink(ca.pcap);
00171 switch (DataLink) {
00172 case DLT_PRISM_HEADER:
00173 debug(3,
00174 "pcap_datalink(ca.pcap) = %d = DLT_PRISM_HEADER\n", DataLink);
00175 ca.offset = 144;
00176 break;
00177 case DLT_IEEE802_11:
00178 debug(3, "pcap_datalink(ca.pcap) = %d = DLT_IEEE802_11\n", DataLink);
00179 ca.offset = 0;
00180 break;
00181 case DLT_AIRONET_HEADER:
00182 debug(3,
00183 "pcap_datalink(ca.pcap) = %d = DLT_AIRONET_HEADER:\n",
00184 DataLink);
00185 ca.offset = 0;
00186 break;
00187 default:
00188 debug(3, "pcap_datalink(ca.pcap) = %d = COOKED:\n", DataLink);
00189 ca.offset = 160;
00190 }
00191 return 1;
00192 }
00193 return -1;
00194 }
00195
00196 void closePacketHOSTAP(void)
00197 {
00198 pcap_close(ca.pcap);
00199 }