From 6f249378c9a6ec57a25295d0beaa0bdd5909306c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Oct 2009 19:23:53 +0000 Subject: [PATCH] - Don't add the media-specific header until right before transmission - Previously we would store the largest media-specific header size and add that value when creating a packet - Makes loopback packets smaller because they have no need for a media-specific header - Would fix packet corruption if interfaces with different media-specific headers were installed (if we supported that) - Makes adding support for other media types easier svn path=/trunk/; revision=43287 --- reactos/drivers/network/tcpip/datalink/lan.c | 50 +++++++++---------- reactos/drivers/network/tcpip/include/ip.h | 2 - reactos/lib/drivers/ip/network/arp.c | 14 +++--- reactos/lib/drivers/ip/network/icmp.c | 6 +-- reactos/lib/drivers/ip/network/ip.c | 11 ---- reactos/lib/drivers/ip/network/loopback.c | 2 +- reactos/lib/drivers/ip/network/neighbor.c | 2 +- reactos/lib/drivers/ip/network/routines.c | 3 +- reactos/lib/drivers/ip/network/transmit.c | 4 +- .../lib/drivers/ip/transport/rawip/rawip.c | 6 +-- reactos/lib/drivers/ip/transport/tcp/event.c | 5 +- reactos/lib/drivers/ip/transport/udp/udp.c | 2 +- 12 files changed, 45 insertions(+), 62 deletions(-) diff --git a/reactos/drivers/network/tcpip/datalink/lan.c b/reactos/drivers/network/tcpip/datalink/lan.c index d813ec8d293..fef1690dfa2 100644 --- a/reactos/drivers/network/tcpip/datalink/lan.c +++ b/reactos/drivers/network/tcpip/datalink/lan.c @@ -231,12 +231,7 @@ VOID NTAPI ProtocolSendComplete( * Status = Status of the operation */ { - TI_DbgPrint(DEBUG_DATALINK, ("Calling completion routine\n")); - ASSERT_KM_POINTER(Packet); - ASSERT_KM_POINTER(PC(Packet)); - ASSERT_KM_POINTER(PC(Packet)->DLComplete); - (*PC(Packet)->DLComplete)( PC(Packet)->Context, Packet, Status); - TI_DbgPrint(DEBUG_DATALINK, ("Finished\n")); + FreeNdisPacket(Packet); } VOID LanReceiveWorker( PVOID Context ) { @@ -418,7 +413,7 @@ NDIS_STATUS NTAPI ProtocolReceive( Adapter, Adapter->MTU)); NdisStatus = AllocatePacketWithBuffer( &NdisPacket, NULL, - PacketSize + HeaderBufferSize ); + PacketSize ); if( NdisStatus != NDIS_STATUS_SUCCESS ) { return NDIS_STATUS_NOT_ACCEPTED; } @@ -599,18 +594,18 @@ VOID LANTransmit( { NDIS_STATUS NdisStatus; PETH_HEADER EHeader; - PCHAR Data; - UINT Size; + PCHAR Data, OldData; + UINT Size, OldSize; PLAN_ADAPTER Adapter = (PLAN_ADAPTER)Context; KIRQL OldIrql; - UINT PacketLength; + PNDIS_PACKET XmitPacket; TI_DbgPrint(DEBUG_DATALINK, ("Called( NdisPacket %x, Offset %d, Adapter %x )\n", NdisPacket, Offset, Adapter)); if (Adapter->State != LAN_STATE_STARTED) { - ProtocolSendComplete(Context, NdisPacket, NDIS_STATUS_NOT_ACCEPTED); + (*PC(NdisPacket)->DLComplete)(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_NOT_ACCEPTED); return; } @@ -623,9 +618,19 @@ VOID LANTransmit( Adapter->HWAddress[4] & 0xff, Adapter->HWAddress[5] & 0xff)); - /* XXX arty -- Handled adjustment in a saner way than before ... - * not needed immediately */ - GetDataPtr( NdisPacket, 0, &Data, &Size ); + GetDataPtr( NdisPacket, 0, &OldData, &OldSize ); + + NdisStatus = AllocatePacketWithBuffer(&XmitPacket, NULL, OldSize + Adapter->HeaderSize); + if (NdisStatus != NDIS_STATUS_SUCCESS) { + (*PC(NdisPacket)->DLComplete)(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_RESOURCES); + return; + } + + GetDataPtr(XmitPacket, 0, &Data, &Size); + + RtlCopyMemory(Data + Adapter->HeaderSize, OldData, OldSize); + + (*PC(NdisPacket)->DLComplete)(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_SUCCESS); switch (Adapter->Media) { case NdisMedium802_3: @@ -652,14 +657,7 @@ VOID LANTransmit( EHeader->EType = ETYPE_IPv6; break; default: -#if DBG - /* Should not happen */ - TI_DbgPrint(MIN_TRACE, ("Unknown LAN protocol.\n")); - - ProtocolSendComplete((NDIS_HANDLE)Context, - NdisPacket, - NDIS_STATUS_FAILURE); -#endif + ASSERT(FALSE); return; } break; @@ -682,9 +680,7 @@ VOID LANTransmit( ((PCHAR)LinkAddress)[5] & 0xff)); } - NdisQueryPacketLength(NdisPacket, &PacketLength); - - if (Adapter->MTU < PacketLength) { + if (Adapter->MTU < Size) { /* This is NOT a pointer. MSDN explicitly says so. */ NDIS_PER_PACKET_INFO_FROM_PACKET(NdisPacket, TcpLargeSendPacketInfo) = (PVOID)((ULONG)Adapter->MTU); @@ -692,7 +688,7 @@ VOID LANTransmit( TcpipAcquireSpinLock( &Adapter->Lock, &OldIrql ); TI_DbgPrint(MID_TRACE, ("NdisSend\n")); - NdisSend(&NdisStatus, Adapter->NdisHandle, NdisPacket); + NdisSend(&NdisStatus, Adapter->NdisHandle, XmitPacket); TI_DbgPrint(MID_TRACE, ("NdisSend %s\n", NdisStatus == NDIS_STATUS_PENDING ? "Pending" : "Complete")); @@ -703,7 +699,7 @@ VOID LANTransmit( * status_pending is returned. Note that this is different from * the situation with IRPs. */ if (NdisStatus != NDIS_STATUS_PENDING) - ProtocolSendComplete((NDIS_HANDLE)Context, NdisPacket, NdisStatus); + ProtocolSendComplete((NDIS_HANDLE)Context, XmitPacket, NdisStatus); } static NTSTATUS diff --git a/reactos/drivers/network/tcpip/include/ip.h b/reactos/drivers/network/tcpip/include/ip.h index 52ed331da19..61f8e7a2414 100644 --- a/reactos/drivers/network/tcpip/include/ip.h +++ b/reactos/drivers/network/tcpip/include/ip.h @@ -208,8 +208,6 @@ extern LIST_ENTRY InterfaceListHead; extern KSPIN_LOCK InterfaceListLock; extern LIST_ENTRY NetTableListHead; extern KSPIN_LOCK NetTableListLock; -extern UINT MaxLLHeaderSize; -extern UINT MinLLFrameSize; extern BOOLEAN IpWorkItemQueued; PIP_PACKET IPCreatePacket( diff --git a/reactos/lib/drivers/ip/network/arp.c b/reactos/lib/drivers/ip/network/arp.c index 0a8a460617e..d8c2f177c8e 100644 --- a/reactos/lib/drivers/ip/network/arp.c +++ b/reactos/lib/drivers/ip/network/arp.c @@ -11,6 +11,7 @@ #include "precomp.h" PNDIS_PACKET PrepareARPPacket( + PIP_INTERFACE IF, USHORT HardwareType, USHORT ProtocolType, UCHAR LinkAddressLength, @@ -45,11 +46,10 @@ PNDIS_PACKET PrepareARPPacket( TI_DbgPrint(DEBUG_ARP, ("Called.\n")); /* Prepare ARP packet */ - Size = MaxLLHeaderSize + - sizeof(ARP_HEADER) + + Size = sizeof(ARP_HEADER) + 2 * LinkAddressLength + /* Hardware address length */ 2 * ProtoAddressLength; /* Protocol address length */ - Size = MAX(Size, MinLLFrameSize); + Size = MAX(Size, IF->MinFrameSize - IF->HeaderSize); NdisStatus = AllocatePacketWithBuffer( &NdisPacket, NULL, Size ); if( !NT_SUCCESS(NdisStatus) ) return NULL; @@ -58,7 +58,7 @@ PNDIS_PACKET PrepareARPPacket( ASSERT(DataBuffer); RtlZeroMemory(DataBuffer, Size); - Header = (PARP_HEADER)((ULONG_PTR)DataBuffer + MaxLLHeaderSize); + Header = (PARP_HEADER)((ULONG_PTR)DataBuffer); Header->HWType = HardwareType; Header->ProtoType = ProtocolType; Header->HWAddrLen = LinkAddressLength; @@ -145,6 +145,7 @@ BOOLEAN ARPTransmit(PIP_ADDRESS Address, PIP_INTERFACE Interface) } NdisPacket = PrepareARPPacket( + Interface, WN2H(0x0001), /* FIXME: Ethernet only */ ProtoType, /* Protocol type */ (UCHAR)Interface->AddressLength, /* Hardware address length */ @@ -164,7 +165,7 @@ BOOLEAN ARPTransmit(PIP_ADDRESS Address, PIP_INTERFACE Interface) TI_DbgPrint(DEBUG_ARP,("Sending ARP Packet\n")); (*Interface->Transmit)(Interface->Context, NdisPacket, - MaxLLHeaderSize, NULL, LAN_PROTO_ARP); + 0, NULL, LAN_PROTO_ARP); return TRUE; } @@ -230,6 +231,7 @@ VOID ARPReceive( /* This is a request for our address. Swap the addresses and send an ARP reply back to the sender */ NdisPacket = PrepareARPPacket( + Interface, Header->HWType, /* Hardware type */ Header->ProtoType, /* Protocol type */ (UCHAR)Interface->AddressLength, /* Hardware address length */ @@ -243,7 +245,7 @@ VOID ARPReceive( PC(NdisPacket)->DLComplete = ARPTransmitComplete; (*Interface->Transmit)(Interface->Context, NdisPacket, - MaxLLHeaderSize, + 0, SenderHWAddress, LAN_PROTO_ARP); } diff --git a/reactos/lib/drivers/ip/network/icmp.c b/reactos/lib/drivers/ip/network/icmp.c index ae022b8800b..6802230ee0c 100644 --- a/reactos/lib/drivers/ip/network/icmp.c +++ b/reactos/lib/drivers/ip/network/icmp.c @@ -75,7 +75,7 @@ BOOLEAN PrepareICMPPacket( /* No special flags */ IPPacket->Flags = 0; - Size = MaxLLHeaderSize + sizeof(IPv4_HEADER) + DataSize; + Size = sizeof(IPv4_HEADER) + DataSize; /* Allocate NDIS packet */ NdisStatus = AllocatePacketWithBuffer( &NdisPacket, NULL, Size ); @@ -84,14 +84,14 @@ BOOLEAN PrepareICMPPacket( IPPacket->NdisPacket = NdisPacket; - GetDataPtr( IPPacket->NdisPacket, MaxLLHeaderSize, + GetDataPtr( IPPacket->NdisPacket, 0, (PCHAR *)&IPPacket->Header, &IPPacket->ContigSize ); TI_DbgPrint(DEBUG_ICMP, ("Size (%d). Data at (0x%X).\n", Size, Data)); TI_DbgPrint(DEBUG_ICMP, ("NdisPacket at (0x%X).\n", NdisPacket)); IPPacket->HeaderSize = sizeof(IPv4_HEADER); - IPPacket->TotalSize = Size - MaxLLHeaderSize; + IPPacket->TotalSize = Size; IPPacket->Data = ((PCHAR)IPPacket->Header) + IPPacket->HeaderSize; TI_DbgPrint(DEBUG_ICMP, ("Copying Address: %x -> %x\n", diff --git a/reactos/lib/drivers/ip/network/ip.c b/reactos/lib/drivers/ip/network/ip.c index fa9511a617d..a47d2ff28d2 100644 --- a/reactos/lib/drivers/ip/network/ip.c +++ b/reactos/lib/drivers/ip/network/ip.c @@ -15,8 +15,6 @@ LIST_ENTRY InterfaceListHead; KSPIN_LOCK InterfaceListLock; LIST_ENTRY NetTableListHead; KSPIN_LOCK NetTableListLock; -UINT MaxLLHeaderSize; /* Largest maximum header size */ -UINT MinLLFrameSize; /* Largest minimum frame size */ BOOLEAN IPInitialized = FALSE; BOOLEAN IpWorkItemQueued = FALSE; /* Work around calling timer at Dpc level */ @@ -153,13 +151,7 @@ PIP_INTERFACE IPCreateInterface( IF->Free = FreeIF; IF->Context = BindInfo->Context; IF->HeaderSize = BindInfo->HeaderSize; - if (IF->HeaderSize > MaxLLHeaderSize) - MaxLLHeaderSize = IF->HeaderSize; - IF->MinFrameSize = BindInfo->MinFrameSize; - if (IF->MinFrameSize > MinLLFrameSize) - MinLLFrameSize = IF->MinFrameSize; - IF->MTU = BindInfo->MTU; IF->Address = BindInfo->Address; IF->AddressLength = BindInfo->AddressLength; @@ -361,9 +353,6 @@ NTSTATUS IPStartup(PUNICODE_STRING RegistryPath) TI_DbgPrint(MAX_TRACE, ("Called.\n")); - MaxLLHeaderSize = 0; - MinLLFrameSize = 0; - /* Initialize lookaside lists */ ExInitializeNPagedLookasideList( &IPDRList, /* Lookaside list */ diff --git a/reactos/lib/drivers/ip/network/loopback.c b/reactos/lib/drivers/ip/network/loopback.c index 79468c0d93e..7b90ea6d2c4 100644 --- a/reactos/lib/drivers/ip/network/loopback.c +++ b/reactos/lib/drivers/ip/network/loopback.c @@ -41,7 +41,7 @@ VOID LoopTransmit( TI_DbgPrint(MAX_TRACE, ("Called (NdisPacket = %x)\n", NdisPacket)); - GetDataPtr( NdisPacket, MaxLLHeaderSize, &PacketBuffer, &PacketLength ); + GetDataPtr( NdisPacket, 0, &PacketBuffer, &PacketLength ); NdisStatus = AllocatePacketWithBuffer ( &XmitPacket, PacketBuffer, PacketLength ); diff --git a/reactos/lib/drivers/ip/network/neighbor.c b/reactos/lib/drivers/ip/network/neighbor.c index ff4e4c79284..295ac908cfd 100644 --- a/reactos/lib/drivers/ip/network/neighbor.c +++ b/reactos/lib/drivers/ip/network/neighbor.c @@ -55,7 +55,7 @@ VOID NBSendPackets( PNEIGHBOR_CACHE_ENTRY NCE ) { NCE->Interface->Transmit ( NCE->Interface->Context, Packet->Packet, - MaxLLHeaderSize, + 0, NCE->LinkAddress, LAN_PROTO_IPv4 ); } diff --git a/reactos/lib/drivers/ip/network/routines.c b/reactos/lib/drivers/ip/network/routines.c index 7688bff3f86..c421695e220 100644 --- a/reactos/lib/drivers/ip/network/routines.c +++ b/reactos/lib/drivers/ip/network/routines.c @@ -115,10 +115,9 @@ VOID DisplayTCPPacket( if (IPPacket->NdisPacket) { NdisQueryPacket(IPPacket->NdisPacket, NULL, NULL, NULL, &Length); - Length -= MaxLLHeaderSize; Buffer = exAllocatePool(NonPagedPool, Length); if (Buffer) { - Length = CopyPacketToBuffer(Buffer, IPPacket->NdisPacket, MaxLLHeaderSize, Length); + Length = CopyPacketToBuffer(Buffer, IPPacket->NdisPacket, 0, Length); DisplayTCPHeader(Buffer, Length); exFreePool(Buffer); } diff --git a/reactos/lib/drivers/ip/network/transmit.c b/reactos/lib/drivers/ip/network/transmit.c index 8372762079a..554f5778cbf 100644 --- a/reactos/lib/drivers/ip/network/transmit.c +++ b/reactos/lib/drivers/ip/network/transmit.c @@ -166,7 +166,7 @@ NTSTATUS SendFragments( PIPFRAGMENT_CONTEXT IFC; NDIS_STATUS NdisStatus; PVOID Data; - UINT BufferSize = MaxLLHeaderSize + PathMTU, InSize; + UINT BufferSize = PathMTU, InSize; PCHAR InData; TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X) NCE (0x%X) PathMTU (%d).\n", @@ -193,7 +193,7 @@ NTSTATUS SendFragments( GetDataPtr( IFC->NdisPacket, 0, (PCHAR *)&Data, &InSize ); - IFC->Header = ((PCHAR)Data) + MaxLLHeaderSize; + IFC->Header = ((PCHAR)Data); IFC->Datagram = IPPacket->NdisPacket; IFC->DatagramData = ((PCHAR)IPPacket->Header) + IPPacket->HeaderSize; IFC->HeaderSize = IPPacket->HeaderSize; diff --git a/reactos/lib/drivers/ip/transport/rawip/rawip.c b/reactos/lib/drivers/ip/transport/rawip/rawip.c index 8e5cc3fff83..53c9403f982 100644 --- a/reactos/lib/drivers/ip/transport/rawip/rawip.c +++ b/reactos/lib/drivers/ip/transport/rawip/rawip.c @@ -37,10 +37,10 @@ NTSTATUS AddGenericHeaderIPv4( TI_DbgPrint(MID_TRACE, ("Packet: %x NdisPacket %x\n", IPPacket, IPPacket->NdisPacket)); - BufferSize = MaxLLHeaderSize + sizeof(IPv4_HEADER) + ExtraLength; + BufferSize = sizeof(IPv4_HEADER) + ExtraLength; GetDataPtr( IPPacket->NdisPacket, - MaxLLHeaderSize, + 0, (PCHAR *)&IPPacket->Header, &IPPacket->ContigSize ); @@ -113,7 +113,7 @@ NTSTATUS BuildRawIpPacket( /* Prepare packet */ Status = AllocatePacketWithBuffer( &Packet->NdisPacket, NULL, - Packet->TotalSize + MaxLLHeaderSize ); + Packet->TotalSize ); if( !NT_SUCCESS(Status) ) return Status; diff --git a/reactos/lib/drivers/ip/transport/tcp/event.c b/reactos/lib/drivers/ip/transport/tcp/event.c index 50eb7453d30..81cdbbb0ffd 100644 --- a/reactos/lib/drivers/ip/transport/tcp/event.c +++ b/reactos/lib/drivers/ip/transport/tcp/event.c @@ -86,15 +86,14 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { return OSK_EADDRNOTAVAIL; } - NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL, - MaxLLHeaderSize + len ); + NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL, len ); if (NdisStatus != NDIS_STATUS_SUCCESS) { TI_DbgPrint(DEBUG_TCP, ("Error from NDIS: %08x\n", NdisStatus)); return OSK_ENOBUFS; } - GetDataPtr( Packet.NdisPacket, MaxLLHeaderSize, + GetDataPtr( Packet.NdisPacket, 0, (PCHAR *)&Packet.Header, &Packet.ContigSize ); RtlCopyMemory( Packet.Header, data, len ); diff --git a/reactos/lib/drivers/ip/transport/udp/udp.c b/reactos/lib/drivers/ip/transport/udp/udp.c index a723eeaf1dc..1f8bdf6d1f4 100644 --- a/reactos/lib/drivers/ip/transport/udp/udp.c +++ b/reactos/lib/drivers/ip/transport/udp/udp.c @@ -94,7 +94,7 @@ NTSTATUS BuildUDPPacket( /* Prepare packet */ Status = AllocatePacketWithBuffer( &Packet->NdisPacket, NULL, - Packet->TotalSize + MaxLLHeaderSize ); + Packet->TotalSize ); if( !NT_SUCCESS(Status) ) return Status;