175 lines
5.1 KiB
C
175 lines
5.1 KiB
C
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
offload.h
|
|
|
|
Abstract:
|
|
Task offloading header file
|
|
|
|
Revision History:
|
|
Who When What
|
|
-------- -------- ----------------------------------------------
|
|
created
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
#if OFFLOAD
|
|
//
|
|
// Define the maximum size of large TCP packets the driver can offload.
|
|
// This sample driver uses shared memory to map the large packets,
|
|
// LARGE_SEND_OFFLOAD_SIZE is useless in this case, so we just define
|
|
// it as NIC_MAX_PACKET_SIZE. But shipping drivers should define
|
|
// LARGE_SEND_OFFLOAD_SIZE if they support LSO, and use it as
|
|
// MaximumPhysicalMapping when they call NdisMInitializeScatterGatherDma
|
|
// if they use ScatterGather method. If the drivers don't support
|
|
// LSO, then MaximumPhysicalMapping is NIC_MAX_PACKET_SIZE.
|
|
//
|
|
#define LARGE_SEND_OFFLOAD_SIZE NIC_MAX_PACKET_SIZE
|
|
//
|
|
// Definitions for header flags.
|
|
//
|
|
#define TCP_FLAG_FIN 0x00000100
|
|
#define TCP_FLAG_SYN 0x00000200
|
|
#define TCP_FLAG_RST 0x00000400
|
|
#define TCP_FLAG_PUSH 0x00000800
|
|
#define TCP_FLAG_ACK 0x00001000
|
|
#define TCP_FLAG_URG 0x00002000
|
|
|
|
//
|
|
// These are the maximum size of TCP and IP options
|
|
//
|
|
#define TCP_MAX_OPTION_SIZE 40
|
|
#define IP_MAX_OPTION_SIZE 40
|
|
|
|
//
|
|
// Structure of a TCP packet header.
|
|
//
|
|
struct TCPHeader {
|
|
USHORT tcp_src; // Source port.
|
|
USHORT tcp_dest; // Destination port.
|
|
int tcp_seq; // Sequence number.
|
|
int tcp_ack; // Ack number.
|
|
USHORT tcp_flags; // Flags and data offset.
|
|
USHORT tcp_window; // Window offered.
|
|
USHORT tcp_xsum; // Checksum.
|
|
USHORT tcp_urgent; // Urgent pointer.
|
|
};
|
|
|
|
typedef struct TCPHeader TCPHeader;
|
|
|
|
|
|
//
|
|
// IP Header format.
|
|
//
|
|
typedef struct IPHeader {
|
|
UCHAR iph_verlen; // Version and length.
|
|
UCHAR iph_tos; // Type of service.
|
|
USHORT iph_length; // Total length of datagram.
|
|
USHORT iph_id; // Identification.
|
|
USHORT iph_offset; // Flags and fragment offset.
|
|
UCHAR iph_ttl; // Time to live.
|
|
UCHAR iph_protocol; // Protocol.
|
|
USHORT iph_xsum; // Header checksum.
|
|
UINT iph_src; // Source address.
|
|
UINT iph_dest; // Destination address.
|
|
} IPHeader;
|
|
|
|
#define TCP_IP_MAX_HEADER_SIZE TCP_MAX_OPTION_SIZE+IP_MAX_OPTION_SIZE \
|
|
+sizeof(TCPHeader)+sizeof(IPHeader)
|
|
|
|
|
|
#define LARGE_SEND_MEM_SIZE_OPTION 3
|
|
//
|
|
// Try different size of shared memory to use
|
|
//
|
|
extern ULONG LargeSendSharedMemArray[];
|
|
|
|
//
|
|
// Compute the checksum
|
|
//
|
|
#define XSUM(_TmpXsum, _StartVa, _PacketLength, _Offset) \
|
|
{ \
|
|
PUSHORT WordPtr = (PUSHORT)((PUCHAR)_StartVa + _Offset); \
|
|
ULONG WordCount = (_PacketLength) >> 1; \
|
|
BOOLEAN fOddLen = (BOOLEAN)((_PacketLength) & 1); \
|
|
while (WordCount--) \
|
|
{ \
|
|
_TmpXsum += *WordPtr; \
|
|
WordPtr++; \
|
|
} \
|
|
if (fOddLen) \
|
|
{ \
|
|
_TmpXsum += (USHORT)*((PUCHAR)WordPtr); \
|
|
} \
|
|
_TmpXsum = (((_TmpXsum >> 16) | (_TmpXsum << 16)) + _TmpXsum) >> 16; \
|
|
}
|
|
|
|
|
|
//
|
|
// Function prototypes
|
|
//
|
|
VOID
|
|
e100DumpPkt(
|
|
PNDIS_PACKET Packet
|
|
);
|
|
|
|
VOID
|
|
CalculateChecksum(
|
|
PVOID StartVa,
|
|
ULONG PacketLength,
|
|
PNDIS_PACKET pPacket,
|
|
ULONG IpHdrOffset
|
|
);
|
|
|
|
VOID
|
|
CalculateTcpChecksum(
|
|
PVOID StartVa,
|
|
ULONG PacketLength,
|
|
ULONG IpHdrOffset
|
|
);
|
|
|
|
VOID
|
|
CalculateIpChecksum(
|
|
PUCHAR StartVa,
|
|
ULONG IpHdrOffset
|
|
);
|
|
|
|
VOID
|
|
CalculateUdpChecksum(
|
|
PNDIS_PACKET Packet,
|
|
ULONG IpHdrOffset
|
|
);
|
|
|
|
|
|
VOID
|
|
MPOffloadSendPackets(
|
|
IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN PPNDIS_PACKET PacketArray,
|
|
IN UINT NumberOfPackets
|
|
);
|
|
|
|
NDIS_STATUS
|
|
MpOffloadSendPacket(
|
|
IN PMP_ADAPTER Adapter,
|
|
IN PNDIS_PACKET Packet,
|
|
IN BOOLEAN bFromQueue
|
|
);
|
|
|
|
|
|
VOID
|
|
MP_OFFLOAD_FREE_SEND_PACKET(
|
|
IN PMP_ADAPTER Adapter,
|
|
IN PMP_TCB pMpTcb
|
|
);
|
|
|
|
VOID
|
|
DisableOffload(
|
|
IN PMP_ADAPTER Adapter
|
|
);
|
|
|
|
#endif // OFFLOAD
|