2 * This file contains general definitions for VirtIO network adapter driver,
3 * common for both NDIS5 and NDIS6
5 * Copyright (c) 2008-2017 Red Hat, Inc.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and / or other materials provided with the distribution.
15 * 3. Neither the names of the copyright holders nor the names of their contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 #ifndef PARANDIS_56_COMMON_H
31 #define PARANDIS_56_COMMON_H
33 //#define PARANDIS_TEST_TX_KICK_ALWAYS
35 #if defined(OFFLOAD_UNIT_TEST)
39 #define ETH_LENGTH_OF_ADDRESS 6
40 #define DoPrint(fmt, ...) printf(fmt##"\n", __VA_ARGS__)
41 #define DPrintf(a,b) DoPrint b
42 #define RtlOffsetToPointer(B,O) ((PCHAR)( ((PCHAR)(B)) + ((ULONG_PTR)(O)) ))
44 #include "ethernetutils.h"
45 #endif //+OFFLOAD_UNIT_TEST
47 #if !defined(OFFLOAD_UNIT_TEST)
49 #if !defined(RtlOffsetToPointer)
50 #define RtlOffsetToPointer(Base,Offset) ((PCHAR)(((PCHAR)(Base))+((ULONG_PTR)(Offset))))
53 #if !defined(RtlPointerToOffset)
54 #define RtlPointerToOffset(Base,Pointer) ((ULONG)(((PCHAR)(Pointer))-((PCHAR)(Base))))
60 #include "kdebugprint.h"
61 #include "ethernetutils.h"
62 #include "virtio_pci.h"
64 #include "virtio_ring.h"
65 #include "IONetDescriptor.h"
66 #include "DebugData.h"
68 // those stuff defined in NDIS
69 //NDIS_MINIPORT_MAJOR_VERSION
70 //NDIS_MINIPORT_MINOR_VERSION
71 // those stuff defined in build environment
72 // PARANDIS_MAJOR_DRIVER_VERSION
73 // PARANDIS_MINOR_DRIVER_VERSION
75 #if !defined(NDIS_MINIPORT_MAJOR_VERSION) || !defined(NDIS_MINIPORT_MINOR_VERSION)
76 #error "Something is wrong with NDIS environment"
79 //define to see when the status register is unreadable(see ParaNdis_ResetVirtIONetDevice)
80 //#define VIRTIO_RESET_VERIFY
82 //define to if hardware raise interrupt on error (see ParaNdis_DPCWorkBody)
83 //#define VIRTIO_SIGNAL_ERROR
85 // define if qemu supports logging to static IO port for synchronization
86 // of driver output with qemu printouts; in this case define the port number
87 // #define VIRTIO_DBG_USE_IOPORT 0x99
89 // to be set to real limit later
90 #define MAX_RX_LOOPS 1000
92 // maximum number of virtio queues used by the driver
93 #define MAX_NUM_OF_QUEUES 3
95 /* The feature bitmap for virtio net */
96 #define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */
97 #define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */
98 #define VIRTIO_NET_F_MAC 5 /* Host has given MAC address. */
99 #define VIRTIO_NET_F_GSO 6 /* Host handles pkts w/ any GSO type */
100 #define VIRTIO_NET_F_GUEST_TSO4 7 /* Guest can handle TSOv4 in. */
101 #define VIRTIO_NET_F_GUEST_TSO6 8 /* Guest can handle TSOv6 in. */
102 #define VIRTIO_NET_F_GUEST_ECN 9 /* Guest can handle TSO[6] w/ ECN in. */
103 #define VIRTIO_NET_F_GUEST_UFO 10 /* Guest can handle UFO in. */
104 #define VIRTIO_NET_F_HOST_TSO4 11 /* Host can handle TSOv4 in. */
105 #define VIRTIO_NET_F_HOST_TSO6 12 /* Host can handle TSOv6 in. */
106 #define VIRTIO_NET_F_HOST_ECN 13 /* Host can handle TSO[6] w/ ECN in. */
107 #define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in. */
108 #define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can handle merged Rx buffers and requires bigger header for that. */
109 #define VIRTIO_NET_F_STATUS 16
110 #define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */
111 #define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */
112 #define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */
113 #define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */
115 #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
117 #define VIRTIO_NET_INVALID_INTERRUPT_STATUS 0xFF
119 #define PARANDIS_MULTICAST_LIST_SIZE 32
120 #define PARANDIS_MEMORY_TAG '5muQ'
121 #define PARANDIS_FORMAL_LINK_SPEED (pContext->ulFormalLinkSpeed)
122 #define PARANDIS_MAXIMUM_TRANSMIT_SPEED PARANDIS_FORMAL_LINK_SPEED
123 #define PARANDIS_MAXIMUM_RECEIVE_SPEED PARANDIS_FORMAL_LINK_SPEED
124 #define PARANDIS_MIN_LSO_SEGMENTS 2
126 #define PARANDIS_MAX_LSO_SIZE 0xF800
128 #define PARANDIS_UNLIMITED_PACKETS_TO_INDICATE (~0ul)
130 extern VirtIOSystemOps ParaNdisSystemOps
;
132 typedef enum _tagInterruptSource
134 isControl
= VIRTIO_PCI_ISR_CONFIG
,
138 isBothTransmitReceive
= isReceive
| isTransmit
,
139 isAny
= isReceive
| isTransmit
| isControl
| isUnknown
,
143 static const ULONG PARANDIS_PACKET_FILTERS
=
144 NDIS_PACKET_TYPE_DIRECTED
|
145 NDIS_PACKET_TYPE_MULTICAST
|
146 NDIS_PACKET_TYPE_BROADCAST
|
147 NDIS_PACKET_TYPE_PROMISCUOUS
|
148 NDIS_PACKET_TYPE_ALL_MULTICAST
;
150 typedef VOID (*ONPAUSECOMPLETEPROC
)(VOID
*);
153 typedef enum _tagSendReceiveState
155 srsDisabled
= 0, // initial state
160 typedef struct _tagBusResource
{
161 NDIS_PHYSICAL_ADDRESS BasePA
;
168 typedef struct _tagAdapterResources
170 tBusResource PciBars
[PCI_TYPE0_ADDRESSES
];
174 ULONG InterruptFlags
;
177 typedef enum _tagOffloadSettingsBit
179 osbT4IpChecksum
= (1 << 0),
180 osbT4TcpChecksum
= (1 << 1),
181 osbT4UdpChecksum
= (1 << 2),
182 osbT4TcpOptionsChecksum
= (1 << 3),
183 osbT4IpOptionsChecksum
= (1 << 4),
185 osbT4LsoIp
= (1 << 6),
186 osbT4LsoTcp
= (1 << 7),
187 osbT4RxTCPChecksum
= (1 << 8),
188 osbT4RxTCPOptionsChecksum
= (1 << 9),
189 osbT4RxIPChecksum
= (1 << 10),
190 osbT4RxIPOptionsChecksum
= (1 << 11),
191 osbT4RxUDPChecksum
= (1 << 12),
192 osbT6TcpChecksum
= (1 << 13),
193 osbT6UdpChecksum
= (1 << 14),
194 osbT6TcpOptionsChecksum
= (1 << 15),
195 osbT6IpExtChecksum
= (1 << 16),
196 osbT6Lso
= (1 << 17),
197 osbT6LsoIpExt
= (1 << 18),
198 osbT6LsoTcpOptions
= (1 << 19),
199 osbT6RxTCPChecksum
= (1 << 20),
200 osbT6RxTCPOptionsChecksum
= (1 << 21),
201 osbT6RxUDPChecksum
= (1 << 22),
202 osbT6RxIpExtChecksum
= (1 << 23),
203 }tOffloadSettingsBit
;
205 typedef struct _tagOffloadSettingsFlags
207 ULONG fTxIPChecksum
: 1;
208 ULONG fTxTCPChecksum
: 1;
209 ULONG fTxUDPChecksum
: 1;
210 ULONG fTxTCPOptions
: 1;
211 ULONG fTxIPOptions
: 1;
215 ULONG fRxIPChecksum
: 1;
216 ULONG fRxTCPChecksum
: 1;
217 ULONG fRxUDPChecksum
: 1;
218 ULONG fRxTCPOptions
: 1;
219 ULONG fRxIPOptions
: 1;
220 ULONG fTxTCPv6Checksum
: 1;
221 ULONG fTxUDPv6Checksum
: 1;
222 ULONG fTxTCPv6Options
: 1;
223 ULONG fTxIPv6Ext
: 1;
225 ULONG fTxLsov6IP
: 1;
226 ULONG fTxLsov6TCP
: 1;
227 ULONG fRxTCPv6Checksum
: 1;
228 ULONG fRxUDPv6Checksum
: 1;
229 ULONG fRxTCPv6Options
: 1;
230 ULONG fRxIPv6Ext
: 1;
231 }tOffloadSettingsFlags
;
234 typedef struct _tagOffloadSettings
236 /* current value of enabled offload features */
237 tOffloadSettingsFlags flags
;
238 /* load once, do not modify - bitmask of offload features, enabled in configuration */
240 ULONG ipHeaderOffset
;
244 typedef struct _tagChecksumCheckResult
259 }tChecksumCheckResult
;
262 for simplicity, we use for NDIS5 the same statistics as native NDIS6 uses
264 typedef struct _tagNdisStatistics
266 ULONG64 ifHCInOctets
;
267 ULONG64 ifHCInUcastPkts
;
268 ULONG64 ifHCInUcastOctets
;
269 ULONG64 ifHCInMulticastPkts
;
270 ULONG64 ifHCInMulticastOctets
;
271 ULONG64 ifHCInBroadcastPkts
;
272 ULONG64 ifHCInBroadcastOctets
;
273 ULONG64 ifInDiscards
;
275 ULONG64 ifHCOutOctets
;
276 ULONG64 ifHCOutUcastPkts
;
277 ULONG64 ifHCOutUcastOctets
;
278 ULONG64 ifHCOutMulticastPkts
;
279 ULONG64 ifHCOutMulticastOctets
;
280 ULONG64 ifHCOutBroadcastPkts
;
281 ULONG64 ifHCOutBroadcastOctets
;
282 ULONG64 ifOutDiscards
;
284 }NDIS_STATISTICS_INFO
;
286 typedef PNDIS_PACKET tPacketType
;
287 typedef PNDIS_PACKET tPacketHolderType
;
288 typedef PNDIS_PACKET tPacketIndicationType
;
290 typedef struct _tagNdisOffloadParams
293 UCHAR TCPIPv4Checksum
;
294 UCHAR UDPIPv4Checksum
;
297 UCHAR TCPIPv6Checksum
;
298 UCHAR UDPIPv6Checksum
;
300 }NDIS_OFFLOAD_PARAMETERS
;
302 //#define UNIFY_LOCKS
304 typedef struct _tagOurCounters
306 UINT nReusedRxBuffers
;
307 UINT nPrintDiagnostic
;
312 typedef struct _tagMaxPacketSize
316 UINT nMaxFullSizeHwTx
;
317 UINT nMaxFullSizeHwRx
;
320 typedef struct _tagCompletePhysicalAddress
322 PHYSICAL_ADDRESS Physical
;
327 } tCompletePhysicalAddress
;
329 typedef struct _tagMulticastData
331 ULONG nofMulticastEntries
;
332 UCHAR MulticastList
[ETH_LENGTH_OF_ADDRESS
* PARANDIS_MULTICAST_LIST_SIZE
];
335 typedef struct _tagIONetDescriptor
{
336 LIST_ENTRY listEntry
;
337 tCompletePhysicalAddress HeaderInfo
;
338 tCompletePhysicalAddress DataInfo
;
339 tPacketHolderType pHolder
;
340 PVOID ReferenceValue
;
342 } IONetDescriptor
, * pIONetDescriptor
;
344 typedef void (*tReuseReceiveBufferProc
)(void *pContext
, pIONetDescriptor pDescriptor
);
346 typedef struct _tagPARANDIS_ADAPTER
348 NDIS_HANDLE DriverHandle
;
349 NDIS_HANDLE MiniportHandle
;
350 NDIS_EVENT ResetEvent
;
351 tAdapterResources AdapterResources
;
352 tBusResource SharedMemoryRanges
[MAX_NUM_OF_QUEUES
];
354 VirtIODevice IODevice
;
355 BOOLEAN bIODeviceInitialized
;
356 ULONGLONG ullHostFeatures
;
357 ULONGLONG ullGuestFeatures
;
359 LARGE_INTEGER LastTxCompletionTimeStamp
;
360 #ifdef PARANDIS_DEBUG_INTERRUPTS
361 LARGE_INTEGER LastInterruptTimeStamp
;
364 BOOLEAN bEnableInterruptHandlingDPC
;
365 BOOLEAN bEnableInterruptChecking
;
366 BOOLEAN bDoInterruptRecovery
;
367 BOOLEAN bDoSupportPriority
;
368 BOOLEAN bDoHwPacketFiltering
;
369 BOOLEAN bUseScatterGather
;
370 BOOLEAN bBatchReceive
;
371 BOOLEAN bLinkDetectSupported
;
372 BOOLEAN bDoHardwareChecksum
;
373 BOOLEAN bDoGuestChecksumOnReceive
;
374 BOOLEAN bDoIPCheckTx
;
375 BOOLEAN bDoIPCheckRx
;
376 BOOLEAN bUseMergedBuffers
;
377 BOOLEAN bDoKickOnNoBuffer
;
378 BOOLEAN bSurprizeRemoved
;
380 BOOLEAN bUseIndirect
;
381 BOOLEAN bHasHardwareFilters
;
382 BOOLEAN bHasControlQueue
;
383 BOOLEAN bNoPauseOnSuspend
;
384 BOOLEAN bFastSuspendInProcess
;
385 BOOLEAN bResetInProgress
;
386 ULONG ulCurrentVlansFilterSet
;
387 tMulticastData MulticastData
;
388 UINT uNumberOfHandledRXPacketsInDPC
;
389 NDIS_DEVICE_POWER_STATE powerState
;
390 LONG dpcReceiveActive
;
391 LONG counterDPCInside
;
393 LONG InterruptStatus
;
394 ULONG ulPriorityVlanSetting
;
396 ULONGLONG ulFormalLinkSpeed
;
397 ULONG ulEnableWakeup
;
398 tMaxPacketSize MaxPacketSize
;
399 ULONG nEnableDPCChecker
;
401 UCHAR PermanentMacAddress
[ETH_LENGTH_OF_ADDRESS
];
402 UCHAR CurrentMacAddress
[ETH_LENGTH_OF_ADDRESS
];
404 ULONG DummyLookAhead
;
405 ULONG ulMilliesToConnect
;
406 ULONG nDetectedStoppedTx
;
407 ULONG nDetectedInactivity
;
408 ULONG nVirtioHeaderSize
;
410 #if !defined(UNIFY_LOCKS)
411 NDIS_SPIN_LOCK SendLock
;
412 NDIS_SPIN_LOCK ReceiveLock
;
416 NDIS_SPIN_LOCK SendLock
;
417 NDIS_SPIN_LOCK ReceiveLock
;
420 NDIS_STATISTICS_INFO Statistics
;
423 ULONG framesCSOffload
;
425 ULONG framesIndirect
;
426 ULONG framesRxPriority
;
427 ULONG framesRxCSHwOK
;
428 ULONG framesRxCSHwMissedBad
;
429 ULONG framesRxCSHwMissedGood
;
430 ULONG framesFilteredOut
;
432 tOurCounters Counters
;
434 tSendReceiveState SendState
;
435 tSendReceiveState ReceiveState
;
436 ONPAUSECOMPLETEPROC SendPauseCompletionProc
;
437 ONPAUSECOMPLETEPROC ReceivePauseCompletionProc
;
438 tReuseReceiveBufferProc ReuseBufferProc
;
439 /* Net part - management of buffers and queues of QEMU */
440 struct virtqueue
* NetControlQueue
;
441 tCompletePhysicalAddress ControlData
;
442 struct virtqueue
* NetReceiveQueue
;
443 struct virtqueue
* NetSendQueue
;
444 /* list of Rx buffers available for data (under VIRTIO management) */
445 LIST_ENTRY NetReceiveBuffers
;
446 UINT NetNofReceiveBuffers
;
447 /* list of Rx buffers waiting for return (under NDIS management) */
448 LIST_ENTRY NetReceiveBuffersWaiting
;
449 /* list of Tx buffers in process (under VIRTIO management) */
450 LIST_ENTRY NetSendBuffersInUse
;
451 /* list of Tx buffers ready for data (under MINIPORT management) */
452 LIST_ENTRY NetFreeSendBuffers
;
453 /* current number of free Tx descriptors */
454 UINT nofFreeTxDescriptors
;
455 /* initial number of free Tx descriptor(from cfg) - max number of available Tx descriptors */
456 UINT maxFreeTxDescriptors
;
457 /* current number of free Tx buffers, which can be submitted */
458 UINT nofFreeHardwareBuffers
;
459 /* maximal number of free Tx buffers, which can be used by SG */
460 UINT maxFreeHardwareBuffers
;
461 /* minimal number of free Tx buffers */
462 UINT minFreeHardwareBuffers
;
463 /* current number of Tx packets (or lists) to return */
464 LONG NetTxPacketsToReturn
;
465 /* total of Rx buffer in turnaround */
466 UINT NetMaxReceiveBuffers
;
467 struct VirtIOBufferDescriptor
*sgTxGatherTable
;
469 NDIS_DEVICE_PNP_EVENT PnpEvents
[16];
470 tOffloadSettings Offload
;
471 NDIS_OFFLOAD_PARAMETERS InitialOffloadParameters
;
472 // we keep these members common for XP and Vista
473 // for XP and non-MSI case of Vista they are set to zero
476 ULONG ulControlMessage
;
478 NDIS_MINIPORT_INTERRUPT Interrupt
;
479 NDIS_HANDLE PacketPool
;
480 NDIS_HANDLE BuffersPool
;
481 NDIS_HANDLE WrapperConfigurationHandle
;
482 LIST_ENTRY SendQueue
;
483 LIST_ENTRY TxWaitingList
;
484 NDIS_EVENT HaltEvent
;
485 NDIS_TIMER ConnectTimer
;
486 NDIS_TIMER DPCPostProcessTimer
;
487 BOOLEAN bDmaInitialized
;
488 }PARANDIS_ADAPTER
, *PPARANDIS_ADAPTER
;
490 typedef enum { cpeOK
, cpeNoBuffer
, cpeInternalError
, cpeTooLarge
, cpeNoIndirect
} tCopyPacketError
;
491 typedef struct _tagCopyPacketResult
494 tCopyPacketError error
;
497 typedef struct _tagSynchronizedContext
499 PARANDIS_ADAPTER
*pContext
;
501 }tSynchronizedContext
;
503 typedef BOOLEAN (*tSynchronizedProcedure
)(tSynchronizedContext
*context
);
505 /**********************************************************
506 LAZY release procedure returns buffers to VirtIO
507 only where there are no free buffers available
509 NON-LAZY release releases transmit buffers from VirtIO
510 library every time there is something to release
511 ***********************************************************/
512 //#define LAZY_TX_RELEASE
514 static inline bool VirtIODeviceGetHostFeature(PARANDIS_ADAPTER
*pContext
, unsigned uFeature
)
516 DPrintf(4, ("%s\n", __FUNCTION__
));
518 return virtio_is_feature_enabled(pContext
->ullHostFeatures
, uFeature
);
521 static inline void VirtIODeviceEnableGuestFeature(PARANDIS_ADAPTER
*pContext
, unsigned uFeature
)
523 DPrintf(4, ("%s\n", __FUNCTION__
));
525 virtio_feature_enable(pContext
->ullGuestFeatures
, uFeature
);
528 static BOOLEAN FORCEINLINE
IsTimeToReleaseTx(PARANDIS_ADAPTER
*pContext
)
530 #ifndef LAZY_TX_RELEASE
531 return pContext
->nofFreeTxDescriptors
< pContext
->maxFreeTxDescriptors
;
533 return pContext
->nofFreeTxDescriptors
== 0;
537 static BOOLEAN FORCEINLINE
IsValidVlanId(PARANDIS_ADAPTER
*pContext
, ULONG VlanID
)
539 return pContext
->VlanId
== 0 || pContext
->VlanId
== VlanID
;
542 static BOOLEAN FORCEINLINE
IsVlanSupported(PARANDIS_ADAPTER
*pContext
)
544 return pContext
->ulPriorityVlanSetting
& 2;
547 static BOOLEAN FORCEINLINE
IsPrioritySupported(PARANDIS_ADAPTER
*pContext
)
549 return pContext
->ulPriorityVlanSetting
& 1;
552 BOOLEAN
ParaNdis_ValidateMacAddress(
556 NDIS_STATUS
ParaNdis_InitializeContext(
557 PARANDIS_ADAPTER
*pContext
,
558 PNDIS_RESOURCE_LIST ResourceList
);
560 NDIS_STATUS
ParaNdis_FinishInitialization(
561 PARANDIS_ADAPTER
*pContext
);
563 VOID
ParaNdis_CleanupContext(
564 PARANDIS_ADAPTER
*pContext
);
567 UINT
ParaNdis_VirtIONetReleaseTransmitBuffers(
568 PARANDIS_ADAPTER
*pContext
);
570 ULONG
ParaNdis_DPCWorkBody(
571 PARANDIS_ADAPTER
*pContext
,
572 ULONG ulMaxPacketsToIndicate
);
574 NDIS_STATUS
ParaNdis_SetMulticastList(
575 PARANDIS_ADAPTER
*pContext
,
581 VOID
ParaNdis_VirtIOEnableIrqSynchronized(
582 PARANDIS_ADAPTER
*pContext
,
583 ULONG interruptSource
);
585 VOID
ParaNdis_VirtIODisableIrqSynchronized(
586 PARANDIS_ADAPTER
*pContext
,
587 ULONG interruptSource
);
589 static __inline
struct virtqueue
*
590 ParaNdis_GetQueueForInterrupt(PARANDIS_ADAPTER
*pContext
, ULONG interruptSource
)
592 if (interruptSource
& isTransmit
)
593 return pContext
->NetSendQueue
;
594 if (interruptSource
& isReceive
)
595 return pContext
->NetReceiveQueue
;
600 static __inline BOOLEAN
601 ParaNDIS_IsQueueInterruptEnabled(struct virtqueue
* _vq
)
603 return virtqueue_is_interrupt_enabled(_vq
);
606 VOID
ParaNdis_OnPnPEvent(
607 PARANDIS_ADAPTER
*pContext
,
608 NDIS_DEVICE_PNP_EVENT pEvent
,
612 BOOLEAN
ParaNdis_OnLegacyInterrupt(
613 PARANDIS_ADAPTER
*pContext
,
616 BOOLEAN
ParaNdis_OnQueuedInterrupt(
617 PARANDIS_ADAPTER
*pContext
,
619 ULONG knownInterruptSources
);
621 VOID
ParaNdis_OnShutdown(
622 PARANDIS_ADAPTER
*pContext
);
624 BOOLEAN
ParaNdis_CheckForHang(
625 PARANDIS_ADAPTER
*pContext
);
627 VOID
ParaNdis_ReportLinkStatus(
628 PARANDIS_ADAPTER
*pContext
,
631 NDIS_STATUS
ParaNdis_PowerOn(
632 PARANDIS_ADAPTER
*pContext
635 VOID
ParaNdis_PowerOff(
636 PARANDIS_ADAPTER
*pContext
639 void ParaNdis_DebugInitialize(PVOID DriverObject
,PVOID RegistryPath
);
640 void ParaNdis_DebugCleanup(PDRIVER_OBJECT pDriverObject
);
641 void ParaNdis_DebugRegisterMiniport(PARANDIS_ADAPTER
*pContext
, BOOLEAN bRegister
);
644 //#define ENABLE_HISTORY_LOG
645 #if !defined(ENABLE_HISTORY_LOG)
647 static void FORCEINLINE
ParaNdis_DebugHistory(
648 PARANDIS_ADAPTER
*pContext
,
649 eHistoryLogOperation op
,
660 void ParaNdis_DebugHistory(
661 PARANDIS_ADAPTER
*pContext
,
662 eHistoryLogOperation op
,
670 typedef struct _tagTxOperationParameters
673 PVOID ReferenceValue
;
677 ULONG tcpHeaderOffset
;
678 ULONG flags
; //see tPacketOffloadRequest
679 }tTxOperationParameters
;
681 tCopyPacketResult
ParaNdis_DoCopyPacketData(
682 PARANDIS_ADAPTER
*pContext
,
683 tTxOperationParameters
*pParams
);
685 typedef struct _tagMapperResult
687 USHORT usBuffersMapped
;
688 USHORT usBufferSpaceUsed
;
693 tCopyPacketResult
ParaNdis_DoSubmitPacket(PARANDIS_ADAPTER
*pContext
, tTxOperationParameters
*Params
);
695 void ParaNdis_ResetOffloadSettings(PARANDIS_ADAPTER
*pContext
, tOffloadSettingsFlags
*pDest
, PULONG from
);
697 tChecksumCheckResult
ParaNdis_CheckRxChecksum(PARANDIS_ADAPTER
*pContext
, ULONG virtioFlags
, PVOID pRxPacket
, ULONG len
);
699 void ParaNdis_CallOnBugCheck(PARANDIS_ADAPTER
*pContext
);
701 /*****************************************************
702 Procedures to implement for NDIS specific implementation
703 ******************************************************/
705 PVOID
ParaNdis_AllocateMemory(
706 PARANDIS_ADAPTER
*pContext
,
707 ULONG ulRequiredSize
);
709 NDIS_STATUS NTAPI
ParaNdis_FinishSpecificInitialization(
710 PARANDIS_ADAPTER
*pContext
);
712 VOID
ParaNdis_FinalizeCleanup(
713 PARANDIS_ADAPTER
*pContext
);
715 NDIS_HANDLE
ParaNdis_OpenNICConfiguration(
716 PARANDIS_ADAPTER
*pContext
);
718 tPacketIndicationType
ParaNdis_IndicateReceivedPacket(
719 PARANDIS_ADAPTER
*pContext
,
722 BOOLEAN bPrepareOnly
,
723 pIONetDescriptor pBufferDesc
);
725 VOID
ParaNdis_IndicateReceivedBatch(
726 PARANDIS_ADAPTER
*pContext
,
727 tPacketIndicationType
*pBatch
,
730 VOID
ParaNdis_PacketMapper(
731 PARANDIS_ADAPTER
*pContext
,
734 struct VirtIOBufferDescriptor
*buffers
,
735 pIONetDescriptor pDesc
,
736 tMapperResult
*pMapperResult
739 tCopyPacketResult
ParaNdis_PacketCopier(
746 BOOLEAN
ParaNdis_ProcessTx(
747 PARANDIS_ADAPTER
*pContext
,
749 BOOLEAN IsInterrupt
);
751 BOOLEAN
ParaNdis_SetTimer(
755 BOOLEAN
ParaNdis_SynchronizeWithInterrupt(
756 PARANDIS_ADAPTER
*pContext
,
758 tSynchronizedProcedure procedure
,
761 VOID
ParaNdis_Suspend(
762 PARANDIS_ADAPTER
*pContext
);
764 VOID
ParaNdis_Resume(
765 PARANDIS_ADAPTER
*pContext
);
767 VOID
ParaNdis_OnTransmitBufferReleased(
768 PARANDIS_ADAPTER
*pContext
,
769 IONetDescriptor
*pDesc
);
772 typedef VOID (*tOnAdditionalPhysicalMemoryAllocated
)(
773 PARANDIS_ADAPTER
*pContext
,
774 tCompletePhysicalAddress
*pAddresses
);
777 typedef struct _tagPhysicalAddressAllocationContext
779 tCompletePhysicalAddress address
;
780 PARANDIS_ADAPTER
*pContext
;
781 tOnAdditionalPhysicalMemoryAllocated Callback
;
782 } tPhysicalAddressAllocationContext
;
785 BOOLEAN
ParaNdis_InitialAllocatePhysicalMemory(
786 PARANDIS_ADAPTER
*pContext
,
787 tCompletePhysicalAddress
*pAddresses
);
789 VOID
ParaNdis_FreePhysicalMemory(
790 PARANDIS_ADAPTER
*pContext
,
791 tCompletePhysicalAddress
*pAddresses
);
793 BOOLEAN
ParaNdis_BindBufferToPacket(
794 PARANDIS_ADAPTER
*pContext
,
795 pIONetDescriptor pBufferDesc
);
797 void ParaNdis_UnbindBufferFromPacket(
798 PARANDIS_ADAPTER
*pContext
,
799 pIONetDescriptor pBufferDesc
);
801 void ParaNdis_IndicateConnect(
802 PARANDIS_ADAPTER
*pContext
,
806 void ParaNdis_RestoreDeviceConfigurationAfterReset(
807 PARANDIS_ADAPTER
*pContext
);
809 VOID
ParaNdis_UpdateDeviceFilters(
810 PARANDIS_ADAPTER
*pContext
);
812 VOID
ParaNdis_DeviceFiltersUpdateVlanId(
813 PARANDIS_ADAPTER
*pContext
);
815 VOID
ParaNdis_SetPowerState(
816 PARANDIS_ADAPTER
*pContext
,
817 NDIS_DEVICE_POWER_STATE newState
);
820 #endif //-OFFLOAD_UNIT_TEST
822 typedef enum _tagppResult
834 ppresXxpIncomplete
= 3,
839 typedef union _tagTcpIpPacketParsingResult
842 /* 0 - not tested, 1 - not IP, 2 - IPV4, 3 - IPV6 */
844 /* 0 - not tested, 1 - n/a, 2 - CS, 3 - bad */
845 ULONG ipCheckSum
: 2;
846 /* 0 - not tested, 1 - PCS, 2 - CS, 3 - bad */
847 ULONG xxpCheckSum
: 2;
848 /* 0 - not tested, 1 - other, 2 - known(contains basic TCP or UDP header), 3 - known incomplete */
850 /* 1 - contains complete payload */
854 ULONG fixedXxpCS
: 1;
855 ULONG IsFragment
: 1;
857 ULONG ipHeaderSize
: 8;
858 ULONG XxpIpHeaderSize
: 8;
861 }tTcpIpPacketParsingResult
;
863 typedef enum _tagPacketOffloadRequest
865 pcrIpChecksum
= (1 << 0),
866 pcrTcpV4Checksum
= (1 << 1),
867 pcrUdpV4Checksum
= (1 << 2),
868 pcrTcpV6Checksum
= (1 << 3),
869 pcrUdpV6Checksum
= (1 << 4),
870 pcrTcpChecksum
= (pcrTcpV4Checksum
| pcrTcpV6Checksum
),
871 pcrUdpChecksum
= (pcrUdpV4Checksum
| pcrUdpV6Checksum
),
872 pcrAnyChecksum
= (pcrIpChecksum
| pcrTcpV4Checksum
| pcrUdpV4Checksum
| pcrTcpV6Checksum
| pcrUdpV6Checksum
),
875 pcrFixIPChecksum
= (1 << 7),
876 pcrFixPHChecksum
= (1 << 8),
877 pcrFixTcpV4Checksum
= (1 << 9),
878 pcrFixUdpV4Checksum
= (1 << 10),
879 pcrFixTcpV6Checksum
= (1 << 11),
880 pcrFixUdpV6Checksum
= (1 << 12),
881 pcrFixXxpChecksum
= (pcrFixTcpV4Checksum
| pcrFixUdpV4Checksum
| pcrFixTcpV6Checksum
| pcrFixUdpV6Checksum
),
882 pcrPriorityTag
= (1 << 13),
883 pcrNoIndirect
= (1 << 14)
884 }tPacketOffloadRequest
;
887 tTcpIpPacketParsingResult
ParaNdis_CheckSumVerify(PVOID buffer
, ULONG size
, ULONG flags
, LPCSTR caller
);
888 tTcpIpPacketParsingResult
ParaNdis_ReviewIPPacket(PVOID buffer
, ULONG size
, LPCSTR caller
);
890 void ParaNdis_PadPacketReceived(PVOID pDataBuffer
, PULONG pLength
);