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

📄 tupptl.cpp

📁 ABis无线接口全套资料
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* ======================================================================== *\
 |
 |
 |  JOYIT Communication Technology
 |  Copyright (C) 2003~2006,  All Right Reserved.
 |
 |  System: Programmable Signaling Gateway
 |  Sub-system:
 |  Filename: tupptl.cpp
 |  Environment: Red Hat Linux 7.2 & GNU C/C++ Compiler 2.96
 |  Function description: Tup Protocol class
 |
\* ======================================================================== */


#ifndef _TUPPTL_HPP
#include "tupptl.hpp"
#endif

#ifndef _TUPFMT_HPP
#include "tupfmt.hpp"
#endif

#ifndef _JOYITIEFMT_HPP
#include "joyitiefmt.hpp"
#endif


UINT16 CTupPdu::TupMsg2JoyitMsg[MAX_MSG];
UINT8 CTupPdu::JoyitMsg2TupMsg[MAX_MSG];

CTupPdu::CTupPdu( ) : CPduBase(0, TUP_VAR_CHINA, 24, 0)
{
	ownedPcmId = 0;
	ownedTsId = 0;
}

CTupPdu::CTupPdu(CTupPdu& s) : CPduBase(s) // Copy construction function. Add 2005-11-19, by Wujianjin.
{
	ownedPcmId = s.ownedPcmId;
	ownedTsId = s.ownedTsId;
}

CTupPdu::CTupPdu(UINT8 pt, UINT8 pv, UINT8 pcf, UINT16 mt) : CPduBase(pt, pv, pcf, mt)
{
}

CTupPdu::~CTupPdu( )
{
}

void CTupPdu::InitStaticData( )	// Initialize static data member.
{
	InitTupMsg( );
	InitJoyitMsg( );

}

void CTupPdu::InitTupMsg( )	// Initialize TupMsg2JoyitMsg array.
{
	memset(TupMsg2JoyitMsg, 0xff, sizeof(UINT16)*MAX_MSG);

	TupMsg2JoyitMsg[TUP_IAM]	= PSG_MSG_TUP_IAM;
	TupMsg2JoyitMsg[TUP_IAI]	= PSG_MSG_TUP_IAI;
	TupMsg2JoyitMsg[TUP_SAM]	= PSG_MSG_TUP_SAM;
	TupMsg2JoyitMsg[TUP_SAO]	= PSG_MSG_TUP_SAO;
	TupMsg2JoyitMsg[TUP_GSM]	= PSG_MSG_TUP_GSM;
	TupMsg2JoyitMsg[TUP_COT]	= PSG_MSG_TUP_COT;
	TupMsg2JoyitMsg[TUP_CCF]	= PSG_MSG_TUP_CCF;
	TupMsg2JoyitMsg[TUP_GRQ]	= PSG_MSG_TUP_GRQ;
	TupMsg2JoyitMsg[TUP_ACM]	= PSG_MSG_TUP_ACM;
	TupMsg2JoyitMsg[TUP_CHG]	= PSG_MSG_TUP_CHG;
	
	TupMsg2JoyitMsg[TUP_SEC]	= PSG_MSG_TUP_SEC;
	TupMsg2JoyitMsg[TUP_CGC]	= PSG_MSG_TUP_CGC;
	TupMsg2JoyitMsg[TUP_NNC]	= PSG_MSG_TUP_NNC;
	TupMsg2JoyitMsg[TUP_ADI]	= PSG_MSG_TUP_ADI;
	TupMsg2JoyitMsg[TUP_CFL]	= PSG_MSG_TUP_CFL;
	TupMsg2JoyitMsg[TUP_SSB]	= PSG_MSG_TUP_SSB;
	TupMsg2JoyitMsg[TUP_UNN]	= PSG_MSG_TUP_UNN;
	TupMsg2JoyitMsg[TUP_LOS]	= PSG_MSG_TUP_LOS;
	TupMsg2JoyitMsg[TUP_SST]	= PSG_MSG_TUP_SST;
	TupMsg2JoyitMsg[TUP_ACB]	= PSG_MSG_TUP_ACB;
	
	TupMsg2JoyitMsg[TUP_DPN]	= PSG_MSG_TUP_DPN;
	TupMsg2JoyitMsg[TUP_EUM]	= PSG_MSG_TUP_EUM;
	TupMsg2JoyitMsg[TUP_ANU]	= PSG_MSG_TUP_ANU;
	TupMsg2JoyitMsg[TUP_ANC]	= PSG_MSG_TUP_ANC;
	TupMsg2JoyitMsg[TUP_ANN]	= PSG_MSG_TUP_ANN;
	TupMsg2JoyitMsg[TUP_CBK]	= PSG_MSG_TUP_CBK;
	TupMsg2JoyitMsg[TUP_IAM]	= PSG_MSG_TUP_IAM;
	TupMsg2JoyitMsg[TUP_CLF]	= PSG_MSG_TUP_CLF;
	TupMsg2JoyitMsg[TUP_RAN]	= PSG_MSG_TUP_RAN;
	TupMsg2JoyitMsg[TUP_FOT]	= PSG_MSG_TUP_FOT;
	
	TupMsg2JoyitMsg[TUP_CCL]	= PSG_MSG_TUP_CCL;
	TupMsg2JoyitMsg[TUP_RLG]	= PSG_MSG_TUP_RLG;
	TupMsg2JoyitMsg[TUP_BLO]	= PSG_MSG_TUP_BLO;
	TupMsg2JoyitMsg[TUP_BLA]	= PSG_MSG_TUP_BLA;
	TupMsg2JoyitMsg[TUP_UBL]	= PSG_MSG_TUP_UBL;
	TupMsg2JoyitMsg[TUP_UBA]	= PSG_MSG_TUP_UBA;
	TupMsg2JoyitMsg[TUP_CCR]	= PSG_MSG_TUP_CCR;
	TupMsg2JoyitMsg[TUP_RSC]	= PSG_MSG_TUP_RSC;
	TupMsg2JoyitMsg[TUP_MGB]	= PSG_MSG_TUP_MGB;
	TupMsg2JoyitMsg[TUP_MBA]	= PSG_MSG_TUP_MBA;
	
	TupMsg2JoyitMsg[TUP_MGU]	= PSG_MSG_TUP_MGU;
	TupMsg2JoyitMsg[TUP_MUA]	= PSG_MSG_TUP_MUA;
	TupMsg2JoyitMsg[TUP_HGB]	= PSG_MSG_TUP_HGB;
	TupMsg2JoyitMsg[TUP_HBA]	= PSG_MSG_TUP_HBA;
	TupMsg2JoyitMsg[TUP_HGU]	= PSG_MSG_TUP_HGU;
	TupMsg2JoyitMsg[TUP_HUA]	= PSG_MSG_TUP_HUA;
	TupMsg2JoyitMsg[TUP_GRS]	= PSG_MSG_TUP_GRS;
	TupMsg2JoyitMsg[TUP_GRA]	= PSG_MSG_TUP_GRA;
	TupMsg2JoyitMsg[TUP_SGB]	= PSG_MSG_TUP_SGB;
	TupMsg2JoyitMsg[TUP_SBA]	= PSG_MSG_TUP_SBA;
	
	TupMsg2JoyitMsg[TUP_SGU]	= PSG_MSG_TUP_SGU;
	TupMsg2JoyitMsg[TUP_SUA]	= PSG_MSG_TUP_SUA;
	TupMsg2JoyitMsg[TUP_ACC]	= PSG_MSG_TUP_ACC;
	TupMsg2JoyitMsg[TUP_MPM]	= PSG_MSG_TUP_MPM;
	TupMsg2JoyitMsg[TUP_OPR]	= PSG_MSG_TUP_OPR;
	TupMsg2JoyitMsg[TUP_SLB]	= PSG_MSG_TUP_SLB;
	TupMsg2JoyitMsg[TUP_STB]	= PSG_MSG_TUP_STB;
	TupMsg2JoyitMsg[TUP_MAL]	= PSG_MSG_TUP_MAL;
}

void CTupPdu::InitJoyitMsg( )	// Initialize JoyitMsg2TupMsg array.
{
	memset(JoyitMsg2TupMsg, 0xff, MAX_MSG);
	
	JoyitMsg2TupMsg[PSG_MSG_TUP_IAM-0x100]   = TUP_IAM;
	JoyitMsg2TupMsg[PSG_MSG_TUP_IAI-0x100]   = TUP_IAI;
	JoyitMsg2TupMsg[PSG_MSG_TUP_SAM-0x100]   = TUP_SAM;
	JoyitMsg2TupMsg[PSG_MSG_TUP_SAO-0x100]   = TUP_SAO;
	JoyitMsg2TupMsg[PSG_MSG_TUP_GSM-0x100]   = TUP_GSM;
	JoyitMsg2TupMsg[PSG_MSG_TUP_COT-0x100]   = TUP_COT;
	JoyitMsg2TupMsg[PSG_MSG_TUP_CCF-0x100]   = TUP_CCF;
	JoyitMsg2TupMsg[PSG_MSG_TUP_GRQ-0x100]   = TUP_GRQ;
	JoyitMsg2TupMsg[PSG_MSG_TUP_ACM-0x100]   = TUP_ACM;
	JoyitMsg2TupMsg[PSG_MSG_TUP_CHG-0x100]   = TUP_CHG;
	
	JoyitMsg2TupMsg[PSG_MSG_TUP_SEC-0x100]   = TUP_SEC;
	JoyitMsg2TupMsg[PSG_MSG_TUP_CGC-0x100]   = TUP_CGC;
	JoyitMsg2TupMsg[PSG_MSG_TUP_NNC-0x100]   = TUP_NNC;
	JoyitMsg2TupMsg[PSG_MSG_TUP_ADI-0x100]   = TUP_ADI;
	JoyitMsg2TupMsg[PSG_MSG_TUP_CFL-0x100]   = TUP_CFL;
	JoyitMsg2TupMsg[PSG_MSG_TUP_SSB-0x100]   = TUP_SSB;
	JoyitMsg2TupMsg[PSG_MSG_TUP_UNN-0x100]   = TUP_UNN;
	JoyitMsg2TupMsg[PSG_MSG_TUP_LOS-0x100]   = TUP_LOS;
	JoyitMsg2TupMsg[PSG_MSG_TUP_SST-0x100]   = TUP_SST;
	JoyitMsg2TupMsg[PSG_MSG_TUP_ACB-0x100]   = TUP_ACB;
	
	JoyitMsg2TupMsg[PSG_MSG_TUP_DPN-0x100]   = TUP_DPN;
	JoyitMsg2TupMsg[PSG_MSG_TUP_EUM-0x100]   = TUP_EUM;
	JoyitMsg2TupMsg[PSG_MSG_TUP_ANU-0x100]   = TUP_ANU;
	JoyitMsg2TupMsg[PSG_MSG_TUP_ANC-0x100]   = TUP_ANC;
	JoyitMsg2TupMsg[PSG_MSG_TUP_ANN-0x100]   = TUP_ANN;
	JoyitMsg2TupMsg[PSG_MSG_TUP_CBK-0x100]   = TUP_CBK;
	JoyitMsg2TupMsg[PSG_MSG_TUP_IAM-0x100]   = TUP_IAM;
	JoyitMsg2TupMsg[PSG_MSG_TUP_CLF-0x100]   = TUP_CLF;
	JoyitMsg2TupMsg[PSG_MSG_TUP_RAN-0x100]   = TUP_RAN;
	JoyitMsg2TupMsg[PSG_MSG_TUP_FOT-0x100]   = TUP_FOT;
	
	JoyitMsg2TupMsg[PSG_MSG_TUP_CCL-0x100]   = TUP_CCL;
	JoyitMsg2TupMsg[PSG_MSG_TUP_RLG-0x100]   = TUP_RLG;
	JoyitMsg2TupMsg[PSG_MSG_TUP_BLO-0x100]   = TUP_BLO;
	JoyitMsg2TupMsg[PSG_MSG_TUP_BLA-0x100]   = TUP_BLA;
	JoyitMsg2TupMsg[PSG_MSG_TUP_UBL-0x100]   = TUP_UBL;
	JoyitMsg2TupMsg[PSG_MSG_TUP_UBA-0x100]   = TUP_UBA;
	JoyitMsg2TupMsg[PSG_MSG_TUP_CCR-0x100]   = TUP_CCR;
	JoyitMsg2TupMsg[PSG_MSG_TUP_RSC-0x100]   = TUP_RSC;
	JoyitMsg2TupMsg[PSG_MSG_TUP_MGB-0x100]   = TUP_MGB;
	JoyitMsg2TupMsg[PSG_MSG_TUP_MBA-0x100]   = TUP_MBA;
	
	JoyitMsg2TupMsg[PSG_MSG_TUP_MGU-0x100]   = TUP_MGU;
	JoyitMsg2TupMsg[PSG_MSG_TUP_MUA-0x100]   = TUP_MUA;
	JoyitMsg2TupMsg[PSG_MSG_TUP_HGB-0x100]   = TUP_HGB;
	JoyitMsg2TupMsg[PSG_MSG_TUP_HBA-0x100]   = TUP_HBA;
	JoyitMsg2TupMsg[PSG_MSG_TUP_HGU-0x100]   = TUP_HGU;
	JoyitMsg2TupMsg[PSG_MSG_TUP_HUA-0x100]   = TUP_HUA;
	JoyitMsg2TupMsg[PSG_MSG_TUP_GRS-0x100]   = TUP_GRS;
	JoyitMsg2TupMsg[PSG_MSG_TUP_GRA-0x100]   = TUP_GRA;
	JoyitMsg2TupMsg[PSG_MSG_TUP_SGB-0x100]   = TUP_SGB;
	JoyitMsg2TupMsg[PSG_MSG_TUP_SBA-0x100]   = TUP_SBA;
	
	JoyitMsg2TupMsg[PSG_MSG_TUP_SGU-0x100]   = TUP_SGU;
	JoyitMsg2TupMsg[PSG_MSG_TUP_SUA-0x100]   = TUP_SUA;
	JoyitMsg2TupMsg[PSG_MSG_TUP_ACC-0x100]   = TUP_ACC;
	JoyitMsg2TupMsg[PSG_MSG_TUP_MPM-0x100]   = TUP_MPM;
	JoyitMsg2TupMsg[PSG_MSG_TUP_OPR-0x100]   = TUP_OPR;
	JoyitMsg2TupMsg[PSG_MSG_TUP_SLB-0x100]   = TUP_SLB;
	JoyitMsg2TupMsg[PSG_MSG_TUP_STB-0x100]   = TUP_STB;
	JoyitMsg2TupMsg[PSG_MSG_TUP_MAL-0x100]   = TUP_MAL;
}


UINT16 CTupPdu::ToJoyitMsg(UINT8 id)	// ISUP message type to TUP API message index.
{

	return (id < MAX_MSG) ? TupMsg2JoyitMsg[id] : 0xFFFF;
}

uchar CTupPdu::ToTupMsg(UINT16 id)	// ISUP API message index to TUP message type.
{
	UINT8 msgindex = id - 0x100;

	return (msgindex < MAX_MSG) ? JoyitMsg2TupMsg[msgindex] : 0xFF;
}

int CTupPdu::Unpacked(char  * ptr, UINT16 len, UINT8 mod)
{
	int r = 0;

	switch (mod)
	{
		case MOD_JOYIT:
			r = DecomposeJoyitApi(ptr, len);
			break;

		case MOD_TUP:
			r = DecomposeTupPdu(ptr, len);
			break;
			
		default:
			break;
	} // End of switch(mod)

	return r;
}

//===================================================================================
char  * CTupPdu::OutPut(UINT16& len, UINT8 mod)
{
	char  * pPdu = NULL;
	len = 0;

	switch (mod)
	{
		case MOD_JOYIT:
		case MOD_TUPAPI:
		case MOD_ISUPAPI:
		case MOD_Q931API:
			pPdu = ComposeJoyitApi(len);
			break;

		case MOD_TUP:
			pPdu = ComposeTupPdu(len);
			break;

		default:
			break;
	} // End of switch(mod)
	
	return pPdu;
}

//==============================================================================
int CTupPdu::DecomposeTupPdu(char  * ptr, UINT16 len)
{
	int r = 0;
	char *pPdu = ptr;

	char tmpbuf[64];
	memset(tmpbuf, 0, 64);

	LengthOfHeader = (24 == GetSS7Pcf( )) ? sizeof(STupHead24bits) : sizeof(STupHead14bits);
	
	if (len < LengthOfHeader)
	{
		// Exception.                
		r = -1; // Message data string too short.
	}
	else
	{ // Begin to decompose pdu,Store the TUP message header.
		memcpy(Header, pPdu, LengthOfHeader);
		pPdu += LengthOfHeader;

		uchar ieLen = 0, numLen = 0;
		unsigned char msgtype = Header[LengthOfHeader-1];

		SetMessageType(CTupPdu::ToJoyitMsg(msgtype));
		if (0xFFFF == GetMessageType( ))
		{
			r = -2; // ISUP message type unrecognized.
		}
		else
		{
			// Get  parameters.
			switch (GetMessageType( ))
			{
				case PSG_MSG_TUP_IAM:
				{
					PutIE(PSG_IE_CLNPRTCTG, sizeof(STupCallingPartysCatetgory), pPdu);
					pPdu += sizeof(STupCallingPartysCatetgory);

					//---------------------------------------------------------------
					// Need to get the address signal numbers here to server the 
					// function of unwrapcalledpartynumber().
					//---------------------------------------------------------------
					char * tmp = pPdu;
					STupIaMessageIndicators tmpt; 
					memcpy(&tmpt, (void*)tmp, sizeof(STupIaMessageIndicators));
					numLen = tmpt.noas; 
				    tmpt.noas = 0;
					//----------------------------------------------------------------

			
					PutIE(PSG_IE_WMSGIND, sizeof(STupIaMessageIndicators), pPdu);
					pPdu += sizeof(STupIaMessageIndicators);

					 //Unwrap Called address.
				    ieLen = UnwrapCalledPartyNumber((unsigned char *)pPdu, numLen, (unsigned char *)tmpbuf);
					PutIE(PSG_IE_CLDPRTNUM, numLen, tmpbuf);

					pPdu += ieLen;
				}
				break;

				case PSG_MSG_TUP_IAI:
				{
					PutIE(PSG_IE_CLNPRTCTG, sizeof(STupCallingPartysCatetgory), pPdu);
					pPdu += sizeof(STupCallingPartysCatetgory);

					//---------------------------------------------------------------
					// Need to get the address signal numbers here to server the 
					// function of unwrapcalledpartynumber.
					//---------------------------------------------------------------
					char * tmp = pPdu;
					STupIaMessageIndicators tmpt; // = new SNatureOfConnection;
					memcpy(&tmpt, (void*)tmp, sizeof(STupIaMessageIndicators));
					numLen = tmpt.noas; 
					tmpt.noas = 0;

			
					PutIE(PSG_IE_WMSGIND, sizeof(STupIaMessageIndicators), pPdu);
					pPdu += sizeof(STupIaMessageIndicators);

					//Unwrap Called address.
				    ieLen = UnwrapCalledPartyNumber((unsigned char *)pPdu, numLen, (unsigned char *)tmpbuf);
					PutIE(PSG_IE_CLDPRTNUM, numLen, tmpbuf);
					pPdu += ieLen;

					//-------------------------------------------------------------------------	 
					// In order to getting the optional IE flags in IAI message,as the judge of
					// the packet of the optional IE.
					//---------------------------------------------------------------
				    tmp = pPdu;
					STupFirstIndicator pt; // = new STupMessageCompatibilityInformation;
					memcpy((char *)&pt, (char *)tmp, sizeof(STupFirstIndicator));
					unsigned char cllf = pt.cli; // Calling line identity indicator.
					unsigned char orgf = pt.oca; // Original called address indicator.
					//----------------------------------------------------------------------------

					PutIE(PSG_IE_FSTIND, sizeof(STupFirstIndicator), pPdu);
					pPdu += sizeof(STupFirstIndicator);

					// block usregroup.UNUSED.
				    // append calling user information.UNUSED.
				    // append route .UNUSED.

					// calling party numbers.
					if (cllf) 
					{
						char para[2];
						// unsigned char flg = 0;

						//Calling address Unwrap and get the address length.
						memset(tmpbuf, 0, 64);
						UnwrapCallingPartyNumber((unsigned char *)pPdu, (unsigned char*)&para, (unsigned char *)tmpbuf);
						numLen = para[0];
						ieLen = para[1];
			
						PutIE(PSG_IE_CLNLINEID, numLen, tmpbuf);
						pPdu += ieLen;
					}

					// Original called party numbers.
					if (orgf) 
					{
						char para[2];
						// unsigned char flg = 1;

						// Original Called address Unwrap.
						memset(tmpbuf, 0, 64);
						UnwrapOriginalCalledPartyNumber((unsigned char *)pPdu, (unsigned char*)&para,
							                             (unsigned char *)tmpbuf);
						
						numLen = para[0];
						ieLen = para[1];

						PutIE(PSG_IE_ORGCLDNUM, numLen, tmpbuf);
						pPdu += ieLen;
					}
				}
				break;

				case PSG_MSG_TUP_SAM:
				{
					/*
					char * tmp = pPdu;
					STupSamAddressNumber tmpt; // = new SNatureOfConnection;
					memcpy(&tmpt, (void*)tmp, sizeof (STupSamAddressNumber));
					numLen = tmpt.num; 
					tmpt.num = 0;

					PutIE(PSG_IE_ADDRCNT, sizeof(STupSamAddressNumber), pPdu);
					pPdu += sizeof(STupSamAddressNumber);
					*/

					//Unwrap Called address.
					tmpbuf[0] = *pPdu;
					ieLen = UnwrapCalledPartyNumber((unsigned char *)pPdu+1, numLen, (unsigned char *)tmpbuf+1);
					PutIE(PSG_IE_SUBNUM, numLen+1, tmpbuf);

					pPdu += (ieLen+1);
				}
					break;

				case PSG_MSG_TUP_SAO:
				{
					/*
					char * tmp = pPdu;
					STupSaoAddressNumber tmpt; 
					memcpy(&tmpt, (void*)tmp, sizeof (STupSaoAddressNumber));
					tmpt.prs = 0;
					*/
					STupSubsequentNumber_H  * snh = (STupSubsequentNumber_H *)tmpbuf;
					snh->noas = 1;
					snh->spare = 0;

					tmpbuf[1] = ((STupSaoAddressNumber *)pPdu)->digit;
					// PutIE(PSG_IE_ADDRSGN, sizeof(STupSaoAddressNumber), pPdu);
					PutIE(PSG_IE_SUBNUM, 2, tmpbuf);

					pPdu += sizeof(STupSaoAddressNumber);
				}
					break;

				case PSG_MSG_TUP_GSM:
				{
					/////////////////////////////////////////////////////////////////////
					// Keep the respone information flag_value.
					unsigned char cll;
					unsigned char cci;
					// unsigned char swt; // Not used in CHINA TUP.
					unsigned char ocl;
				
					// char * tmp = pPdu;
					STupResponseTypeIndicator tmpt; 
					memcpy(&tmpt, pPdu, sizeof (STupResponseTypeIndicator));
					cll = tmpt.cpc; // Calling party category indicator.
					cci = tmpt.cli; // Calling line identity indicator.
					// swt = tmpt.swt; // Not used in CHINA TUP.
					ocl = tmpt.oca;  // Original called address indicator.
					///////////////////////////////////////////////////////////////////////

					PutIE(PSG_IE_RSPTYPEIND, sizeof(STupResponseTypeIndicator), pPdu);
					pPdu += sizeof(STupResponseTypeIndicator);

					if (cll)
					{
						PutIE(PSG_IE_CLNPRTCTG, sizeof(STupCallingPartysCatetgory), pPdu);
						pPdu += sizeof(STupCallingPartysCatetgory);
					}
					
					if (cci)
					{

						char para[2];
						// unsigned char flg = 0;
						
						//Calling address Unwrap and get the address length.
						UnwrapCallingPartyNumber((unsigned char *)pPdu,(unsigned char*)&para, 
													(unsigned char *)tmpbuf);
						numLen = para[0];
						ieLen = para[1];
				

						PutIE(PSG_IE_CLNLINEID, numLen, tmpbuf); // In TUP use PSG_IE_CLNLINEID, and in ISUP use PSG_IE_CLNPRTNUM instead.
						pPdu += ieLen;
					}

					/*
					if (swt)
					{
						PutIE(PSG_IE_TRNNTWSLC, sizeof(STupSwitchingCallingSignalInformation), pPdu);
						pPdu += sizeof(STupSwitchingCallingSignalInformation);
					}
					*/

					if (ocl)
					{
						char para[2];
					    // unsigned char flg = 1;

						// Original Called address Unwrap.
						UnwrapOriginalCalledPartyNumber((unsigned char *)pPdu,
							(unsigned char*)&para, (unsigned char *)tmpbuf);
						numLen = para[0];
						ieLen = para[1];

						PutIE(PSG_IE_ORGCLDNUM, numLen, tmpbuf);
						pPdu += ieLen;
					}
				}
					break;

				case PSG_MSG_TUP_COT:
				case PSG_MSG_TUP_CCF:
					break;

				case PSG_MSG_TUP_GRQ:
				{ 
					PutIE(PSG_IE_REQTYPEIND, sizeof(STupRequestTypeIndicator), pPdu);
					pPdu += sizeof(STupRequestTypeIndicator);
				}
					break;

				case PSG_MSG_TUP_ACM:
				{
					PutIE(PSG_IE_WMSGIND, sizeof(STupAcmMessageIndicator), pPdu);
					pPdu += sizeof(STupAcmMessageIndicator);
				}
					break;

				case PSG_MSG_TUP_SEC:
				case PSG_MSG_TUP_CGC:
				case PSG_MSG_TUP_NNC:
				case PSG_MSG_TUP_ADI:
				case PSG_MSG_TUP_CFL:
				case PSG_MSG_TUP_UNN:
				case PSG_MSG_TUP_LOS:
				case PSG_MSG_TUP_SST:
				case PSG_MSG_TUP_ACB:
				case PSG_MSG_TUP_DPN:
					break;
		
				case PSG_MSG_TUP_EUM: // Not used in CHINA TUP.
				/*
				{
					PutIE(PSG_IE_USRSRVINF, sizeof(STupUserBusyIndicator), pPdu);
					pPdu += sizeof(STupUserBusyIndicator);

					PutIE(PSG_IE_SPC, sizeof(STupSignalPoitCode), pPdu);
					pPdu += sizeof(STupSignalPoitCode);
				}
				*/
					break;

				case PSG_MSG_TUP_ANC:
				case PSG_MSG_TUP_ANN:
				case PSG_MSG_TUP_CBK:
				case PSG_MSG_TUP_CLF:
				case PSG_MSG_TUP_RAN:
				case PSG_MSG_TUP_FOT:
				case PSG_MSG_TUP_CCL:
					break;

				case PSG_MSG_TUP_RLG:
				case PSG_MSG_TUP_BLO:
				case PSG_MSG_TUP_BLA:
				case PSG_MSG_TUP_UBL:
				case PSG_MSG_TUP_UBA:
				case PSG_MSG_TUP_CCR:
				case PSG_MSG_TUP_RSC:
					break;

				case PSG_MSG_TUP_ACC: // Not used in CHINA TUP.
				/*
				{
					PutIE(PSG_IE_BMSGIND, sizeof(STupMessageCongestionInformation), pPdu);
					pPdu += sizeof(STupMessageCongestionInformation);
				}
				*/
					break;
		
				case PSG_MSG_TUP_MPM:
				{
					PutIE(PSG_IE_CRGINF, sizeof(STupChargeInformation), pPdu);
					pPdu += sizeof(STupChargeInformation);
				}
					break;

				case PSG_MSG_TUP_OPR:
					break;

				case PSG_MSG_TUP_SLB:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -