⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m803xxrtcp.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 4 页
字号:
        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 + -