From: Owen Smith Date: Thu, 18 Dec 2014 14:28:22 +0000 (+0000) Subject: Update to VIF Interface v2 X-Git-Tag: 8.1.0-rc1~68 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=eaf6c677b5a1ad674c4ba9f95937e711f7d52114;p=people%2Fpauldu%2Fxenvif.git Update to VIF Interface v2 Renames XENVIF_TRANSMITTER_PACKET to XENVIF_TRANSMITTER_PACKET_V1 and adds XENVIF_TRANSMITTER_PACKET_V2 for future patches. VIF v2 will be implemented in another patch. Signed-off-by: Owen Smith Signed-off-by: Paul Durrant --- diff --git a/include/vif_interface.h b/include/vif_interface.h index 498ed8f..d083fd1 100644 --- a/include/vif_interface.h +++ b/include/vif_interface.h @@ -257,7 +257,7 @@ struct _XENVIF_TRANSMITTER_PACKET_V1 { }; }; -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) @@ -265,6 +265,30 @@ typedef struct _XENVIF_TRANSMITTER_PACKET_V1 XENVIF_TRANSMITTER_PACKET, *PXENVIF 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 @@ -474,16 +498,44 @@ typedef NTSTATUS 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 @@ -708,7 +760,37 @@ struct _XENVIF_VIF_INTERFACE_V1 { 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 @@ -719,6 +801,6 @@ typedef struct _XENVIF_VIF_INTERFACE_V1 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTER #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 diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c index 6cba6c1..826d2f0 100644 --- a/src/xenvif/transmitter.c +++ b/src/xenvif/transmitter.c @@ -89,7 +89,7 @@ typedef struct _XENVIF_TRANSMITTER_FRAGMENT { #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; @@ -101,8 +101,8 @@ typedef struct _XENVIF_TRANSMITTER_STATE { #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 { @@ -122,7 +122,7 @@ 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; @@ -557,7 +557,7 @@ __TransmitterRingCopyPayload( 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; @@ -704,7 +704,7 @@ __TransmitterRingGrantPayload( 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; @@ -853,7 +853,7 @@ __TransmitterRingPrepareHeader( 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; @@ -1130,7 +1130,7 @@ __TransmitterRingUnprepareFragments( while (State->Count != 0) { PLIST_ENTRY ListEntry; PXENVIF_TRANSMITTER_FRAGMENT Fragment; - PXENVIF_TRANSMITTER_PACKET Packet; + PXENVIF_TRANSMITTER_PACKET_V1 Packet; --State->Count; @@ -1186,8 +1186,8 @@ __TransmitterRingUnprepareFragments( 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) \ @@ -1338,13 +1338,13 @@ fail1: #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; @@ -1703,7 +1703,7 @@ __TransmitterRingPostFragments( 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; @@ -1928,12 +1928,12 @@ __TransmitterRingFakeResponses( 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; @@ -2027,7 +2027,7 @@ TransmitterRingPoll( 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++; @@ -2194,17 +2194,17 @@ __TransmitterRingPushRequests( 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); @@ -2229,8 +2229,8 @@ TransmitterRingSwizzle( { 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()); @@ -2270,8 +2270,8 @@ TransmitterRingSchedule( State = &Ring->State; for (;;) { - PXENVIF_TRANSMITTER_PACKET Packet; - NTSTATUS status; + PXENVIF_TRANSMITTER_PACKET_V1 Packet; + NTSTATUS status; if (State->Count != 0) { status = __TransmitterRingPostFragments(Ring); @@ -2365,6 +2365,20 @@ TransmitterRingSchedule( __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( @@ -2462,8 +2476,8 @@ __TransmitterRingReleaseLock( 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; @@ -2488,13 +2502,11 @@ __TransmitterRingReleaseLock( if (HeadPacket != NULL) { PXENVIF_TRANSMITTER Transmitter; - PXENVIF_FRONTEND Frontend; Transmitter = Ring->Transmitter; - Frontend = Transmitter->Frontend; - VifTransmitterReturnPackets(PdoGetVifContext(FrontendGetPdo(Frontend)), - HeadPacket); + __TransmitterReturnPackets(Transmitter, + HeadPacket); } } @@ -3091,7 +3103,7 @@ __TransmitterRingDisable( { PXENVIF_TRANSMITTER Transmitter; PXENVIF_FRONTEND Frontend; - PXENVIF_TRANSMITTER_PACKET Packet; + PXENVIF_TRANSMITTER_PACKET_V1 Packet; PCHAR Buffer; XenbusState State; ULONG Attempt; @@ -3286,14 +3298,14 @@ __TransmitterRingTeardown( 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); @@ -3323,7 +3335,7 @@ __TransmitterRingAbortPackets( IN PXENVIF_TRANSMITTER_RING Ring ) { - PXENVIF_TRANSMITTER_PACKET Packet; + PXENVIF_TRANSMITTER_PACKET_V1 Packet; __TransmitterRingAcquireLock(Ring); @@ -3335,7 +3347,7 @@ __TransmitterRingAbortPackets( Ring->Queued.TailPacket = &Ring->Queued.HeadPacket; while (Packet != NULL) { - PXENVIF_TRANSMITTER_PACKET Next; + PXENVIF_TRANSMITTER_PACKET_V1 Next; Next = Packet->Next; Packet->Next = NULL; @@ -3829,9 +3841,9 @@ fail1: } 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; diff --git a/src/xenvif/transmitter.h b/src/xenvif/transmitter.h index 9c3bfaa..7c16076 100644 --- a/src/xenvif/transmitter.h +++ b/src/xenvif/transmitter.h @@ -108,9 +108,9 @@ TransmitterAdvertiseAddresses( ); extern VOID -TransmitterQueuePackets( - IN PXENVIF_TRANSMITTER Transmitter, - IN PXENVIF_TRANSMITTER_PACKET HeadPacket +TransmitterQueuePacketsVersion1( + IN PXENVIF_TRANSMITTER Transmitter, + IN PXENVIF_TRANSMITTER_PACKET_V1 HeadPacket ); extern VOID diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c index 97ce84a..a4a8557 100644 --- a/src/xenvif/vif.c +++ b/src/xenvif/vif.c @@ -275,9 +275,9 @@ VifReceiverReturnPackets( 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; @@ -289,8 +289,8 @@ VifTransmitterQueuePackets( if (Context->Enabled == FALSE) goto fail1; - TransmitterQueuePackets(FrontendGetTransmitter(Context->Frontend), - Head); + TransmitterQueuePacketsVersion1(FrontendGetTransmitter(Context->Frontend), + Head); ReleaseMrswLockShared(&Context->Lock); @@ -642,7 +642,7 @@ static struct _XENVIF_VIF_INTERFACE_V1 VifInterfaceVersion1 = { VifReceiverSetOffloadOptions, VifReceiverQueryRingSize, VifTransmitterSetPacketOffset, - VifTransmitterQueuePackets, + VifTransmitterQueuePacketsVersion1, VifTransmitterQueryOffloadOptions, VifTransmitterQueryLargePacketSize, VifTransmitterQueryRingSize, @@ -783,9 +783,9 @@ VifReceiverQueuePackets( } 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, diff --git a/src/xenvif/vif.h b/src/xenvif/vif.h index 17a04db..a26aa1b 100644 --- a/src/xenvif/vif.h +++ b/src/xenvif/vif.h @@ -69,9 +69,9 @@ VifReceiverQueuePackets( ); extern VOID -VifTransmitterReturnPackets( - IN PXENVIF_VIF_CONTEXT Context, - IN PXENVIF_TRANSMITTER_PACKET Head +VifTransmitterReturnPacketsV1( + IN PXENVIF_VIF_CONTEXT Context, + IN PXENVIF_TRANSMITTER_PACKET_V1 Head ); extern PXENVIF_THREAD