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

1023 lines
33 KiB
C

#include "./include/sip_ua_pub.h"
#include "./include/sip_ua_const.h"
#include "./include/sip_ua_struct.h"
#include "./include/sip_ua_msg.h"
#include "./include/sip_ua_ext.h"
#include "./include/sip_ua_dialog.h"
#include "./include/sip_ua.h"
#include "./include/sip_const.h"
#include "./include/sip_ext.h"
#include "./include/sip_debug.h"
extern void sip_ua_fsm(WORD port);
int sip_ua_create_register_tag(int port, SIP_GEN_PARA *tagPara)
{
struct timeval tv;
if ((port < 0) || (port >= SIP_UA_MAX_NUM_OF_PORT))
return -1;
gettimeofday(&tv, NULL);
tagPara->paraName = SIP_API_PNAME_TAG;
tagPara->paraType = SIP_API_PTYPE_STRING;
sprintf(tagPara->para.paraStr, "%X%lX%lX", port, tv.tv_sec, tv.tv_usec);
return 0;
}
int sip_ua_create_register_call_id(WORD usrPort, SIP_HDR_CALL_ID *callId)
{
struct timeval tv;
gettimeofday(&tv, NULL);
sprintf(callId->value, "%X%lX%lX", usrPort, tv.tv_usec, tv.tv_sec);
strcpy(callId->host, sipUaDottedHostIp);
return 0;
}
int sip_ua_set_send_cmd(SIP_UA_PORT *sipUaPortPtr, SIP_API_STRUCT *sipApiMsg)
{
SIP_START_LINE *startLine;
if ((sipUaPortPtr == NULL) || (sipApiMsg == NULL))
{
sprintf((char *)sipAsciTempBuf, "sip ua set send cmd failed\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
startLine = &sipApiMsg->sipApiMsg.sipMsg.sipStartLine;
if (sipApiMsg->sipApiType == SIP_API_REQ_MSG)
sipUaPortPtr->sdCmd = startLine->sipMethod;
else if (sipApiMsg->sipApiType == SIP_API_RES_MSG)
sipUaPortPtr->sdCmd = startLine->statusCode;
else
return -1;
return 0;
}
void sip_ua_fill_uri_in_dialog(SIP_URI *sipUri, SIP_UA_URI *sipUaUri)
{
if ((sipUri == NULL) || (sipUaUri == NULL))
{
return;
}
sipUri->uriType = sipUaUri->uriType;
strcpy(sipUri->userName, sipUaUri->userName);
strcpy(sipUri->password, sipUaUri->password);
strcpy(sipUri->host.addr.domain, sipUaUri->domain);
}
int sip_ua_fill_tag_in_dialog(SIP_GEN_PARA *tagPara, char *tagOrg)
{
if ((tagPara == NULL) || (tagOrg == NULL))
{
return 0;
}
if (*tagOrg != '\0')
{
tagPara->paraName = SIP_API_PNAME_TAG;
tagPara->paraType = SIP_API_PTYPE_STRING;
strcpy(tagPara->para.paraStr, tagOrg);
return 1;
}
return 0;
}
int sip_ua_fill_msg_with_dialog(WORD dialogId, SIP_API_STRUCT *sdMsg)
{
SIP_DIALOG *sipUaDlgPtr;
SIP_MSG *sipMsg;
// SIP_URI url;
if (sdMsg == NULL)
return -1;
if ((dialogId >= SIP_UA_MAX_NUM_OF_DIALOG) || (sipUaDialog[dialogId].flag == 0))
{
sprintf((char *)sipAsciTempBuf, "sip_ua_fill_msg_with_dialog:dialogId wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
sipUaDlgPtr = &sipUaDialog[dialogId];
sipMsg = &sdMsg->sipApiMsg.sipMsg;
if (sdMsg->sipApiType == SIP_API_REQ_MSG)
{
sip_ua_fill_uri_in_dialog(&sipMsg->sipHdrFrom.url, &sipUaDlgPtr->localURI);
if (sip_ua_fill_tag_in_dialog(&sipMsg->sipHdrFrom.params.para[0], sipUaDlgPtr->localTag) == 1)
sipMsg->sipHdrFrom.params.paraNum++;
sipMsg->sipGenHdrFlag[0] |= SIP_HDR_FROM_MASK;
sip_ua_fill_uri_in_dialog(&sipMsg->sipHdrTo.url, &sipUaDlgPtr->remoteURI);
if (sip_ua_fill_tag_in_dialog(&sipMsg->sipHdrTo.params.para[0], sipUaDlgPtr->remoteTag) == 1)
sipMsg->sipHdrTo.params.paraNum++;
sipMsg->sipGenHdrFlag[0] |= SIP_HDR_TO_MASK;
memcpy(&sipMsg->sipHdrCallId, &sipUaDlgPtr->callId, sizeof(SIP_HDR_CALL_ID));
sipMsg->sipGenHdrFlag[0] |= SIP_HDR_CALL_ID_MASK;
if (sipMsg->sipStartLine.sipMethod != SIP_METHOD_INVITE)
{
if ((sipUaDlgPtr->paramFlag & SIP_UA_DIALOG_REMOTE_TARGET_FLAG) == SIP_UA_DIALOG_REMOTE_TARGET_FLAG)
{
sip_ua_fill_uri_in_dialog(&sipMsg->sipStartLine.requestUri, &sipUaDlgPtr->remoteTarget);
}
}
if ((sipMsg->sipStartLine.sipMethod == SIP_METHOD_INVITE) || (sipMsg->sipStartLine.sipMethod == SIP_METHOD_CANCEL))
{
if (sipMsg->sipStartLine.sipMethod == SIP_METHOD_INVITE)
sipUaDlgPtr->invCSeq = sipUaDlgPtr->localCseq.value= sipMsg->sipHdrCseq.value = 1;
else
sipMsg->sipHdrCseq.value = sipUaDlgPtr->invCSeq;
}
else
{
if ((sipUaDlgPtr->type == SIP_CALLER) && (sipUaDlgPtr->invCSeq == 0))
{
sprintf((char *)sipAsciTempBuf, "sip_ua_fill_msg_with_dialog:caller send other req before sending invite\r\n");
sip_log_err(sipAsciTempBuf);
return -2;
}
if (sipMsg->sipStartLine.sipMethod != SIP_METHOD_ACK)
{
sipUaDlgPtr->localCseq.value = sipUaDlgPtr->localCseq.value + 1;
sipMsg->sipHdrCseq.value = sipUaDlgPtr->localCseq.value;
}
else
{
sipMsg->sipHdrCseq.value = sipUaDlgPtr->invCSeq;
}
}
sipMsg->sipGenHdrFlag[0] |= SIP_HDR_CSEQ_MASK;
if (sipUaDlgPtr->routeSets.num != 0)
{
memcpy(&sipMsg->sipReStruct.sipReHdr.sipReqHdr.sipHdrRoutes, (SIP_HDR_ROUTES *)&sipUaDlgPtr->routeSets, sizeof(SIP_HDR_ROUTES));
if (sipUaDlgPtr->routeSets.recRoutes[0].url.params.para[0].paraName != SIP_API_PNAME_LR)//if (sipUaDlgPtr->routeSets.recRoutes[0].params.para[0].paraName != SIP_API_PNAME_LR)
{
if (sipUaDlgPtr->routeSets.num >= SIP_MAX_NUM_OF_RECORD_ROUTES)
{
memcpy(&sipMsg->sipReStruct.sipReHdr.sipReqHdr.sipHdrRoutes.routes[0].url, &sipMsg->sipStartLine.requestUri, sizeof(SIP_URI));
}
else
{
memcpy(&sipMsg->sipReStruct.sipReHdr.sipReqHdr.sipHdrRoutes.routes[sipUaDlgPtr->routeSets.num].url, &sipMsg->sipStartLine.requestUri, sizeof(SIP_URI));//0
}
memcpy(&sipMsg->sipStartLine.requestUri, &sipUaDlgPtr->routeSets.recRoutes[0].url, sizeof(SIP_URI));
sipMsg->sipReStruct.sipReHdr.sipReqHdr.sipHdrRoutes.head = 1;
}
sdMsg->sipTransAddr.addr.ipV4 = inet_addr(sipUaDlgPtr->routeSets.recRoutes[0].url.host.addr.domain);
if (sipUaDlgPtr->routeSets.recRoutes[0].url.port != 0)
sdMsg->sipTransAddr.port = sipUaDlgPtr->routeSets.recRoutes[0].url.port;
else
sdMsg->sipTransAddr.port = 5060;
//need forward develop
sipMsg->sipReStruct.sipReHdrFlag[0] |= SIP_HDR_ROUTE_MASK;
}
}
else
{
sip_ua_fill_uri_in_dialog(&sipMsg->sipHdrFrom.url, &sipUaDlgPtr->remoteURI);
if (sip_ua_fill_tag_in_dialog(&sipMsg->sipHdrFrom.params.para[0], sipUaDlgPtr->remoteTag) == 1)
sipMsg->sipHdrFrom.params.paraNum++;
sipMsg->sipGenHdrFlag[0] |= SIP_HDR_FROM_MASK;
sip_ua_fill_uri_in_dialog(&sipMsg->sipHdrTo.url, &sipUaDlgPtr->localURI);
if (sip_ua_fill_tag_in_dialog(&sipMsg->sipHdrTo.params.para[0], sipUaDlgPtr->localTag) == 1)
sipMsg->sipHdrTo.params.paraNum++;
sipMsg->sipGenHdrFlag[0] |= SIP_HDR_TO_MASK;
memcpy(&sipMsg->sipHdrCallId, &sipUaDlgPtr->callId, sizeof(SIP_HDR_CALL_ID));
sipMsg->sipGenHdrFlag[0] |= SIP_HDR_CALL_ID_MASK;
if (sipMsg->sipHdrCseq.method == SIP_METHOD_INVITE)
{
sipMsg->sipHdrCseq.value = sipUaDlgPtr->remoteInvCseq;
}
else
{
sipMsg->sipHdrCseq.value = sipUaDlgPtr->remoteCseq.value;
}
sipMsg->sipGenHdrFlag[0] |= SIP_HDR_CSEQ_MASK;
if ((sipUaDlgPtr->routeSets.num != 0)
// && ((sipUaDlgPtr->paramFlag & SIP_UA_DIALOG_RECORD_ROUTE_SEND_FLAG) != SIP_UA_DIALOG_RECORD_ROUTE_SEND_FLAG)
&& (sipUaDlgPtr->type == SIP_CALLEE) && (sipMsg->sipHdrCseq.method == SIP_METHOD_INVITE))
{
memcpy(&sipMsg->sipHdrRecordRoutes, &sipUaDlgPtr->routeSets, sizeof(SIP_HDR_RECORD_ROUTES));
// sipUaDlgPtr->paramFlag |= SIP_UA_DIALOG_RECORD_ROUTE_SEND_FLAG;
sipMsg->sipGenHdrFlag[0] |= SIP_HDR_RECORD_ROUTE_MASK;
}
}
return 0;
}
int sip_ua_update_retransmit_para(WORD dialogId, SIP_API_STRUCT *sdMsg)
{
SIP_DIALOG *sipUaDlgPtr;
SIP_MSG *sipMsg;
// SIP_URI url;
if (sdMsg == NULL)
return -1;
if ((dialogId >= SIP_UA_MAX_NUM_OF_DIALOG) || (sipUaDialog[dialogId].flag == 0))
{
sprintf((char *)sipAsciTempBuf, "sip_ua_update_retransmit_para:dialogId wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
sipUaDlgPtr = &sipUaDialog[dialogId];
sipMsg = &sdMsg->sipApiMsg.sipMsg;
if (sdMsg->sipApiType == SIP_API_REQ_MSG)
{
if (sipUaDlgPtr->routeSets.num != 0)
{
memcpy(&sipMsg->sipReStruct.sipReHdr.sipReqHdr.sipHdrRoutes, (SIP_HDR_ROUTES *)&sipUaDlgPtr->routeSets, sizeof(SIP_HDR_ROUTES));
if (sipUaDlgPtr->routeSets.recRoutes[0].url.params.para[0].paraName != SIP_API_PNAME_LR)//if (sipUaDlgPtr->routeSets.recRoutes[0].params.para[0].paraName != SIP_API_PNAME_LR)
{
memcpy(&sipMsg->sipReStruct.sipReHdr.sipReqHdr.sipHdrRoutes.routes[0].url, &sipMsg->sipStartLine.requestUri, sizeof(SIP_URI));
memcpy(&sipMsg->sipStartLine.requestUri, &sipUaDlgPtr->routeSets.recRoutes[0].url, sizeof(SIP_URI));
sipMsg->sipReStruct.sipReHdr.sipReqHdr.sipHdrRoutes.head = 1;
}
sdMsg->sipTransAddr.addr.ipV4 = inet_addr(sipUaDlgPtr->routeSets.recRoutes[0].url.host.addr.domain);
if (sipUaDlgPtr->routeSets.recRoutes[0].url.port != 0)
sdMsg->sipTransAddr.port = sipUaDlgPtr->routeSets.recRoutes[0].url.port;
else
sdMsg->sipTransAddr.port = 5060;
//need forward develop
sipMsg->sipReStruct.sipReHdrFlag[0] |= SIP_HDR_ROUTE_MASK;
}
}
return 0;
}
int sip_ua_send_invite(BYTE cgId, WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg)//BYTE sapIndex
{
int port;
BYTE client;
BYTE method;
int ret;
if ((dialogId >= SIP_UA_MAX_NUM_OF_DIALOG) || (sdMsg == NULL))
{
return -1;
}
if ((port = sip_ua_get_port()) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_invite:allocate port failed\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
client = SIP_TRANS_CLIENT;
method = SIP_TRANS_INVITE;
sdMsg->sipApiType = SIP_API_REQ_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = SIP_METHOD_INVITE;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = SIP_METHOD_INVITE;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdrFlag[0] |= SIP_HDR_MAX_FORWARDS_MASK;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdr.sipReqHdr.sipHdrMaxForwards.value = 70;
if (sip_ua_fill_msg_with_dialog(dialogId, sdMsg) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_invite:fill msg with dialog failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
if ((ret = sip_create_transaction(client, method, sipUaSipIndex, port, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_invite:fill create transaction in sip failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
strcpy(sipUaDialog[dialogId].invBranch, sdMsg->sipApiMsg.sipMsg.sipHdrVias.vias[0].params.para[0].para.paraStr);
sipUaPort[port].sipuafState = SIP_UA_FSM_STATE_REQUEST;
sipUaPort[port].dialogId = dialogId;
sipUaPort[port].usrPort = usrPort;
sipUaPort[port].cgId = cgId;//sipUaPort[port].sapIndex = sapIndex;
sipUaPort[port].llPort = ret;
sipUaPort[port].mainState = SIP_UA_MAIN_STATE_INVITE_REQ;
sipUaPort[port].state = SIP_UA_SEND_REQUEST;
memcpy(&sipUaPort[port].sdSipMsg, sdMsg, sizeof(SIP_API_STRUCT));
sip_ua_set_send_cmd(&sipUaPort[port], sdMsg);
sipUaDialog[dialogId].sipUaPort = port;
sipUaDialog[dialogId].invUaPort.sdInvUaPort = port;
sip_ua_fsm(port);
return 0;
}
int sip_ua_send_re_invite(BYTE cgId, WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg)//BYTE sapIndex
{
int port;
BYTE client;
BYTE method;
int ret;
if ((dialogId >= SIP_UA_MAX_NUM_OF_DIALOG) || (sdMsg == NULL))
{
return -1;
}
if ((port = sip_ua_get_port()) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_re_invite:allocate port failed\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
client = SIP_TRANS_CLIENT;
method = SIP_TRANS_INVITE;
sdMsg->sipApiType = SIP_API_REQ_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = SIP_METHOD_RE_INVITE;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = SIP_METHOD_RE_INVITE;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdrFlag[0] |= SIP_HDR_MAX_FORWARDS_MASK;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdr.sipReqHdr.sipHdrMaxForwards.value = 70;
if (sip_ua_fill_msg_with_dialog(dialogId, sdMsg) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_re_invite:fill msg with dialog failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
if ((ret = sip_create_transaction(client, method, sipUaSipIndex, port, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_re_invite:fill create transaction in sip failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
sipUaPort[port].sipuafState = SIP_UA_FSM_STATE_REQUEST;
sipUaPort[port].dialogId = dialogId;
sipUaPort[port].usrPort = usrPort;
sipUaPort[port].cgId = cgId;//sipUaPort[port].sapIndex = sapIndex;
sipUaPort[port].llPort = ret;
sipUaPort[port].mainState = SIP_UA_MAIN_STATE_INVITE_REQ;
sipUaPort[port].state = SIP_UA_SEND_REQUEST;
memcpy(&sipUaPort[port].sdSipMsg, sdMsg, sizeof(SIP_API_STRUCT));
sip_ua_set_send_cmd(&sipUaPort[port], sdMsg);
sipUaDialog[dialogId].sipUaPort = port;
sip_ua_fsm(port);
return 0;
}
int sip_ua_send_non_inv(BYTE cgId, WORD dialogId, WORD usrPort, BYTE method, SIP_API_STRUCT *sdMsg)//BYTE sapIndex
{
int port;
BYTE client;
BYTE sipMethod;
int ret;
if ((dialogId >= SIP_UA_MAX_NUM_OF_DIALOG) || (sdMsg == NULL))
{
return -1;
}
if ((port = sip_ua_get_port()) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_non_inv:allocate port failed, method = %d\r\n", method);
sip_log_err(sipAsciTempBuf);
return -1;
}
client = SIP_TRANS_CLIENT;
sipMethod = SIP_TRANS_NON_INVITE;
sdMsg->sipApiType = SIP_API_REQ_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = method;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = method;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdrFlag[0] |= SIP_HDR_MAX_FORWARDS_MASK;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdr.sipReqHdr.sipHdrMaxForwards.value = 70;
if (sip_ua_fill_msg_with_dialog(dialogId, sdMsg) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_non_inv:fill msg with dialog failed, method = %d\r\n", method);
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
if (method == SIP_METHOD_CANCEL)
{
sdMsg->sipApiMsg.sipMsg.sipHdrVias.vias[sdMsg->sipApiMsg.sipMsg.sipHdrVias.head].params.para[0].paraName = SIP_API_PNAME_BRANCH;
sdMsg->sipApiMsg.sipMsg.sipHdrVias.vias[sdMsg->sipApiMsg.sipMsg.sipHdrVias.head].params.para[0].paraType = SIP_API_PTYPE_STRING;
strcpy(sdMsg->sipApiMsg.sipMsg.sipHdrVias.vias[sdMsg->sipApiMsg.sipMsg.sipHdrVias.head].params.para[0].para.paraStr, sipUaDialog[dialogId].invBranch);
sdMsg->sipApiMsg.sipMsg.sipHdrVias.vias[sdMsg->sipApiMsg.sipMsg.sipHdrVias.head].params.paraNum++;
}
if ((ret = sip_create_transaction(client, sipMethod, sipUaSipIndex, port, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_non_inv:create transaction is sip failed, method = %d\r\n", method);
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
sipUaPort[port].sipuafState = SIP_UA_FSM_STATE_REQUEST;
sipUaPort[port].dialogId = dialogId;
sipUaPort[port].usrPort = usrPort;
sipUaPort[port].cgId = cgId;//sipUaPort[port].sapIndex = sapIndex;
sipUaPort[port].llPort = ret;
sipUaPort[port].mainState = SIP_UA_MAIN_STATE_NON_INVITE_REQ;
sipUaPort[port].state = SIP_UA_SEND_REQUEST;
if (SIP_METHOD_ACK == method)
{
sipUaDialog[dialogId].uaAckPort = port;
}
memcpy(&sipUaPort[port].sdSipMsg, sdMsg, sizeof(SIP_API_STRUCT));
sip_ua_set_send_cmd(&sipUaPort[port], sdMsg);
sipUaDialog[dialogId].sipUaPort = port;
sip_ua_fsm(port);
return 0;
}
int sip_ua_send_options(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg)//BYTE sapIndex
{
int port;
BYTE client;
BYTE method;
int ret;
if (sdMsg == NULL)
return -1;
if (dialogId < SIP_UA_MAX_NUM_OF_DIALOG)
{
if (cgId != sipUaDialog[dialogId].cgId)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_options:userIndex is wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
}
if ((port = sip_ua_get_port()) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_options:allocate port failed\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
client = SIP_TRANS_CLIENT;
method = SIP_TRANS_NON_INVITE;
sdMsg->sipApiType = SIP_API_REQ_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = SIP_METHOD_OPTIONS;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = SIP_METHOD_OPTIONS;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdrFlag[0] |= SIP_HDR_MAX_FORWARDS_MASK;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdr.sipReqHdr.sipHdrMaxForwards.value = 70;
if (dialogId < SIP_UA_MAX_NUM_OF_DIALOG)
{
if (sip_ua_fill_msg_with_dialog(dialogId, sdMsg) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_options:fille msg with dialog failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
sipUaDialog[dialogId].sipUaPort = port;
}
if ((ret = sip_create_transaction(client, method, sipUaSipIndex, port, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_options:create transaction in sip failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
sipUaPort[port].sipuafState = SIP_UA_FSM_STATE_REQUEST;
sipUaPort[port].dialogId = dialogId;
sipUaPort[port].usrPort = usrPort;
sipUaPort[port].cgId = cgId;//sipUaPort[port].sapIndex = sapIndex;
sipUaPort[port].llPort = ret;
sipUaPort[port].mainState = SIP_UA_MAIN_STATE_NON_INVITE_REQ;
sipUaPort[port].state = SIP_UA_SEND_REQUEST;
memcpy(&sipUaPort[port].sdSipMsg, sdMsg, sizeof(SIP_API_STRUCT));
sip_ua_set_send_cmd(&sipUaPort[port], sdMsg);
sip_ua_fsm(port);
return 0;
}
int sip_ua_send_register(BYTE cgId, WORD usrPort, SIP_API_STRUCT *sdMsg)//BYTE sapIndex
{
int port;
BYTE client;
BYTE method;
int ret;
if (sdMsg == NULL)
return -1;
if ((port = sip_ua_get_port()) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_options:allocate port failed\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
client = SIP_TRANS_CLIENT;
method = SIP_TRANS_NON_INVITE;
sdMsg->sipApiType = SIP_API_REQ_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = SIP_METHOD_REGISTER;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = SIP_METHOD_REGISTER;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.value = time(NULL);
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdrFlag[0] |= SIP_HDR_CSEQ_MASK;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdr.sipReqHdr.sipHdrMaxForwards.value = 70;
sdMsg->sipApiMsg.sipMsg.sipReStruct.sipReHdrFlag[0] |= SIP_HDR_MAX_FORWARDS_MASK;
if (sip_ua_create_register_tag(port, &sdMsg->sipApiMsg.sipMsg.sipHdrFrom.params.para[0]) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_create_register_tag:create tag failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
sdMsg->sipApiMsg.sipMsg.sipHdrFrom.params.paraNum++;
sdMsg->sipApiMsg.sipMsg.sipGenHdrFlag[0] |= SIP_HDR_FROM_MASK;
if (sip_ua_create_register_call_id(usrPort, &sdMsg->sipApiMsg.sipMsg.sipHdrCallId) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_create_register_tag:create call id failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
sdMsg->sipApiMsg.sipMsg.sipGenHdrFlag[0] |= SIP_HDR_CALL_ID_MASK;
/* if (dialogId < SIP_UA_MAX_NUM_OF_DIALOG)
{
if (sip_ua_fill_msg_with_dialog(dialogId, sdMsg) < 0)
{
sprintf(sipAsciTempBuf, "sip_ua_send_options:fille msg with dialog failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
sipUaDialog[dialogId].sipUaPort = port;
}*/
if ((ret = sip_create_transaction(client, method, sipUaSipIndex, port, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_options:create transaction in sip failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(port);
return -1;
}
sipUaPort[port].sipuafState = SIP_UA_FSM_STATE_REQUEST;
sipUaPort[port].dialogId = SIP_UA_NULL_DIALOG;//dialogId
sipUaPort[port].usrPort = usrPort;
sipUaPort[port].cgId = cgId;//sipUaPort[port].sapIndex = sapIndex;
sipUaPort[port].llPort = ret;
sipUaPort[port].mainState = SIP_UA_MAIN_STATE_NON_INVITE_REQ;
sipUaPort[port].state = SIP_UA_SEND_REQUEST;
memcpy(&sipUaPort[port].sdSipMsg, sdMsg, sizeof(SIP_API_STRUCT));
sip_ua_set_send_cmd(&sipUaPort[port], sdMsg);
sip_ua_fsm(port);
return 0;
}
int sip_ua_set_inv_temp_rsp(WORD uaPort,SIP_API_STRUCT *sdMsg)
{
BYTE client;
BYTE method;
int ret;
if (sdMsg == NULL)
return -1;
if ((uaPort >= SIP_UA_MAX_NUM_OF_PORT) || (sipUaPort[uaPort].flag != 1))
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_inv_temp_rsp:ua port wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
client = SIP_TRANS_SERVER;
method = SIP_TRANS_INVITE;
sdMsg->sipApiType = SIP_API_RES_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = SIP_METHOD_INVITE;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = SIP_METHOD_INVITE;
if ((ret = sip_create_transaction(client, method, sipUaSipIndex, uaPort, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_inv_rsp:create transaction in sip failed no proc port\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
sipUaPort[uaPort].llPort = ret;
return 0;
}
int sip_ua_send_inv_rsp(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg)//BYTE cgId
{
BYTE client;
BYTE method;
int ret;
WORD uaPort;
if (sdMsg == NULL)
return -1;
if (dialogId >= SIP_UA_MAX_NUM_OF_DIALOG)
{
return -1;
}
if (cgId != sipUaDialog[dialogId].cgId)//if (sapIndex != sipUaDialog[dialogId].userIndex)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_inv_rsp:cgId wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
uaPort = sipUaDialog[dialogId].sipUaPort;
if ((uaPort >= SIP_UA_MAX_NUM_OF_PORT) || (sipUaPort[uaPort].flag != 1))
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_inv_rsp:ua port wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
if (!((sipUaDialog[dialogId].uaPort == 0xFFFF) || (sipUaDialog[dialogId].uaPort == uaPort)))
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_inv_rsp:dialog ua port not match\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
client = SIP_TRANS_SERVER;
method = SIP_TRANS_INVITE;
sdMsg->sipApiType = SIP_API_RES_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = SIP_METHOD_INVITE;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = SIP_METHOD_INVITE;
if (sip_ua_fill_msg_with_dialog(dialogId, sdMsg) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_inv_rsp:fill msg with dialog failed no proc port\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
if (sipUaPort[uaPort].llPort == 0xFFFF)
{
if ((ret = sip_create_transaction(client, method, sipUaSipIndex, uaPort, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_inv_rsp:create transaction in sip failed no proc port\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
sipUaPort[uaPort].dialogId = dialogId;
sipUaPort[uaPort].usrPort = usrPort;
sipUaPort[uaPort].cgId = cgId;//sipUaPort[uaPort].sapIndex = sapIndex;
sipUaPort[uaPort].llPort = ret;
}
if (sipUaPort[uaPort].usrPort == 0xFFFF)//if (sipUaDialog[dialogId].uaPort == 0xFFFF)
{
sipUaPort[uaPort].dialogId = dialogId;
sipUaPort[uaPort].usrPort = usrPort;
sipUaPort[uaPort].cgId = cgId;//sipUaPort[uaPort].sapIndex = sapIndex;
sipUaPort[uaPort].state = SIP_UA_SEND_RESPONSE;
sipUaPort[uaPort].timer = SIP_UA_TIMER_TIME_OUT;
}
memcpy(&sipUaPort[uaPort].sdSipMsg, sdMsg, sizeof(SIP_API_STRUCT));
sip_ua_set_send_cmd(&sipUaPort[uaPort], sdMsg);
sipUaDialog[dialogId].uaPort = uaPort;
sip_ua_fsm(uaPort);
return 0;
}
int sip_ua_send_cancel_inv_rsp(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg)//BYTE sapIndex
{
BYTE client;
BYTE method;
int ret;
WORD uaPort;
if (sdMsg == NULL)
return -1;
if (dialogId >= SIP_UA_MAX_NUM_OF_DIALOG)
{
return -1;
}
if (cgId != sipUaDialog[dialogId].cgId)//if (sapIndex != sipUaDialog[dialogId].userIndex)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_cancel_inv_rsp:userIndex wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
uaPort = sipUaDialog[dialogId].invUaPort.rvInvUaPort;
if ((uaPort >= SIP_UA_MAX_NUM_OF_PORT) || (sipUaPort[uaPort].flag != 1))
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_cancel_inv_rsp:ua port wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
if (!((sipUaDialog[dialogId].uaPort == 0xFFFF) || (sipUaDialog[dialogId].uaPort == uaPort)))
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_cancel_inv_rsp:dialog ua port not match\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
client = SIP_TRANS_SERVER;
method = SIP_TRANS_INVITE;
sdMsg->sipApiType = SIP_API_RES_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = SIP_METHOD_INVITE;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = SIP_METHOD_INVITE;
if (sip_ua_fill_msg_with_dialog(dialogId, sdMsg) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_cancel_inv_rsp:fill msg with dialog failed no proc port\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
if (sipUaPort[uaPort].llPort == 0xFFFF)
{
if ((ret = sip_create_transaction(client, method, sipUaSipIndex, uaPort, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_inv_rsp:create transaction in sip failed no proc port\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
sipUaPort[uaPort].dialogId = dialogId;
sipUaPort[uaPort].usrPort = usrPort;
sipUaPort[uaPort].cgId = cgId;//sipUaPort[uaPort].sapIndex = sapIndex;
sipUaPort[uaPort].llPort = ret;
}
if (sipUaPort[uaPort].usrPort == 0xFFFF)//if (sipUaDialog[dialogId].uaPort == 0xFFFF)
{
sipUaPort[uaPort].dialogId = dialogId;
sipUaPort[uaPort].usrPort = usrPort;
sipUaPort[uaPort].cgId = cgId;//sipUaPort[uaPort].sapIndex = sapIndex;
sipUaPort[uaPort].state = SIP_UA_SEND_RESPONSE;
sipUaPort[uaPort].timer = SIP_UA_TIMER_TIME_OUT;
}
memcpy(&sipUaPort[uaPort].sdSipMsg, sdMsg, sizeof(SIP_API_STRUCT));
sip_ua_set_send_cmd(&sipUaPort[uaPort], sdMsg);
sipUaDialog[dialogId].uaPort = uaPort;
sip_ua_fsm(uaPort);
return 0;
}
int sip_ua_send_re_inv_rsp(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg)//BYTE sapIndex
{
BYTE client;
BYTE method;
int ret;
WORD uaPort;
if (sdMsg == NULL)
return -1;
if (dialogId >= SIP_UA_MAX_NUM_OF_DIALOG)
{
return -1;
}
if (cgId != sipUaDialog[dialogId].cgId)//if (sapIndex != sipUaDialog[dialogId].userIndex)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_re_inv_rsp:userIndex wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
uaPort = sipUaDialog[dialogId].sipUaPort;
if ((uaPort >= SIP_UA_MAX_NUM_OF_PORT) || (sipUaPort[uaPort].flag != 1))
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_re_inv_rsp:ua port wrong\r\n");
sip_log_err(sipAsciTempBuf);
return -1;
}
client = SIP_TRANS_SERVER;
method = SIP_TRANS_INVITE;
sdMsg->sipApiType = SIP_API_RES_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = SIP_METHOD_RE_INVITE;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = SIP_METHOD_RE_INVITE;
if (sip_ua_fill_msg_with_dialog(dialogId, sdMsg) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_re_inv_rsp:fill msg with dialog failed no proc port\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
if ((ret = sip_create_transaction(client, method, sipUaSipIndex, uaPort, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_re_inv_rsp:create transaction in sip failed no proc port\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
sipUaPort[uaPort].dialogId = dialogId;
sipUaPort[uaPort].usrPort = usrPort;
sipUaPort[uaPort].cgId = cgId;//sipUaPort[uaPort].sapIndex = sapIndex;
sipUaPort[uaPort].llPort = ret;
sipUaPort[uaPort].state = SIP_UA_SEND_RESPONSE;
sipUaPort[uaPort].timer = SIP_UA_TIMER_TIME_OUT;
memcpy(&sipUaPort[uaPort].sdSipMsg, sdMsg, sizeof(SIP_API_STRUCT));
sip_ua_set_send_cmd(&sipUaPort[uaPort], sdMsg);
sipUaDialog[dialogId].uaPort = uaPort;
sip_ua_fsm(uaPort);
return 0;
}
int sip_ua_send_non_inv_rsp(BYTE cgId, WORD dialogId, WORD usrPort, BYTE method, SIP_API_STRUCT *sdMsg)//BYTE sapIndex
{
BYTE client;
BYTE sipMethod;
int ret;
WORD uaPort=0xFFFF;
if (sdMsg == NULL)
return -1;
if ((method != SIP_METHOD_OPTIONS) && (dialogId >= SIP_UA_MAX_NUM_OF_DIALOG))
{
return -1;
}
if (dialogId < SIP_UA_MAX_NUM_OF_DIALOG)
{
if (cgId != sipUaDialog[dialogId].cgId)
return -1;
}
client = SIP_TRANS_SERVER;
sipMethod = SIP_TRANS_NON_INVITE;
sdMsg->sipApiType = SIP_API_RES_MSG;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipMethod = method;
sdMsg->sipApiMsg.sipMsg.sipStartLine.sipVersion = SIP_VERSION_2_0;
sdMsg->sipApiMsg.sipMsg.sipHdrCseq.method = method;
if (dialogId < SIP_UA_MAX_NUM_OF_DIALOG)
{
if (sip_ua_fill_msg_with_dialog(dialogId, sdMsg) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_non_inv_rsp:fill msg with dialog failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
uaPort = sipUaDialog[dialogId].sipUaPort;
}
if (uaPort >= SIP_UA_MAX_NUM_OF_PORT)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_non_inv_rsp:uaPort wrong\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
if ((ret = sip_create_transaction(client, sipMethod, sipUaSipIndex, uaPort, sdMsg)) < 0)
{
sprintf((char *)sipAsciTempBuf, "sip_ua_send_non_inv_rsp:create transaction in sip failed\r\n");
sip_log_err(sipAsciTempBuf);
sip_ua_init_port(uaPort);
return -1;
}
sipUaPort[uaPort].dialogId = dialogId;
sipUaPort[uaPort].usrPort = usrPort;
sipUaPort[uaPort].cgId = cgId;//sipUaPort[uaPort].sapIndex = sapIndex;
sipUaPort[uaPort].llPort = ret;
sipUaPort[uaPort].state = SIP_UA_SEND_RESPONSE;
memcpy(&sipUaPort[uaPort].sdSipMsg, sdMsg, sizeof(SIP_API_STRUCT));
sip_ua_set_send_cmd(&sipUaPort[uaPort], sdMsg);
sip_ua_fsm(uaPort);
return 0;
}