/** @file
Header file for for USB Rndis driver
Copyright (c) 2023, American Megatrends International LLC. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef USB_RNDIS_H_
#define USB_RNDIS_H_
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct _REMOTE_NDIS_MSG_HEADER REMOTE_NDIS_MSG_HEADER;
typedef struct {
UINT32 Signature;
EDKII_USB_ETHERNET_PROTOCOL UsbEth;
EFI_HANDLE UsbCdcDataHandle;
EFI_HANDLE UsbRndisHandle;
EFI_USB_IO_PROTOCOL *UsbIo;
EFI_USB_IO_PROTOCOL *UsbIoCdcData;
EFI_USB_CONFIG_DESCRIPTOR *Config;
UINT8 NumOfInterface;
UINT8 BulkInEndpoint;
UINT8 BulkOutEndpoint;
UINT8 InterrupEndpoint;
EFI_MAC_ADDRESS MacAddress;
UINT32 RequestId;
UINT32 Medium;
UINT32 MaxPacketsPerTransfer;
UINT32 MaxTransferSize;
UINT32 PacketAlignmentFactor;
LIST_ENTRY ReceivePacketList;
} USB_RNDIS_DEVICE;
#define USB_RNDIS_DRIVER_VERSION 1
#define USB_TX_ETHERNET_BULK_TIMEOUT 3000
#define USB_RX_ETHERNET_BULK_TIMEOUT 3
#define USB_ETHERNET_TRANSFER_TIMEOUT 200
#define LAN_BULKIN_CMD_CONTROL 1
#define MAXIMUM_STOPBULKIN_CNT 300 // Indicating maximum counts for waiting bulk in command
#define MINIMUM_STOPBULKIN_CNT 3 // Indicating minimum counts for waiting bulk in command
#define BULKIN_CMD_POLLING_CNT 300 // Indicating the waiting counts for send bulk in command when system pending
#define RNDIS_RESERVED_BYTE_LENGTH 8
#define USB_RNDIS_SIGNATURE SIGNATURE_32('r', 'n', 'd', 's')
#define USB_RNDIS_DEVICE_FROM_THIS(a) CR (a, USB_RNDIS_DEVICE, UsbEth, USB_RNDIS_SIGNATURE)
extern EFI_COMPONENT_NAME2_PROTOCOL gUsbRndisComponentName2;
typedef struct {
UINT16 Src;
UINT16 Dst;
} BIT_MAP;
EFI_STATUS
EFIAPI
UsbRndisDriverSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
UsbRndisDriverStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
UsbRndisDriverStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer
);
EFI_STATUS
LoadAllDescriptor (
IN EFI_USB_IO_PROTOCOL *UsbIo,
OUT EFI_USB_CONFIG_DESCRIPTOR **ConfigDesc
);
BOOLEAN
NextDescriptor (
IN EFI_USB_CONFIG_DESCRIPTOR *Desc,
IN OUT UINTN *Offset
);
EFI_STATUS
GetFunctionalDescriptor (
IN EFI_USB_CONFIG_DESCRIPTOR *Config,
IN UINT8 FunDescriptorType,
OUT VOID *DataBuffer
);
VOID
GetEndpoint (
IN EFI_USB_IO_PROTOCOL *UsbIo,
IN OUT USB_RNDIS_DEVICE *UsbRndisDevice
);
EFI_STATUS
EFIAPI
UsbRndisInterrupt (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN BOOLEAN IsNewTransfer,
IN UINTN PollingInterval,
IN EFI_USB_DEVICE_REQUEST *Requst
);
EFI_STATUS
EFIAPI
InterruptCallback (
IN VOID *Data,
IN UINTN DataLength,
IN VOID *Context,
IN UINT32 Status
);
EFI_STATUS
EFIAPI
GetUsbEthMacAddress (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT EFI_MAC_ADDRESS *MacAddress
);
EFI_STATUS
EFIAPI
UsbEthBulkSize (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT UINTN *BulkSize
);
EFI_STATUS
EFIAPI
RndisDummyReturn (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
RndisUndiStart (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
RndisUndiStop (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
RndisUndiGetInitInfo (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
RndisUndiGetConfigInfo (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
RndisUndiInitialize (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
RndisUndiTransmit (
IN PXE_CDB *Cdb,
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN VOID *BulkOutData,
IN OUT UINTN *DataLength
);
EFI_STATUS
EFIAPI
RndisUndiReceive (
IN PXE_CDB *Cdb,
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN OUT VOID *BulkInData,
IN OUT UINTN *DataLength
);
EFI_STATUS
EFIAPI
RndisUndiReset (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
RndisUndiShutdown (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
RndisUndiReceiveFilter (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
RndisUndiGetStatus (
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
EFI_STATUS
EFIAPI
GetUsbHeaderFunDescriptor (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT USB_HEADER_FUN_DESCRIPTOR *UsbHeaderFunDescriptor
);
EFI_STATUS
EFIAPI
GetUsbUnionFunDescriptor (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT USB_UNION_FUN_DESCRIPTOR *UsbUnionFunDescriptor
);
EFI_STATUS
EFIAPI
GetUsbRndisFunDescriptor (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT USB_ETHERNET_FUN_DESCRIPTOR *UsbEthFunDescriptor
);
EFI_STATUS
EFIAPI
SetUsbRndisMcastFilter (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
IN VOID *McastAddr
);
EFI_STATUS
EFIAPI
SetUsbRndisPowerFilter (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
IN UINT16 Length,
IN VOID *PatternFilter
);
EFI_STATUS
EFIAPI
GetUsbRndisPowerFilter (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
IN BOOLEAN *PatternActive
);
EFI_STATUS
EFIAPI
SetUsbRndisPacketFilter (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value
);
EFI_STATUS
EFIAPI
GetRndisStatistic (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
IN VOID *Statistic
);
EFI_STATUS
RndisControlMsg (
IN USB_RNDIS_DEVICE *UsbRndisDevice,
IN REMOTE_NDIS_MSG_HEADER *RndisMsg,
OUT REMOTE_NDIS_MSG_HEADER *RndisMsgResponse
);
EFI_STATUS
RndisTransmitDataMsg (
IN USB_RNDIS_DEVICE *UsbRndisDevice,
IN REMOTE_NDIS_MSG_HEADER *RndisMsg,
UINTN *TransferLength
);
EFI_STATUS
RndisReceiveDataMsg (
IN USB_RNDIS_DEVICE *UsbRndisDevice,
IN REMOTE_NDIS_MSG_HEADER *RndisMsg,
UINTN *TransferLength
);
VOID
PrintRndisMsg (
IN REMOTE_NDIS_MSG_HEADER *RndisMsg
);
#define RNDIS_MAJOR_VERSION 0x00000001
#define RNDIS_MINOR_VERSION 0x00000000
#define RNDIS_MAX_TRANSFER_SIZE 0x4000
#define RNDIS_PACKET_MSG 0x00000001
#define RNDIS_INITIALIZE_MSG 0x00000002
#define RNDIS_INITIALIZE_CMPLT 0x80000002
#define RNDIS_HLT_MSG 0x00000003
#define RNDIS_QUERY_MSG 0x00000004
#define RNDIS_QUERY_CMPLT 0x80000004
#define RNDIS_SET_MSG 0x00000005
#define RNDIS_SET_CMPLT 0x80000005
#define RNDIS_RESET_MSG 0x00000006
#define RNDIS_RESET_CMPLT 0x80000006
#define RNDIS_INDICATE_STATUS_MSG 0x00000007
#define RNDIS_KEEPALIVE_MSG 0x00000008
#define RNDIS_KEEPALIVE_CMPLT 0x80000008
#define RNDIS_STATUS_SUCCESS 0x00000000
#define RNDIS_STATUS_FAILURE 0xC0000001
#define RNDIS_STATUS_INVALID_DATA 0xC0010015
#define RNDIS_STATUS_NOT_SUPPORTED 0xC00000BB
#define RNDIS_STATUS_MEDIA_CONNECT 0x4001000B
#define RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000C
#define RNDIS_CONTROL_TIMEOUT 10000 // 10sec
#define RNDIS_KEEPALIVE_TIMEOUT 5000 // 5sec
#define SEND_ENCAPSULATED_COMMAND 0x00000000
#define GET_ENCAPSULATED_RESPONSE 0x00000001
//
// General Objects
//
// Taken from NTDDNDIS.H
#define OID_GEN_SUPPORTED_LIST 0x00010101
#define OID_GEN_HARDWARE_STATUS 0x00010102
#define OID_GEN_MEDIA_SUPPORTED 0x00010103
#define OID_GEN_MEDIA_IN_USE 0x00010104
#define OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105
#define OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106
#define OID_GEN_LINK_SPEED 0x00010107
#define OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108
#define OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109
#define OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A
#define OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B
#define OID_GEN_VENDOR_ID 0x0001010C
#define OID_GEN_VENDOR_DESCRIPTION 0x0001010D
#define OID_GEN_CURRENT_PACKET_FILTER 0x0001010E
#define OID_GEN_CURRENT_LOOKAHEAD 0x0001010F
#define OID_GEN_DRIVER_VERSION 0x00010110
#define OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111
#define OID_GEN_PROTOCOL_OPTIONS 0x00010112
#define OID_GEN_MAC_OPTIONS 0x00010113
#define OID_GEN_MEDIA_CONNECT_STATUS 0x00010114
#define OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115
#define OID_GEN_VENDOR_DRIVER_VERSION 0x00010116
#define OID_GEN_XMIT_OK 0x00020101
#define OID_GEN_RCV_OK 0x00020102
#define OID_GEN_XMIT_ERROR 0x00020103
#define OID_GEN_RCV_ERROR 0x00020104
#define OID_GEN_RCV_NO_BUFFER 0x00020105
#define OID_GEN_DIRECTED_BYTES_XMIT 0x00020201
#define OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202
#define OID_GEN_MULTICAST_BYTES_XMIT 0x00020203
#define OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204
#define OID_GEN_BROADCAST_BYTES_XMIT 0x00020205
#define OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206
#define OID_GEN_DIRECTED_BYTES_RCV 0x00020207
#define OID_GEN_DIRECTED_FRAMES_RCV 0x00020208
#define OID_GEN_MULTICAST_BYTES_RCV 0x00020209
#define OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A
#define OID_GEN_BROADCAST_BYTES_RCV 0x0002020B
#define OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C
#define OID_GEN_RCV_CRC_ERROR 0x0002020D
#define OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E
#define OID_802_3_CURRENT_ADDRESS 0x01010102
//
// Ndis Packet Filter Bits (OID_GEN_CURRENT_PACKET_FILTER).
//
#define NDIS_PACKET_TYPE_DIRECTED 0x0001
#define NDIS_PACKET_TYPE_MULTICAST 0x0002
#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x0004
#define NDIS_PACKET_TYPE_BROADCAST 0x0008
#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x0010
#define NDIS_PACKET_TYPE_PROMISCUOUS 0x0020
#define NDIS_PACKET_TYPE_SMT 0x0040
#define NDIS_PACKET_TYPE_ALL_LOCAL 0x0080
#define NDIS_PACKET_TYPE_MAC_FRAME 0x8000
#define NDIS_PACKET_TYPE_FUNCTIONAL 0x4000
#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x2000
#define NDIS_PACKET_TYPE_GROUP 0x1000
#pragma pack(1)
typedef struct _REMOTE_NDIS_MSG_HEADER {
UINT32 MessageType;
UINT32 MessageLength;
} REMOTE_NDIS_MSG_HEADER;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 RequestID;
UINT32 MajorVersion;
UINT32 MinorVersion;
UINT32 MaxTransferSize;
} REMOTE_NDIS_INITIALIZE_MSG;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 RequestID;
} REMOTE_NDIS_HALT_MSG;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 RequestID;
UINT32 Oid;
UINT32 InformationBufferLength;
UINT32 InformationBufferOffset;
UINT32 Reserved;
} REMOTE_NDIS_QUERY_MSG;
typedef struct {
REMOTE_NDIS_QUERY_MSG QueryMsg;
UINT8 Addr[6];
} REMOTE_NDIS_QUERY_MAC_MSG;
typedef struct {
REMOTE_NDIS_QUERY_MSG QueryMsg;
UINT32 MaxTotalSize;
} REMOTE_NDIS_QUERY_MAX_TOTAL_SIZE_MSG;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 RequestID;
UINT32 Oid;
UINT32 InformationBufferLength;
UINT32 InformationBufferOffset;
UINT32 Reserved;
} REMOTE_NDIS_SET_MSG;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 Reserved;
} REMOTE_NDIS_RESET_MSG;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 Status;
UINT32 StatusBufferLength;
UINT32 StatusBufferOffset;
} REMOTE_NDIS_INDICATE_STATUS_MSG;
typedef struct {
UINT32 DiagStatus;
UINT32 ErrorOffset;
} RNDIS_DIAGNOSTIC_INFO;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 RequestID;
} REMOTE_NDIS_KEEPALIVE_MSG;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 RequestID;
UINT32 Status;
UINT32 MajorVersion;
UINT32 MinorVersion;
UINT32 DeviceFlags;
UINT32 Medium;
UINT32 MaxPacketsPerTransfer;
UINT32 MaxTransferSize;
UINT32 PacketAlignmentFactor;
UINT64 Reserved;
} REMOTE_NDIS_INITIALIZE_CMPLT;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 RequestID;
UINT32 Status;
UINT32 InformationBufferLength;
UINT32 InformationBufferOffset;
} REMOTE_NDIS_QUERY_CMPLT;
typedef struct {
REMOTE_NDIS_QUERY_CMPLT QueryCmplt;
UINT8 Addr[6];
} REMOTE_NDIS_QUERY_MAC_CMPLT;
typedef struct {
REMOTE_NDIS_QUERY_CMPLT QueryCmplt;
UINT32 MaxTotalSize;
} REMOTE_NDIS_QUERY_MAX_TOTAL_SIZE_CMPLT;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 RequestID;
UINT32 Status;
} REMOTE_NDIS_SET_CMPLT;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 Status;
UINT32 AddressingReset;
} REMOTE_NDIS_RESET_CMPLT;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 RequestID;
UINT32 Status;
} REMOTE_NDIS_KEEPALIVE_CMPLT;
typedef struct {
UINT32 MessageType;
UINT32 MessageLength;
UINT32 DataOffset;
UINT32 DataLength;
UINT32 OutOfBandDataOffset;
UINT32 OutOfBandDataLength;
UINT32 NumOutOfBandDataElements;
UINT32 PerPacketInfoOffset;
UINT32 PerPacketInfoLength;
UINT32 Reserved1;
UINT32 Reserved2;
} REMOTE_NDIS_PACKET_MSG;
typedef struct {
UINT32 Size;
UINT32 Type;
UINT32 ClassInformationOffset;
} OUT_OF_BAND_DATA_RECORD;
typedef struct {
UINT32 Size;
UINT32 Type;
UINT32 ClassInformationOffset;
} PER_PACKET_INFO_DATA_RECORD;
typedef struct {
LIST_ENTRY PacketList;
UINT8 *OrgBuffer;
UINTN RemainingLength;
UINT8 *PacketStartBuffer; // Variable size data to follow
} PACKET_LIST;
#pragma pack()
#endif