Extend incomplete RNDISHost demo -- can not enumerate a RNDIS device correctly and...
[pub/USBasp.git] / Demos / Host / Incomplete / RNDISEthernetHost / Lib / RNDISCommands.c
index 6bacc8f..e248b18 100644 (file)
@@ -48,17 +48,6 @@ uint8_t RNDIS_SendEncapsulatedCommand(void* Buffer, uint16_t Length)
                        .wIndex        = 0,\r
                        .wLength       = Length,\r
                };\r
-       \r
-       printf("==== RNDIS CONTROL REQUEST ====\r\n");\r
-       uint8_t* Data = Buffer;\r
-       for (uint16_t i = 0; i < Length / 8; i++)\r
-       {\r
-               for (uint16_t j = 0; (j < 8) && i*8+j < Length; j++)\r
-                       printf("%02X ", *(Data++));\r
-                       \r
-               printf("\r\n");\r
-       }\r
-       printf("==== ********************* ====\r\n");\r
 \r
        /* Select the control pipe for the request transfer */\r
        Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
@@ -83,6 +72,32 @@ uint8_t RNDIS_GetEncapsulatedResponse(void* Buffer, uint16_t Length)
        return USB_Host_SendControlRequest(Buffer);\r
 }\r
 \r
+uint8_t RNDIS_KeepAlive(void)\r
+{\r
+       uint8_t ErrorCode;\r
+\r
+       RNDIS_KeepAlive_Message_t  KeepAliveMessage;\r
+       RNDIS_KeepAlive_Complete_t KeepAliveMessageResponse;\r
+       \r
+       KeepAliveMessage.MessageType     = REMOTE_NDIS_KEEPALIVE_MSG;\r
+       KeepAliveMessage.MessageLength   = sizeof(RNDIS_KeepAlive_Message_t);\r
+       KeepAliveMessage.RequestId       = RequestID++;\r
+\r
+       if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&KeepAliveMessage,\r
+                                                      sizeof(RNDIS_KeepAlive_Message_t))) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+       \r
+       if ((ErrorCode = RNDIS_GetEncapsulatedResponse(&KeepAliveMessageResponse,\r
+                                                      sizeof(RNDIS_KeepAlive_Complete_t))) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+       \r
+       return HOST_SENDCONTROL_Successful;\r
+}\r
+\r
 uint8_t RNDIS_InitializeDevice(uint16_t MaxPacketSize, RNDIS_Initialize_Complete_t* InitMessageResponse)\r
 {\r
        uint8_t ErrorCode;\r
@@ -131,7 +146,8 @@ uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length)
        SetMessageData.SetMessage.InformationBufferLength = Length;\r
        SetMessageData.SetMessage.InformationBufferOffset = 0;\r
        SetMessageData.SetMessage.DeviceVcHandle = 0;\r
-\r
+       \r
+       memcpy(&SetMessageData.ContigiousBuffer, Buffer, Length);\r
 \r
        if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&SetMessageData,\r
                                                       SetMessageData.SetMessage.MessageLength)) != HOST_SENDCONTROL_Successful)\r
@@ -147,3 +163,57 @@ uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length)
 \r
        return HOST_SENDCONTROL_Successful;\r
 }\r
+\r
+uint8_t RNDIS_QueryRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length)\r
+{\r
+       uint8_t ErrorCode;\r
+\r
+       RNDIS_Query_Message_t  QueryMessage;\r
+\r
+       struct\r
+       {\r
+               RNDIS_Query_Complete_t QueryMessageResponse;\r
+               uint8_t              ContigiousBuffer[Length];\r
+       } QueryMessageResponseData;\r
+\r
+       QueryMessage.MessageType    = REMOTE_NDIS_QUERY_MSG;\r
+       QueryMessage.MessageLength  = sizeof(RNDIS_Query_Message_t);\r
+       QueryMessage.RequestId      = RequestID++;\r
+                       \r
+       QueryMessage.Oid            = Oid;\r
+       QueryMessage.InformationBufferLength = Length;\r
+       QueryMessage.InformationBufferOffset = 0;\r
+       QueryMessage.DeviceVcHandle = 0;\r
+\r
+       if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&QueryMessage,\r
+                                                      sizeof(RNDIS_Query_Message_t))) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+       \r
+       if ((ErrorCode = RNDIS_GetEncapsulatedResponse(&QueryMessageResponseData,\r
+                                                      sizeof(QueryMessageResponseData))) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+\r
+       memcpy(Buffer, &QueryMessageResponseData.ContigiousBuffer, Length);\r
+\r
+       return HOST_SENDCONTROL_Successful;\r
+}\r
+\r
+uint8_t RNDIS_GetPacketSize(uint16_t* PacketSize)\r
+{\r
+       uint8_t ErrorCode;\r
+\r
+       RNDIS_Packet_Message_t DeviceMessage;\r
+       \r
+       if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t))) != PIPE_RWSTREAM_NoError)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+\r
+       *PacketSize = (uint16_t)DeviceMessage.DataLength;\r
+       \r
+       return PIPE_RWSTREAM_NoError;\r
+}\r