📄 t38fax.c
字号:
faxDebug(dbgClass, gPort, " packet %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", Rtp_Head[0],Rtp_Head[1],Rtp_Head[2],Rtp_Head[3],Rtp_Head[4],Rtp_Head[5],Rtp_Head[6],Rtp_Head[7],Rtp_Head[8],Rtp_Head[9],Rtp_Head[10],Rtp_Head[11]);
}
/*-----------------------------
* receiveT38FaxPkt - T.38 FAX收包处理
*
* Description:
*
* Argument:
* PortPtr -- Port Status
* portNo -- No. Of The M803xx Port
* Len -- Length Of The Data
* Addr -- Base Address of the M803xx
* Eof -- 1 - end of frame
*
* Return:
* void
*
* Modified history
*------------------------------
* 2006-3-23 15:13 ZhengaQishan Created.
*
**/
void receiveT38FaxPkt(M803xx_PORT_STATE *PortPtr, UINT8 portNo, UINT16 Len, UINT32 Addr, UINT8 Eof)
{
UINT16 ipPktLen;
UINT16 udpPktLen;
/*UINT32 tmpValue;*/
UINT32 rxBufAddrH,rxBufAddrL;
UINT32 Port;
VOIP_MUX_STRUCT Msg;
UINT32 *bufAddr = (UINT32 *)NULL;
UINT32 *buf = (UINT32 *)NULL;
UINT32 *tempAddr = (UINT32 *)NULL;
TRTPHeader *pRTPHdr = (TRTPHeader*)NULL;
UINT8 *ip_hdrTemp = (UINT8 *)NULL;
UINT8 Rtp_Head[100] , i=0;
UINT32 gPort;
int dbgClass = 0;
memset(Rtp_Head,0,sizeof(Rtp_Head));
if(m_port[portNo].CallType == LFXS_CALLTYPE_IN)
{
dbgClass = /*faxrelaypacket|*/ faxrelaypacketcalled;
}
else if(m_port[portNo].CallType == LFXS_CALLTYPE_OUT)
{
dbgClass = /*faxrelaypacket |*/ faxrelaypacketcalling;
}
gPort = (((UINT32)((CON_TO_DP[m_port[portNo].Channel].chan)+1))<<16)+(UINT32)((CON_TO_DP[m_port[portNo].Channel].chip+1)<<24); /* 全局端口号 */
if(M80320_Debug[portNo] == 1)
M80320_PRINTF("port(%d) rcv data %d bytes!\n", portNo, Len);
/* 全局端口号 */
Port = (((UINT32)((CON_TO_DP[m_port[portNo].Channel].chan) + 1) << 16))+((CON_TO_DP[m_port[portNo].Channel].chip + 1) << 24);
semTake(M803xxQueueSem[portNo / 8], WAIT_FOREVER);
if((m_port[portNo].status == TalkStatus))
{
M803xx_ALLOC_PCI_ADDR(bufAddr,tempAddr,buf);
if (buf == NULL)
{
rxBufAddrH = ((UINT32)((UINT8 *)PciReadBuf[m_port[portNo].Channel] + PACKET_START_SIZE)) >> 16;
rxBufAddrL = ((UINT32)((UINT8 *)PciReadBuf[m_port[portNo].Channel] + PACKET_START_SIZE)) & 0x0000ffff;
QueueTxBoxMsg(CMD_PCIREQ, 0x400, rxBufAddrH, rxBufAddrL, portNo);
printf("!!!!!!!!!!!!!!M803xx PktAlloc Fail\n");
BUFNULL++;
semGive(M803xxQueueSem[portNo / 8]);
return;
}
rxBufAddrH = ((UINT32)((UINT8 *)bufAddr + PACKET_START_SIZE)) >> 16;
rxBufAddrL = ((UINT32)((UINT8 *)bufAddr + PACKET_START_SIZE)) & 0x0000ffff;
QueueTxBoxMsg(CMD_PCIREQ, 0x400, rxBufAddrH, rxBufAddrL, portNo);
}
else
{
M803xx_Stop_PciReq[portNo] = 1;
semGive(M803xxQueueSem[portNo / 8]);
return;
}
semGive(M803xxQueueSem[portNo / 8]);
M803xx_ADDR(PciReadBuf[m_port[portNo].Channel]);
pRTPHdr = (TRTPHeader*)(((UINT8 *)PciReadBuf[m_port[portNo].Channel]) + PACKET_START_SIZE);
RecordRTPTimeStamp[portNo] = Swap_DwordM(pRTPHdr->RTPTimeStamp);
ip_hdrTemp = (UINT8 *)PciReadBuf[m_port[portNo].Channel];
/*拷贝IP + UDP头*/
memcpy(ip_hdrTemp, gpT38FaxParameter[portNo]->t38FaxArg.ipUdpHeader, PACKET_START_SIZE);
/*insert IP length*/
ipPktLen = Len + UDP_HEADER_LEN + IPV4_HEADER_LEN;
*(ip_hdrTemp + IPV4_PKT_LEN_OFFSET) = (ipPktLen >> 8)& 0xFF;
*(ip_hdrTemp + IPV4_PKT_LEN_OFFSET + 1) = (ipPktLen)& 0xFF;
/*Inser UDP length*/
udpPktLen = Len + UDP_HEADER_LEN;
*(ip_hdrTemp + UDP_PKT_LEN_OFFSET) = (udpPktLen >> 8)& 0xFF;
*(ip_hdrTemp + UDP_PKT_LEN_OFFSET + 1) = (udpPktLen)& 0xFF;
#if 0
SET_IP_HEADER_HEADER_CHECKSUM(ip_hdr, 0);
SET_IP_HEADER_HEADER_CHECKSUM(ip_hdr, SWAP16(~GLUE_CKSUM(ip_hdr,
(GET_IP_HEADER_HEADER_LENGTH(ip_hdr) << 1))));
#else
SET_IP_HEADER_HEADER_CHECKSUM (ip_hdrTemp, 0);
SET_IP_HEADER_HEADER_CHECKSUM (ip_hdrTemp,
ROS_HTONS(~GLUE_CKSUM(ip_hdrTemp,(GET_IP_HEADER_HEADER_LENGTH(ip_hdrTemp) << 1))) );
#endif
/*暂时不需要校验和*/
Msg.mestype = RTP_PACKET; /* 应该是UDPTL包 */
Msg.portno = Port; /* 全局端口号 */
Msg.msgLen = ipPktLen;
Msg.mesptr = (UINT32 *)PciReadBuf[m_port[portNo].Channel];
/*add for T.38 fax收包的debug信息*/
faxDebug(dbgClass, gPort, " Send packet %d bytes!", Len);
if (Len>100)
{
Len = 100;
}
for(i=0; i<Len; i++)
{
Rtp_Head[i] = (UINT8)(((UINT8 *)PciReadBuf[m_port[portNo].Channel])[UDP_HEADER_LEN+IPV4_HEADER_LEN+i]);
}
faxDebug(dbgClass, gPort, " packet %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", Rtp_Head[0],Rtp_Head[1],Rtp_Head[2],Rtp_Head[3],Rtp_Head[4],Rtp_Head[5],Rtp_Head[6],Rtp_Head[7],Rtp_Head[8],Rtp_Head[9],Rtp_Head[10],Rtp_Head[11]);
/*end add*/
M803xxMsgProcess((VOIP_MUX_STRUCT *) &Msg);
semTake(M803xxQueueSem[portNo / 8], WAIT_FOREVER);
PciReadBuf[m_port[portNo].Channel] = bufAddr;
semGive(M803xxQueueSem[portNo / 8]);
}
/*-----------------------------
* showFaxSttInfo - 查看T.38 FAX所有统计计数
*
* Description:
*
* Argument:
* int slot - 槽位号,取值范围从1 到 8
* int port - 端口号,取值范围从1 到 8
*
* Modified history
*------------------------------
* 2006-3-15 15:13 ZhengaQishan Created.
*
**/
void Send_T38FaxStatics_Cmd(int slot, int port)
{
int portNo;
portNo = 8 * (slot - 1) + port - 1;
/*只有当芯片工作在传真模式时才能执行此操作,否则会将芯片状态机搞乱*/
if (m_port[portNo].VAD != Fax)
{
printf("No T.38 FAX mode!\n");
return;
}
semTake(M803xxQueueSem[portNo/8], WAIT_FOREVER);
#if SendOpenChannelMsgFirst
if (OK == M80320_checkOpenChanQueue((UINT8)portNo, 0x0, FUN_FINFOIND))
SendMsgToOpenChannelQueue((UINT16)(CMD_CMDDAT |(port - 1)) , 0xfd00, 0x0100 | CMD_TYPE_FAX_COMBINED_Statics, FUN_FINFOIND, (UINT8)portNo);
#else
QueueTxBoxMsg(CMD_CMDDAT, 0xfd00, 0x010f, FUN_FINFOIND, portNo);
#endif
semGive(M803xxQueueSem[portNo/8]);
}
/*-----------------------------
* showFaxSttInfo - 回显T.38 FAX所有统计计数
*
* Description:
*
* Argument:
* portNo -- No. Of The M803xx Port
* void *pBuf - 统计信息存放的buffer
*
* Modified history
*------------------------------
* 2006-3-15 16:13 ZhengaQishan Created.
*
**/
void showFaxSttInfo(int portNo, void *pBuf)
{
T38_FAX_STATISTIC *pStt = (T38_FAX_STATISTIC *)pBuf;
if ((void *)NULL == pBuf)
return;
printf("portNo = %d\n", portNo);
printf("formatVer = %d\n", pStt->formatVer);
printf("callTimer = %d\n", pStt->callTimer);
printf("currPlayOutDelay = %d\n", pStt->currPlayOutDelay);
printf("minPlayOutDelay = %d\n", pStt->minPlayOutDelay);
printf("maxPlayOutDelay = %d\n", pStt->maxPlayOutDelay);
printf("bufOverFlow = %d\n", pStt->bufOverFlow);
printf("bufUnderFlow = %d\n", pStt->bufUnderFlow);
printf("TxPkt = %d\n", pStt->TxPkt);
printf("TxDuration = %d\n", pStt->TxDuration);
printf("RxPkt = %d\n", pStt->RxPkt);
printf("RxDuration = %d\n", pStt->RxDuration);
printf("TxPage = %d\n", pStt->TxPage);
printf("RxPage = %d\n", pStt->RxPage);
printf("pktOutOfSequence = %d\n", pStt->pktOutOfSequence);
printf("badProtocolHeader = %d\n", pStt->badProtocolHeader);
printf("dataPumpMode = %d\n", pStt->dataPumpMode);
printf("rxLevel = %d\n", pStt->rxLevel);
printf("phaseJitter = %d\n", pStt->phaseJitter);
printf("freqOffset = %d\n", pStt->freqOffset);
printf("eyeQualityMonitor = %d\n", pStt->eyeQualityMonitor);
printf("pktLossConceament = %d\n", pStt->pktLossConceament);
printf("TxBytes = %d\n", pStt->TxBytes);
printf("RxBytes = %d\n", pStt->RxBytes);
printf("hsModulation = %d\n", pStt->hsModulation);
}
/*==============================DEBUG CODE======================================*/
/*-----------------------------
* showT38FaxCfgArg - 显示T.38 FAX的接口配置参数
*
* Description:
*
* Argument:
* int slot - 槽位号,取值范围从1 到 8
* int port - 端口号,取值范围从1 到 8
*
* Modified history
*------------------------------
* 2006-3-25 16:13 ZhengaQishan Created.
*
**/
void showT38FaxCfgArg(int slot, int port)
{
int portNo;
T38_FAX_ARG_T *pFaxOper = (T38_FAX_ARG_T *)NULL;
portNo = 8 * (slot -1) + port - 1;
if ((PortStatusParameter *)NULL == gpT38FaxParameter[portNo])
{
printf (" Slot (%d) Port (%d) is not exist!\n", slot, port);
return;
}
pFaxOper = &(gpT38FaxParameter[portNo]->t38FaxArg.chipArg);
printf (" Slot(%d) port(%d) T38 FAX Argument(user config):\n\n", slot, port);
printf (" Address of Arg: 0x%x\n", (UINT32)gpT38FaxParameter[portNo]);
printf (" bearerInformation: %d\n", gpT38FaxParameter[portNo]->bearerInformation);
printf (" FAX mode (0 - T38, 1 - pass through): %d\n", gpT38FaxParameter[portNo]->faxMode);
printf (" Packet Loss Concealment: %d\n (0 - No, 1 - replaced by white lines, 2 - replaced by last good lines)\n", pFaxOper->lossPktConcealment);
printf (" ECM(0 - allow, 1 - Prevent): %d \n", pFaxOper->ECMFlag);
printf (" Fax Page Data Redundancy: %d\n", pFaxOper->redundancyNumOfPageData);
printf (" T.30 MSG Redundancy: %d\n", pFaxOper->redundancyNumOfT30Msg);
printf (" Speed limited: %d\n", pFaxOper->speed);
printf (" Error Recovery Method: %d\n", pFaxOper->errRecoverMethod);
printf (" TCF procedure(0 - TCF pass across IP network, 1 - no): %d\n", pFaxOper->tcfPassThroughIpNetwork);
printf (" FAX signal level: -%d dBm\n", pFaxOper->level);
printf (" Src UDP Port No: %d\n", gpT38FaxParameter[portNo]->localRtpAddress.port);
printf (" Des UDP Port No: %d\n", gpT38FaxParameter[portNo]->remoteRtpAddress.port);
printf (" Src IP address: %d.%d.%d.%d\n", gpT38FaxParameter[portNo]->localRtpAddress.ipAddr.addr[0],
gpT38FaxParameter[portNo]->localRtpAddress.ipAddr.addr[1],
gpT38FaxParameter[portNo]->localRtpAddress.ipAddr.addr[2],
gpT38FaxParameter[portNo]->localRtpAddress.ipAddr.addr[3]);
printf (" Des IP address: %d.%d.%d.%d\n", gpT38FaxParameter[portNo]->remoteRtpAddress.ipAddr.addr[0],
gpT38FaxParameter[portNo]->remoteRtpAddress.ipAddr.addr[1],
gpT38FaxParameter[portNo]->remoteRtpAddress.ipAddr.addr[2],
gpT38FaxParameter[portNo]->remoteRtpAddress.ipAddr.addr[3]);
printf (" The pointer to IP Header: 0x%x\n", (int)gpT38FaxParameter[portNo]->t38FaxArg.ipUdpHeader);
}
void getVoiceCodecID(int capId, char *pCoderStr)
{
switch(capId)
{
case CODER_TYPE_G711Alaw:
strcpy(pCoderStr, "G711Alaw");
break;
case CODER_TYPE_G711Ulaw:
strcpy(pCoderStr, "G711Ulaw");
break;
case CODER_TYPE_G723:
strcpy(pCoderStr, "G723");
break;
case CODER_TYPE_G728:
strcpy(pCoderStr, "G728");
break;
case CODER_TYPE_G729:
strcpy(pCoderStr, "G729");
break;
case CODER_TYPE_G729a:
strcpy(pCoderStr, "G729a");
break;
case CODER_TYPE_G729wb:
strcpy(pCoderStr, "G729wb");
break;
case CODER_TYPE_G729awb:
strcpy(pCoderStr, "G729awb");
break;
default:
strcpy(pCoderStr, "Error CodecID");
break;
}
}
/*-----------------------------
* showVoiceCfgArg - 显示Voice的接口配置参数
*
* Description:
*
* Argument:
* int slot - 槽位号,取值范围从1 到 8
* int port - 端口号,取值范围从1 到 8
*
* Modified history
*------------------------------
* 2006-4-06 16:13 ZhengaQishan Created.
*
**/
void showVoiceCfgArg(int slot, int port)
{
int portNo;
char coderStr[25];
portNo = 8 * (slot -1) + port - 1;
getVoiceCodecID(Parameter[portNo].bearerInformation, coderStr);
printf (" Slot(%d) port(%d) VOICE Argument(user config):\n\n", slot, port);
printf (" Address of Arg: 0x%x\n", (UINT32)(&Parameter[portNo]));
printf (" FAX mode (0 - T38, 1 - pass through): %d\n", Parameter[portNo].faxMode);
printf (" CODEC Mode: %s\n", coderStr);
printf (" Jitter Value: %d\n", Parameter[portNo].JitterValue);
printf (" Src UDP Port No: %d\n", Parameter[portNo].localRtpAddress.port);
printf (" Des UDP Port No: %d\n", Parameter[portNo].remoteRtpAddress.port);
printf (" Src IP address: %d.%d.%d.%d\n", Parameter[portNo].localRtpAddress.ipAddr.addr[0],
Parameter[portNo].localRtpAddress.ipAddr.addr[1],
Parameter[portNo].localRtpAddress.ipAddr.addr[2],
Parameter[portNo].localRtpAddress.ipAddr.addr[3]);
printf (" Des IP address: %d.%d.%d.%d\n", Parameter[portNo].remoteRtpAddress.ipAddr.addr[0],
Parameter[portNo].remoteRtpAddress.ipAddr.addr[1],
Parameter[portNo].remoteRtpAddress.ipAddr.addr[2],
Parameter[portNo].remoteRtpAddress.ipAddr.addr[3]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -