/** @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