[kismac] [binaervarianz] r162 - in branches/usb-drivers/Sources/Driver: . USBJack

  • From: svn@xxxxxxxxxxxxxxxx
  • To: kismac@xxxxxxxxxxxxx
  • Date: Wed, 26 Jul 2006 03:59:33 +0200

Author: gkruse
Date: 2006-07-26 03:59:29 +0200 (Wed, 26 Jul 2006)
New Revision: 162

Added:
   branches/usb-drivers/Sources/Driver/USBJack/
   branches/usb-drivers/Sources/Driver/USBJack/IntersilJack.h
   branches/usb-drivers/Sources/Driver/USBJack/IntersilJack.mm
   branches/usb-drivers/Sources/Driver/USBJack/RalinkJack.h
   branches/usb-drivers/Sources/Driver/USBJack/RalinkJack.mm
   branches/usb-drivers/Sources/Driver/USBJack/USBJack.h
   branches/usb-drivers/Sources/Driver/USBJack/USBJack.mm
   branches/usb-drivers/Sources/Driver/USBJack/prism2.h
   branches/usb-drivers/Sources/Driver/USBJack/structs.h
Removed:
   branches/usb-drivers/Sources/Driver/USBIntersilJack/
Log:
some experimental and totally non functional driver stuff.  Don't expect 
anything in this branch to work.  And don't be surprised when KisMAC eats your 
cat

Added: branches/usb-drivers/Sources/Driver/USBJack/IntersilJack.h
===================================================================
--- branches/usb-drivers/Sources/Driver/USBJack/IntersilJack.h  2006-07-26 
01:50:43 UTC (rev 161)
+++ branches/usb-drivers/Sources/Driver/USBJack/IntersilJack.h  2006-07-26 
01:59:29 UTC (rev 162)
@@ -0,0 +1,23 @@
+//
+//  IntersilJack.h
+//  KisMAC
+//
+//  Created by Geoffrey Kruse on 5/1/06.
+//  Copyright 2006 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "USBJack.h"
+
+class IntersilJack: public USBJack
+{
+public:
+
+    IntersilJack();
+    ~IntersilJack();
+    
+private:
+        int temp;
+};
+
+

Added: branches/usb-drivers/Sources/Driver/USBJack/IntersilJack.mm
===================================================================
--- branches/usb-drivers/Sources/Driver/USBJack/IntersilJack.mm 2006-07-26 
01:50:43 UTC (rev 161)
+++ branches/usb-drivers/Sources/Driver/USBJack/IntersilJack.mm 2006-07-26 
01:59:29 UTC (rev 162)
@@ -0,0 +1,187 @@
+//
+//  IntersilJack.mm
+//  KisMAC
+//
+//  Created by Geoffrey Kruse on 5/1/06.
+//  Copyright 2006 __MyCompanyName__. All rights reserved.
+//
+
+#import "IntersilJack.h"
+
+bool USBJack::startCapture(UInt16 channel) {
+    if (!_devicePresent) return false;
+    if (!_deviceInit) return false;
+    
+    if ((!_isEnabled) && (_disable() != kIOReturnSuccess)) {
+        NSLog(@"USBJack::::startCapture: Couldn't disable card\n");
+        return false;
+    }
+    
+    if (setChannel(channel) == false) {
+        NSLog(@"USBJack::::startCapture: setChannel(%d) failed - 
resetting...\n",
+              channel);
+               _reset();
+        return false;
+    }
+    
+    if (_doCommand(wlcMonitorOn, 0) != kIOReturnSuccess) {
+        NSLog(@"USBJack::::startCapture: _doCommand(wlcMonitorOn) failed\n");
+        return false;
+    }
+    
+    if (_enable() != kIOReturnSuccess) {
+        NSLog(@"USBJack::::startCapture: Couldn't enable card\n");
+        return false;
+    }
+    
+    _channel = channel;
+    return true;
+}
+
+bool USBJack::stopCapture() {
+_channel = 0;
+
+if (!_devicePresent) return false;
+if (!_deviceInit) return false;
+
+if (_doCommand(wlcMonitorOff, 0) != kIOReturnSuccess) {
+    NSLog(@"USBJack::stopCapture: _doCommand(wlcMonitorOff) failed\n");
+    return false;
+}
+
+return true;
+}
+
+bool USBJack::getChannel(UInt16* channel) {
+    if (!_devicePresent) return false;
+    if (!_deviceInit) return false;
+    
+    if (_getValue(0xFDC1, channel) != kIOReturnSuccess) {
+        NSLog(@"USBJack::getChannel: getValue error\n");
+        return false;
+    }
+    
+    _channel = *channel;
+    return true;
+}
+
+bool USBJack::getAllowedChannels(UInt16* channels) {
+    if (!_devicePresent) return false;
+    if (!_deviceInit) return false;
+    
+    if (_getValue(0xFD10, channels) != kIOReturnSuccess) {
+        NSLog(@"USBJack::getAllowedChannels: getValue error\n");
+        return false;
+    }
+    
+    return true;
+}
+
+bool USBJack::setChannel(UInt16 channel) {
+    if (!_devicePresent) return false;
+    if (!_deviceInit) return false;
+    
+    if (_setValue(0xFC03, channel) != kIOReturnSuccess) {
+        usleep(10000);
+        if (_setValue(0xFC03, channel) != kIOReturnSuccess) {
+            NSLog(@"USBJack::setChannel: setValue error\n");
+            return false;
+        }
+    }
+    
+    if (_isEnabled) {
+        if (_disable() != kIOReturnSuccess) {
+            NSLog(@"USBJack::setChannel: Couldn't disable card\n");
+            return false;
+        }
+        if (_enable() != kIOReturnSuccess) {
+            NSLog(@"USBJack::setChannel: Couldn't enable card\n");
+            return false;
+        }
+    }
+    
+    _channel = channel;
+    return true;
+}
+
+IOReturn USBJack::_reset() {
+    int i;
+    
+    if (_doCommand(wlcInit, 0) != kIOReturnSuccess) {
+        NSLog(@"USBJack::_reset: _doCommand(wlcInit, 0) failed\n");
+        return kIOReturnError;
+    }
+    
+    usleep(100000); // give it a sec to reset
+    
+    for (i = 0; i < wlTimeout; i++) {
+        _firmwareType = _getFirmwareType();
+        if (_firmwareType != -1) break;
+    }
+    
+    for (i = 0; i < wlTimeout; i++) {
+        if (_setValue(0xFC00, (_firmwareType == WI_LUCENT) ? 0x3 : 0x5) == 
kIOReturnSuccess) break;
+    }
+    
+    if (_firmwareType == WI_INTERSIL) {
+        _setValue(0xFC06, 1); //syscale
+        _setValue(0xFC07, 2304); //max data len
+        _setValue(0xFC09, 0); //pm off!
+        _setValue(0xFC84, 3); //default tx rate
+        _setValue(0xFC85, 0); //promiscous mode
+        _setValue(0xFC2A, 1); //auth type
+        _setValue(0xFC2D, 1); //roaming by firmware
+               _setValue(0xFC28, 0x90); //set wep ignore
+    }
+    
+    if (i==wlTimeout) {
+        NSLog(@"USBJack::_reset: could not set port type\n");
+        return kIOReturnError;
+    }
+    
+    /*
+     * Set list of interesting events
+     */
+    //_interrupts = wleRx;  //| wleTx | wleTxExc | wleAlloc | wleInfo | 
wleInfDrop | wleCmd | wleWTErr | wleTick;
+    
+    _enable();
+    _isSending = false;
+    
+    return kIOReturnSuccess;
+}
+
+IntersilJack::IntersilJack() {
+    _isEnabled = false;
+    _deviceInit = false;
+    _devicePresent = false;
+    
+    _interface = NULL;
+    _runLoopSource = NULL;
+    _runLoop = NULL;
+    _intLoop = NULL;
+    _channel = 3;
+    _frameSize = 0;
+    _notifyPort = NULL;
+    
+    pthread_mutex_init(&_wait_mutex, NULL);
+    pthread_cond_init (&_wait_cond, NULL);
+    pthread_mutex_init(&_recv_mutex, NULL);
+    pthread_cond_init (&_recv_cond, NULL);
+    
+    run();
+    
+    while (_runLoop==NULL || _intLoop==NULL)
+        usleep(100);
+}
+
+IntersilJack::~IntersilJack() {
+    stopRun();
+    _interface = NULL;
+    _frameSize = 0;
+    
+    pthread_mutex_destroy(&_wait_mutex);
+    pthread_cond_destroy(&_wait_cond);
+    pthread_mutex_destroy(&_recv_mutex);
+    pthread_cond_destroy(&_recv_cond);
+}
+

Added: branches/usb-drivers/Sources/Driver/USBJack/RalinkJack.h
===================================================================
--- branches/usb-drivers/Sources/Driver/USBJack/RalinkJack.h    2006-07-26 
01:50:43 UTC (rev 161)
+++ branches/usb-drivers/Sources/Driver/USBJack/RalinkJack.h    2006-07-26 
01:59:29 UTC (rev 162)
@@ -0,0 +1,23 @@
+/*
+ *  RalinkJack.h
+ *  KisMAC
+ *
+ *  Created by Geoffrey Kruse on 5/28/06.
+ *  Copyright 2006 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+#import <Cocoa/Cocoa.h>
+#import "USBJack.h"
+
+class RalinkJack: public USBJack
+{
+public:
+    
+    RalinkJack();
+    ~RalinkJack();
+    
+private:
+        int temp;
+};
+

Added: branches/usb-drivers/Sources/Driver/USBJack/RalinkJack.mm
===================================================================
--- branches/usb-drivers/Sources/Driver/USBJack/RalinkJack.mm   2006-07-26 
01:50:43 UTC (rev 161)
+++ branches/usb-drivers/Sources/Driver/USBJack/RalinkJack.mm   2006-07-26 
01:59:29 UTC (rev 162)
@@ -0,0 +1,45 @@
+/*
+ *  RalinkJack.mm
+ *  KisMAC
+ *
+ *  Created by Geoffrey Kruse on 5/28/06.
+ *  Copyright 2006 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+#include "RalinkJack.h"
+
+RalinkJack::RalinkJack() {
+    _isEnabled = false;
+    _deviceInit = false;
+    _devicePresent = false;
+    
+    _interface = NULL;
+    _runLoopSource = NULL;
+    _runLoop = NULL;
+    _intLoop = NULL;
+    _channel = 3;
+    _frameSize = 0;
+    _notifyPort = NULL;
+    
+    pthread_mutex_init(&_wait_mutex, NULL);
+    pthread_cond_init (&_wait_cond, NULL);
+    pthread_mutex_init(&_recv_mutex, NULL);
+    pthread_cond_init (&_recv_cond, NULL);
+    
+    run();
+    
+    while (_runLoop==NULL || _intLoop==NULL)
+        usleep(100);
+}
+
+RalinkJack::~RalinkJack() {
+    stopRun();
+    _interface = NULL;
+    _frameSize = 0;
+    
+    pthread_mutex_destroy(&_wait_mutex);
+    pthread_cond_destroy(&_wait_cond);
+    pthread_mutex_destroy(&_recv_mutex);
+    pthread_cond_destroy(&_recv_cond);
+}

Added: branches/usb-drivers/Sources/Driver/USBJack/USBJack.h
===================================================================
--- branches/usb-drivers/Sources/Driver/USBJack/USBJack.h       2006-07-26 
01:50:43 UTC (rev 161)
+++ branches/usb-drivers/Sources/Driver/USBJack/USBJack.h       2006-07-26 
01:59:29 UTC (rev 162)
@@ -0,0 +1,120 @@
+/*
+        
+        File:                  USBIntersil.h
+        Program:               KisMAC
+       Author:                 Michael Ro§berg
+                               mick@xxxxxxxxxxxxxxxx
+       Description:            KisMAC is a wireless stumbler for MacOS X.
+                
+        This file is part of KisMAC.
+
+    KisMAC is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    KisMAC is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with KisMAC; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <Cocoa/Cocoa.h>
+#include <IOKit/usb/IOUSBLib.h>
+#include <pthread.h>
+#include "../../Core/80211b.h"
+#include <unistd.h>
+#include "prism2.h"
+#include "structs.h"
+
+class USBJack {
+public:
+    bool    startCapture(UInt16 channel);
+    bool    stopCapture();
+    virtual bool    getChannel(UInt16* channel);
+    virtual bool    getAllowedChannels(UInt16* channel);
+    virtual bool    setChannel(UInt16 channel);
+    bool    devicePresent();
+    
+    WLFrame *recieveFrame();
+    bool    sendFrame(UInt8* data);
+    
+    void    startMatching();
+    USBJack();
+    virtual ~USBJack();
+    
+protected:
+    bool    run();
+    bool    stopRun();
+    
+    int kInterruptPipe;
+    int kOutPipe;
+    int kInPipe; 
+
+    IOReturn    _doCommand(enum WLCommandCode cmd, UInt16 param0, UInt16 
param1 = 0, UInt16 param2 = 0);
+    IOReturn    _doCommandNoWait(enum WLCommandCode cmd, UInt16 param0, UInt16 
param1 = 0, UInt16 param2 = 0);
+#if BYTE_ORDER == BIG_ENDIAN
+        IOReturn    _getRecord(UInt16 rid, void* buf, UInt32* n, bool 
swapBytes = true);
+        IOReturn    _setRecord(UInt16 rid, const void* buf, UInt32 n, bool 
swapBytes = true);
+#else 
+        IOReturn    _getRecord(UInt16 rid, void* buf, UInt32* n, bool 
swapBytes = false); 
+        IOReturn    _setRecord(UInt16 rid, const void* buf, UInt32 n, bool 
swapBytes = false); 
+#endif
+    IOReturn    _getValue(UInt16 rid, UInt16* v);
+    IOReturn    _setValue(UInt16 rid, UInt16 v);
+    IOReturn    _sendFrame(UInt8* data, IOByteCount size);
+    
+    IOReturn    _getHardwareAddress(struct WLHardwareAddress* addr);
+    IOReturn    _getIdentity(WLIdentity* wli);
+    int         _getFirmwareType();
+    IOReturn    _disable();
+    IOReturn    _enable();
+    IOReturn    _init();
+    virtual IOReturn    _reset();
+    
+    inline void        _lockDevice();
+    inline void        _unlockDevice();
+    inline IOReturn    _writeWaitForResponse(UInt32 size);
+    
+    IOReturn    _configureAnchorDevice(IOUSBDeviceInterface **dev);
+    IOReturn    _findInterfaces(void *refCon, IOUSBDeviceInterface **dev);
+    
+    static void         _addDevice(void *refCon, io_iterator_t iterator);
+    static void         _handleDeviceRemoval(void *refCon, io_iterator_t 
iterator);
+    static void         _interruptRecieved(void *refCon, IOReturn result, int 
len);
+    static void         _runCFRunLoop(USBJack* me);
+    static void         _intCFRunLoop(USBJack* me);
+
+    SInt32                      _vendorID;
+    SInt32                      _productID;
+    
+    bool                        _devicePresent;
+    bool                        _deviceInit;
+    bool                        _stayUp;
+    bool                        _isSending;
+    bool                        _isEnabled;
+    SInt16                      _firmwareType;
+    
+    CFRunLoopRef                _runLoop;
+    CFRunLoopRef                _intLoop;
+    UInt16                      _channel;
+    IONotificationPortRef      _notifyPort;
+    CFRunLoopSourceRef         _runLoopSource;
+    io_iterator_t              _deviceAddedIter;
+    io_iterator_t              _deviceRemovedIter;
+    IOUSBInterfaceInterface**   _interface;
+    union _usbout               _outputBuffer;
+    union _usbin                _inputBuffer;
+    union _usbin                _recieveBuffer;
+    UInt8                       _frameBuffer[3000];
+    UInt16                      _frameSize;
+    
+    pthread_mutex_t             _wait_mutex;
+    pthread_cond_t              _wait_cond;
+    pthread_mutex_t             _recv_mutex;
+    pthread_cond_t              _recv_cond;
+};
\ No newline at end of file

Added: branches/usb-drivers/Sources/Driver/USBJack/USBJack.mm
===================================================================
--- branches/usb-drivers/Sources/Driver/USBJack/USBJack.mm      2006-07-26 
01:50:43 UTC (rev 161)
+++ branches/usb-drivers/Sources/Driver/USBJack/USBJack.mm      2006-07-26 
01:59:29 UTC (rev 162)
@@ -0,0 +1,1034 @@
+/*
+        
+        File:                  USBIntersil.mm
+        Program:               KisMAC
+               Author:                 Michael Rossberg
+                                               mick@xxxxxxxxxxxxxxxx
+               Description:    KisMAC is a wireless stumbler for MacOS X.
+                
+        This file is part of KisMAC.
+
+    KisMAC is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    KisMAC is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with KisMAC; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+       
+#include <CoreFoundation/CoreFoundation.h>
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOCFPlugIn.h>
+
+#include "USBJack.h"
+#include "IntersilJack.h"
+
+#define wlcDeviceGone   (int)0xe000404f
+#define align64(a)      (((a)+63)&~63)
+
+struct identStruct {
+    UInt16 vendor;
+    UInt16 device;
+};
+
+enum  deviceTypes {
+    intersil,
+    zydas,
+    ralink
+} deviceType; 
+
+static struct identStruct devices[] = {
+    { 0x04bb, 0x0922}, //1 IOData AirPort WN-B11/USBS
+    { 0x07aa, 0x0012}, //2 Corega Wireless LAN USB Stick-11
+    { 0x09aa, 0x3642}, //3 Prism2.x 11Mbps WLAN USB Adapter
+    { 0x1668, 0x0408}, //4 Actiontec Prism2.5 11Mbps WLAN USB Adapter
+    { 0x1668, 0x0421}, //5 Actiontec Prism2.5 11Mbps WLAN USB Adapter
+    { 0x066b, 0x2212}, //6 Linksys WUSB11v2.5 11Mbps WLAN USB Adapter
+    { 0x066b, 0x2213}, //7 Linksys WUSB12v1.1 11Mbps WLAN USB Adapter
+    { 0x067c, 0x1022}, //8 Siemens SpeedStream 1022 11Mbps WLAN USB Adapter
+    { 0x049f, 0x0033}, //9 Compaq/Intel W100 PRO/Wireless 11Mbps multiport 
WLAN Adapter
+    { 0x0411, 0x0016}, //10 Melco WLI-USB-S11 11Mbps WLAN Adapter
+    { 0x08de, 0x7a01}, //11 PRISM25 IEEE 802.11 Mini USB Adapter
+    { 0x8086, 0x1111}, //12 Intel PRO/Wireless 2011B LAN USB Adapter
+    { 0x0d8e, 0x7a01}, //13 PRISM25 IEEE 802.11 Mini USB Adapter
+    { 0x045e, 0x006e}, //14 Microsoft MN510 Wireless USB Adapter
+    { 0x0967, 0x0204}, //15 Acer Warplink USB Adapter
+    { 0x0cde, 0x0002}, //16 Z-Com 725/726 Prism2.5 USB/USB Integrated
+    { 0x413c, 0x8100}, //17 Dell TrueMobile 1180 Wireless USB Adapter
+    { 0x0b3b, 0x1601}, //18 ALLNET 0193 11Mbps WLAN USB Adapter
+    { 0x0b3b, 0x1602}, //19 ZyXEL ZyAIR B200 Wireless USB Adapter
+    { 0x0baf, 0x00eb}, //20 USRobotics USR1120 Wireless USB Adapter
+    { 0x0411, 0x0027}, //21 Melco WLI-USB-KS11G 11Mbps WLAN Adapter
+    { 0x04f1, 0x3009}, //22 JVC MP-XP7250 Builtin USB WLAN Adapter
+    { 0x03f3, 0x0020}, //23 Adaptec AWN-8020 USB WLAN Adapter
+    { 0x0ace, 0x1201}, //24 ZyDAS ZD1201 Wireless USB Adapter
+    { 0x2821, 0x3300}, //25 ASUS-WL140 Wireless USB Adapter
+    { 0x2001, 0x3700}, //26 DWL-122 Wireless USB Adapter
+    { 0x0846, 0x4110}, //27 NetGear MA111
+    { 0x0772, 0x5731}, //28 MacSense WUA-700
+    { 0x124a, 0x4017}, //29 AirVast WN-220?
+    { 0x9016, 0x182d}, //30 Sitecom WL-022 - new version
+       { 0x0707, 0xee04}, //31 SMC WUSB32
+       { 0x1915, 0x2236}, //32 WUSB11 version 3.0
+    //zydas
+    {0x0586, 0x3401}, //1 Zyxel duh
+    //ralink
+    {0x2001, 0x3C00}, //1 Dlink duh
+};
+
+#define dIntersilDeviceCount 32
+#define dZydasDeviceCount 1
+#define dRalinkDeviceCount 1
+
+#define dbgOutPutBuf(a) NSLog( @"0x%.4x 0x%.4x 0x%.4x 0x%.4x%.4x", 
NSSwapLittleShortToHost(*((UInt16*)&(a) )), 
NSSwapLittleShortToHost(*((UInt16*)&(a)+1)), 
NSSwapLittleShortToHost(*((UInt16*)&(a)+2)), 
NSSwapLittleShortToHost(*((UInt16*)&(a)+3)), 
NSSwapLittleShortToHost(*((UInt16*)&(a)+4)) );              
+
+#import <mach/mach_types.h>
+#import <mach/mach_error.h>
+
+
+bool USBJack::startCapture(UInt16 channel) {
+    return false;   //this method MUST be overridden
+}
+
+bool USBJack::stopCapture() {
+    return false;   //this method MUST be overridden
+}
+
+bool USBJack::getChannel(UInt16* channel) {
+    return false;   //this method MUST be overridden
+}
+
+bool USBJack::getAllowedChannels(UInt16* channels) {
+    return false;   //this method MUST be overridden
+}
+
+bool USBJack::setChannel(UInt16 channel) {
+    return false;   //this method MUST be overridden
+}
+
+bool USBJack::devicePresent() {
+    return _devicePresent;
+}
+
+WLFrame *USBJack::recieveFrame() {
+    WLFrame* ret;
+    
+    if (!_devicePresent) return NULL;
+    
+    pthread_mutex_lock(&_recv_mutex);
+    pthread_cond_wait(&_recv_cond, &_recv_mutex);
+    if (_frameSize==0) ret = NULL;
+    else {
+        ret = (WLFrame*)_frameBuffer;
+    }
+    pthread_mutex_unlock(&_recv_mutex);
+    return ret;
+}
+
+bool USBJack::sendFrame(UInt8* data) {
+    WLFrame *frameDescriptor;
+    UInt8 aData[2364];
+    IOByteCount pktsize;
+    
+    memcpy(aData, data, sizeof(WLFrame));
+    frameDescriptor = (WLFrame*)aData;
+    switch(frameDescriptor->frameControl & 0x0c) {
+        case 0x08:
+        case 0x00:
+            pktsize = frameDescriptor->dataLen;
+            if ((pktsize + sizeof(WLFrame)) > 2364) return 
kIOReturnBadArgument;
+            
frameDescriptor->dataLen=NSSwapHostShortToLittle(frameDescriptor->dataLen);
+            break;
+        case 0x04:
+            pktsize = 0;
+            frameDescriptor->dataLen = 0;
+            break;
+        default:
+            return kIOReturnBadArgument;
+    }
+
+    frameDescriptor->txControl=NSSwapHostShortToLittle(0x08 | 
_TX_RETRYSTRAT_SET(3)| _TX_CFPOLL_SET(1) | _TX_TXEX_SET(0) | _TX_TXOK_SET(0) | 
_TX_MACPORT_SET(0));
+    
+    frameDescriptor->rate = 0x6e;      //11 MBit/s
+    frameDescriptor->tx_rate = 0x6e;   //11 MBit/s
+
+    memcpy(aData + 0x3C, data + sizeof(WLFrame), pktsize);
+
+    if (_sendFrame(aData, pktsize + 0x3C) != kIOReturnSuccess)
+        return NO;
+    
+    return YES;
+}
+
+#pragma mark -
+
+IOReturn USBJack::_getHardwareAddress(struct WLHardwareAddress* addr) {
+    UInt32 size = sizeof(struct WLHardwareAddress);
+    
+    if (_getRecord(0xFC01, (UInt16*)addr, &size, false) != kIOReturnSuccess) {
+       NSLog(@"USBJack::_getHardwareAddress: getRecord error\n");
+       return kIOReturnError;
+    }
+
+    NSLog(@"USBJack: MAC 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
+                addr->bytes[0], addr->bytes[1], addr->bytes[2],
+                addr->bytes[3], addr->bytes[4], addr->bytes[5]);
+
+    return kIOReturnSuccess;
+}
+
+IOReturn USBJack::_getIdentity(WLIdentity* wli) {
+    UInt32 size = sizeof(WLIdentity);
+    if (_getRecord(0xFD20, (UInt16*)wli, &size) != kIOReturnSuccess) {
+        NSLog(@"USBJack::getIdentity: getRecord failed\n");
+        return kIOReturnError;
+    }
+
+    return kIOReturnSuccess;
+}
+
+int USBJack::_getFirmwareType() {
+    UInt16 card_id;
+    UInt32 size = 8;
+    UInt8 d[8];
+    
+    if (_getRecord(0xFD0B, (UInt16*)d, &size) != kIOReturnSuccess) {
+        NSLog(@"USBJack::_getFirmwareType: getRecord failed\n");
+        return -1;
+    }
+
+    card_id = *(UInt16*)d;
+    if (card_id & 0x8000) {
+        NSLog(@"USBJack: Detected a Prism2 card\n");
+        return WI_INTERSIL;
+    } else {
+        NSLog(@"USBJack: WARNING detected a Lucent card. This is not 
supported! 0x%x\n",card_id);
+        return WI_LUCENT;
+    }
+}
+
+IOReturn USBJack::_enable() {
+    if (_doCommand(wlcEnable, 0) != kIOReturnSuccess) {
+        NSLog(@"USBJackUSBJack::startCapture: _doCommand(wlcEnable) failed\n");
+        return kIOReturnError;
+    }
+    _isEnabled = true;
+    
+    return kIOReturnSuccess;
+}
+
+IOReturn USBJack::_disable() {
+    if (_doCommand(wlcDisable, 0) != kIOReturnSuccess) {
+        NSLog(@"USBJack::_disable: _doCommand(wlcDisable) failed\n");
+        return kIOReturnError;
+    }
+    _isEnabled = false;
+
+    return kIOReturnSuccess;
+}
+
+IOReturn USBJack::_init() {
+    WLIdentity ident;
+    WLHardwareAddress macAddr;
+    int i; 
+    
+    _firmwareType = -1;
+    
+    for (i = 0; i< wlResetTries; i++) {
+        if (_reset() == kIOReturnSuccess) break;
+        if (!_devicePresent) return kIOReturnError;
+    }
+    
+    /*
+     * Get firmware vendor and version
+     */
+     
+    if (_getIdentity(&ident) != kIOReturnSuccess) {
+        NSLog(@"USBJack::_init: Couldn't read card identity\n");
+        return kIOReturnError;
+    }
+
+    NSLog(@"USBJack: Firmware vendor %d, variant %d, version %d.%d\n", 
ident.vendor, ident.variant, ident.major, ident.minor);
+
+    if (_getHardwareAddress(&macAddr) != kIOReturnSuccess) {
+        NSLog(@"USBJack::_init: Couldn't read MAC address\n");
+        return kIOReturnError;
+    }
+    
+    _deviceInit = true;
+    
+    return kIOReturnSuccess;
+}
+
+IOReturn USBJack::_reset() {
+    return kIOReturnError;  //this method MUST be overridden
+}
+
+#pragma mark -
+
+IOReturn USBJack::_doCommand(enum WLCommandCode cmd, UInt16 param0, UInt16 
param1, UInt16 param2) {
+    UInt16 status;
+    
+    if (!_devicePresent) return kIOReturnError;
+    
+    if (_interface == NULL) {
+        NSLog(@"USBJack::_doCommand called with NULL interface this is 
prohibited!\n");
+        return kIOReturnError;
+    }
+    
+    _lockDevice();
+    /* Initialize the command */
+    _outputBuffer.cmdreq.type =        NSSwapHostShortToLittle(_USB_CMDREQ);
+    _outputBuffer.cmdreq.cmd =          NSSwapHostShortToLittle(cmd);
+    _outputBuffer.cmdreq.parm0 =       NSSwapHostShortToLittle(param0);
+    _outputBuffer.cmdreq.parm1 =       NSSwapHostShortToLittle(param1);
+    _outputBuffer.cmdreq.parm2 =       NSSwapHostShortToLittle(param2);
+    
+    if (_writeWaitForResponse(sizeof(_outputBuffer.cmdreq)) != 
kIOReturnSuccess) {
+        NSLog(@"USBJack::unable to execute commmand (%08x)\n", cmd);
+        _unlockDevice();
+        return kIOReturnError;
+    }
+    
+    status = NSSwapLittleShortToHost(_inputBuffer.cmdresp.status) >> 7;
+    _unlockDevice();
+    
+    if (status) {
+        NSLog(@"USBJack::_doCommand: Status code (0x%x) at command cmd 
0x%x\n", status, cmd);
+        return kIOReturnError;
+    }
+
+    return kIOReturnSuccess;
+}
+
+IOReturn USBJack::_doCommandNoWait(enum WLCommandCode cmd, UInt16 param0, 
UInt16 param1, UInt16 param2) {
+    IOReturn kr;
+    
+    if (_interface == NULL) {
+        NSLog(@"USBJack::_doCommandNoWait called with NULL interface this is 
prohibited!\n");
+        return kIOReturnError;
+    }
+    
+    _lockDevice();
+    /* Initialize the command */
+    _outputBuffer.cmdreq.type =        NSSwapHostShortToLittle(_USB_CMDREQ);
+    _outputBuffer.cmdreq.cmd =          NSSwapHostShortToLittle(cmd);
+    _outputBuffer.cmdreq.parm0 =       NSSwapHostShortToLittle(param0);
+    _outputBuffer.cmdreq.parm1 =       NSSwapHostShortToLittle(param1);
+    _outputBuffer.cmdreq.parm2 =       NSSwapHostShortToLittle(param2);
+    
+    kr = (*_interface)->WritePipe(_interface, kOutPipe, &_outputBuffer, 
sizeof(_outputBuffer.cmdreq));
+    _unlockDevice();
+
+    return kr;
+}
+
+IOReturn USBJack::_getRecord(UInt16 rid, void* buf, UInt32* n, bool swapBytes) 
{
+    UInt32  readLength = 0;
+    
+    if (!_devicePresent) return kIOReturnError;
+    
+    if (_interface == NULL) {
+        NSLog(@"USBJack::_getRecord called with NULL interface this is 
prohibited!\n");
+        return kIOReturnError;
+    }
+    
+    _lockDevice();
+    
+    _outputBuffer.rridreq.type =   NSSwapHostShortToLittle(_USB_RRIDREQ);
+    _outputBuffer.rridreq.frmlen = 
NSSwapHostShortToLittle(sizeof(_outputBuffer.rridreq.rid));
+    _outputBuffer.rridreq.rid =    NSSwapHostShortToLittle(rid);
+    
+    if (_writeWaitForResponse(sizeof(_outputBuffer.rridreq)) != 
kIOReturnSuccess) {
+        NSLog(@"USBJack::unable to write record offset.\n");
+        _unlockDevice();
+        return kIOReturnError;
+    }
+    
+    readLength = ((NSSwapLittleShortToHost(_inputBuffer.rridresp.frmlen)-1)*2);
+    if (readLength != *n) {  
+        //NSLog(@"USBJack::RID len mismatch, rid=0x%04x hlen=%d fwlen=%d\n", 
rid, *n, readLength);
+        _unlockDevice();
+        return kIOReturnError;
+    }
+
+    if (swapBytes) {
+        swab(_inputBuffer.rridresp.data, buf, readLength);
+    } else {
+        memcpy(buf, _inputBuffer.rridresp.data, readLength);
+    }
+    
+    _unlockDevice();
+    
+    return kIOReturnSuccess;
+}
+
+IOReturn USBJack::_setRecord(UInt16 rid, const void* buf, UInt32 n, bool 
swapBytes) {
+    UInt32      numBytes;
+    UInt16      status;
+  
+    if (!_devicePresent) return kIOReturnError;
+    
+    if (_interface == NULL) {
+        NSLog(@"USBJack::_setRecord called with NULL interface this is 
prohibited!\n");
+        return kIOReturnError;
+    }
+    
+    _lockDevice();
+
+    bzero(&_outputBuffer, sizeof(_outputBuffer));
+    _outputBuffer.wridreq.type =   NSSwapHostShortToLittle(_USB_WRIDREQ);
+    _outputBuffer.wridreq.frmlen = 
NSSwapHostShortToLittle((sizeof(_outputBuffer.wridreq.rid) + n + 1) / 2);
+    _outputBuffer.wridreq.rid =    NSSwapHostShortToLittle(rid);
+    
+    if (swapBytes) {
+        swab(buf, _outputBuffer.wridreq.data, n);
+    } else {
+        memcpy(_outputBuffer.wridreq.data, buf, n);
+    }
+    
+    numBytes =  align64(sizeof(_outputBuffer.wridreq.type) +
+                       sizeof(_outputBuffer.wridreq.frmlen) + 
sizeof(_outputBuffer.wridreq.rid) + n);
+   
+    if (_writeWaitForResponse(numBytes) != kIOReturnSuccess) {
+        NSLog(@"USBJack::unable to write record offset for writing.\n");
+        _unlockDevice();
+        return kIOReturnError;
+    }
+    
+    status = NSSwapLittleShortToHost(_inputBuffer.wridresp.status);
+    if (status & 0x7F00) {
+       NSLog(@"USBJack::_setRecord: setRecord result 0x%x\n", status & 0x7F00);
+        _unlockDevice();
+        return kIOReturnError;
+    }
+    
+    _unlockDevice();
+    
+    return kIOReturnSuccess;
+}
+
+IOReturn USBJack::_getValue(UInt16 rid, UInt16* v) {
+    UInt32 n = 2;
+    return _getRecord(rid, v, &n);
+}
+
+IOReturn USBJack::_setValue(UInt16 rid, UInt16 v) {
+    UInt16 value = v;
+    IOReturn ret = _setRecord(rid, &value, 2);
+
+    if (ret != kIOReturnSuccess)
+        return ret;
+
+    ret = _getValue(rid, &value);
+
+    if (ret != kIOReturnSuccess)
+        return ret;
+
+    if (value != v) {
+        //NSLog(@"USBJack::setValue: Failed to set value (0x%x != 0x%x) for 
register 0x%x\n", value, v, rid);
+        return kIOReturnError;
+    }
+
+    return kIOReturnSuccess;
+}
+
+IOReturn USBJack::_sendFrame(UInt8* data, IOByteCount size) {
+    UInt32      numBytes;
+    IOReturn    kr;
+  
+    if (!_devicePresent) return kIOReturnError;
+    
+    if (_interface == NULL) {
+        NSLog(@"USBJack::_sendFrame called with NULL interface this is 
prohibited!\n");
+        return kIOReturnError;
+    }
+    
+    _lockDevice();
+
+    memcpy(&_outputBuffer, data, size);
+    _outputBuffer.type =   NSSwapHostShortToLittle(_USB_TXFRM);
+    
+    numBytes =  align64(size);
+   
+    kr = (*_interface)->WritePipe(_interface, kOutPipe, &_outputBuffer, 
numBytes);
+
+    _unlockDevice();
+        
+    return kr;
+}
+
+#pragma mark -
+
+void  USBJack::_lockDevice() {
+    pthread_mutex_lock(&_wait_mutex);
+}
+
+void  USBJack::_unlockDevice() {
+    pthread_mutex_unlock(&_wait_mutex);
+}
+
+IOReturn USBJack::_writeWaitForResponse(UInt32 size) {
+    IOReturn kr;
+    struct timespec to;
+    int error;
+    int calls = 0;
+    
+    to.tv_nsec = 0;
+    
+    do {
+        kr = (*_interface)->WritePipe(_interface, kOutPipe, &_outputBuffer, 
size);
+        if (kr != kIOReturnSuccess) {
+            if (kr==wlcDeviceGone) _devicePresent = false;
+            else NSLog(@"USBJack::unable to write to USB Device(%08x)\n", kr);
+            return kr;
+        }
+
+        to.tv_sec  = time(0) + 5;
+        error = pthread_cond_timedwait(&_wait_cond, &_wait_mutex, &to);
+        if (error == ETIMEDOUT) NSLog(@"Timeout error.");
+        
+        if (calls++ == 5) return kIOReturnTimeout;
+    } while (error == ETIMEDOUT); //wait for async response
+
+    return kIOReturnSuccess;
+}
+ 
+void USBJack::_interruptRecieved(void *refCon, IOReturn result, int len) {
+    USBJack             *me = (USBJack*) refCon;
+    IOReturn                    kr;
+    UInt32                      type;
+    
+    //NSLog(@"interruptRecieved.\n");
+    if (kIOReturnSuccess != result) {
+        if (result == (IOReturn)0xe00002ed) {
+            me->_devicePresent = false;
+            //tell the recieve function that we are gone
+            pthread_mutex_lock(&me->_recv_mutex);
+            me->_frameSize = 0;
+            pthread_cond_signal(&me->_recv_cond);
+            pthread_mutex_unlock(&me->_recv_mutex);
+            return;
+        } else {
+            NSLog(@"error from async interruptRecieved (%08x)\n", result);
+            if (me->_devicePresent) goto readon;
+        }
+    }
+    
+    type = NSSwapLittleShortToHost(me->_recieveBuffer.type);
+    if (_USB_ISRXFRM(type)) {
+        WLFrame* frameDescriptor = (WLFrame*)&(me->_recieveBuffer.rxfrm);
+        frameDescriptor->status = 
NSSwapLittleShortToHost(frameDescriptor->status);
+        frameDescriptor->dataLen = 
NSSwapLittleShortToHost(frameDescriptor->dataLen);
+        frameDescriptor->channel = me->_channel;
+        if (me->_channel > 14) 
+            return;
+
+        /*
+            * If the frame has an FCS error, is received on a MAC port other
+            * than the monitor mode port, or is a message type other than
+            * normal, we don't want it.
+            */
+        if (frameDescriptor->status & 0x1 ||
+            (frameDescriptor->status & 0x700) != 0x700 ||
+            frameDescriptor->status & 0xe000) {
+            goto readon;
+        }
+        
+        if (frameDescriptor->dataLen > 2304) {
+            //NSLog(@"MACJackCard::_handleRx: Oversized packet (%d bytes)\n",
+            //            frameDescriptor->dataLen);
+            goto readon;
+        }
+        
+        /*
+            * Read in the packet data.  Read 8 extra bytes for IV + ICV if
+            * applicable.
+        */
+        UInt16 packetLength = sizeof(WLFrame) + (frameDescriptor->dataLen) + 8;
+        
+        pthread_mutex_lock(&me->_recv_mutex);
+        memcpy(me->_frameBuffer, frameDescriptor, packetLength);
+        me->_frameSize = packetLength;
+        
+        pthread_cond_signal(&me->_recv_cond);
+        pthread_mutex_unlock(&me->_recv_mutex);
+        
+    } else {
+        switch (type) {
+        case _USB_INFOFRM:
+            /*if (action == ABORT)
+                    goto exit;
+            if (action == HANDLE)
+                    _usbin_info(wlandev, usbin);*/
+            break;
+        case _USB_CMDRESP:
+        case _USB_WRIDRESP:
+        case _USB_RRIDRESP:
+        case _USB_WMEMRESP:
+        case _USB_RMEMRESP:
+                pthread_mutex_lock(&me->_wait_mutex);
+                memcpy(&me->_inputBuffer, &me->_recieveBuffer, len);
+                pthread_cond_signal(&me->_wait_cond);
+                pthread_mutex_unlock(&me->_wait_mutex);
+                break;
+        case _USB_BUFAVAIL:
+                NSLog(@"Received BUFAVAIL packet, frmlen=%d\n", 
me->_recieveBuffer.bufavail.frmlen);
+                break;
+        case _USB_ERROR:
+                NSLog(@"Received USB_ERROR packet, errortype=%d\n", 
me->_recieveBuffer.usberror.errortype);
+                break;
+    
+        default:
+                break;
+        }
+    }
+    
+readon:
+    bzero(&me->_recieveBuffer, sizeof(me->_recieveBuffer));
+    kr = (*me->_interface)->ReadPipeAsync((me->_interface), (me->kInPipe), 
&me->_recieveBuffer, sizeof(me->_recieveBuffer), 
(IOAsyncCallback1)_interruptRecieved, refCon);
+    if (kIOReturnSuccess != kr) {
+        NSLog(@"unable to do async interrupt read (%08x). this means the card 
is stopped!\n", kr);
+               // I haven't been able to reproduce the error that caused it to 
hit this point in the code again since adding the following lines
+               // however, when it hit this point previously, the only 
solution was to kill and relaunch KisMAC, so at least this won't make anything 
worse
+               NSLog(@"Attempting to re-initialise adapter...");
+               if (me->_init() != kIOReturnSuccess) 
NSLog(@"USBJack::_interruptReceived: _init() failed\n");
+    }
+        
+}
+
+#pragma mark -
+
+IOReturn USBJack::_configureAnchorDevice(IOUSBDeviceInterface **dev) {
+    UInt8                              numConf;
+    IOReturn                           kr;
+    IOUSBConfigurationDescriptorPtr    confDesc;
+    
+    kr = (*dev)->GetNumberOfConfigurations(dev, &numConf);
+    if (!numConf)
+        return kIOReturnError;
+    
+    // get the configuration descriptor for index 0
+    kr = (*dev)->GetConfigurationDescriptorPtr(dev, 0, &confDesc);
+    if (kr) {
+        NSLog(@"\tunable to get config descriptor for index %d (err = 
%08x)\n", 0, kr);
+        return kIOReturnError;
+    }
+    kr = (*dev)->SetConfiguration(dev, confDesc->bConfigurationValue);
+    if (kr) {
+        NSLog(@"\tunable to set configuration to value %d (err=%08x)\n", 0, 
kr);
+        return kIOReturnError;
+    }
+    
+    return kIOReturnSuccess;
+}
+
+IOReturn USBJack::_findInterfaces(void *refCon, IOUSBDeviceInterface **dev) {
+    IOReturn                   kr;
+    IOUSBFindInterfaceRequest  request;
+    io_iterator_t              iterator;
+    io_service_t               usbInterface;
+    IOCFPlugInInterface        **plugInInterface = NULL;
+    IOUSBInterfaceInterface    **intf = NULL;
+    HRESULT                    res;
+    SInt32                     score;
+    UInt8                      intfClass;
+    UInt8                      intfSubClass;
+    UInt8                      intfNumEndpoints;
+    int                                pipeRef;
+    CFRunLoopSourceRef         runLoopSource;
+    BOOL                        error;
+    USBJack             *me = (USBJack *) refCon;
+    
+    
+    request.bInterfaceClass = kIOUSBFindInterfaceDontCare;
+    request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare;
+    request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare;
+    request.bAlternateSetting = kIOUSBFindInterfaceDontCare;
+   
+    kr = (*dev)->CreateInterfaceIterator(dev, &request, &iterator);
+    
+    while ((usbInterface = IOIteratorNext(iterator))) {
+        //NSLog(@"Interface found.\n");
+       
+        kr = IOCreatePlugInInterfaceForService(usbInterface, 
kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &plugInInterface, 
&score);
+        kr = IOObjectRelease(usbInterface);                            // done 
with the usbInterface object now that I have the plugin
+        if ((kIOReturnSuccess != kr) || !plugInInterface) {
+            NSLog(@"unable to create a plugin (%08x)\n", kr);
+            break;
+        }
+            
+        // I have the interface plugin. I need the interface interface
+        res = (*plugInInterface)->QueryInterface(plugInInterface, 
CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID), (void**) &intf);
+        (*plugInInterface)->Release(plugInInterface);                  // done 
with this
+        if (res || !intf) {
+            NSLog(@"couldn't create an IOUSBInterfaceInterface (%08x)\n", 
(int) res);
+            break;
+        }
+        
+        kr = (*intf)->GetInterfaceClass(intf, &intfClass);
+        kr = (*intf)->GetInterfaceSubClass(intf, &intfSubClass);
+        
+        //NSLog(@"Interface class %d, subclass %d\n", intfClass, intfSubClass);
+        
+        // Now open the interface. This will cause the pipes to be 
instantiated that are 
+        // associated with the endpoints defined in the interface descriptor.
+        kr = (*intf)->USBInterfaceOpen(intf);
+        if (kIOReturnSuccess != kr) {
+            NSLog(@"unable to open interface (%08x)\n", kr);
+            (void) (*intf)->Release(intf);
+            break;
+        }
+        
+       kr = (*intf)->GetNumEndpoints(intf, &intfNumEndpoints);
+        if (kIOReturnSuccess != kr) {
+            NSLog(@"unable to get number of endpoints (%08x)\n", kr);
+            (void) (*intf)->USBInterfaceClose(intf);
+            (void) (*intf)->Release(intf);
+            break;
+        }
+        
+        if (intfNumEndpoints < 1) {
+            NSLog(@"Error: Interface has %d endpoints. Needs at least 
one!!\n", intfNumEndpoints);
+            (void) (*intf)->USBInterfaceClose(intf);
+            (void) (*intf)->Release(intf);
+            break;
+        }
+        
+        for (pipeRef = 1; pipeRef <= intfNumEndpoints; pipeRef++)
+        {
+            IOReturn   kr2;
+            UInt8      direction;
+            UInt8      number;
+            UInt8      transferType;
+            UInt16     maxPacketSize;
+            UInt8      interval;
+            
+            kr2 = (*intf)->GetPipeProperties(intf, pipeRef, &direction, 
&number, &transferType, &maxPacketSize, &interval);
+            if (kIOReturnSuccess != kr) {
+                NSLog(@"unable to get properties of pipe %d (%08x)\n", 
pipeRef, kr2);
+                (void) (*intf)->USBInterfaceClose(intf);
+                (void) (*intf)->Release(intf);
+                break;
+            } else {
+                error = false;
+                if (direction == kUSBIn && transferType == kUSBBulk) 
me->kInPipe = pipeRef;
+                else if (direction == kUSBOut && transferType == kUSBBulk) 
me->kOutPipe = pipeRef;
+                else if (direction == kUSBIn && transferType  == 
kUSBInterrupt) me->kInterruptPipe = pipeRef;
+                else NSLog(@"Found unknown interface, ignoring");
+            
+                
+                if (error) {
+                    NSLog(@"unable to properties of pipe %d are not as 
expected!\n", pipeRef);
+                    (void) (*intf)->USBInterfaceClose(intf);
+                    (void) (*intf)->Release(intf);
+                    break;
+                }
+            }
+        }
+        
+        // Just like with service matching notifications, we need to create an 
event source and add it 
+        //  to our run loop in order to receive async completion notifications.
+        kr = (*intf)->CreateInterfaceAsyncEventSource(intf, &runLoopSource);
+        if (kIOReturnSuccess != kr) {
+            NSLog(@"unable to create async event source (%08x)\n", kr);
+            (void) (*intf)->USBInterfaceClose(intf);
+            (void) (*intf)->Release(intf);
+            break;
+        }
+        CFRunLoopAddSource(_intLoop, runLoopSource, kCFRunLoopDefaultMode);
+        
+        _interface = intf;
+        
+        NSLog(@"USBJack is now ready to start working.\n");
+        
+        //startUp Interrupt handling
+        UInt32 numBytesRead = sizeof(_recieveBuffer); // leave one byte at the 
end for NUL termination
+        bzero(&_recieveBuffer, numBytesRead);
+        kr = (*intf)->ReadPipeAsync(intf, kInPipe, &_recieveBuffer, 
numBytesRead, (IOAsyncCallback1)_interruptRecieved, this);
+        
+        if (kIOReturnSuccess != kr) {
+            NSLog(@"unable to do async interrupt read (%08x)\n", kr);
+            (void) (*intf)->USBInterfaceClose(intf);
+            (void) (*intf)->Release(intf);
+            break;
+        }
+        
+        _devicePresent = true;
+        me->_init();
+        
+        if (_channel) {
+            startCapture(_channel);
+        }
+        
+        break;
+    }
+    
+    return kr;
+}
+
+void USBJack::_addDevice(void *refCon, io_iterator_t iterator) {
+    USBJack             *me = (USBJack*)refCon;
+    kern_return_t              kr;
+    io_service_t               usbDevice;
+    IOCFPlugInInterface        **plugInInterface=NULL;
+    IOUSBDeviceInterface       **dev=NULL;
+    HRESULT                    res;
+    SInt32                     score;
+    UInt16                     vendor;
+    UInt16                     product;
+    UInt16                     release;
+    int                         i;
+    
+    
+    while ((usbDevice = IOIteratorNext(iterator))) {
+        //NSLog(@"USB Device added.\n");
+       
+        kr = IOCreatePlugInInterfaceForService(usbDevice, 
kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugInInterface, &score);
+        if ((kIOReturnSuccess != kr) || !plugInInterface) {
+            kr = IOObjectRelease(usbDevice);                           // done 
with the device object now that I have the plugin
+            NSLog(@"unable to create a plugin (%08x)\n", kr);
+            continue;
+        }
+        kr = IOObjectRelease(usbDevice);                               // done 
with the device object now that I have the plugin
+            
+        // I have the device plugin, I need the device interface
+        res = (*plugInInterface)->QueryInterface(plugInInterface, 
CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (void**)&dev);
+        (*plugInInterface)->Release(plugInInterface);                  // done 
with this
+        if (res || !dev) {
+            NSLog(@"couldn't create a device interface (%08x)\n", (int) res);
+            continue;
+        }
+        // technically should check these kr values
+        kr = (*dev)->GetDeviceVendor(dev, &vendor);
+        kr = (*dev)->GetDeviceProduct(dev, &product);
+        kr = (*dev)->GetDeviceReleaseNumber(dev, &release);
+        
+        //find the correct device
+        for (i=0; i< (dIntersilDeviceCount + dZydasDeviceCount + 
dRalinkDeviceCount); i++) {
+            if ((vendor == devices[i].vendor) && (product == 
devices[i].device)) break;
+        }
+        
+        if (i < dIntersilDeviceCount) {
+            NSLog(@"Intersil USB Device found (vendor = 0x%x, product = 
0x%x)\n", vendor, product);
+            deviceType = intersil;
+        }
+        else if (i < dIntersilDeviceCount + dZydasDeviceCount) {
+            NSLog(@"Zydas USB Device found (vendor = 0x%x, product = 0x%x)\n", 
vendor, product);
+            deviceType = zydas;
+        }
+        else if (i < dIntersilDeviceCount + dZydasDeviceCount + 
dRalinkDeviceCount) {
+            NSLog(@"Ralink 2500 USB Device found (vendor = 0x%x, product = 
0x%x)\n", vendor, product);
+            deviceType = ralink;
+        }
+        else {
+            NSLog(@"found unwanted device  (vendor = 0x%x, product = 0x%x)\n", 
vendor, product);
+            (*dev)->Release(dev);
+            continue;
+        }
+                
+        // need to open the device in order to change its state
+        kr = (*dev)->USBDeviceOpen(dev);
+        if (kIOReturnSuccess != kr) {
+            NSLog(@"unable to open device: %08x\n", kr);
+            (*dev)->Release(dev);
+            continue;
+        }
+        
+        kr = me->_configureAnchorDevice(dev);
+        if (kIOReturnSuccess != kr) {
+            NSLog(@"unable to configure device: %08x\n", kr);
+            (*dev)->USBDeviceClose(dev);
+            (*dev)->Release(dev);
+            continue;
+        }
+
+        kr = me->_findInterfaces(refCon, dev);
+        if (kIOReturnSuccess != kr) {
+            NSLog(@"unable to find interfaces on device: %08x\n", kr);
+            (*dev)->USBDeviceClose(dev);
+            (*dev)->Release(dev);
+            continue;
+        }
+        
+        kr = (*dev)->USBDeviceClose(dev);
+        kr = (*dev)->Release(dev);
+        
+        break;
+    }
+}
+
+void USBJack::_handleDeviceRemoval(void *refCon, io_iterator_t iterator) {
+    kern_return_t      kr;
+    io_service_t       obj;
+    int                 count = 0;
+    //USBJack     *me = (USBJack*)refCon;
+    
+    while ((obj = IOIteratorNext(iterator)) != nil) {
+        count++;
+        //NSLog(@"Device removed.\n");
+        kr = IOObjectRelease(obj);
+    }
+    
+    /*if (count) {
+        me->_interface = NULL;
+        me->stopRun();
+    }*/
+}
+
+#pragma mark -
+
+bool USBJack::stopRun() {
+    if (_runLoop == NULL && _intLoop == NULL) return false;
+    _stayUp = false;
+    if (_notifyPort) {
+        IONotificationPortDestroy(_notifyPort);
+        _notifyPort = NULL;
+    }
+    
+    if (_runLoop) CFRunLoopStop(_runLoop);
+    if (_intLoop) CFRunLoopStop(_intLoop);
+    
+    _runLoop = NULL;
+    _intLoop = NULL;
+    return true;
+}
+
+void USBJack::_runCFRunLoop(USBJack* me) {
+    me->_runLoop = CFRunLoopGetCurrent();
+    while(me->_stayUp) {
+        CFRunLoopRun();
+    };
+    if (me->_runLoop) {
+        if (me->_runLoopSource) CFRunLoopRemoveSource(me->_runLoop, 
me->_runLoopSource, kCFRunLoopDefaultMode);
+        CFRunLoopStop(me->_runLoop);
+        me->_runLoop = NULL;
+    }
+} 
+
+void USBJack::_intCFRunLoop(USBJack* me) {
+    me->_intLoop = CFRunLoopGetCurrent();
+    while(me->_stayUp) {
+        CFRunLoopRun();
+    };
+    if (me->_intLoop) {
+        CFRunLoopStop(me->_intLoop);
+        me->_intLoop = NULL;
+    }
+} 
+
+bool USBJack::run() {
+    pthread_t pt;
+    
+    _stayUp = true;
+    if (_runLoop==NULL) {
+        pthread_create(&pt, NULL, (void*(*)(void*))_runCFRunLoop, this);
+    }
+    if (_intLoop==NULL) {
+        pthread_create(&pt, NULL, (void*(*)(void*))_intCFRunLoop, this);
+    }
+    
+    return true;
+}
+
+void USBJack::startMatching() {
+    mach_port_t                masterPort;
+    CFMutableDictionaryRef     matchingDict;
+    kern_return_t              kr;
+ 
+    if (_runLoopSource) return;
+    
+    // first create a master_port for my task
+    kr = IOMasterPort(MACH_PORT_NULL, &masterPort);
+    if (kr || !masterPort) {
+        NSLog(@"ERR: Couldn't create a master IOKit Port(%08x)\n", kr);
+    }
+
+    //NSLog(@"Looking for devices matching vendor ID=%ld and product 
ID=%ld\n", _vendorID, _productID);
+
+    // Set up the matching criteria for the devices we're interested in
+    matchingDict = IOServiceMatching(kIOUSBDeviceClassName);   // Interested 
in instances of class IOUSBDevice and its subclasses
+    if (!matchingDict) {
+        NSLog(@"Can't create a USB matching dictionary\n");
+        //mach_port_deallocate(mach_task_self(), masterPort);
+        return;
+    }
+    
+    // Create a notification port and add its run loop event source to our run 
loop
+    // This is how async notifications get set up.
+    _notifyPort = IONotificationPortCreate(masterPort);
+    _runLoopSource = IONotificationPortGetRunLoopSource(_notifyPort);
+    
+    CFRunLoopAddSource(_runLoop, _runLoopSource, kCFRunLoopDefaultMode);
+    
+    // Retain additional references because we use this same dictionary with 
four calls to 
+    // IOServiceAddMatchingNotification, each of which consumes one reference.
+    matchingDict = (CFMutableDictionaryRef) CFRetain(matchingDict); 
+    
+    // Now set up two more notifications, one to be called when a bulk test 
device is first matched by I/O Kit, and the other to be
+    // called when the device is terminated.
+    kr = IOServiceAddMatchingNotification(  _notifyPort,
+                                            kIOFirstMatchNotification,
+                                            matchingDict,
+                                            _addDevice,
+                                            this,
+                                            &_deviceAddedIter);
+                                            
+    _addDevice(this, _deviceAddedIter);        // Iterate once to get 
already-present devices and
+                                                        // arm the notification
+
+    kr = IOServiceAddMatchingNotification(  _notifyPort,
+                                            kIOTerminatedNotification,
+                                            matchingDict,
+                                            _handleDeviceRemoval,
+                                            this,
+                                            &_deviceRemovedIter );
+                                            
+    _handleDeviceRemoval(this, _deviceRemovedIter);    // Iterate once to arm 
the notification
+
+
+    // Now done with the master_port
+    masterPort = 0;
+}
+
+USBJack::USBJack() {
+    _isEnabled = false;
+    _deviceInit = false;
+    _devicePresent = false;
+    
+    _interface = NULL;
+    _runLoopSource = NULL;
+    _runLoop = NULL;
+    _intLoop = NULL;
+    _channel = 3;
+    _frameSize = 0;
+    _notifyPort = NULL;
+    
+    pthread_mutex_init(&_wait_mutex, NULL);
+    pthread_cond_init (&_wait_cond, NULL);
+    pthread_mutex_init(&_recv_mutex, NULL);
+    pthread_cond_init (&_recv_cond, NULL);
+    
+    run();
+    
+    while (_runLoop==NULL || _intLoop==NULL)
+        usleep(100);
+}
+
+USBJack::~USBJack() {
+    stopRun();
+    _interface = NULL;
+    _frameSize = 0;
+
+    pthread_mutex_destroy(&_wait_mutex);
+    pthread_cond_destroy(&_wait_cond);
+    pthread_mutex_destroy(&_recv_mutex);
+    pthread_cond_destroy(&_recv_cond);
+}
\ No newline at end of file

Added: branches/usb-drivers/Sources/Driver/USBJack/prism2.h
===================================================================
--- branches/usb-drivers/Sources/Driver/USBJack/prism2.h        2006-07-26 
01:50:43 UTC (rev 161)
+++ branches/usb-drivers/Sources/Driver/USBJack/prism2.h        2006-07-26 
01:59:29 UTC (rev 162)
@@ -0,0 +1,57 @@
+/*
+        
+        File:                  prism2.h
+        Program:               KisMAC
+       Description:            KisMAC is a wireless stumbler for MacOS X.
+                
+    KisMAC is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    KisMAC is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with KisMAC; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#define wlResetTries 100
+#define wlTimeout  65536
+
+/* Firmware types */
+#define        WI_NOTYPE       0
+#define        WI_LUCENT       1
+#define        WI_INTERSIL     2
+#define        WI_SYMBOL       3
+
+enum WLCommandCode {
+    wlcInit        = 0x0000,
+    wlcEnable      = 0x0001,
+    wlcDisable     = 0x0002,
+    wlcDiag        = 0x0003,
+    wlcAllocMem    = 0x000a,
+    wlcTransmit    = 0x000b,
+    wlcNotify      = 0x0010,
+    wlcInquire     = 0x0011,
+    wlcAccessRead  = 0x0021,
+    wlcAccessWrite = 0x0121,
+    wlcProgram     = 0x0022,
+    wlcMonitorOn   = 0x0B38,
+    wlcMonitorOff  = 0x0F38
+};
+
+struct WLHardwareAddress {
+    UInt8 bytes[6];
+};
+
+struct WLIdentity {
+    UInt16 vendor;
+    UInt16 variant;
+    UInt16 major;
+    UInt16 minor;
+};
+

Added: branches/usb-drivers/Sources/Driver/USBJack/structs.h
===================================================================
--- branches/usb-drivers/Sources/Driver/USBJack/structs.h       2006-07-26 
01:50:43 UTC (rev 161)
+++ branches/usb-drivers/Sources/Driver/USBJack/structs.h       2006-07-26 
01:59:29 UTC (rev 162)
@@ -0,0 +1,208 @@
+/*
+        
+        File:                  structs.h
+        Program:               KisMAC
+       Description:            KisMAC is a wireless stumbler for MacOS X.
+                
+        This file is part of KisMAC. Most of this has been shamelessly ripped 
off
+        the Linux wlan-driver-ng. Sorry but I did not want to sign the NDA.
+
+    KisMAC is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    KisMAC is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with KisMAC; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#define                _RID_GUESSING_MAXLEN    2048  /* I'm not really sure */
+#define                _RIDDATA_MAXLEN         _RID_GUESSING_MAXLEN    
+#define                _USB_RWMEM_MAXLEN       2048
+#define         WLAN_DATA_MAXLEN                2400
+
+/*--------------------------------------------------------------------
+USB Packet structures and constants.
+--------------------------------------------------------------------*/
+
+/* Should be sent to the bulkout endpoint */
+#define _USB_TXFRM     0
+#define _USB_CMDREQ    1
+#define _USB_WRIDREQ   2
+#define _USB_RRIDREQ   3
+#define _USB_WMEMREQ   4
+#define _USB_RMEMREQ   5
+
+/* Received from the bulkin endpoint */
+#define _USB_ISFRM(a)  (!((a) & 0x8000))
+#define _USB_ISTXFRM(a)        (((a) & 0x9000) == 0x1000)
+#define _USB_ISRXFRM(a)        (!((a) & 0x9000))
+#define _USB_INFOFRM   0x8000
+#define _USB_CMDRESP   0x8001
+#define _USB_WRIDRESP  0x8002
+#define _USB_RRIDRESP  0x8003
+#define _USB_WMEMRESP  0x8004
+#define _USB_RMEMRESP  0x8005
+#define _USB_BUFAVAIL  0x8006
+#define _USB_ERROR     0x8007
+
+#define        _TX_CFPOLL                      (0x1000)
+#define        _TX_PRST                        (0x0800)
+#define        _TX_MACPORT                     (0x0700)
+#define        _TX_NOENCRYPT                   (0x0080)
+#define        _TX_RETRYSTRAT                  (0x0060)
+#define        _TX_STRUCTYPE                   (0x0018)
+#define        _TX_TXEX                        (0x0004)
+#define        _TX_TXOK                        (0x0001)
+#define        _TX_SET(v,m,s)                  
((((UInt16)(v))<<((UInt16)(s)))&((UInt16)(m)))
+#define        _TX_RETRYSTRAT_SET(v)           _TX_SET(v, _TX_RETRYSTRAT, 5)
+#define        _TX_CFPOLL_SET(v)               _TX_SET(v, _TX_CFPOLL,12)
+#define        _TX_MACPORT_SET(v)              _TX_SET(v, _TX_MACPORT, 8)
+#define        _TX_TXEX_SET(v)                 _TX_SET(v, _TX_TXEX, 2)
+#define        _TX_TXOK_SET(v)                 _TX_SET(v, _TX_TXOK, 1)
+
+/*--------------------------------------------------------------------
+FRAME STRUCTURES: Communication Frames
+----------------------------------------------------------------------
+Communication Frames: Transmit Frames
+--------------------------------------------------------------------*/
+
+
+/*------------------------------------*/
+/* Request (bulk OUT) packet contents */
+
+typedef struct _usb_txfrm {
+       WLFrame         desc;
+       UInt8           data[WLAN_DATA_MAXLEN];
+} __attribute__((packed)) _usb_txfrm_t;
+
+typedef struct _usb_cmdreq {
+       UInt16          type                            ;
+       UInt16          cmd                             ;
+       UInt16          parm0                           ;
+       UInt16          parm1                           ;
+       UInt16          parm2                           ;
+       UInt8           pad[54]                         ;
+} __attribute__((packed)) _usb_cmdreq_t;
+
+typedef struct _usb_wridreq {
+       UInt16          type                            ;
+       UInt16          frmlen                          ;
+       UInt16          rid                             ;
+       UInt8           data[_RIDDATA_MAXLEN]   ;
+} __attribute__((packed)) _usb_wridreq_t;
+
+typedef struct _usb_rridreq {
+       UInt16          type                            ;
+       UInt16          frmlen                          ;
+       UInt16          rid                             ;
+       UInt8           pad[58]                         ;
+} __attribute__((packed)) _usb_rridreq_t;
+
+typedef struct _usb_wmemreq {
+       UInt16          type                            ;
+       UInt16          frmlen                          ;
+       UInt16          offset                          ;
+       UInt16          page                            ;
+       UInt8           data[_USB_RWMEM_MAXLEN] ;
+} __attribute__((packed)) _usb_wmemreq_t;
+
+typedef struct _usb_rmemreq {
+       UInt16          type                            ;
+       UInt16          frmlen                          ;
+       UInt16          offset                          ;
+       UInt16          page                            ;
+       UInt8           pad[56]                         ;
+} __attribute__((packed)) _usb_rmemreq_t;
+
+/*--------------------------------------------------------------------
+Communication Frames: Receive Frames
+--------------------------------------------------------------------*/
+
+/*------------------------------------*/
+/* Response (bulk IN) packet contents */
+
+typedef struct _usb_rxfrm {
+       WLFrame         desc;
+       UInt8           data[WLAN_DATA_MAXLEN];
+} __attribute__((packed)) _usb_rxfrm_t;
+
+typedef struct _usb_cmdresp {
+       UInt16          type                            ;
+       UInt16          status                          ;
+       UInt16          resp0                           ;
+       UInt16          resp1                           ;
+       UInt16          resp2                           ;
+} __attribute__((packed)) _usb_cmdresp_t;
+
+typedef struct _usb_wridresp {
+       UInt16          type                            ;
+       UInt16          status                          ;
+       UInt16          resp0                           ;
+       UInt16          resp1                           ;
+       UInt16          resp2                           ;
+} __attribute__((packed)) _usb_wridresp_t;
+
+typedef struct _usb_rridresp {
+       UInt16          type                            ;
+       UInt16          frmlen                          ;
+       UInt16          rid                             ;
+       UInt8           data[_RIDDATA_MAXLEN]   ;
+} __attribute__((packed)) _usb_rridresp_t;
+
+typedef struct _usb_wmemresp {
+       UInt16          type                            ;
+       UInt16          status                          ;
+       UInt16          resp0                           ;
+       UInt16          resp1                           ;
+       UInt16          resp2                           ;
+} __attribute__((packed)) _usb_wmemresp_t;
+
+typedef struct _usb_rmemresp {
+       UInt16          type                            ;
+       UInt16          frmlen                          ;
+       UInt8           data[_USB_RWMEM_MAXLEN] ;
+} __attribute__((packed)) _usb_rmemresp_t;
+
+typedef struct _usb_bufavail {
+       UInt16          type                            ;
+       UInt16          frmlen                          ;
+} __attribute__((packed)) _usb_bufavail_t;
+
+typedef struct _usb_error {
+       UInt16          type                            ;
+       UInt16          errortype                       ;
+} __attribute__((packed)) _usb_error_t;
+
+/*----------------------------------------------------------*/
+/* Unions for packaging all the known packet types together */
+
+typedef union _usbout {
+       UInt16                  type                    ;
+       _usb_txfrm_t    txfrm                   ;
+       _usb_cmdreq_t   cmdreq                  ;
+       _usb_wridreq_t  wridreq                 ;
+       _usb_rridreq_t  rridreq                 ;
+       _usb_wmemreq_t  wmemreq                 ;
+       _usb_rmemreq_t  rmemreq                 ;
+} __attribute__((packed)) _usbout_t;
+
+typedef union _usbin {
+       UInt16                  type                    ;
+       _usb_rxfrm_t    rxfrm                   ;
+       _usb_txfrm_t    txfrm                   ;
+       _usb_cmdresp_t  cmdresp                 ;
+       _usb_wridresp_t wridresp                ;
+       _usb_rridresp_t rridresp                ;
+       _usb_wmemresp_t wmemresp                ;
+       _usb_rmemresp_t rmemresp                ;
+       _usb_bufavail_t bufavail                ;
+       _usb_error_t    usberror                ;
+       UInt8                   boguspad[3000]          ;
+} __attribute__((packed)) _usbin_t;
\ No newline at end of file


Other related posts:

  • » [kismac] [binaervarianz] r162 - in branches/usb-drivers/Sources/Driver: . USBJack