windows-nt/Source/XPSP1/NT/net/qos/psched/sys/timestmp.h
2020-09-26 16:20:57 +08:00

208 lines
10 KiB
C

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// EXTERNAL (SHARED) DEFINITIONS //
// //
// ( Any user mode app which wants to use this functionality should copy this section of the header file) //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WildCard definitions for Ip Address, Port and Protocol //
#define UL_ANY 0xffffffff
#define US_ANY 0xffff
// Definitions for Direction (Send/Recv) //
#define DIR_SEND 1
#define DIR_RECV 2
// Common InBuf structure: This is same for either type of request //
// For wildcarding, use UL_ANY for ULONGs and US_ANY for USHORTs //
// //
// This will be layed out in the buffer in this fashion: //
// +---------------------------------------------+ //
// 0x00 | SrcIp (4) | SrcPort(2) Padding(2) | //
// +---------------------------------------------+ //
// 0x08 | DstIp (4) | DstPort(2) Padding(2) | //
// +---------------------------------------------+ //
// 0x10 | Proto(2)| Dir'n(2) | //
// +---------+----------+ //
typedef struct _TIMESTMP_REQ
{
ULONG SrcIp;
USHORT SrcPort;
ULONG DstIp;
USHORT DstPort;
USHORT Proto;
USHORT Direction;
} TIMESTMP_REQ, *PTIMESTMP_REQ;
// 1. MARK_IN_BUF_RECORD: THIS WILL MARK THE TIMESTAMPS IN A BUFFER WITH IP-ID'S AND PACKET-SIZES //
// //
// This will be laid out in the buffer in this fashion: //
// +---------------------------------------------+ //
// 0x00 |IpId(2) Size(2) | Padding(4) | //
// +---------------------------------------------+ //
// 0x08 | TimeValue (8) | //
// +---------------------------------------------+ //
#define IOCTL_TIMESTMP_REGISTER_IN_BUF CTL_CODE( FILE_DEVICE_NETWORK, 23, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_TIMESTMP_DEREGISTER_IN_BUF CTL_CODE( FILE_DEVICE_NETWORK, 24, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_TIMESTMP_FINISH_BUFFERING CTL_CODE( FILE_DEVICE_NETWORK, 25, METHOD_BUFFERED, FILE_WRITE_ACCESS)
typedef struct _MARK_IN_BUF_RECORD
{
USHORT IpId;
USHORT Size;
UINT64 TimeValue;
} MARK_IN_BUF_RECORD, *PMARK_IN_BUF_RECORD;
// This is the MINIMUM size of the buffer that should be passed in with every request to copy //
// timestamps colleced in the drivers internal buffer. Application should call this frequently //
// to prevent driver buffer re-use //
#define PACKET_STORE_SIZE (sizeof(MARK_IN_BUF_RECORD)*5000)
// 2. MARK_IN_PKT_RECORD: THIS WILL MARK THE TIMESTAMPS IN THE PACKET ITSELF //
// //
// This will be laid out in the packet in this fashion: //
// +---------------------------------------------+ //
// 0x00 | Time Sent - App (8) | //
// +---------------------------------------------+ //
// 0x08 | Time Rcvd - App (8) | //
// +---------------------------------------------+ //
// 0x10 | Time Sent - OS (8) | //
// +---------------------------------------------+ //
// 0x18 | Time Rcvd - OS (8) | //
// +---------------------------------------------+ //
// 0x20 | Latency - App (8) | //
// +---------------------------------------------+ //
// 0x28 | BufferSize - App(4) | Seq No - App (4) | //
// +---------------------------------------------+ //
// //
#define IOCTL_TIMESTMP_REGISTER_IN_PKT CTL_CODE( FILE_DEVICE_NETWORK, 21, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_TIMESTMP_DEREGISTER_IN_PKT CTL_CODE( FILE_DEVICE_NETWORK, 22, METHOD_BUFFERED, FILE_WRITE_ACCESS)
typedef struct _MARK_IN_PKT_RECORD
{
UINT64 TimeSent;
UINT64 TimeReceived;
UINT64 TimeSentWire;
UINT64 TimeReceivedWire;
UINT64 Latency;
INT BufferSize;
INT SequenceNumber;
} MARK_IN_PKT_RECORD, *PMARK_IN_PKT_RECORD;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// INTERNAL TIMESTMP DEFINITIONS //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define IOCTL_PSCHED_ZAW_EVENT CTL_CODE( FILE_DEVICE_NETWORK, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define MARK_NONE 0
#define MARK_IN_PKT 1
#define MARK_IN_BUF 2
typedef struct _TS_ENTRY {
LIST_ENTRY Linkage;
ULONG SrcIp;
USHORT SrcPort;
ULONG DstIp;
USHORT DstPort;
USHORT Proto;
USHORT Type;
USHORT Direction;
PFILE_OBJECT FileObject;
PMARK_IN_BUF_RECORD pPacketStore;
PMARK_IN_BUF_RECORD pPacketStoreHead;
} TS_ENTRY, *PTS_ENTRY;
extern LIST_ENTRY TsList;
extern NDIS_SPIN_LOCK TsSpinLock;
extern ULONG TsCount;
VOID
InitializeTimeStmp( PPSI_INFO Info );
BOOL
AddRequest( PFILE_OBJECT FileObject,
ULONG SrcIp,
USHORT SrcPort,
ULONG DstIp,
USHORT DstPort,
USHORT Proto,
USHORT Type,
USHORT Direction);
void
RemoveRequest( PFILE_OBJECT FileObject,
ULONG SrcIp,
USHORT SrcPort,
ULONG DstIp,
USHORT DstPort,
USHORT Proto);
int
CopyTimeStmps( PFILE_OBJECT FileObject, PVOID buf, ULONG Len);
VOID
UnloadTimeStmp();
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// COPIED TRANSPORT DEFINITIONS
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define IP_MF_FLAG 0x0020
#define IP_VERSION 0x40
#define IP_VER_FLAG 0xF0
#define TCP_OFFSET_MASK 0xf0
#define TCP_HDR_SIZE(t) (uint)(((*(uchar *)&(t)->tcp_flags) & TCP_OFFSET_MASK) >> 2)
#define IP_OFFSET_MASK ~0x00E0
#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || ((defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
#define net_short(_x) _byteswap_ushort((USHORT)(_x))
#else
#define net_short(x) ((((x)&0xff) << 8) | (((x)&0xff00) >> 8))
#endif
typedef int SeqNum; // A sequence number.
struct TCPHeader {
ushort tcp_src; // Source port.
ushort tcp_dest; // Destination port.
SeqNum tcp_seq; // Sequence number.
SeqNum 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;
struct UDPHeader {
ushort uh_src; // Source port.
ushort uh_dest; // Destination port.
ushort uh_length; // Length
ushort uh_xsum; // Checksum.
}; /* UDPHeader */
typedef struct UDPHeader UDPHeader;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////