Driver for USB RNDIS network devices
Copyright (C) 2022 Adrien Destugues <pulkomandy@pulkomandy.tk>
Distributed under the terms of the MIT license.
*/
#ifndef _USB_RNDIS_DEVICE_H_
#define _USB_RNDIS_DEVICE_H_
#include "Driver.h"
class RNDISDevice {
public:
RNDISDevice(usb_device device);
~RNDISDevice();
status_t InitCheck() { return fStatus; };
status_t Open();
bool IsOpen() { return fOpen; };
status_t Close();
status_t Free();
status_t Read(uint8 *buffer, size_t *numBytes);
status_t Write(const uint8 *buffer, size_t *numBytes);
status_t Control(uint32 op, void *buffer, size_t length);
void Removed();
bool IsRemoved() { return fRemoved; };
private:
static void _ReadCallback(void *cookie, int32 status,
void *data, size_t actualLength);
static void _WriteCallback(void *cookie, int32 status,
void *data, size_t actualLength);
static void _NotifyCallback(void *cookie, int32 status,
void *data, size_t actualLength);
status_t _SendCommand(const void*, size_t);
status_t _ReadResponse(void*, size_t);
status_t _RNDISInitialize();
status_t _GetOID(uint32 oid, void* buffer, size_t length);
status_t _SetupDevice();
status_t _ReadMACAddress(usb_device device, uint8 *buffer);
status_t _ReadMaxSegmentSize(usb_device device);
status_t _ReadMediaState(usb_device device);
status_t _ReadLinkSpeed(usb_device device);
status_t _EnableBroadcast(usb_device device);
status_t fStatus;
bool fOpen;
bool fRemoved;
int32 fInsideNotify;
usb_device fDevice;
uint16 fVendorID;
uint16 fProductID;
uint8 fDataInterfaceIndex;
uint32 fMaxSegmentSize;
usb_pipe fNotifyEndpoint;
usb_pipe fReadEndpoint;
usb_pipe fWriteEndpoint;
uint32 fActualLengthRead;
uint32 fActualLengthWrite;
int32 fStatusRead;
int32 fStatusWrite;
sem_id fNotifyReadSem;
sem_id fNotifyWriteSem;
sem_id fLockWriteSem;
sem_id fNotifyControlSem;
uint8 fNotifyBuffer[8];
uint8 fReadBuffer[0x4000];
uint32* fReadHeader;
sem_id fLinkStateChangeSem;
uint8 fMACAddress[6];
uint32 fMediaConnectState;
uint32 fDownstreamSpeed;
};
#endif