Files
svc.ems/plat/mgcp/src/mgcp_trans.c
2024-09-27 15:39:34 +08:00

301 lines
5.4 KiB
C

#include "./include/mgcp_pub.h"
#include "./include/mgcp.h"
#include "./include/mgcp_const.h"
#include "./include/mgcp_ext.h"
#include "./include/mgcp_struct.h"
#include "./include/mgcp_msg.h"
int mgcp_create_trans_id(WORD port)
{
if (port >= MGCP_MAX_NUM_OF_PORT)
return -1;
mgcpTransStart[port]++;
mgcpPort[port].transId = (port << 16) | mgcpTransStart[port];
return 0;
}
int mgcp_match_client_trans(DWORD transId)
{
WORD port;
DWORD srcIp;
MGCP_PORT *trans;
port = transId >> 16;
if (port >= MGCP_MAX_NUM_OF_PORT)
return -1;
trans = &mgcpPort[port];
if (trans->flag == 0)
return -1;
srcIp = mgcpRvMsg.msgSrcIP;
if ((trans->reqInd == MGCP_REQUEST)
&& (trans->transId == transId)
&& (trans->para.ip == srcIp))
return port;
return -1;
}
int mgcp_match_server_trans(DWORD transId)
{
WORD port;
DWORD srcIp;
MGCP_PORT *trans;
srcIp = mgcpRvMsg.msgSrcIP;
for (port = 1; port < MGCP_MAX_NUM_OF_PORT; port++)
{
trans = &mgcpPort[port];
if (trans->flag == 0)
continue;
if ((trans->reqInd == MGCP_INDICATION)
&& (trans->transId == transId)
&& (trans->para.ip == srcIp))
{
if (1 == trans->state2)
{
mgcp_send_msg(port, MGCP_RESPONSE);
trans->timer = MGCP_TIME_WAIT_TIMER;
}
return port;
}
}
return -1;
}
BYTE mgcp_trans_init_proc(WORD port)
{
if (port >= MGCP_MAX_NUM_OF_PORT)
return 0;
memset((BYTE *) &mgcpPort[port], 0, sizeof(MGCP_PORT));
return 1;
}
BYTE mgcp_trans_idle_proc(WORD port)
{
BYTE cmd;
MGCP_PARA *para;
MGCP_PORT *trans;
if (port >= MGCP_MAX_NUM_OF_PORT)
return 0;
trans = &mgcpPort[port];
cmd = trans->cmd;
if ((cmd < MGCP_CMD_CRCX) || (cmd > MGCP_CMD_RSIP))
return 3;
para = &trans->para;
if (para->sl.cmdRes == MGCP_COMMAND)
{
para->sl.cmdRes = 0;
if (trans->reqInd == MGCP_REQUEST)
{
mgcp_create_trans_id(port);
if (mgcp_send_msg(port, MGCP_COMMAND) < 0)
{
if (mgcpSap[0].MGCP_cnf == NULL)
return 3;
mgcpSap[0].MGCP_cnf(trans->cmd, trans->usrPort, port, MGCP_RET_CODE_TRANS_TIME_OUT, &trans->para);
return 3;
}
trans->timer = MGCP_MAX_RETRANS_TIMER;
return 1;
}
else if (trans->reqInd == MGCP_INDICATION)
{
if (mgcpSap[0].MGCP_ind == NULL)
return 3;
if (mgcpSap[0].MGCP_ind(cmd, &trans->usrPort, port, para) < 0)
return 3;
trans->timer = MGCP_MAX_RETRANS_TIMER;
return 2;
}
else
return 3;
}
return 3;
}
BYTE mgcp_trans_await_peer_response_proc(WORD port)
{
MGCP_PORT *trans;
MGCP_SL *sl;
if (port >= MGCP_MAX_NUM_OF_PORT)
return 0;
trans = &mgcpPort[port];
sl = &trans->para.sl;
if ((trans->cmd < MGCP_CMD_CRCX) || (trans->cmd > MGCP_CMD_RSIP))
return 1;
if (sl->cmdRes == MGCP_RESPONSE)
{
if (mgcpSap[0].MGCP_cnf == NULL)
return 1;
if (mgcpSap[0].MGCP_cnf(trans->cmd, trans->usrPort, port, sl->retCode, &trans->para) < 0)
return 1;
else
{
if ((sl->retCode < 100) ||
(sl->retCode >= 200))
return 1;
sl->cmdRes = 0;
trans->gotProvRes = 1;
}
}
if (trans->timer > 0)
{
if (--trans->timer == 0)
{
if (mgcpSap[0].MGCP_cnf == NULL)
return 1;
mgcpSap[0].MGCP_cnf(trans->cmd, trans->usrPort, port, MGCP_RET_CODE_TRANS_TIME_OUT, &trans->para);
return 1;
}
else if ((trans->gotProvRes == 0) &&
((trans->timer % MGCP_RETRANS_TIMER) == 0))
mgcp_send_msg(port, MGCP_COMMAND);
}
return 0;
}
BYTE mgcp_trans_await_user_response_proc(WORD port)
{
MGCP_PORT *trans;
MGCP_SL *sl;
if (port >= MGCP_MAX_NUM_OF_PORT)
return 0;
trans = &mgcpPort[port];
sl = &trans->para.sl;
switch (trans->state2 & 1)
{
case 0:
if (sl->cmdRes == MGCP_RESPONSE)
{
if (mgcp_send_msg(port, MGCP_RESPONSE) < 0)
return 1;
if ((sl->retCode < 100) ||
(sl->retCode >= 200))
{
trans->state2 = 1;
trans->timer = MGCP_TIME_WAIT_TIMER;
return 0;
}
sl->cmdRes = 0;
trans->gotProvRes = 1;
}
if (trans->timer > 0)
{
if (--trans->timer == 0)
{
if (mgcp_send_rsp(port, MGCP_RET_CODE_TRANS_TIME_OUT_INDEX) < 0)
return 1;
trans->state2 = 1;
trans->timer = MGCP_TIME_WAIT_TIMER;
return 0;
}
}
break;
case 1:
if (trans->timer > 0)
{
if (--trans->timer == 0)
return 1;
}
break;
}
return 0;
}
void mgcp_trans_proc()
{
WORD port;
for (port = 1; port < MGCP_MAX_NUM_OF_PORT; port++)
{
if (mgcpPort[port].flag != 1)
continue;
switch (mgcpPort[port].state)
{
case MGCP_TRANS_IDLE_STATE:
switch (mgcp_trans_idle_proc(port))
{
case 0:
break;
case 1:
mgcpPort[port].state = MGCP_TRANS_AWAIT_PEER_RESPONSE_STATE;
break;
case 2:
mgcpPort[port].state = MGCP_TRANS_AWAIT_USER_RESPONSE_STATE;
break;
case 3:
mgcpPort[port].state = MGCP_TRANS_INIT_STATE;
break;
}
break;
case MGCP_TRANS_AWAIT_PEER_RESPONSE_STATE:
switch (mgcp_trans_await_peer_response_proc(port))
{
case 0:
break;
case 1:
mgcpPort[port].state = MGCP_TRANS_INIT_STATE;
break;
}
break;
case MGCP_TRANS_AWAIT_USER_RESPONSE_STATE:
switch (mgcp_trans_await_user_response_proc(port))
{
case 0:
break;
case 1:
mgcpPort[port].state = MGCP_TRANS_INIT_STATE;
break;
}
break;
case MGCP_TRANS_INIT_STATE:
switch (mgcp_trans_init_proc(port))
{
case 0:
break;
case 1:
mgcpPort[port].state = MGCP_TRANS_IDLE_STATE;
break;
}
break;
}
}
}