windows-nt/Source/XPSP1/NT/drivers/net/ms/e100bex/offload.h
2020-09-26 16:20:57 +08:00

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