X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/6a46f0025a4d44ca2c747745f542e8f475dd9b28..aaa0bed556d0fa424b831418a7ce2531653a8b03:/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c diff --git a/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c b/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c index 6bacc8f6d..b1966142a 100644 --- a/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c +++ b/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c @@ -48,17 +48,6 @@ uint8_t RNDIS_SendEncapsulatedCommand(void* Buffer, uint16_t Length) .wIndex = 0, .wLength = Length, }; - - printf("==== RNDIS CONTROL REQUEST ====\r\n"); - uint8_t* Data = Buffer; - for (uint16_t i = 0; i < Length / 8; i++) - { - for (uint16_t j = 0; (j < 8) && i*8+j < Length; j++) - printf("%02X ", *(Data++)); - - printf("\r\n"); - } - printf("==== ********************* ====\r\n"); /* Select the control pipe for the request transfer */ Pipe_SelectPipe(PIPE_CONTROLPIPE); @@ -83,18 +72,46 @@ uint8_t RNDIS_GetEncapsulatedResponse(void* Buffer, uint16_t Length) return USB_Host_SendControlRequest(Buffer); } -uint8_t RNDIS_InitializeDevice(uint16_t MaxPacketSize, RNDIS_Initialize_Complete_t* InitMessageResponse) +uint8_t RNDIS_SendKeepAlive(void) { uint8_t ErrorCode; - RNDIS_Initialize_Message_t InitMessage; + RNDIS_KeepAlive_Message_t KeepAliveMessage; + RNDIS_KeepAlive_Complete_t KeepAliveMessageResponse; + + KeepAliveMessage.MessageType = REMOTE_NDIS_KEEPALIVE_MSG; + KeepAliveMessage.MessageLength = sizeof(RNDIS_KeepAlive_Message_t); + KeepAliveMessage.RequestId = RequestID++; + + if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&KeepAliveMessage, + sizeof(RNDIS_KeepAlive_Message_t))) != HOST_SENDCONTROL_Successful) + { + return ErrorCode; + } + + if ((ErrorCode = RNDIS_GetEncapsulatedResponse(&KeepAliveMessageResponse, + sizeof(RNDIS_KeepAlive_Complete_t))) != HOST_SENDCONTROL_Successful) + { + return ErrorCode; + } + + return HOST_SENDCONTROL_Successful; +} + +uint8_t RNDIS_InitializeDevice(uint16_t HostMaxPacketSize, uint16_t* DeviceMaxPacketSize) +{ + uint8_t ErrorCode; + + RNDIS_Initialize_Message_t InitMessage; + RNDIS_Initialize_Complete_t InitMessageResponse; InitMessage.MessageType = REMOTE_NDIS_INITIALIZE_MSG; InitMessage.MessageLength = sizeof(RNDIS_Initialize_Message_t); InitMessage.RequestId = RequestID++; + InitMessage.MajorVersion = REMOTE_NDIS_VERSION_MAJOR; InitMessage.MinorVersion = REMOTE_NDIS_VERSION_MINOR; - InitMessage.MaxTransferSize = sizeof(RNDIS_Packet_Message_t) + MaxPacketSize; + InitMessage.MaxTransferSize = HostMaxPacketSize; if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&InitMessage, sizeof(RNDIS_Initialize_Message_t))) != HOST_SENDCONTROL_Successful) @@ -102,11 +119,16 @@ uint8_t RNDIS_InitializeDevice(uint16_t MaxPacketSize, RNDIS_Initialize_Complete return ErrorCode; } - if ((ErrorCode = RNDIS_GetEncapsulatedResponse(InitMessageResponse, + if ((ErrorCode = RNDIS_GetEncapsulatedResponse(&InitMessageResponse, sizeof(RNDIS_Initialize_Complete_t))) != HOST_SENDCONTROL_Successful) { return ErrorCode; } + + if (InitMessageResponse.Status != REMOTE_NDIS_STATUS_SUCCESS) + return RNDIS_COMMAND_FAILED; + + *DeviceMaxPacketSize = InitMessageResponse.MaxTransferSize; return HOST_SENDCONTROL_Successful; } @@ -123,15 +145,16 @@ uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length) RNDIS_Set_Complete_t SetMessageResponse; - SetMessageData.SetMessage.MessageType = REMOTE_NDIS_SET_MSG; - SetMessageData.SetMessage.MessageLength = sizeof(RNDIS_Set_Message_t) + Length; - SetMessageData.SetMessage.RequestId = RequestID++; + SetMessageData.SetMessage.MessageType = REMOTE_NDIS_SET_MSG; + SetMessageData.SetMessage.MessageLength = sizeof(RNDIS_Set_Message_t) + Length; + SetMessageData.SetMessage.RequestId = RequestID++; - SetMessageData.SetMessage.Oid = Oid; + SetMessageData.SetMessage.Oid = Oid; SetMessageData.SetMessage.InformationBufferLength = Length; - SetMessageData.SetMessage.InformationBufferOffset = 0; + SetMessageData.SetMessage.InformationBufferOffset = (sizeof(RNDIS_Set_Message_t) - sizeof(RNDIS_Message_Header_t)); SetMessageData.SetMessage.DeviceVcHandle = 0; - + + memcpy(&SetMessageData.ContigiousBuffer, Buffer, Length); if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&SetMessageData, SetMessageData.SetMessage.MessageLength)) != HOST_SENDCONTROL_Successful) @@ -145,5 +168,67 @@ uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length) return ErrorCode; } + if (SetMessageResponse.Status != REMOTE_NDIS_STATUS_SUCCESS) + return RNDIS_COMMAND_FAILED; + + return HOST_SENDCONTROL_Successful; +} + +uint8_t RNDIS_QueryRNDISProperty(uint32_t Oid, void* Buffer, uint16_t MaxLength) +{ + uint8_t ErrorCode; + + RNDIS_Query_Message_t QueryMessage; + + struct + { + RNDIS_Query_Complete_t QueryMessageResponse; + uint8_t ContigiousBuffer[MaxLength]; + } QueryMessageResponseData; + + QueryMessage.MessageType = REMOTE_NDIS_QUERY_MSG; + QueryMessage.MessageLength = sizeof(RNDIS_Query_Message_t); + QueryMessage.RequestId = RequestID++; + + QueryMessage.Oid = Oid; + QueryMessage.InformationBufferLength = 0; + QueryMessage.InformationBufferOffset = 0; + QueryMessage.DeviceVcHandle = 0; + + if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&QueryMessage, + sizeof(RNDIS_Query_Message_t))) != HOST_SENDCONTROL_Successful) + { + return ErrorCode; + } + + if ((ErrorCode = RNDIS_GetEncapsulatedResponse(&QueryMessageResponseData, + sizeof(QueryMessageResponseData))) != HOST_SENDCONTROL_Successful) + { + return ErrorCode; + } + + if (QueryMessageResponseData.QueryMessageResponse.Status != REMOTE_NDIS_STATUS_SUCCESS) + return RNDIS_COMMAND_FAILED; + + memcpy(Buffer, &QueryMessageResponseData.ContigiousBuffer, MaxLength); + return HOST_SENDCONTROL_Successful; } + +uint8_t RNDIS_GetPacketLength(uint16_t* PacketLength) +{ + uint8_t ErrorCode; + + RNDIS_Packet_Message_t DeviceMessage; + + if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t))) != PIPE_RWSTREAM_NoError) + { + return ErrorCode; + } + + *PacketLength = (uint16_t)DeviceMessage.DataLength; + + Pipe_Discard_Stream(DeviceMessage.DataOffset - (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t))); + + return PIPE_RWSTREAM_NoError; +}