|
|
/*---------------------------------------------------------------------------
* File : RRCMDATA.H * * RRCM data structures information. * * INTEL Corporation Proprietary Information * This listing is supplied under the terms of a license agreement with * Intel Corporation and may not be copied nor disclosed except in * accordance with the terms of that agreement. * Copyright (c) 1995 Intel Corporation. *--------------------------------------------------------------------------*/
#ifndef __RRCMDATA_H_
#define __RRCMDATA_H_
// force 8 byte structure packing
#include <pshpack8.h>
#define MAX_DWORD 4294967295
#define HASH_MODULO 255
#define FILENAME_LENGTH 128
#define RTCP_FEEDBACK_LIST 0
// RTP/RTCP collision data
typedef struct _rtp_collision { char collideAddr[MAX_ADDR_LEN]; int addrLen; DWORD dwCollideTime; DWORD dwCurRecvRTCPrptNumber; DWORD SSRC; } RTP_COLLISION, *PRTP_COLLISION;
// RTCP Session Information data structure
typedef struct _RTCP_SESSION { LINK_LIST RTCPList; // Next/prev RTCP session ptrs
// Synchronization elements
CRITICAL_SECTION critSect; // Critical section
HANDLE hExitEvent; // Exit RTCP event handle
#ifdef ENABLE_ISDM2
// ISDM2 Handle
KEY_HANDLE hSessKey; // Key to this sessions ISDM info
#endif
// List of SSRC(s) on the transmit list, i.e., our own transmit SSRC's
// and list of SSRC(s) received
HEAD_TAIL RcvSSRCList; // Rcv SSRC list head/tail ptrs
HEAD_TAIL XmtSSRCList; // Xmt SSRC list head/tail ptrs
// List of Rcv/Xmt data structure. The data resides in a heap
// in order to avoid page fault
HEAD_TAIL RTCPrcvBfrList; // Rcv buffers head/tail ptrs
HANDLE hHeapRcvBfrList; // Heap handle to Rcv bfrs list
// Rcv/Xmt buffers have their own heap
HANDLE hHeapRcvBfr; // Heap handle to Rcv Bfrs mem.
WSABUF XmtBfr; // RTCP send buffer descriptor
// Application provided list of buffers where RRCM will copy the raw
// RTCP buffers
HEAD_TAIL appRtcpBfrList; // Head/tail ptrs for app bfr list
DWORD dwInitNumFreeRcvBfr; // Number of Free Rcv Buffers
DWORD dwRcvBfrSize; // Receive Buffer size
DWORD dwXmtBfrSize; // Transmit Buffer size
DWORD dwSessionStatus; // Entry status:
char toBfr[MAX_ADDR_LEN]; // Destination address
int toLen; // Size of lpTo
int avgRTCPpktSizeRcvd; // Average RTCP pckt size
DWORD dwNumStreamPerSes; // Num of streams per Session
DWORD dwCurNumSSRCperSes; // Num of SSRC per Session
#ifdef MONITOR_STATS
DWORD dwHiNumSSRCperSes; // High Num of SSRC per Session
#endif
// Receive information (shared by all streams of this session)
HANDLE hShutdownDone; // Shutdown procedure done
int dwNumRcvIoPending; // Number of receive I/O pending
// Notification callback of RRCM events if desired by the application
VOID (*pRRCMcallback)(RRCM_EVENT_T, DWORD_PTR, DWORD_PTR, DWORD_PTR);
// User information on callback
DWORD_PTR dwCallbackUserInfo;
// RTP Loop/Collision information
RTP_COLLISION collInfo[NUM_COLLISION_ENTRIES];
} RTCP_SESSION, *PRTCP_SESSION;
// RTCP Xmt information
typedef struct _XMIT_INFO { DWORD dwNumPcktSent; // Number of packet sent
DWORD dwNumBytesSent; // Number of bytes sent
DWORD dwNTPmsw; // NTP most significant word
DWORD dwNTPlsw; // NTP least significant word
DWORD dwRTPts; // RTP timestamp
DWORD dwCurXmtSeqNum; // Current Xmt sequence number
DWORD dwPrvXmtSeqNum; // Previous Xmt sequence number
DWORD dwRtcpStreamMinBW; // Minimal session's bandwidth
#ifdef DYNAMIC_RTCP_BW
DWORD dwCalculatedXmtBW; // Session's calculated bandwidth
DWORD dwLastTimeBwCalculated; // Last time BW was calculated
DWORD dwLastTimeNumBytesSent; // Last time number of bytes send
DWORD dwLastTimeNumPcktSent; // Last time number of bytes send
#endif
DWORD dwLastSR; // Last sender report (RTP format)
DWORD dwLastSRLocalTime; // Last sender report local time
DWORD dwLastSendRTPSystemTime; // Last RTP packet send time
DWORD dwLastSendRTPTimeStamp; // RTP timestamp of the last packet
} XMIT_INFO, *PXMIT_INFO;
// RTCP receive information
typedef struct _RECV_INFO { DWORD dwNumPcktRcvd; // Number of packet received
DWORD dwPrvNumPcktRcvd; // Previous number of pckt rcvd
DWORD dwExpectedPrior; // Number previously expected
DWORD dwNumBytesRcvd; // Number of bytes rcvd
DWORD dwBaseRcvSeqNum; // Initial sequence number rcvd
DWORD dwBadSeqNum; // Potential new valid seq num
DWORD dwProbation; // # consec pkts for validation
RTP_SEQ_NUM XtendedSeqNum; // Xtnded highest seq. num rcvd
DWORD dwPropagationTime; // Last packet's transmit time
DWORD interJitter; // Interarrival jitter
#ifdef DYNAMIC_RTCP_BW
DWORD dwCalculatedRcvBW; // Session's calculated bandwidth
DWORD dwLastTimeBwCalculated; // Last time BW was calculated
DWORD dwLastTimeNumBytesRcvd; // Last time number of bytes rcvd
DWORD dwLastTimeNumPcktRcvd; // Last time number of bytes rcvd
#endif
} RECV_INFO, *PRECV_INFO;
// RRCM statistics table entry data structure
typedef struct _SSRC_ENTRY { LINK_LIST SSRCList; // Next/prev SSRC entry
CRITICAL_SECTION critSect; // Critical section synch.
PRTCP_SESSION pRTCPses; // Point to the parent session
DWORD SSRC; // Source SSRC
DWORD PayLoadType; // payload associated with this SSRC
DWORD dwSSRCStatus; // Entry status
#define NETWK_ADDR_UPDATED 0x80000000 // Network Address already done
#define SEQ_NUM_UPDATED 0x40000000 // XMT Sequence already done
#define THIRD_PARTY_COLLISION 0x20000000 // Third party collsion detected
#define CLOSE_RTCP_SOCKET 0x10000000 // RTCP will close the RTCP socket
#define RTCP_XMT_USER_CTRL 0x08000000 // User's has RTCP timeout control
// SSRC Transmit information
// If on our transmit list, this is our SSRC information, and if on our
// receive list, this is a SR feedback information.
XMIT_INFO xmtInfo;
// SSRC Receive information
// If on our transmit list, this is undefined information, and if on our
// receive list, this is the SSRC's receive information, ie, this SSRC
// is an active sender somewhere on the network. This information is
// maintained by RTP, and used by RTCP to generate RR.
RECV_INFO rcvInfo;
// Feedback information received about ourselve if we're an active source
RTCP_FEEDBACK rrFeedback; // Feedback information
DWORD dwLastReportRcvdTime; // Time of last report received
DWORD dwNextReportSendTime; // Next scheduled report time (ms)
#ifdef _DEBUG
DWORD dwPrvTime; // Elapsed time between report
#endif
// SSRC SDES information
SDES_DATA cnameInfo; // CNAME information
SDES_DATA nameInfo; // NAME information
SDES_DATA emailInfo; // EMAIL address information
SDES_DATA phoneInfo; // PHONE number information
SDES_DATA locInfo; // LOCation (users) information
SDES_DATA toolInfo; // TOOL name information
SDES_DATA txtInfo; // TEXT (NOTE) information
SDES_DATA privInfo; // PRIVate information
// SSRC network address information
int fromLen; // From address length
char from[MAX_ADDR_LEN]; // From address
// !!! Not implemented (entries will grow exponentionally) !!!
// List of SSRCs in RR received by this SSRC. It might be useful for a
// sender or a controller to know how other active sources are received
// by others.
// The drawback is that the number of entries will grow exponentially
// with the number of participants.
// Currently not implemented.
#if RTCP_FEEDBACK_LIST
HEAD_TAIL rrFeedbackList; // Head/Tail of feedback list
#endif
#ifdef ENABLE_ISDM2
DWORD hISDM; // ISDM session handle
#endif
// All variables below should be in an additional linked list one layer
// up this one, under the RTCP session link list.
// They have been moved here when we added multiple streams per session
// !!! NOTE !!!: There is only 1 transmit thread per stream. It's ID is
// found in this data structure which is on the Xmt list.
SOCKET RTPsd; // RTP socket descriptor
SOCKET RTCPsd; // RTCP socket descriptor
HANDLE hXmtThread; // RTCP session thread handle
DWORD dwXmtThreadID; // RTCP session thread ID
HANDLE hExitXmtEvent; // Xmt thread Exit event -
// Used to terminate a session
// among multiple stream on the
// same session
DWORD dwNumRptSent; // Number of RTCP report sent
DWORD dwNumRptRcvd; // Number of RTCP report rcvd
DWORD dwNumXmtIoPending; // Number of transmit I/O pending
DWORD dwStreamClock; // Sampling frequency
DWORD dwUserXmtTimeoutCtrl; // User's xmt timer control
// 0x0 -> RRCM control
// 0xFFFF -> No RTCP send
// value -> timer value
// All the above variables should move in the intermediate layer for
// multiple stream per session support
} SSRC_ENTRY, *PSSRC_ENTRY;
// RTP process data structure
typedef struct _RTP_SESSION { LINK_LIST RTPList; // Next/Prev RTP session
CRITICAL_SECTION critSect; // Critical section
PRTCP_SESSION pRTCPSession; // Pointer to my RTCP side
} RTP_SESSION, *PRTP_SESSION;
#if 0
// RTP Ordered buffer structure
typedef struct _RTP_BFR_LIST { LINK_LIST RTPBufferLink; // Next/prev
LPWSAOVERLAPPED_COMPLETION_ROUTINE pfnCompletionNotification; // Pointer to Rcv notif. func
WSAEVENT hEvent; // WSAOverlapped handle
LPWSABUF pBuffer; // Pointer to WSABuffers
PRTP_SESSION pSession; // This session's ID
DWORD dwBufferCount; // Number of bufs in LPWSABUF
DWORD dwFlags; // WSARecv flags
LPVOID pFrom; // Pointer to source address
LPINT pFromlen; // Pointer to source address
SOCKET RTPsocket; // Socket descriptor
} RTP_BFR_LIST, *PRTP_BFR_LIST;
// RTP Ordered buffer structure
typedef struct _RTP_HASH_LIST { LINK_LIST RTPHashLink; // Next/prev
PRTP_SESSION pSession; // This session's ID
SOCKET RTPsocket; // Socket descriptor
} RTP_HASH_LIST, *PRTP_HASH_LIST;
#endif
// RTP registry initialization
typedef struct _RRCM_REGISTRY { DWORD NumSessions; // RTP/RTCP sessions
DWORD NumFreeSSRC; // Initial number of free SSRCs
DWORD NumRTCPPostedBfr; // Number of RTCP recv bfr posted
DWORD RTCPrcvBfrSize; // RTCP rcv bfr size
// Dynamically loaded DLL & Send/Recv function name
CHAR WSdll[FILENAME_LENGTH]; } RRCM_REGISTRY, *PRRCM_REGISTRY;
// RTP Context Sensitive structure
typedef struct _RTP_CONTEXT { HEAD_TAIL pRTPSession; // Head/tail of RTP session(s)
CRITICAL_SECTION critSect; HINSTANCE hInst; // DLL instance
RRCM_REGISTRY registry; // Registry initialization
} RTP_CONTEXT, *PRTP_CONTEXT;
// RTCP Context Sensitive structure
typedef struct _RTCP_CONTEXT { HEAD_TAIL RTCPSession; // RTCP sessions head/tail ptrs
HANDLE hHeapRTCPSes; // Heap handle to RTCP sessions
CRITICAL_SECTION critSect; // Critical section synch.
HEAD_TAIL RRCMFreeStat; // RRCM entries head/tail ptrs
HANDLE hHeapRRCMStat; // Heap handle to RRCM stats
DWORD dwInitNumFreeRRCMStat; // Number of Free SSRC entries
DWORD dwRtcpThreadID; // RTCP thread ID
HANDLE hRtcpThread; // RTCP thread hdle
HANDLE hTerminateRtcpEvent; // RTCP terminate thread event hdl
HANDLE hRtcpRptRequestEvent; // RTCP report request event
#ifdef MONITOR_STATS
DWORD dwRTCPSesCurNum; // Num of RTCP Session
DWORD dwRTCPSesHiNum; // High num RTCP per Session
DWORD dwRRCMStatFreeLoNum; // Low num of RRCM free Stat
DWORD dwRRCMStatFreeCurNum; // Cur num of RRCM Free Stat
DWORD dwRRCMStatFreeHiNum; // High num of RRCM Free Stat
DWORD dwCurNumRTCPThread; // Current num of RTCP thread
DWORD dwHiNumRTCPThread; // High number of RTCP thread
DWORD dwNumRTCPhdrErr; // Num of RTCP pckt header err.
DWORD dwNumRTCPlenErr; // Num of RTCP pckt length err.
#endif
} RTCP_CONTEXT, *PRTCP_CONTEXT;
// RTCP Free Buffers List
typedef struct _RTCP_BFR_LIST { LINK_LIST bfrList; // Next/prev buffer in list
WSAOVERLAPPED overlapped; // Overlapped I/O structure
WSABUF bfr; // WSABuffers
DWORD dwBufferCount; // Number of bufs in WSABUF
DWORD dwNumBytesXfr; // Number of bytes rcv/xmt
DWORD dwFlags; // Flags
char addr[MAX_ADDR_LEN]; // Network Address
int addrLen; // Address length
PSSRC_ENTRY pSSRC; // Pointer to SSRC entry address
} RTCP_BFR_LIST, *PRTCP_BFR_LIST;
// Dynamically loaded functions
typedef struct _RRCM_WS { HINSTANCE hWSdll; LPFN_WSASENDTO sendTo; LPFN_WSARECVFROM recvFrom; LPFN_WSANTOHL ntohl; LPFN_WSANTOHS ntohs; LPFN_WSAHTONL htonl; LPFN_WSAHTONS htons; LPFN_GETSOCKNAME getsockname; LPFN_GETHOSTNAME gethostname; LPFN_GETHOSTBYNAME gethostbyname; LPFN_CLOSESOCKET closesocket; LPFN_WSASOCKET WSASocket; LPFN_BIND bind; LPFN_WSAENUMPROTOCOLS WSAEnumProtocols; LPFN_WSAJOINLEAF WSAJoinLeaf; LPFN_WSAIOCTL WSAIoctl; LPFN_SETSOCKOPT setsockopt; WSAPROTOCOL_INFO RTPProtInfo; // used to open RTP sockets
} RRCM_WS, *PRRCM_WS;
extern RRCM_WS RRCMws;
#define WS2Enabled (RRCMws.hWSdll != NULL)
#define WSQOSEnabled (RRCMws.RTPProtInfo.dwServiceFlags1 & XP1_QOS_SUPPORTED)
#ifdef ENABLE_ISDM2
// ISDM support
typedef struct _ISDM2 { CRITICAL_SECTION critSect; // Critical section synch.
ISDM2API ISDMEntry; // DLL entry point
HINSTANCE hISDMdll; DWORD hIsdmSession; // ISDM Session's handle
} ISDM2, *PISDM2; #endif // #ifdef ENABLE_ISDM2
// restore structure packing
#include <poppack.h>
#endif // __RRCMDATA_H_
|