📄 m803xxrtcp.c
字号:
RTCPRepBuff[PortNo].CumLost =(unsigned int )-1;
RTCPRepBuff[PortNo].ExtHighSeq =(unsigned int )-1;
RTCPRepBuff[PortNo].ReportType =RTCP_RR_Rx;
}
RtpValue[PortNo].Rcvr_LostPackets = RTCPRepBuff[PortNo].CumLost;
RtpValue[PortNo].Rcvr_Jitter = RTCPRepBuff[PortNo].Jitter;
RtpValue[PortNo].Rcvr_Rtt = RTCPRepBuff[PortNo].RoundTrip;
RtpValue[PortNo].Rcvr_RrTime =0;
/*check for extensions*/
if ((ptr->Common.RTCPLength)>(2-1+(ptr->Common.RTCPCount)*6))
{
/*check length*/
if (4*(ptr->Common.RTCPLength)-4*(2+(ptr->Common.RTCPCount)*6)<256)
{
RTCPInfo[PortNo].RxExtLength=4*(ptr->Common.RTCPLength)-4*(2+(ptr->Common.RTCPCount)*6)+4;
memcpy(RTCPInfo[PortNo].RxExtension,RTCPFrame+4*(2+(ptr->Common.RTCPCount)*6),RTCPInfo[PortNo].RxExtLength);
}
}
}
/***************************************************************************************/
/* Function name: RTCPDecodePacket */
/* Description : Decodes Received RTCP packet */
/* Return type : void */
/* Argument : PortNo - the channel on the board */
/* RTCPFrame - pointer to the received RTCP packet */
/* FrameLen - size of packet */
/* Author/Date : */
/* Note: called after receiving RTCP packet */
/***************************************************************************************/
void RTCPDecodePacket(UINT8 PortNo, char *RTCPFrame, int FrameLen)
{
if(((TRTCP *)RTCPFrame)->Common.RTCPPT == RTCP_BYE)
RtpValue[PortNo].Sess_Byes++;
while(FrameLen>0)
{
switch ((enum TRTCPType)((TRTCP *)RTCPFrame)->Common.RTCPPT)
{
case RTCP_SR:
RTCPDecodeSRPacket(PortNo, RTCPFrame);
break;
case RTCP_RR:
RTCPDecodeRRPacket(PortNo, RTCPFrame);
break;
case RTCP_SDES:
break;
case RTCP_BYE :
break;
case RTCP_APP :
break;
default:
break;
} /*end of switch*/
/*update pointers*/
FrameLen-=(((( TRTCP *)RTCPFrame)->Common.RTCPLength + 1)*4);
RTCPFrame = (char *)((unsigned int *)RTCPFrame + (( TRTCP *)RTCPFrame)->Common.RTCPLength + 1);
} /*end of while (FrameLen>0)*/
}
#endif
/***************************************************************************************/
/* Function name: RTCPUpdateTxStatistics */
/* Description : updates transmission statistics (Packet Count, Octet count etc.) */
/* Return type : void */
/* Argument : PortNo - the channel on the board */
/* TxOctets - number of transmitted octets */
/* Author/Date : */
/* Note: called before SendToNetwork() */
/***************************************************************************************/
void RTCPUpdateTxStatistics(UINT8 PortNo, int TxOctets)
{
/*save RTCP statistics*/
RTCPInfo[PortNo].SenderPacketCount++;
RTCPInfo[PortNo].SenderOctetCount+=TxOctets;
RTCPInfo[PortNo].PacketSentSinceSR=1;
}
/******************************************************************************/
/* Function name: M803xx_SendRtcpPacket */
/* Description : This function send RTCP packet */
/* Return type : void */
/* Argument : PortNo - the channel on the board */
/* Author/Date : */
/* Note: */
/******************************************************************************/
void M803xx_SendRtcpPacket(UINT8 PortNo)
{
char *PacketEnd,*RTCPRepBuffer;
VOIP_MUX_STRUCT Msg;
UINT16 Len;
/*M803xx_PORT_STATE *PortPtr;*/
UINT32 Port;
ipaddr_t Ipaddr[2];
UINT8 i;
UINT16 UdpPort[2];
UINT8 *ip_hdr;
UINT32 TOS;
#if 0
UINT8 *udp_hdr;
#endif
for(i=0; i<MAX_IP_ADDR_LEN; i++)
{
Ipaddr[0].addr[i] = Parameter[PortNo].localRtcpAddress.ipAddr.addr[i];
Ipaddr[1].addr[i] = Parameter[PortNo].remoteRtcpAddress.ipAddr.addr[i];
}
UdpPort[0] = Parameter[PortNo].localRtcpAddress.port;
UdpPort[1] = Parameter[PortNo].remoteRtcpAddress.port;
TOS = (UINT32)(Parameter[PortNo].Tos);
voip_driver_check_qos_dscp(&TOS);
/*PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];*/
Port = (((UINT32)((CON_TO_DP[m_port[PortNo].Channel].chan)+1)<<16))+((CON_TO_DP[m_port[PortNo].Channel].chip+1)<<24); /* 全局端口号 */
RTCPRepBuffer = (char *)endPktAlloc();
if (RTCPRepBuffer==NULL)
return;
if (RTCPInfo[PortNo].PacketSentSinceSR)
{
PacketEnd=RTCPBuildSRPacket(PortNo,RTCPRepBuffer+PACKET_START_SIZE);
RtpValue[PortNo].Sender_Srs++;
Len = sizeof(TRTCPHeader)+28+sizeof(TRTCPSR);
}
else
{
PacketEnd=RTCPBuildRRPacket(PortNo,RTCPRepBuffer+PACKET_START_SIZE);
Len = sizeof(TRTCPHeader)+sizeof(TRTCPRR);
}
*(UINT32 *)(RTCPRepBuffer)=Swap_DwordM((0x45000000 | (((TOS & 0x3F) << 18) & 0xfc0000))+(Len+PACKET_START_SIZE));
*(((UINT32 *)(RTCPRepBuffer))+1)=0x00000000;
*(((UINT32 *)(RTCPRepBuffer))+2)=Swap_DwordM(0x7e110000);
*(((UINT32 *)(RTCPRepBuffer))+3)=
Swap_DwordM((UINT32)((((UINT32)(Ipaddr[0].addr[0]))<<24)&0xff000000)
+(((Ipaddr[0].addr[1])<<16)&0x00ff0000)
+(((Ipaddr[0].addr[2])<<8)&0x0000ff00)
+((Ipaddr[0].addr[3])&0x000000ff));
*(((UINT32 *)(RTCPRepBuffer))+4)=
Swap_DwordM((UINT32)((((UINT32)(Ipaddr[1].addr[0]))<<24)&0xff000000)
+(((Ipaddr[1].addr[1])<<16)&0x00ff0000)
+(((Ipaddr[1].addr[2])<<8)&0x0000ff00)+
((Ipaddr[1].addr[3])&0x000000ff));
*(((UINT32 *)(RTCPRepBuffer))+5)=
Swap_DwordM(((((UINT32)UdpPort[0])<<16)&0xffff0000)+(((UINT32)UdpPort[1])&0x0000ffff));
*(((UINT32 *)(RTCPRepBuffer))+6)=
Swap_DwordM(((UINT32)(Len+8)<<16)&0xffff0000);
ip_hdr =(UINT8 *) RTCPRepBuffer;
SET_IP_HEADER_HEADER_CHECKSUM(ip_hdr, 0);
SET_IP_HEADER_HEADER_CHECKSUM (ip_hdr,
ROS_HTONS(~GLUE_CKSUM(ip_hdr,(GET_IP_HEADER_HEADER_LENGTH(ip_hdr) << 1))) );
#if 0
udp_hdr = RTCPRepBuffer+20;
{
UINT8 pseudo_hdr[SIZEOF_IP_PSEUDO_HEADER];
MEMSET(pseudo_hdr, 0, sizeof(pseudo_hdr));
MEMCPY(PTR_IP_PSEUDO_HEADER_DESTINATION_ADDRESS(pseudo_hdr),
PTR_IPADDR_BITS(&Ipaddr[1]), SIZEOF_IP_ADDRESS);
MEMCPY(PTR_IP_PSEUDO_HEADER_SOURCE_ADDRESS(pseudo_hdr),
PTR_IPADDR_BITS(&Ipaddr[0]), SIZEOF_IP_ADDRESS);
SET_IP_PSEUDO_HEADER_PROTOCOL(pseudo_hdr, IP_PROTOCOL_is_UDP);
SET_IP_PSEUDO_HEADER_PAYLOAD_LENGTH(pseudo_hdr, Len + 8);
SET_UDP_HEADER_CHECKSUM(udp_hdr, SWAP16(GLUE_CKSUM(pseudo_hdr,
SIZEOF_IP_PSEUDO_HEADER >> 1)));
SET_UDP_HEADER_CHECKSUM(udp_hdr, SWAP16(~GLUE_CKSUM(udp_hdr,
(Len + 8 + 1) >> 1)));
}
if (GET_UDP_HEADER_CHECKSUM(udp_hdr) == 0)
SET_UDP_HEADER_CHECKSUM(udp_hdr, 0xFFFF);
#endif /*0*/
Msg.mestype = RTCP_PACKET;
Msg.portno = Port; /* 全局端口号 */
Msg.msgLen = Len+PACKET_START_SIZE;
Msg.mesptr = (UINT32 *)RTCPRepBuffer;
M803xxMsgProcess((VOIP_MUX_STRUCT *)&Msg);
}
/*****************************************************************************/
/* Function name: RTCPSwapSDESCNAMEPacket */
/* Description : Utility functions for Little Endian machines, these */
/* functions have no use in this program. */
/* Return type : void */
/* Argument : */
/* Author/Date : */
/* Note: */
/*****************************************************************************/
void RTCPSwapSDESCNAMEPacket(char *Buffer)
{
TRTCP *RTCPPacketTemp=(TRTCP*)Buffer;
RTCPPacketTemp->Common.RTCPSsrc =UL_SWAP(RTCPPacketTemp->Common.RTCPSsrc);
RTCPPacketTemp->Common.RTCPLength=US_SWAP(RTCPPacketTemp->Common.RTCPLength);
}
void RTCPSwapBYEPacket(char *Buffer)
{
TRTCP *RTCPPacketTemp=(TRTCP*)Buffer;
RTCPPacketTemp->Common.RTCPSsrc =UL_SWAP(RTCPPacketTemp->Common.RTCPSsrc);
RTCPPacketTemp->Common.RTCPLength=US_SWAP(RTCPPacketTemp->Common.RTCPLength);
}
void RTCPSwapSRPacket(char *Buffer)
{
unsigned int c;
TRTCP *RTCPPacketTemp=(TRTCP*)Buffer;
RTCPPacketTemp->Common.RTCPSsrc =UL_SWAP(RTCPPacketTemp->Common.RTCPSsrc );
RTCPPacketTemp->Report.SR.RTCPNtpSec =UL_SWAP(RTCPPacketTemp->Report.SR.RTCPNtpSec );
RTCPPacketTemp->Report.SR.RTCPNtpFrac =UL_SWAP(RTCPPacketTemp->Report.SR.RTCPNtpFrac );
RTCPPacketTemp->Report.SR.RTCPTs =UL_SWAP(RTCPPacketTemp->Report.SR.RTCPTs );
RTCPPacketTemp->Report.SR.RTCPPsent =UL_SWAP(RTCPPacketTemp->Report.SR.RTCPPsent );
RTCPPacketTemp->Report.SR.RTCPOsent =UL_SWAP(RTCPPacketTemp->Report.SR.RTCPOsent );
RTCPPacketTemp->Common.RTCPLength =US_SWAP(RTCPPacketTemp->Common.RTCPLength );
for (c=0;c<RTCPPacketTemp->Common.RTCPCount;c++)
{
RTCPPacketTemp->Report.SR.RR[c].RTCPSsrc =UL_SWAP(RTCPPacketTemp->Report.SR.RR[c].RTCPSsrc );
RTCPPacketTemp->Report.SR.RR[c].RTCPLast_seq=UL_SWAP(RTCPPacketTemp->Report.SR.RR[c].RTCPLast_seq);
RTCPPacketTemp->Report.SR.RR[c].RTCPJitter =UL_SWAP(RTCPPacketTemp->Report.SR.RR[c].RTCPJitter );
RTCPPacketTemp->Report.SR.RR[c].RTCPLsr =UL_SWAP(RTCPPacketTemp->Report.SR.RR[c].RTCPLsr );
RTCPPacketTemp->Report.SR.RR[c].RTCPDlsr =UL_SWAP(RTCPPacketTemp->Report.SR.RR[c].RTCPDlsr );
RTCPPacketTemp->Report.SR.RR[c].RTCPCumLost =U24BIT_SWAP(RTCPPacketTemp->Report.SR.RR[c].RTCPCumLost);
}
}
void RTCPSwapRRPacket(char *Buffer)
{
unsigned int c;
RTCPPacket=(TRTCP*)Buffer;
RTCPPacket->Common.RTCPLength =US_SWAP(RTCPPacket->Common.RTCPLength);
RTCPPacket->Common.RTCPSsrc =UL_SWAP(RTCPPacket->Common.RTCPSsrc );
for (c=0;c<RTCPPacket->Common.RTCPCount;c++)
{
RTCPPacket->Report.RR[c].RTCPSsrc =UL_SWAP(RTCPPacket->Report.RR[c].RTCPSsrc );
RTCPPacket->Report.RR[c].RTCPLast_seq =UL_SWAP(RTCPPacket->Report.RR[c].RTCPLast_seq );
RTCPPacket->Report.RR[c].RTCPJitter =UL_SWAP(RTCPPacket->Report.RR[c].RTCPJitter );
RTCPPacket->Report.RR[c].RTCPLsr =UL_SWAP(RTCPPacket->Report.RR[c].RTCPLsr );
RTCPPacket->Report.RR[c].RTCPDlsr =UL_SWAP(RTCPPacket->Report.RR[c].RTCPDlsr );
RTCPPacket->Report.RR[c].RTCPCumLost =U24BIT_SWAP(RTCPPacket->Report.RR[c].RTCPCumLost);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -