📄 m803xxvoip.c
字号:
/**************************************************************************
* Module Name: M803xx File Name: M803xxVoip.C
* Create Date: 2003/01/23 Author: Cao Wanming
* Version: 1.0
* History:
* Date Version Modifier Activies
* =========================================================================
**************************************************************************/
#include "m803xx.h"
/*#include "ctype.h"*/
#include "string.h"
#include "sysLib.h"
/*#include "bootLib.h"
#include "fioLib.h"*/
#include "private/vmLibP.h"
#include "t38fax.h"
#include "rtpmib.h"
#include "globalVarDef.h"
#include "Protocol\Attache\Transport\Include\port_numbers.h"
#include "voip/include/voip_ex.h"
/*#include <ip_ex.h>*/
#if INSTALL_ON_IXP1200
#define LN_BUFFER_CACHE_INVALIDATE(address, len) \
CACHE_DRV_INVALIDATE (&cacheUserFuncs, (address), (len))
#define LN_BUFFER_CACHE_FLUSH(address, len) \
CACHE_DRV_FLUSH (&cacheUserFuncs, (address), (len))
#else
#define LN_BUFFER_CACHE_INVALIDATE(address, len)
#define LN_BUFFER_CACHE_FLUSH(address, len)
#endif
RPPH RPPH_value[MAX_PIN_NUM];
UINT32 M803xxReceiveRTPPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxReceiveRTCPPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxSendRTPPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxSendRTCPPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxReceiveUDPTLPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxSendUDPTLPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT16 RtpPortNumber[MAX_CID_NUM], RtcpPortNumber[MAX_CID_NUM];
RtpSessionValue RtpValue[MAX_CID_NUM];
FaxSessionValue FaxValue[MAX_CID_NUM];
UINT8 First_Flag[MAX_CID_NUM] = {0};
UINT16 Tone_Parameter[MAX_TONE_NUM * 30] =
{0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 1000, 0, 0,0,
0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 1000, 4000, 0,0,
0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 700, 700, 0,0,
0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 350, 350, 0,0,
0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 100, 100,0,0,
450, 100, 0,0, 100, 100,0,0,
450, 100, 0,0, 100, 100,0,0,
450, 100, 0,0, 400, 400,0,0,
0xff00, 0,0,0,0,0,0,0, 950, 100, 0,0, 1000, 0,0,0,
};
UINT16 Tone_Parameter_Len[MAX_TONE_NUM] = {16, 16, 16, 16, 40, 16};
UINT16 Tone_Parameter_Start[MAX_TONE_NUM] = {0, 16, 32, 48, 64, 104};
UINT16 RemainedTxCmdNum[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT16 TxCmdFifoOverflowFlag[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 ReceivePacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM] = {0};
LOCAL UINT8 SendPktToQueue(UINT8 * buf, int nLen, int PortNo, packet * p);
UINT8 senddtmf[64]={0};
int VoIP_CID_Printf = 0;
extern int VoIP_Call_Printf;
/*extern void endPktFree(char* buff );*/
unsigned long Swap_DwordM( unsigned long in )
{
#if INSTALL_ON_IXP1200
return (((in&0xff000000)>>24)|((in&0x00ff0000)>>8)|
((in&0x0000ff00)<<8 )|((in&0x000000ff)<<24));
#else
return (in);
#endif
}
UINT16 Swap_WordM(UINT16 in )
{
#if INSTALL_ON_IXP1200
return (((in&0xff00)>>8)|((in&0x00ff)<<8));
#else /*PPC 8240*/
return (in);
#endif
}
/*************************************************************************/
/* Function name: InitRtpSessionValue */
/* Description : Init rtp session value */
/* Return type : void */
/* Argument : */
/* Author/Date : */
/* Note: This function is provided for MIB interface */
/*************************************************************************/
void InitRtpSessionValue(UINT8 PortNo)
{
memset(&RtpValue[PortNo], 0, sizeof(RtpSessionValue));
}
/*************************************************************************/
/* Function name: InitFaxSessionValue */
/* Description : Init fax session value */
/* Return type : void */
/* Argument : */
/* Author/Date : */
/* Note: */
/* */
/*************************************************************************/
void InitFaxSessionValue(UINT8 PortNo)
{
memset(&FaxValue[PortNo], 0, sizeof(FaxSessionValue));
}
/*************************************************************************/
/* Function name: SelectRPPHParameter */
/* Description : Select RPPH Parameter */
/* Return type : void */
/* Argument : PortNo -- No. of Port Num */
/* Author/Date : */
/* Note: */
/* */
/*************************************************************************/
void SelectRPPHParameter(UINT8 PortNo)
{
UINT8 name,lpwinitial,PinNo;
PinNo = CON_TO_DP[m_port[PortNo].Channel].chip;
name = (UINT8)(Parameter[PortNo].bearerInformation);
lpwinitial=(UINT8)(Parameter[PortNo].JitterValue);
if((lpwinitial<20)||(lpwinitial>200))
lpwinitial=20;
switch(name)
{
case CODER_TYPE_G711Alaw: /* g711Alaw64k */
case CODER_TYPE_G711Ulaw: /* g711Ulaw64k */
RPPH_value[PinNo].LPWmin = 20;
RPPH_value[PinNo].LPWmax = 200;
RPPH_value[PinNo].LPWinitial = lpwinitial;
RPPH_value[PinNo].LPR = 0;
RPPH_value[PinNo].MAT = 250;
RPPH_value[PinNo].DT = 280;
RPPH_value[PinNo].HardSoftmode = 1;
break;
case 6:
case CODER_TYPE_G723:/* g7231 */
RPPH_value[PinNo].LPWmin = 20;
RPPH_value[PinNo].LPWmax = 200;
RPPH_value[PinNo].LPWinitial = lpwinitial;
RPPH_value[PinNo].LPR = 0;
RPPH_value[PinNo].MAT = 265;
RPPH_value[PinNo].DT = 510;
RPPH_value[PinNo].HardSoftmode = 0;
break;
#if 0
case CODER_TYPE_G728: /* G728 */
RPPH_value[PinNo].LPWmin = 20;
RPPH_value[PinNo].LPWmax = 200;
RPPH_value[PinNo].LPWinitial = lpwinitial;
RPPH_value[PinNo].LPR = 0;
RPPH_value[PinNo].MAT = 230;
RPPH_value[PinNo].DT = 500;
RPPH_value[PinNo].HardSoftmode = 0;
break;
#endif
case CODER_TYPE_G729: /* G729 */
case CODER_TYPE_G729a:
case CODER_TYPE_G729wb:
case CODER_TYPE_G729awb:
RPPH_value[PinNo].LPWmin = 20;
RPPH_value[PinNo].LPWmax = 200;
RPPH_value[PinNo].LPWinitial = lpwinitial;
RPPH_value[PinNo].LPR = 0;
RPPH_value[PinNo].MAT = 235;
RPPH_value[PinNo].DT = 500;
RPPH_value[PinNo].HardSoftmode = 0;
break;
case CODER_TYPE_T38: /* T38 fax */
break;
default:
RPPH_value[PinNo].LPWmin = 20;
RPPH_value[PinNo].LPWmax = 200;
RPPH_value[PinNo].LPWinitial = lpwinitial;
RPPH_value[PinNo].LPR = 0;
RPPH_value[PinNo].MAT = 235;
RPPH_value[PinNo].DT = 500;
RPPH_value[PinNo].HardSoftmode = 0;
break;
}
}
/*************************************************************************/
/* Function name: SelectVocoderType */
/* Description : Select Vocoder Type */
/* Return type : UINT16 */
/* Argument : PortNo -- No. of Port Num */
/* Author/Date : */
/* Note: */
/* */
/*************************************************************************/
UINT16 SelectVocoderType(UINT8 PortNo)
{
UINT8 name;
UINT16 Type;
/*2006-3-28 Added by ZhengQishan, 传真和语音的参数不一样*/
if (m_port[PortNo].ExpectServiceType == Fax)
name = (UINT8)(gpT38FaxParameter[PortNo]->bearerInformation);
else
name = (UINT8)(Parameter[PortNo].bearerInformation);
switch(name)
{
case CODER_TYPE_G711Alaw:
Type = 0x0880; /* G711Alaw */
break;
case CODER_TYPE_G711Ulaw:
Type = 0x80; /* G711Ulaw */
break;
case CODER_TYPE_G723:
Type = 0x0480; /* G723 */
break;
#if 0
case CODER_TYPE_G728:
Type = 0x0F80; /* G728 */
break;
#endif
case CODER_TYPE_G729: /* G729 */
case CODER_TYPE_G729a: /* G729a */
case CODER_TYPE_G729wb: /* G729wb */
case CODER_TYPE_G729awb: /* G729awb */
Type = 0x1280;
break;
case CODER_TYPE_T30: /* T30 */
case CODER_TYPE_T38: /* T38 */
Type = 0x6280;
break;
default:
Type = 0x1280; /* G729 */
break;
}
return Type;
}
UINT16 SelectPackLen(UINT8 PortNo)
{
UINT8 name;
UINT16 Len;
/*2006-3-28 Added by ZhengQishan, 传真和语音的参数不一样*/
if (m_port[PortNo].ExpectServiceType == Fax)
name = (UINT8)(gpT38FaxParameter[PortNo]->bearerInformation);
else
name = (UINT8)(Parameter[PortNo].bearerInformation);
switch(name)
{
case CODER_TYPE_G711Alaw:
case CODER_TYPE_G711Ulaw:
Len = 40; /* G711Alaw/G711ulaw */
break;
case 6:
case CODER_TYPE_G723:
Len = 24; /* G7231 */
break;
#if 0
case CODER_TYPE_G728:
Len = ; /* G728 */
break;
case CODER_TYPE_T38:
Len = ; /* T38 fax */
break;
#endif
case CODER_TYPE_G729: /* G729 */
case CODER_TYPE_G729a: /* G729a */
case CODER_TYPE_G729wb: /* G729wb */
case CODER_TYPE_G729awb: /* G729awb */
Len = 10; /* G729 */
break;
default:
Len = 10; /* G729 */
break;
}
return Len;
}
/************************************************************
* 0 G.711 u-law PCM audio 5 ms
* 4 G.723.1 audio 30 ms
* 8 G.711 A-law PCM audio 5 ms
* 15 G.728 audio 5 ms
* 18 G.729A audio 10 ms
* N/A G.726 audio 5 ms
* N/A G.727 audio 5 ms
* N/A GSM-FR audio 20 ms
************************************************************/
UINT16 SelectVoiceOptionValue(UINT8 PortNo)
{
M803xx_PORT_STATE *PortPtr;
#if 0
UINT8 FrameNumInOneRTPPacket;
#endif
UINT16 opt_value;
UINT8 VADOption; /* voice activity detection options */
PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
#if 0
FrameNumInOneRTPPacket = Parameter[PortNo].frameNum;
FrameNumInOneRTPPacket = 0;
#endif
/* 0x30:no Vad; 0x70:vad send silence packet; 0xb0:vad */
if( Parameter[PortNo].VAD )
{
VADOption = 0xb0;/* 0xb0 */
}
else
{
VADOption = 0x30;/* modify 0x70 -> 0x30 by caowm 2003/06/25 */
if( !(Parameter[PortNo].CNG) )
VADOption = VADOption | 0x02;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -