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 #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
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
00048 static UINT8 wlan_payload[MAX_BUFFER_SIZE];
00049 #endif
00050
00051 #ifndef WITH_SYSTEMCALL
00052
00053
00054 static p80211msg_lnxreq_wlansniff_t lnxreq_wlansniff;
00055 static p80211msg_lnxreq_ifstate_t lnxreq_ifstate;
00056 #endif
00057
00058 #ifndef WITH_SYSTEMCALL
00059
00060
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
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
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
00101
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
00110 req.magic = P80211_IOCTL_MAGIC;
00111
00112
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
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
00129
00130 result = ioctl(fd, P80211_IFREQ, &req);
00131
00132
00133
00134
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
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
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
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
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
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
00296
00297 int shutCardWLAN(char *devname)
00298 {
00299 INT result = 0;
00300 char CmdSystem[128];
00301
00302
00303 snprintf(CmdSystem, 32, "ifconfig %s down", devname);
00304 system(CmdSystem);
00305
00306 #ifndef WITH_SYSTEMCALL
00307
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
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
00378 if (result) {
00379 fatal("Warning : Change state of interface to enable failed\n");
00380 }
00381 #ifndef WITH_SYSTEMCALL
00382
00383
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
00418 snprintf(CmdSystem, 32, "ifconfig %s 0", devname);
00419 system(CmdSystem);
00420 debug(3, "%s#%d : %s\n", __FUNCTION__, __LINE__, CmdSystem);
00421
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
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
00443 if (ret)
00444 debug(3, "Ret= %x - pktHdr.len = %x\n", ret, pktHdr.len);
00445
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
00451
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
00458 wlan_header.version = 0;
00459 wlan_header.length = 0;
00460 wlan_header.mactime = Sniff_Frame->mactime.data;
00461 wlan_header.hosttime = Sniff_Frame->hosttime.data;
00462 wlan_header.phytype = phytype_dsss_dot11_b;
00463 wlan_header.channel = Sniff_Frame->channel.data;
00464 wlan_header.datarate = Sniff_Frame->rate.data * 5;
00465 wlan_header.antenna = 0;
00466 wlan_header.priority = 0;
00467 wlan_header.ssi_type = 0;
00468 wlan_header.ssi_signal = Sniff_Frame->signal.data;
00469 wlan_header.ssi_noise = Sniff_Frame->noise.data;
00470 wlan_header.preamble = 0;
00471 wlan_header.encoding = 0;
00472
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
00485 return 0;
00486 else
00487 return (pktHdr.len - sizeof(p80211msg_lnxind_wlansniffrm_t));
00488 }
00489 } else {
00490 return (0);
00491 }
00492 }
00493
00494
00495
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:
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
00529 void closePacketWLAN(void)
00530 {
00531 pcap_close(ca.pcap);
00532 }