};
};
-typedef struct _XENVIF_TRANSMITTER_PACKET_V1 XENVIF_TRANSMITTER_PACKET, *PXENVIF_TRANSMITTER_PACKET;
+typedef struct _XENVIF_TRANSMITTER_PACKET_V1 XENVIF_TRANSMITTER_PACKET_V1, *PXENVIF_TRANSMITTER_PACKET_V1;
#pragma warning(pop)
C_ASSERT(sizeof (struct _XENVIF_TRANSMITTER_PACKET_V1) <= (3 * sizeof (PVOID)));
+/*! \struct _XENVIF_TRANSMITTER_PACKET_V2
+ \brief Transmit-side packet structure (v2)
+*/
+struct _XENVIF_TRANSMITTER_PACKET_V2 {
+ /*! List entry used for chaining packets together */
+ LIST_ENTRY ListEntry;
+ /*! Opaque cookie used to store context information for packet return */
+ PVOID Cookie;
+ /*! Hash value set by subscriber */
+ ULONG Value;
+ /*! Packet information passed from subscriber to provider */
+ XENVIF_TRANSMITTER_PACKET_SEND_INFO Send;
+ /*! Packet information passed from provider to subscriber on packet return */
+ XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO Completion;
+ /*! Packet data MDL */
+ PMDL Mdl;
+ /*! Offset into MDL to start of packet */
+ ULONG Offset;
+ /*! Packet length */
+ ULONG Length;
+};
+
+typedef struct _XENVIF_TRANSMITTER_PACKET_V2 XENVIF_TRANSMITTER_PACKET, *PXENVIF_TRANSMITTER_PACKET;
+
/*! \enum _XENVIF_TRANSMITTER_PACKET_OFFSET
\brief Offsets of packet metadata relative to
XENVIF_TRANSMITTER_PACKET pointer
IN LONG_PTR Value
);
+/*! \typedef XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS
+ \brief Get the packet headers into supplied buffer
+
+ \param Interface The interface header
+ \param Packet The packet to acquire headers for.
+ \param Headers The buffer to receive headers.
+ \param Info The offsets into Headers for relevant headers
+*/
+typedef NTSTATUS
+(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS)(
+ IN PINTERFACE Interface,
+ IN PXENVIF_TRANSMITTER_PACKET Packet,
+ OUT PVOID Headers,
+ OUT PXENVIF_PACKET_INFO Info
+ );
+
/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS
\brief Queue transmit side packets at the provider
\param Interface The interface header
- \param Head The head of a chain of XENVIF_TRANSMITTER_PACKET
+ \param Head The head of a chain of _XENVIF_TRANSMITTER_PACKET_V1
*/
typedef NTSTATUS
(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS)(
- IN PINTERFACE Interface,
- IN PXENVIF_TRANSMITTER_PACKET Head
+ IN PINTERFACE Interface,
+ IN PXENVIF_TRANSMITTER_PACKET_V1 Head
+ );
+
+/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2
+ \brief Queue transmit side packets at the provider
+
+ \param Interface The interface header
+ \param List List of _XENVIF_TRANSMITTER_PACKET_V2
+*/
+typedef NTSTATUS
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2)(
+ IN PINTERFACE Interface,
+ IN PLIST_ENTRY List
);
/*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS
XENVIF_VIF_MAC_QUERY_FILTER_LEVEL MacQueryFilterLevel;
};
-typedef struct _XENVIF_VIF_INTERFACE_V1 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
+
+/*! \struct _XENVIF_VIF_INTERFACE_V2
+ \brief VIF interface version 2
+ \ingroup interfaces
+*/
+struct _XENVIF_VIF_INTERFACE_V2 {
+ INTERFACE Interface;
+ XENVIF_VIF_ACQUIRE Acquire;
+ XENVIF_VIF_RELEASE Release;
+ XENVIF_VIF_ENABLE Enable;
+ XENVIF_VIF_DISABLE Disable;
+ XENVIF_VIF_QUERY_STATISTIC QueryStatistic;
+ XENVIF_VIF_RECEIVER_RETURN_PACKETS ReceiverReturnPackets;
+ XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS ReceiverSetOffloadOptions;
+ XENVIF_VIF_RECEIVER_QUERY_RING_SIZE ReceiverQueryRingSize;
+ XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS TransmitterGetPacketHeaders;
+ XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2 TransmitterQueuePackets;
+ XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS TransmitterQueryOffloadOptions;
+ XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE TransmitterQueryLargePacketSize;
+ XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE TransmitterQueryRingSize;
+ XENVIF_VIF_MAC_QUERY_STATE MacQueryState;
+ XENVIF_VIF_MAC_QUERY_MAXIMUM_FRAME_SIZE MacQueryMaximumFrameSize;
+ XENVIF_VIF_MAC_QUERY_PERMANENT_ADDRESS MacQueryPermanentAddress;
+ XENVIF_VIF_MAC_QUERY_CURRENT_ADDRESS MacQueryCurrentAddress;
+ XENVIF_VIF_MAC_QUERY_MULTICAST_ADDRESSES MacQueryMulticastAddresses;
+ XENVIF_VIF_MAC_SET_MULTICAST_ADDRESSES MacSetMulticastAddresses;
+ XENVIF_VIF_MAC_SET_FILTER_LEVEL MacSetFilterLevel;
+ XENVIF_VIF_MAC_QUERY_FILTER_LEVEL MacQueryFilterLevel;
+};
+
+typedef struct _XENVIF_VIF_INTERFACE_V2 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
/*! \def XENVIF_VIF
\brief Macro at assist in method invocation
#endif // _WINDLL
#define XENVIF_VIF_INTERFACE_VERSION_MIN 1
-#define XENVIF_VIF_INTERFACE_VERSION_MAX 1
+#define XENVIF_VIF_INTERFACE_VERSION_MAX 2
#endif // _XENVIF_INTERFACE_H
#define XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID 0x03FF
typedef struct _XENVIF_TRANSMITTER_STATE {
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
XENVIF_TRANSMITTER_PACKET_SEND_INFO Send;
PUCHAR StartVa;
XENVIF_PACKET_INFO Info;
#define XENVIF_TRANSMITTER_RING_SIZE (__CONST_RING_SIZE(netif_tx, PAGE_SIZE))
typedef struct _XENVIF_TRANSMITTER_PACKET_LIST {
- PXENVIF_TRANSMITTER_PACKET HeadPacket;
- PXENVIF_TRANSMITTER_PACKET *TailPacket;
+ PXENVIF_TRANSMITTER_PACKET_V1 HeadPacket;
+ PXENVIF_TRANSMITTER_PACKET_V1 *TailPacket;
} XENVIF_TRANSMITTER_PACKET_LIST, *PXENVIF_TRANSMITTER_PACKET_LIST;
typedef struct _XENVIF_TRANSMITTER_RING {
BOOLEAN Connected;
BOOLEAN Enabled;
BOOLEAN Stopped;
- PXENVIF_TRANSMITTER_PACKET Lock;
+ PVOID Lock;
PKTHREAD LockThread;
XENVIF_TRANSMITTER_PACKET_LIST Queued;
XENVIF_TRANSMITTER_STATE State;
PXENVIF_TRANSMITTER Transmitter;
PXENVIF_FRONTEND Frontend;
PXENVIF_TRANSMITTER_STATE State;
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
XENVIF_PACKET_PAYLOAD Payload;
PXENVIF_TRANSMITTER_FRAGMENT Fragment;
PXENVIF_TRANSMITTER_BUFFER Buffer;
PXENVIF_TRANSMITTER Transmitter;
PXENVIF_FRONTEND Frontend;
PXENVIF_TRANSMITTER_STATE State;
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
PXENVIF_PACKET_PAYLOAD Payload;
PMDL Mdl;
ULONG Offset;
PXENVIF_FRONTEND Frontend;
PXENVIF_MAC Mac;
PXENVIF_TRANSMITTER_STATE State;
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
PXENVIF_PACKET_PAYLOAD Payload;
PXENVIF_PACKET_INFO Info;
PXENVIF_TRANSMITTER_FRAGMENT Fragment;
while (State->Count != 0) {
PLIST_ENTRY ListEntry;
PXENVIF_TRANSMITTER_FRAGMENT Fragment;
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
--State->Count;
static FORCEINLINE NTSTATUS
__TransmitterRingPreparePacket(
- IN PXENVIF_TRANSMITTER_RING Ring,
- IN PXENVIF_TRANSMITTER_PACKET Packet
+ IN PXENVIF_TRANSMITTER_RING Ring,
+ IN PXENVIF_TRANSMITTER_PACKET_V1 Packet
)
{
#define OFFSET_EXISTS(_Ring, _Packet, _Type) \
#undef OFFSET_EXISTS
}
-static FORCEINLINE PXENVIF_TRANSMITTER_PACKET
+static FORCEINLINE PXENVIF_TRANSMITTER_PACKET_V1
__TransmitterRingUnpreparePacket(
IN PXENVIF_TRANSMITTER_RING Ring
)
{
PXENVIF_TRANSMITTER_STATE State;
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
State = &Ring->State;
Packet = State->Packet;
PXENVIF_TRANSMITTER Transmitter;
PXENVIF_FRONTEND Frontend;
PXENVIF_TRANSMITTER_STATE State;
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
PXENVIF_PACKET_PAYLOAD Payload;
RING_IDX req_prod;
RING_IDX rsp_cons;
static FORCEINLINE VOID
__TransmitterRingCompletePacket(
- IN PXENVIF_TRANSMITTER_RING Ring,
- IN PXENVIF_TRANSMITTER_PACKET Packet
+ IN PXENVIF_TRANSMITTER_RING Ring,
+ IN PXENVIF_TRANSMITTER_PACKET_V1 Packet
)
{
- PXENVIF_TRANSMITTER Transmitter;
- PXENVIF_FRONTEND Frontend;
+ PXENVIF_TRANSMITTER Transmitter;
+ PXENVIF_FRONTEND Frontend;
Transmitter = Ring->Transmitter;
Frontend = Transmitter->Frontend;
netif_tx_response_t *rsp;
uint16_t id;
PXENVIF_TRANSMITTER_FRAGMENT Fragment;
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
rsp = RING_GET_RESPONSE(&Ring->Front, rsp_cons);
rsp_cons++;
static FORCEINLINE ULONG
__TransmitterReversePacketList(
- IN PXENVIF_TRANSMITTER_PACKET *Packet
+ IN PXENVIF_TRANSMITTER_PACKET_V1 *Packet
)
{
- PXENVIF_TRANSMITTER_PACKET HeadPacket;
- ULONG Count;
+ PXENVIF_TRANSMITTER_PACKET_V1 HeadPacket;
+ ULONG Count;
HeadPacket = NULL;
Count = 0;
while (*Packet != NULL) {
- PXENVIF_TRANSMITTER_PACKET Next;
+ PXENVIF_TRANSMITTER_PACKET_V1 Next;
ASSERT(((ULONG_PTR)*Packet & XENVIF_TRANSMITTER_LOCK_BIT) == 0);
{
ULONG_PTR Old;
ULONG_PTR New;
- PXENVIF_TRANSMITTER_PACKET HeadPacket;
- PXENVIF_TRANSMITTER_PACKET *TailPacket;
+ PXENVIF_TRANSMITTER_PACKET_V1 HeadPacket;
+ PXENVIF_TRANSMITTER_PACKET_V1 *TailPacket;
ULONG Count;
ASSERT3P(Ring->LockThread, ==, KeGetCurrentThread());
State = &Ring->State;
for (;;) {
- PXENVIF_TRANSMITTER_PACKET Packet;
- NTSTATUS status;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
+ NTSTATUS status;
if (State->Count != 0) {
status = __TransmitterRingPostFragments(Ring);
__TransmitterRingPushRequests(Ring);
}
+static FORCEINLINE VOID
+__TransmitterReturnPackets(
+ IN PXENVIF_TRANSMITTER Transmitter,
+ IN PXENVIF_TRANSMITTER_PACKET_V1 HeadPacket
+ )
+{
+ PXENVIF_FRONTEND Frontend;
+
+ Frontend = Transmitter->Frontend;
+
+ VifTransmitterReturnPacketsV1(PdoGetVifContext(FrontendGetPdo(Frontend)),
+ HeadPacket);
+}
+
static FORCEINLINE BOOLEAN
__drv_requiresIRQL(DISPATCH_LEVEL)
__TransmitterRingTryAcquireLock(
IN PXENVIF_TRANSMITTER_RING Ring
)
{
- PXENVIF_TRANSMITTER_PACKET HeadPacket;
- PXENVIF_TRANSMITTER_PACKET *TailPacket;
+ PXENVIF_TRANSMITTER_PACKET_V1 HeadPacket;
+ PXENVIF_TRANSMITTER_PACKET_V1 *TailPacket;
HeadPacket = NULL;
TailPacket = &HeadPacket;
if (HeadPacket != NULL) {
PXENVIF_TRANSMITTER Transmitter;
- PXENVIF_FRONTEND Frontend;
Transmitter = Ring->Transmitter;
- Frontend = Transmitter->Frontend;
- VifTransmitterReturnPackets(PdoGetVifContext(FrontendGetPdo(Frontend)),
- HeadPacket);
+ __TransmitterReturnPackets(Transmitter,
+ HeadPacket);
}
}
{
PXENVIF_TRANSMITTER Transmitter;
PXENVIF_FRONTEND Frontend;
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
PCHAR Buffer;
XenbusState State;
ULONG Attempt;
static FORCEINLINE VOID
__TransmitterRingQueuePackets(
- IN PXENVIF_TRANSMITTER_RING Ring,
- IN PXENVIF_TRANSMITTER_PACKET HeadPacket
+ IN PXENVIF_TRANSMITTER_RING Ring,
+ IN PXENVIF_TRANSMITTER_PACKET_V1 HeadPacket
)
{
- PXENVIF_TRANSMITTER_PACKET *TailPacket;
- ULONG_PTR Old;
- ULONG_PTR LockBit;
- ULONG_PTR New;
+ PXENVIF_TRANSMITTER_PACKET_V1 *TailPacket;
+ ULONG_PTR Old;
+ ULONG_PTR LockBit;
+ ULONG_PTR New;
TailPacket = &HeadPacket->Next;
(VOID) __TransmitterReversePacketList(&HeadPacket);
IN PXENVIF_TRANSMITTER_RING Ring
)
{
- PXENVIF_TRANSMITTER_PACKET Packet;
+ PXENVIF_TRANSMITTER_PACKET_V1 Packet;
__TransmitterRingAcquireLock(Ring);
Ring->Queued.TailPacket = &Ring->Queued.HeadPacket;
while (Packet != NULL) {
- PXENVIF_TRANSMITTER_PACKET Next;
+ PXENVIF_TRANSMITTER_PACKET_V1 Next;
Next = Packet->Next;
Packet->Next = NULL;
}
VOID
-TransmitterQueuePackets(
- IN PXENVIF_TRANSMITTER Transmitter,
- IN PXENVIF_TRANSMITTER_PACKET HeadPacket
+TransmitterQueuePacketsVersion1(
+ IN PXENVIF_TRANSMITTER Transmitter,
+ IN PXENVIF_TRANSMITTER_PACKET_V1 HeadPacket
)
{
PXENVIF_TRANSMITTER_RING Ring;
static NTSTATUS
-VifTransmitterQueuePackets(
- IN PINTERFACE Interface,
- IN PXENVIF_TRANSMITTER_PACKET Head
+VifTransmitterQueuePacketsVersion1(
+ IN PINTERFACE Interface,
+ IN PXENVIF_TRANSMITTER_PACKET_V1 Head
)
{
PXENVIF_VIF_CONTEXT Context = Interface->Context;
if (Context->Enabled == FALSE)
goto fail1;
- TransmitterQueuePackets(FrontendGetTransmitter(Context->Frontend),
- Head);
+ TransmitterQueuePacketsVersion1(FrontendGetTransmitter(Context->Frontend),
+ Head);
ReleaseMrswLockShared(&Context->Lock);
VifReceiverSetOffloadOptions,
VifReceiverQueryRingSize,
VifTransmitterSetPacketOffset,
- VifTransmitterQueuePackets,
+ VifTransmitterQueuePacketsVersion1,
VifTransmitterQueryOffloadOptions,
VifTransmitterQueryLargePacketSize,
VifTransmitterQueryRingSize,
}
VOID
-VifTransmitterReturnPackets(
- IN PXENVIF_VIF_CONTEXT Context,
- IN PXENVIF_TRANSMITTER_PACKET Head
+VifTransmitterReturnPacketsV1(
+ IN PXENVIF_VIF_CONTEXT Context,
+ IN PXENVIF_TRANSMITTER_PACKET_V1 Head
)
{
Context->Callback(Context->Argument,