HKR, Ndi\params\LROIPv6\enum, "0", 0, %Disabled%
HKR, Ndi\params\LROIPv6\enum, "1", 0, %Enabled%
-HKR, Ndi\params\*HeaderDataSplit, ParamDesc, 0, %HeaderDataSplit%
-HKR, Ndi\params\*HeaderDataSplit, Type, 0, "enum"
-HKR, Ndi\params\*HeaderDataSplit, Default, 0, "0"
-HKR, Ndi\params\*HeaderDataSplit, Optional, 0, "0"
-HKR, Ndi\params\*HeaderDataSplit\enum, "0", 0, %Disabled%
-HKR, Ndi\params\*HeaderDataSplit\enum, "1", 0, %Enabled%
-
[XenNet_Inst.Services]
AddService=xennet,0x02,XenNet_Service,XenNet_EventLog
int lsov6;
int lrov4;
int lrov6;
- ULONG HeaderDataSplit;
} PROPERTIES, *PPROPERTIES;
struct _XENNET_ADAPTER {
OID_PNP_CAPABILITIES,
OID_PNP_QUERY_POWER,
OID_PNP_SET_POWER,
- OID_GEN_HD_SPLIT_PARAMETERS,
};
#define ADAPTER_POOL_TAG 'AteN'
TxOptions->OffloadIpVersion6UdpChecksum = 1;
RxOptions = ReceiverOffloadOptions(Adapter->Receiver);
+
RxOptions->Value = 0;
RxOptions->OffloadTagManipulation = 1;
#undef TX_ENABLED
#undef CHANGE
-static NDIS_STATUS
-AdapterGetHeaderDataSplitParameters(
- IN PXENNET_ADAPTER Adapter,
- IN PNDIS_HD_SPLIT_PARAMETERS Split
- )
-{
- if (Split->HDSplitCombineFlags == NDIS_HD_SPLIT_COMBINE_ALL_HEADERS)
- ReceiverSplitHeaderData(Adapter->Receiver, 0);
-
- return NDIS_STATUS_SUCCESS;
-}
-
static NDIS_STATUS
AdapterQueryGeneralStatistics(
IN PXENNET_ADAPTER Adapter,
}
break;
- case OID_GEN_HD_SPLIT_PARAMETERS:
- BytesNeeded = sizeof(NDIS_HD_SPLIT_PARAMETERS);
- if (BufferLength >= BytesNeeded) {
- ndisStatus = AdapterGetHeaderDataSplitParameters(Adapter,
- (PNDIS_HD_SPLIT_PARAMETERS)Buffer);
- if (ndisStatus == NDIS_STATUS_SUCCESS)
- BytesRead = sizeof(NDIS_HD_SPLIT_PARAMETERS);
- }
- break;
-
case OID_GEN_INTERRUPT_MODERATION:
case OID_GEN_MACHINE_NAME:
Warn = FALSE;
READ_PROPERTY(Adapter->Properties.lrov4, L"LROIPv4", 1, Handle);
READ_PROPERTY(Adapter->Properties.lrov6, L"LROIPv6", 1, Handle);
READ_PROPERTY(Adapter->Properties.need_csum_value, L"NeedChecksumValue", 1, Handle);
- READ_PROPERTY(Adapter->Properties.HeaderDataSplit, L"*HeaderDataSplit", 1, Handle);
NdisCloseConfiguration(Handle);
return ndisStatus;
}
-static NDIS_STATUS
-AdapterSetHeaderDataSplitAttributes(
- IN PXENNET_ADAPTER Adapter
- )
-{
- NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES Attribs;
- NDIS_HD_SPLIT_ATTRIBUTES Split;
- NDIS_STATUS NdisStatus;
-
- RtlZeroMemory(&Attribs, sizeof(Attribs));
-
- Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES;
- Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
- Attribs.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
-
- RtlZeroMemory(&Split, sizeof(Split));
-
- Split.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;
- Split.Header.Revision = NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1;
- Split.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;
- Split.HardwareCapabilities =
- NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT |
- NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |
- NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |
- NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;
-
- if (Adapter->Properties.HeaderDataSplit != 0)
- Split.CurrentCapabilities = Split.HardwareCapabilities;
-
- Attribs.HDSplitAttributes = &Split;
-
- NdisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
- (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
- if (NdisStatus != NDIS_STATUS_SUCCESS)
- goto fail1;
-
- if (Split.HDSplitFlags == NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {
- ASSERT(Split.CurrentCapabilities & NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT);
-
- Info("BackfillSize = %u\n", Split.BackfillSize);
- Info("MaxHeaderSize = %u\n", Split.MaxHeaderSize);
-
- XENVIF_VIF(ReceiverSetBackfillSize,
- &Adapter->VifInterface,
- Split.BackfillSize);
-
- ReceiverSplitHeaderData(Adapter->Receiver, Split.MaxHeaderSize);
- }
-
- return NDIS_STATUS_SUCCESS;
-
-fail1:
- Error("fail1 (%08x)\n", NdisStatus);
-
- return NdisStatus;
-}
-
NDIS_STATUS
AdapterInitialize(
IN NDIS_HANDLE Handle,
if (ndisStatus != NDIS_STATUS_SUCCESS)
goto fail11;
- ndisStatus = AdapterSetHeaderDataSplitAttributes(*Adapter);
- if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail12;
-
RtlZeroMemory(&Dma, sizeof(NDIS_SG_DMA_DESCRIPTION));
Dma.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;
Dma.Header.Revision = NDIS_SG_DMA_DESCRIPTION_REVISION_1;
return NDIS_STATUS_SUCCESS;
-fail12:
fail11:
fail10:
fail9:
LONG InNDIS;
LONG InNDISMax;
XENVIF_VIF_OFFLOAD_OPTIONS OffloadOptions;
- ULONG MaxHeaderSize;
};
#define RECEIVER_POOL_TAG 'RteN'
)
{
PNET_BUFFER_LIST NetBufferList;
- PNET_BUFFER NetBuffer;
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
UNREFERENCED_PARAMETER(MaximumSegmentSize);
+ UNREFERENCED_PARAMETER(Info);
NetBufferList = __ReceiverAllocateNetBufferList(Receiver,
Mdl,
if (NetBufferList == NULL)
goto fail1;
- NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
-
NetBufferList->SourceHandle = AdapterGetHandle(Receiver->Adapter);
csumInfo.Value = 0;
NET_BUFFER_LIST_INFO(NetBufferList, Ieee8021QNetBufferListInfo) = Ieee8021QInfo.Value;
}
- if (Info->IpHeader.Offset != 0) {
- ULONG NblFlags;
- PUCHAR InfoVa;
- PIP_HEADER IpHeader;
- NDIS_PHYSICAL_ADDRESS DataPhysicalAddress;
-
- NblFlags = NET_BUFFER_LIST_NBL_FLAGS(NetBufferList);
-
- InfoVa = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
- ASSERT(InfoVa != NULL);
- InfoVa += Offset;
-
- IpHeader = (PIP_HEADER)(InfoVa + Info->IpHeader.Offset);
-
- if (IpHeader->Version == 4) {
- NblFlags |= NDIS_NBL_FLAGS_IS_IPV4;
- } else {
- ASSERT3U(IpHeader->Version, ==, 6);
- NblFlags |= NDIS_NBL_FLAGS_IS_IPV6;
- }
-
- if (Info->TcpHeader.Offset != 0)
- NblFlags |= NDIS_NBL_FLAGS_IS_TCP;
- else if (Info->UdpHeader.Offset != 0)
- NblFlags |= NDIS_NBL_FLAGS_IS_UDP;
-
- if (Mdl->Next != NULL && Info->Length < Receiver->MaxHeaderSize) {
- NblFlags |= NDIS_NBL_FLAGS_HD_SPLIT;
- if (NblFlags & (NDIS_NBL_FLAGS_IS_TCP | NDIS_NBL_FLAGS_IS_UDP))
- NblFlags |= NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD;
- else
- NblFlags |= NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER;
-
- DataPhysicalAddress.QuadPart = (ULONGLONG)MmGetMdlPfnArray(Mdl->Next)[0] << PAGE_SHIFT;
- DataPhysicalAddress.QuadPart += Mdl->Next->ByteOffset;
-
- NET_BUFFER_DATA_PHYSICAL_ADDRESS(NetBuffer) = DataPhysicalAddress;
- }
-
- NET_BUFFER_LIST_NBL_FLAGS(NetBufferList) = NblFlags;
- }
-
return NetBufferList;
fail2:
{
return &Receiver->OffloadOptions;
}
-
-VOID
-ReceiverSplitHeaderData(
- IN PXENNET_RECEIVER Receiver,
- IN ULONG MaxHeaderSize
- )
-{
- Receiver->MaxHeaderSize = MaxHeaderSize;
-}