////////////////////////////////////////////////// //Title : scoc_if.c //Auhtor : Liu Wei //Desc : SCOC interface implementation //Created : 2007-05-07 //Revision : // //Revision : // ////////////////////////////////////////////////// #include "./include/sccp_pub.h" #ifdef LOOSE_COUPLING_MODE //Loose coupling mode extern inline int coCheckConnId ( SP_UiPriPara * pUiPriParam ); extern void coRedirect(SP_UiPriPara * pUiPriParam); /* by simon at 23/9/25 */ extern DWORD ExistIP[64]; extern DWORD ExistIPNum; extern SCOC_BUF ScocBuf; extern LOCAL_SSN LocalSSN[256]; extern u8 ExistSSN[64]; extern u8 ExistSSNNum; extern struct _dpc2sls { int dpc; u8 sls; } dpc2sls[256]; // used for sequence control, add by Roy Jiang, 2007-09-17 extern SCCP_OPT SCCP_Param; extern u8 MNP_Flag[2]; extern SCCP_ROUTE RouteList[SCCP_ROUTE_NUM]; extern int RelatedSSNNum; extern RL_SSN RelatedSSN[SCCP_RLSSN_NUM]; extern int RelatedSPCNum; extern RL_SPC RelatedSPC[SCCP_RLSPC_NUM]; extern GTTATT_OMC GTTAttribute[SCCP_ROUTE_NUM]; extern SCCP_CSTA SccpCsta[96]; extern DWORD SccpCstaInd; extern SCCP_Capture_Buf SCCPCapBuf; /////////////////////////////////////////////////////////////////////////// // // Name : PostSp // Function : Upper layer post request/response primitive to sccp // Parameter: pUiPriParam [sccp UL primitive buffer pointer] // Note : Sccp Connid is implicit returned in "pUiPriParam" buffer // : while N-Connect requesing // Return : 0 Post Fail 1 Post Successful // /////////////////////////////////////////////////////////////////////////// int PostSp ( SP_UiPriPara * pUiPriParam ) { int nRet; u8 *pPriStr; spShowPrimitive ( pUiPriParam, 1 ); spWatchDogStatic ( UL_POST_CO_APT ); switch ( pUiPriParam->uUiPri ) { case N_UNITDATA_REQ: { SCLC_MSG tClMsg; tClMsg.msglen = pUiPriParam->tPriUnion.tPriNUDataReq.tUD.uDataLen; memcpy ( &tClMsg.msg, &pUiPriParam->tPriUnion.tPriNUDataReq.tUD.aUserData, tClMsg.msglen ); memcpy ( &tClMsg.src_addr, &pUiPriParam->tPriUnion.tPriNUDataReq.tCGA, sizeof ( SCCP_ADDR ) ); memcpy ( &tClMsg.dst_addr, &pUiPriParam->tPriUnion.tPriNUDataReq.tCDA, sizeof ( SCCP_ADDR ) ); tClMsg.src_addr.DPC = SCCP_Param.spc[tClMsg.src_addr.NetID]; tClMsg.sequence_control = 0; sclc_send ( &tClMsg ); spWatchDogStatic ( UL_POST_CO ); return 1; } //break; case N_UNITDATA_IND: case N_CONNECT_IND: //redirect to alternative server, add by Roy coRedirect(pUiPriParam); spWatchDogStatic ( UL_POST_CO ); return 1; break; case N_CONNECT_REQ: nRet = coNewConnId ( N_CONNECT_REQ ); if( nRet < 0 ) { spLogDebug ( SCCPDB_ERR, "No resouces available !\n" ); return 0; } pUiPriParam->wConnId = nRet; break; case N_CONNECT_RSP: case N_DISCONNECT_REQ: case N_DATA_REQ: if( !coCheckConnId ( pUiPriParam ) ) { spLogDebug ( SCCPDB_ERR, "Invalid SCCP connection ID : %d", pUiPriParam->wConnId ); return 0; } break; case N_DATAAK_REQ: case N_EDATA_REQ: case N_RESET_REQ: case N_RESET_RSP: case N_INFORM_REQ: spGetUlPrimitiveStr ( pUiPriParam->uUiPri, pPriStr ); spLogDebug ( SCCPDB_ERR, "Unsupported the primitive now :%s", pPriStr ); return 0; default: spGetUlPrimitiveStr ( pUiPriParam->uUiPri, pPriStr ); spLogDebug ( SCCPDB_ERR, "Invalid primivtive recieved :%s ", pPriStr ); return 0; } spWatchDogStatic ( UL_POST_CO ); { SP_PriPoolEle tPoolEle; memset ( &tPoolEle, 0, sizeof ( SP_PriPoolEle ) ); memcpy ( &tPoolEle.tUiPri, pUiPriParam, sizeof ( SP_UiPriPara ) ); spPoolPut ( &tPoolEle, pInCoPool ); } return 1; } /////////////////////////////////////////////////////////////////////////// // // Name : SpSubmit // Function : Upper layer fetch indicate/confirm primitive submited form sccp // Parameter: pUiPriParam [sccp UL primitive buffer pointer] // uUlSapId [upper layer sap id [0 tcap 1 pps 2 smsc 3 aif ] ] // Return : 0 Fetch Fail 1 Fetch Successful // /////////////////////////////////////////////////////////////////////////// int SpSubmit ( SP_UiPriPara * pUiPriParam, u8 uUlSapId ) { int nRet = 0; SCLC_MSG tClMsg; nRet = sclc_receive ( &tClMsg, uUlSapId ); if( nRet ) { pUiPriParam->tPriUnion.tPriNUDataInd.uSLS = tClMsg.sls; pUiPriParam->wConnId = 0xFFFF; pUiPriParam->uUiPri = N_UNITDATA_IND; pUiPriParam->tPriUnion.tPriNUDataInd.tUD.uDataLen = tClMsg.msglen; memcpy ( &pUiPriParam->tPriUnion.tPriNUDataInd.tUD.aUserData, &tClMsg.msg, tClMsg.msglen ); memcpy ( &pUiPriParam->tPriUnion.tPriNUDataInd.tCGA, &tClMsg.src_addr, sizeof ( SCCP_ADDR ) ); memcpy ( &pUiPriParam->tPriUnion.tPriNUDataInd.tCDA, &tClMsg.dst_addr, sizeof ( SCCP_ADDR ) ); return nRet; } if( 3 == uUlSapId ) { SP_PriPoolEle tPoolEle; nRet = spPoolGet ( &tPoolEle, pOutCoPool ); memcpy ( pUiPriParam, &tPoolEle.tUiPri, sizeof ( SP_UiPriPara ) ); return nRet; } return nRet; } #else /////////////////////Below is reserved, do not need to read///////////////////// #ifdef TIGHT_COUPING_MODE //Tight coupling mode #error "Do not support Tight coupling mode ,please use \"LOOSE_COUPLING_MODE\" flag \n" /////////////////////////////////////////////////////////////////////////// // /// /////////////////////////////////////////////////////////////////////////// void Ul_Post_Sp ( SP_UiPriPara * pUiPriParam ) { SP_UiPriUnion *pPriUn; pPriUn = &pUlPri->tPriUnion; switch ( pUiPriParam->uUi_Pri ) { case N_UNITDATA_REQ: //reserved for sclc spUi_N_UnitDataReq ( &pPriUn->tPriNUDataReq.tCDA, &pPriUn->tPriNUDataReq.tCGA, &pPriUn->tPriNUDataReq.tSEQ, &pPriUn->tPriNUDataReq.tRO, &pPriUn->tPriNUDataReq.tUD ); break; case N_CONNECT_REQ: spUi_N_ConnectReq ( &pPriUn->tPriNConnReq.tCDA, &pPriUn->tPriNConnReq.tCGA, &pPriUn->tPriNConnReq.tRCS, &pPriUn->tPriNConnReq.tEDS ); break; case N_CONNECT_RSP: spUi_N_ConnectRsp ( &pPriUn->tPriNConnRsp.tRA, &pPriUn->tPriNConnRsp.tRCS, &pPriUn->tPriNConnRsp.tEDS ); break; case N_DISCONNECT_REQ: spUi_N_DisconnectReq ( &pPriUn->tPriNDisconnReq.tRA, &pPriUn->tPriNDisconnReq.tREA, &pPriUn->tPriNDisconnReq.tUC, pPriUn->tPriNDisconnReq.tCI ); break; case N_DATA_REQ: spUi_N_DataReq ( &pPriUn->tPriNDataReq.tCR, &pPriUn->tPriNDataReq.tUD, pPriUn->tPriNDataReq.tCI ); break; case N_DATAAK_REQ: spUi_N_DataAkReq ( pPriUn->tPriNDataAkReq.tCI ); break; case N_EDATA_REQ: spUi_N_EDataReq ( pPriUn->tPriNEDataReq.tCI, &pPriUn->tPriNEDataReq.tUD ); break; case N_RESET_REQ: spUi_N_ResetReq ( &pPriUn->tPriNResetReq.tREA, pPriUn->tPriNResetReq.tCI ); break; case N_RESET_RSP: spUi_N_ResetRsp ( pPriUn->tPriNResetRsp.tCI ); break; case N_INFORM_REQ: spUi_N_InformReq ( &pPriUn->tPriNInformReq.tREA, &pPriUn->tPriNInformReq.tQOS, pPriUn->tPriNInformReq.tCI ); break; default: spShowMsg ( SCCPDB_ERR, "SCCP <== AIF. UnKnow Primitive %s", GetUiPriStr ( pPriUn->uUi_Pri ) ); return; break; } spShowMsg ( SCCPDB_AIF, "SCCP <== AIF. Primitive %s", GetUiPriStr ( pPriUn->uUi_Pri ) ); return; } /////////////////////////////////////////////////////////////////////////// // /// /////////////////////////////////////////////////////////////////////////// void Sp_Submit_Ul ( SP_UiPriPara * pUiPriParam ) { switch ( Ui_Pri ) { case N_UNITDATA_IND: //reserved for sclc break; case N_NOTICE_IND: break; case N_CONNECT_IND: break; case N_CONNECT_CFM: break; case N_DISCONNECT_IND: break; case N_DATA_IND: break; case N_DATAAK_IND: break; case N_EDATA_IND: break; case N_RESET_IND: break; case N_RESET_CFM: break; case N_INFORM_IND: break; default: break; } return 0; } #endif /////////////////////Above is reserved, do not need to read///////////////////// #endif