/* * @implemented */ USHORT WSAAPI htons(IN USHORT hostshort) { return WH2N(hostshort); }
BOOLEAN PrepareICMPPacket( PADDRESS_FILE AddrFile, PIP_INTERFACE Interface, PIP_PACKET IPPacket, PIP_ADDRESS Destination, PCHAR Data, UINT DataSize) /* * FUNCTION: Prepares an ICMP packet * ARGUMENTS: * NTE = Pointer to net table entry to use * Destination = Pointer to destination address * DataSize = Size of dataarea * RETURNS: * Pointer to IP packet, NULL if there is not enough free resources */ { PNDIS_PACKET NdisPacket; NDIS_STATUS NdisStatus; PIPv4_HEADER IPHeader; ULONG Size; TI_DbgPrint(DEBUG_ICMP, ("Called. DataSize (%d).\n", DataSize)); IPInitializePacket(IPPacket, IP_ADDRESS_V4); /* No special flags */ IPPacket->Flags = 0; Size = sizeof(IPv4_HEADER) + DataSize; /* Allocate NDIS packet */ NdisStatus = AllocatePacketWithBuffer( &NdisPacket, NULL, Size ); if( !NT_SUCCESS(NdisStatus) ) return FALSE; IPPacket->NdisPacket = NdisPacket; IPPacket->MappedHeader = TRUE; GetDataPtr( IPPacket->NdisPacket, 0, (PCHAR *)&IPPacket->Header, &IPPacket->TotalSize ); ASSERT(IPPacket->TotalSize == Size); 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->Data = ((PCHAR)IPPacket->Header) + IPPacket->HeaderSize; TI_DbgPrint(DEBUG_ICMP, ("Copying Address: %x -> %x\n", &IPPacket->DstAddr, Destination)); RtlCopyMemory(&IPPacket->DstAddr, Destination, sizeof(IP_ADDRESS)); RtlCopyMemory(IPPacket->Data, Data, DataSize); /* Build IPv4 header. FIXME: IPv4 only */ IPHeader = (PIPv4_HEADER)IPPacket->Header; /* Version = 4, Length = 5 DWORDs */ IPHeader->VerIHL = 0x45; /* Normal Type-of-Service */ IPHeader->Tos = 0; /* Length of data and header */ IPHeader->TotalLength = WH2N((USHORT)DataSize + sizeof(IPv4_HEADER)); /* Identification */ IPHeader->Id = (USHORT)Random(); /* One fragment at offset 0 */ IPHeader->FlagsFragOfs = 0; /* Set TTL */ if (AddrFile) IPHeader->Ttl = AddrFile->TTL; else IPHeader->Ttl = 128; /* Internet Control Message Protocol */ IPHeader->Protocol = IPPROTO_ICMP; /* Checksum is 0 (for later calculation of this) */ IPHeader->Checksum = 0; /* Source address */ IPHeader->SrcAddr = Interface->Unicast.Address.IPv4Address; /* Destination address */ IPHeader->DstAddr = Destination->Address.IPv4Address; TI_DbgPrint(MID_TRACE,("Leaving\n")); return TRUE; }
unsigned short L2PNet_htons( unsigned short hostshort ) { return WH2N(hostshort); }
BOOLEAN PrepareNextFragment( PIPFRAGMENT_CONTEXT IFC) /* * FUNCTION: Prepares the next fragment of an IP datagram for transmission * ARGUMENTS: * IFC = Pointer to IP fragment context * RETURNS: * TRUE if a fragment was prepared for transmission, FALSE if * there are no more fragments to send */ { UINT MaxData; UINT DataSize; PIPv4_HEADER Header; BOOLEAN MoreFragments; USHORT FragOfs; TI_DbgPrint(MAX_TRACE, ("Called. IFC (0x%X)\n", IFC)); if (IFC->BytesLeft > 0) { TI_DbgPrint(MAX_TRACE, ("Preparing 1 fragment.\n")); MaxData = IFC->PathMTU - IFC->HeaderSize; /* Make fragment a multiplum of 64bit */ MaxData -= MaxData % 8; if (IFC->BytesLeft > MaxData) { DataSize = MaxData; MoreFragments = TRUE; } else { DataSize = IFC->BytesLeft; MoreFragments = FALSE; } TI_DbgPrint(MID_TRACE,("Copying data from %x to %x (%d)\n", IFC->DatagramData, IFC->Data, DataSize)); RtlCopyMemory(IFC->Data, IFC->DatagramData, DataSize); // SAFE /* Fragment offset is in 8 byte blocks */ FragOfs = (USHORT)(IFC->Position / 8); if (MoreFragments) FragOfs |= IPv4_MF_MASK; else FragOfs &= ~IPv4_MF_MASK; Header = IFC->Header; Header->FlagsFragOfs = WH2N(FragOfs); Header->TotalLength = WH2N((USHORT)(DataSize + IFC->HeaderSize)); /* FIXME: Handle options */ /* Calculate checksum of IP header */ Header->Checksum = 0; Header->Checksum = (USHORT)IPv4Checksum(Header, IFC->HeaderSize, 0); TI_DbgPrint(MID_TRACE,("IP Check: %x\n", Header->Checksum)); /* Update pointers */ IFC->DatagramData = (PVOID)((ULONG_PTR)IFC->DatagramData + DataSize); IFC->Position += DataSize; IFC->BytesLeft -= DataSize; return TRUE; } else { TI_DbgPrint(MAX_TRACE, ("No more fragments.\n")); return FALSE; } }