*
*/
-
-#pragma once
-
#include "VmbusChannelInterface.h"
-#define NVSP_INVALID_PROTOCOL_VERSION ((u32)0xFFFFFFFF)
-
-#define NVSP_PROTOCOL_VERSION_1 2
-#define NVSP_MIN_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
-#define NVSP_MAX_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
-
-typedef enum _NVSP_MESSAGE_TYPE
-{
- NvspMessageTypeNone = 0,
-
+#define NVSP_INVALID_PROTOCOL_VERSION ((u32)0xFFFFFFFF)
- /* Init Messages */
+#define NVSP_PROTOCOL_VERSION_1 2
+#define NVSP_MIN_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
+#define NVSP_MAX_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
- NvspMessageTypeInit = 1,
- NvspMessageTypeInitComplete = 2,
+typedef enum _NVSP_MESSAGE_TYPE {
+ NvspMessageTypeNone = 0,
- NvspVersionMessageStart = 100,
+ /* Init Messages */
+ NvspMessageTypeInit = 1,
+ NvspMessageTypeInitComplete = 2,
+ NvspVersionMessageStart = 100,
- /* Version 1 Messages */
+ /* Version 1 Messages */
+ NvspMessage1TypeSendNdisVersion = NvspVersionMessageStart,
- NvspMessage1TypeSendNdisVersion = NvspVersionMessageStart,
+ NvspMessage1TypeSendReceiveBuffer,
+ NvspMessage1TypeSendReceiveBufferComplete,
+ NvspMessage1TypeRevokeReceiveBuffer,
- NvspMessage1TypeSendReceiveBuffer,
- NvspMessage1TypeSendReceiveBufferComplete,
- NvspMessage1TypeRevokeReceiveBuffer,
+ NvspMessage1TypeSendSendBuffer,
+ NvspMessage1TypeSendSendBufferComplete,
+ NvspMessage1TypeRevokeSendBuffer,
- NvspMessage1TypeSendSendBuffer,
- NvspMessage1TypeSendSendBufferComplete,
- NvspMessage1TypeRevokeSendBuffer,
-
- NvspMessage1TypeSendRNDISPacket,
- NvspMessage1TypeSendRNDISPacketComplete,
-
-
- /* This should be set to the number of messages for the version */
- /* with the maximum number of messages. */
-
- NvspNumMessagePerVersion = 9,
+ NvspMessage1TypeSendRNDISPacket,
+ NvspMessage1TypeSendRNDISPacketComplete,
+ /*
+ * This should be set to the number of messages for the version with
+ * the maximum number of messages.
+ */
+ NvspNumMessagePerVersion = 9,
} NVSP_MESSAGE_TYPE, *PNVSP_MESSAGE_TYPE;
-typedef enum _NVSP_STATUS
-{
- NvspStatusNone = 0,
- NvspStatusSuccess,
- NvspStatusFailure,
- NvspStatusProtocolVersionRangeTooNew,
- NvspStatusProtocolVersionRangeTooOld,
- NvspStatusInvalidRndisPacket,
- NvspStatusBusy,
- NvspStatusMax,
+typedef enum _NVSP_STATUS {
+ NvspStatusNone = 0,
+ NvspStatusSuccess,
+ NvspStatusFailure,
+ NvspStatusProtocolVersionRangeTooNew,
+ NvspStatusProtocolVersionRangeTooOld,
+ NvspStatusInvalidRndisPacket,
+ NvspStatusBusy,
+ NvspStatusMax,
} NVSP_STATUS, *PNVSP_STATUS;
-#pragma pack(push, 1)
-
-typedef struct _NVSP_MESSAGE_HEADER
-{
- u32 MessageType;
+typedef struct _NVSP_MESSAGE_HEADER {
+ u32 MessageType;
} NVSP_MESSAGE_HEADER, *PNVSP_MESSAGE_HEADER;
-
/* Init Messages */
+/*
+ * This message is used by the VSC to initialize the channel after the channels
+ * has been opened. This message should never include anything other then
+ * versioning (i.e. this message will be the same for ever).
+ */
+typedef struct _NVSP_MESSAGE_INIT {
+ u32 MinProtocolVersion;
+ u32 MaxProtocolVersion;
+} __attribute__((packed)) NVSP_MESSAGE_INIT, *PNVSP_MESSAGE_INIT;
+/*
+ * This message is used by the VSP to complete the initialization of the
+ * channel. This message should never include anything other then versioning
+ * (i.e. this message will be the same for ever).
+ */
+typedef struct _NVSP_MESSAGE_INIT_COMPLETE {
+ u32 NegotiatedProtocolVersion;
+ u32 MaximumMdlChainLength;
+ u32 Status;
+} __attribute__((packed)) NVSP_MESSAGE_INIT_COMPLETE, *PNVSP_MESSAGE_INIT_COMPLETE;
-/* This message is used by the VSC to initialize the channel */
-/* after the channels has been opened. This message should */
-/* never include anything other then versioning (i.e. this */
-/* message will be the same for ever). */
-
-typedef struct _NVSP_MESSAGE_INIT
-{
- u32 MinProtocolVersion;
- u32 MaxProtocolVersion;
-} NVSP_MESSAGE_INIT, *PNVSP_MESSAGE_INIT;
-
-
-/* This message is used by the VSP to complete the initialization */
-/* of the channel. This message should never include anything other */
-/* then versioning (i.e. this message will be the same for ever). */
-
-typedef struct _NVSP_MESSAGE_INIT_COMPLETE
-{
- u32 NegotiatedProtocolVersion;
- u32 MaximumMdlChainLength;
- u32 Status;
-} NVSP_MESSAGE_INIT_COMPLETE, *PNVSP_MESSAGE_INIT_COMPLETE;
-
-typedef union _NVSP_MESSAGE_INIT_UBER
-{
- NVSP_MESSAGE_INIT Init;
- NVSP_MESSAGE_INIT_COMPLETE InitComplete;
-} NVSP_MESSAGE_INIT_UBER;
-
+typedef union _NVSP_MESSAGE_INIT_UBER {
+ NVSP_MESSAGE_INIT Init;
+ NVSP_MESSAGE_INIT_COMPLETE InitComplete;
+} __attribute__((packed)) NVSP_MESSAGE_INIT_UBER;
/* Version 1 Messages */
+/*
+ * This message is used by the VSC to send the NDIS version to the VSP. The VSP
+ * can use this information when handling OIDs sent by the VSC.
+ */
+typedef struct _NVSP_1_MESSAGE_SEND_NDIS_VERSION {
+ u32 NdisMajorVersion;
+ u32 NdisMinorVersion;
+} __attribute__((packed)) NVSP_1_MESSAGE_SEND_NDIS_VERSION, *PNVSP_1_MESSAGE_SEND_NDIS_VERSION;
+/*
+ * This message is used by the VSC to send a receive buffer to the VSP. The VSP
+ * can then use the receive buffer to send data to the VSC.
+ */
+typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER {
+ u32 GpadlHandle;
+ u16 Id;
+} __attribute__((packed)) NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER;
+
+typedef struct _NVSP_1_RECEIVE_BUFFER_SECTION {
+ u32 Offset;
+ u32 SubAllocationSize;
+ u32 NumSubAllocations;
+ u32 EndOffset;
+} __attribute__((packed)) NVSP_1_RECEIVE_BUFFER_SECTION, *PNVSP_1_RECEIVE_BUFFER_SECTION;
-/* This message is used by the VSC to send the NDIS version */
-/* to the VSP. The VSP can use this information when handling */
-/* OIDs sent by the VSC. */
-
-typedef struct _NVSP_1_MESSAGE_SEND_NDIS_VERSION
-{
- u32 NdisMajorVersion;
- u32 NdisMinorVersion;
-} NVSP_1_MESSAGE_SEND_NDIS_VERSION, *PNVSP_1_MESSAGE_SEND_NDIS_VERSION;
-
-
-/* This message is used by the VSC to send a receive buffer */
-/* to the VSP. The VSP can then use the receive buffer to */
-/* send data to the VSC. */
-
-typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER
-{
- u32 GpadlHandle;
- u16 Id;
-} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER;
-
-typedef struct _NVSP_1_RECEIVE_BUFFER_SECTION
-{
- u32 Offset;
- u32 SubAllocationSize;
- u32 NumSubAllocations;
- u32 EndOffset;
-} NVSP_1_RECEIVE_BUFFER_SECTION, *PNVSP_1_RECEIVE_BUFFER_SECTION;
-
-
-/* This message is used by the VSP to acknowledge a receive */
-/* buffer send by the VSC. This message must be sent by the */
-/* VSP before the VSP uses the receive buffer. */
-
-typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE
-{
- u32 Status;
- u32 NumSections;
-
-
- /* The receive buffer is split into two parts, a large */
- /* suballocation section and a small suballocation */
- /* section. These sections are then suballocated by a */
- /* certain size. */
-
- /* For example, the following break up of the receive */
- /* buffer has 6 large suballocations and 10 small */
- /* suballocations. */
-
- /* | Large Section | | Small Section | */
- /* ------------------------------------------------------------ */
- /* | | | | | | | | | | | | | | | | | | */
- /* | | */
- /* LargeOffset SmallOffset */
-
- NVSP_1_RECEIVE_BUFFER_SECTION Sections[1];
-
-} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE;
-
-
-/* This message is sent by the VSC to revoke the receive buffer. */
-/* After the VSP completes this transaction, the vsp should never */
-/* use the receive buffer again. */
+/*
+ * This message is used by the VSP to acknowledge a receive buffer send by the
+ * VSC. This message must be sent by the VSP before the VSP uses the receive
+ * buffer.
+ */
+typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE {
+ u32 Status;
+ u32 NumSections;
+
+ /*
+ * The receive buffer is split into two parts, a large suballocation
+ * section and a small suballocation section. These sections are then
+ * suballocated by a certain size.
+ */
+
+ /*
+ * For example, the following break up of the receive buffer has 6
+ * large suballocations and 10 small suballocations.
+ */
+
+ /*
+ * | Large Section | | Small Section |
+ * ------------------------------------------------------------
+ * | | | | | | | | | | | | | | | | | |
+ * | |
+ * LargeOffset SmallOffset
+ */
+
+ NVSP_1_RECEIVE_BUFFER_SECTION Sections[1];
+} __attribute__((packed)) NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE;
-typedef struct _NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER
-{
- u16 Id;
+/*
+ * This message is sent by the VSC to revoke the receive buffer. After the VSP
+ * completes this transaction, the vsp should never use the receive buffer
+ * again.
+ */
+typedef struct _NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER {
+ u16 Id;
} NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER;
+/*
+ * This message is used by the VSC to send a send buffer to the VSP. The VSC
+ * can then use the send buffer to send data to the VSP.
+ */
+typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER {
+ u32 GpadlHandle;
+ u16 Id;
+} __attribute__((packed)) NVSP_1_MESSAGE_SEND_SEND_BUFFER, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER;
-/* This message is used by the VSC to send a send buffer */
-/* to the VSP. The VSC can then use the send buffer to */
-/* send data to the VSP. */
-
-typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER
-{
- u32 GpadlHandle;
- u16 Id;
-} NVSP_1_MESSAGE_SEND_SEND_BUFFER, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER;
-
-
-/* This message is used by the VSP to acknowledge a send */
-/* buffer sent by the VSC. This message must be sent by the */
-/* VSP before the VSP uses the sent buffer. */
-
-typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE
-{
- u32 Status;
-
-
- /* The VSC gets to choose the size of the send buffer and */
- /* the VSP gets to choose the sections size of the buffer. */
- /* This was done to enable dynamic reconfigurations when */
- /* the cost of GPA-direct buffers decreases. */
-
- u32 SectionSize;
-} NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE;
-
-
-/* This message is sent by the VSC to revoke the send buffer. */
-/* After the VSP completes this transaction, the vsp should never */
-/* use the send buffer again. */
+/*
+ * This message is used by the VSP to acknowledge a send buffer sent by the
+ * VSC. This message must be sent by the VSP before the VSP uses the sent
+ * buffer.
+ */
+typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE {
+ u32 Status;
+
+ /*
+ * The VSC gets to choose the size of the send buffer and the VSP gets
+ * to choose the sections size of the buffer. This was done to enable
+ * dynamic reconfigurations when the cost of GPA-direct buffers
+ * decreases.
+ */
+ u32 SectionSize;
+} __attribute__((packed)) NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE;
-typedef struct _NVSP_1_MESSAGE_REVOKE_SEND_BUFFER
-{
- u16 Id;
+/*
+ * This message is sent by the VSC to revoke the send buffer. After the VSP
+ * completes this transaction, the vsp should never use the send buffer again.
+ */
+typedef struct _NVSP_1_MESSAGE_REVOKE_SEND_BUFFER {
+ u16 Id;
} NVSP_1_MESSAGE_REVOKE_SEND_BUFFER, *PNVSP_1_MESSAGE_REVOKE_SEND_BUFFER;
+/*
+ * This message is used by both the VSP and the VSC to send a RNDIS message to
+ * the opposite channel endpoint.
+ */
+typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET {
+ /*
+ * This field is specified by RNIDS. They assume there's two different
+ * channels of communication. However, the Network VSP only has one.
+ * Therefore, the channel travels with the RNDIS packet.
+ */
+ u32 ChannelType;
+
+ /*
+ * This field is used to send part or all of the data through a send
+ * buffer. This values specifies an index into the send buffer. If the
+ * index is 0xFFFFFFFF, then the send buffer is not being used and all
+ * of the data was sent through other VMBus mechanisms.
+ */
+ u32 SendBufferSectionIndex;
+ u32 SendBufferSectionSize;
+} __attribute__((packed)) NVSP_1_MESSAGE_SEND_RNDIS_PACKET, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET;
-/* This message is used by both the VSP and the VSC to send */
-/* a RNDIS message to the opposite channel endpoint. */
-
-typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET
-{
-
- /* This field is specified by RNIDS. They assume there's */
- /* two different channels of communication. However, */
- /* the Network VSP only has one. Therefore, the channel */
- /* travels with the RNDIS packet. */
-
- u32 ChannelType;
-
-
- /* This field is used to send part or all of the data */
- /* through a send buffer. This values specifies an */
- /* index into the send buffer. If the index is */
- /* 0xFFFFFFFF, then the send buffer is not being used */
- /* and all of the data was sent through other VMBus */
- /* mechanisms. */
-
- u32 SendBufferSectionIndex;
- u32 SendBufferSectionSize;
-} NVSP_1_MESSAGE_SEND_RNDIS_PACKET, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET;
-
-
-/* This message is used by both the VSP and the VSC to complete */
-/* a RNDIS message to the opposite channel endpoint. At this */
-/* point, the initiator of this message cannot use any resources */
-/* associated with the original RNDIS packet. */
-
-typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE
-{
- u32 Status;
+/*
+ * This message is used by both the VSP and the VSC to complete a RNDIS message
+ * to the opposite channel endpoint. At this point, the initiator of this
+ * message cannot use any resources associated with the original RNDIS packet.
+ */
+typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE {
+ u32 Status;
} NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE;
-typedef union _NVSP_MESSAGE_1_UBER
-{
- NVSP_1_MESSAGE_SEND_NDIS_VERSION SendNdisVersion;
-
- NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER SendReceiveBuffer;
- NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE SendReceiveBufferComplete;
- NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER RevokeReceiveBuffer;
+typedef union _NVSP_MESSAGE_1_UBER {
+ NVSP_1_MESSAGE_SEND_NDIS_VERSION SendNdisVersion;
- NVSP_1_MESSAGE_SEND_SEND_BUFFER SendSendBuffer;
- NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE SendSendBufferComplete;
- NVSP_1_MESSAGE_REVOKE_SEND_BUFFER RevokeSendBuffer;
+ NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER SendReceiveBuffer;
+ NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE SendReceiveBufferComplete;
+ NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER RevokeReceiveBuffer;
- NVSP_1_MESSAGE_SEND_RNDIS_PACKET SendRNDISPacket;
- NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE SendRNDISPacketComplete;
-} NVSP_1_MESSAGE_UBER;
+ NVSP_1_MESSAGE_SEND_SEND_BUFFER SendSendBuffer;
+ NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE SendSendBufferComplete;
+ NVSP_1_MESSAGE_REVOKE_SEND_BUFFER RevokeSendBuffer;
-typedef union _NVSP_ALL_MESSAGES
-{
- NVSP_MESSAGE_INIT_UBER InitMessages;
- NVSP_1_MESSAGE_UBER Version1Messages;
-
-} NVSP_ALL_MESSAGES;
+ NVSP_1_MESSAGE_SEND_RNDIS_PACKET SendRNDISPacket;
+ NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE SendRNDISPacketComplete;
+} __attribute__((packed)) NVSP_1_MESSAGE_UBER;
+typedef union _NVSP_ALL_MESSAGES {
+ NVSP_MESSAGE_INIT_UBER InitMessages;
+ NVSP_1_MESSAGE_UBER Version1Messages;
+} __attribute__((packed)) NVSP_ALL_MESSAGES;
/* ALL Messages */
+typedef struct _NVSP_MESSAGE {
+ NVSP_MESSAGE_HEADER Header;
+ NVSP_ALL_MESSAGES Messages;
+} __attribute__((packed)) NVSP_MESSAGE, *PNVSP_MESSAGE;
-typedef struct _NVSP_MESSAGE
-{
- NVSP_MESSAGE_HEADER Header;
- NVSP_ALL_MESSAGES Messages;
-} NVSP_MESSAGE, *PNVSP_MESSAGE;
-
-#pragma pack(pop)