📄 bs_msghandle.c
字号:
void send_dp_reg_resp (St_BsUeCtxt * pUeCtxt)
{
R64_MSG_S msg;
bzero((char *)&msg, sizeof(msg));
if(pUeCtxt->sendCount < TXTIME)
{
gen_dp_reg_resp(pUeCtxt, &msg);
printf("Before Sending DP RESP");
if(ERROR == bs_r6_msg_send(&msg))
{
TRACE3("DP RESP sending Error!");
}
BS_StartTimer(pUeCtxt->timer, EXPIRES);
pUeCtxt->sendCount++;
}
else
{
TRACE3("NO RSP answer for DP_REG_RESP!\n");
PRNT_MSID(&msg);
handle_bs_err (pUeCtxt);
}
return;
}
/****************************************************************************
**
** Function Name: handle_dp_reg_ack
**
** Description:
** Handle data path registration ack of data path registration procedure.
**
** Argument Type IO Description
** ------------- -------- -- ---------------------------------
** pUeCtxt St_BsUeCtxt * I pointer of UE context
** pR64Msg R64_MSG_S * I pointer R64 message
**
** Return Value: int SUCCESS/FAILURE value
** 0 SUCCESS
** -1 FAILURE
**
****************************************************************************/
int handle_dp_reg_ack (St_BsUeCtxt * pUeCtxt, R64_MSG_S * pR64Msg)
{
extern St_DhcpBinding *gpDhcpClientTestBinding;
BS_StopTimer(pUeCtxt->timer);
BS_DestroyTimer(&pUeCtxt->timer);
pUeCtxt->transId= pR64Msg->msgHead.transId;
if(pR64Msg->u.dataPathRegAck.causeCode.code == R64_CAUSE_FAILURE)
{
TRACE3("Data path registration failed!\n");
PRNT_MSID(pR64Msg);
BS_UeFree(pUeCtxt);
return FAILURE;
}
pUeCtxt->state = BSFS_DATA_TRANSFER;
/* DHCP proc*/
TRACE2("trigger dhcp msId: 0x%02x%02x%02x-%02x%02x%02x\n",
pUeCtxt->msId.id[0],pUeCtxt->msId.id[1],pUeCtxt->msId.id[2],
pUeCtxt->msId.id[3],pUeCtxt->msId.id[4],pUeCtxt->msId.id[5]);
/*printf("trigger dhcp msId: 0x%02x%02x%02x-%02x%02x%02x\n",
pUeCtxt->msId.id[0],pUeCtxt->msId.id[1],pUeCtxt->msId.id[2],
pUeCtxt->msId.id[3],pUeCtxt->msId.id[4],pUeCtxt->msId.id[5]);
*/
dhcp_client_send_discover((unsigned char *)pUeCtxt->msId.id);
pUeCtxt->dhcpClientTestBinding = gpDhcpClientTestBinding;
return SUCCESS;
}
/****************************************************************************
**
** Function Name: init_ms_dereg
**
** Description:
** Init data path deregistration procedure.
**
** Argument Type IO Description
** ------------- -------- -- ---------------------------------
** pUeCtxt St_BsUeCtxt * I pointer of UE context
** pR64Msg R64_MSG_S * I pointer R64 message
**
** Return Value: int SUCCESS/FAILURE value
** 0 SUCCESS
** -1 FAILURE
**
****************************************************************************/
int init_ms_dereg (St_BsUeCtxt * pUeCtxt, R64_MSG_S * pR64Msg)
{
pUeCtxt->state = BSFS_DP_DEREG_START;
pUeCtxt->xid++;
BS_CreateTimer(&pUeCtxt->timer, (BS_TMR_FUNC )BS_PostTimer, pUeCtxt);
pUeCtxt->sendCount = 0;
send_dp_dereg_req(pUeCtxt);
return SUCCESS;
}
void gen_dp_dereg_req (St_BsUeCtxt * pUeCtxt, R64_MSG_S * pMsg)
{
pMsg->u.dataPathDeregReq.present.deregTypePresent = PRESENT;
pMsg->u.dataPathDeregReq.present.msInfoPresent = PRESENT;
pMsg->u.dataPathDeregReq.msInfo.present.msIdPresent = PRESENT;
pMsg->u.dataPathDeregReq.present.bsInfoPresent = PRESENT;
pMsg->u.dataPathDeregReq.bsInfo.present.bsIdPresent = PRESENT;
pMsg->u.dataPathDeregReq.deregType.type = R64_REGISTRATION_BS_INITIATED_DEREGISTRATION;
bcopy((char *)&pUeCtxt->msId, (char *)&pMsg->u.dataPathDeregReq.msInfo.msId, sizeof(R64_MS_ID_S));
bcopy((char *)&gBsId, (char *)&pMsg->u.dataPathDeregReq.bsInfo.bsId, sizeof(R64_BS_ID_S));
pMsg->u.dataPathDeregReq.bsInfo.targetServingInd.indicator = R64_SERVING_NODE;
pMsg->msgHead.functionType = R64_FUNCTION_TYPE_DATA_PATH;
pMsg->msgHead.messageType = R64_ID_DATA_PATH_DE_REGISTRATION_REQUEST;
bcopy((char *)&pUeCtxt->msId, (char *)&pMsg->msgHead.msId, sizeof(R64_MS_ID_S));
pMsg->msgHead.transId = pUeCtxt->xid;
pMsg->msgHead.sourceIp = gSourceIp;
pMsg->msgHead.destinationIp = gDestinationIp;
pMsg->msgHead.sourceUdpPort = BS_R6_UDP_PORT;
pMsg->msgHead.destinationUdpPort = GW_R6_UDP_PORT;
pMsg->msgHead.ifType = IF_TYPE_R6;
return;
}
void send_dp_dereg_req (St_BsUeCtxt * pUeCtxt)
{
R64_MSG_S msg;
bzero((char *)&msg, sizeof(msg));
if(pUeCtxt->sendCount < TXTIME)
{
gen_dp_dereg_req(pUeCtxt, &msg);
bs_r6_msg_send(&msg);
BS_StartTimer(pUeCtxt->timer, EXPIRES);
pUeCtxt->sendCount++;
}
else
{
TRACE3("NO RSP answer for DP_DREG_REQ!.\n");
PRNT_MSID(&msg);
handle_bs_err (pUeCtxt);
}
return;
}
/****************************************************************************
**
** Function Name: handle_dp_dereg_resp
**
** Description:
** Handle data path deregistration response of data path deregistration procedure.
**
** Argument Type IO Description
** ------------- -------- -- ---------------------------------
** pUeCtxt St_BsUeCtxt * I pointer of UE context
** pR64Msg R64_MSG_S * I pointer R64 message
**
** Return Value: int SUCCESS/FAILURE value
** 0 SUCCESS
** -1 FAILURE
**
****************************************************************************/
int handle_dp_dereg_resp (St_BsUeCtxt * pUeCtxt, R64_MSG_S * pR64Msg)
{
BS_StopTimer(pUeCtxt->timer);
BS_DestroyTimer(&pUeCtxt->timer);
pUeCtxt->transId = pR64Msg->msgHead.transId;
send_dp_dreg_ack(pUeCtxt);
BS_UeFree(pUeCtxt);
pUeCtxt->state = BSFS_NULL;
return SUCCESS;
}
void send_dp_dreg_ack (St_BsUeCtxt * pUeCtxt)
{
R64_MSG_S msg;
bzero((char *)&msg, sizeof(msg));
msg.u.dataPathDeregReq.present.deregTypePresent = PRESENT;
msg.u.dataPathDeregReq.present.msInfoPresent = PRESENT;
msg.u.dataPathDeregReq.msInfo.present.msIdPresent = PRESENT;
msg.u.dataPathDeregReq.deregType.type = R64_REGISTRATION_BS_INITIATED_DEREGISTRATION;
bcopy((char *)&pUeCtxt->msId, (char *)&msg.u.dataPathDeregReq.msInfo.msId, sizeof(R64_MS_ID_S));
msg.msgHead.functionType = R64_FUNCTION_TYPE_DATA_PATH;
msg.msgHead.messageType = R64_ID_DATA_PATH_DE_REGISTRATION_ACK;
bcopy((char *)&pUeCtxt->msId, (char *)&msg.msgHead.msId, sizeof(R64_MS_ID_S));
msg.msgHead.transId = pUeCtxt->transId;
msg.msgHead.sourceIp = gSourceIp;
msg.msgHead.destinationIp = gDestinationIp;
msg.msgHead.sourceUdpPort = BS_R6_UDP_PORT;
msg.msgHead.destinationUdpPort = GW_R6_UDP_PORT;
msg.msgHead.ifType = IF_TYPE_R6;
bs_r6_msg_send(&msg);
return;
}
/****************************************************************************
**
** Function Name: handle_err_ctxt_rep
**
** Description:
** Handle error context report.
**
** Argument Type IO Description
** ------------- -------- -- ---------------------------------
** pUeCtxt St_BsUeCtxt * I pointer of UE context
** pR64Msg R64_MSG_S * I pointer R64 message
**
** Return Value: int SUCCESS/FAILURE value
** 0 SUCCESS
** -1 FAILURE
**
****************************************************************************/
int handle_err_ctxt_rep (St_BsUeCtxt * pUeCtxt, R64_MSG_S * pR64Msg)
{
pUeCtxt->transId= pR64Msg->msgHead.transId;
if(pUeCtxt->state < BSFS_DATA_TRANSFER)
{
pUeCtxt->state = BSFS_NULL;
send_err_ctxt_rep_ack(pUeCtxt);
BS_UeFree(pUeCtxt);
}
else
init_ms_dereg(pUeCtxt, pR64Msg);
return SUCCESS;
}
void send_err_ctxt_rep_ack (St_BsUeCtxt * pUeCtxt)
{
R64_MSG_S msg;
bzero((char *)&msg, sizeof(msg));
msg.u.msContextRepAck.present.purposeIndPresent = PRESENT;
msg.u.msContextRepAck.present.msInfoPresent = PRESENT;
msg.u.msContextRepAck.msInfo.present.msIdPresent = PRESENT;
msg.u.msContextRepAck.purposeInd.indicator = R64_CONTEXT_PURPOSE_MS_ERROR;
bcopy((char *)&pUeCtxt->msId, (char *)&msg.u.msContextRepAck.msInfo.msId, sizeof(R64_MS_ID_S));
msg.msgHead.functionType = R64_FUNCTION_TYPE_CONTEXT;
msg.msgHead.messageType = R64_ID_CONTEXT_ACK;
bcopy((char *)&pUeCtxt->msId, (char *)&msg.msgHead.msId, sizeof(R64_MS_ID_S));
msg.msgHead.transId = pUeCtxt->transId;
msg.msgHead.sourceIp = gSourceIp;
msg.msgHead.destinationIp = gDestinationIp;
msg.msgHead.sourceUdpPort = BS_R6_UDP_PORT;
msg.msgHead.destinationUdpPort = GW_R6_UDP_PORT;
msg.msgHead.ifType = IF_TYPE_R6;
bs_r6_msg_send(&msg);
return;
}
/****************************************************************************
**
** Function Name: handle_bs_err
**
** Description:
** Handle bs init error.
**
** Argument Type IO Description
** ------------- -------- -- ---------------------------------
** pUeCtxt St_BsUeCtxt * I pointer of UE context
** pR64Msg R64_MSG_S * I pointer R64 message
**
** Return Value: int SUCCESS/FAILURE value
** 0 SUCCESS
** -1 FAILURE
**
****************************************************************************/
int handle_bs_err (St_BsUeCtxt * pUeCtxt)
{
if(pUeCtxt->state < BSFS_DATA_TRANSFER)
{
pUeCtxt->state = BSFS_NULL;
send_err_ctxt_rep(pUeCtxt);
BS_UeFree(pUeCtxt);
}
else
init_ms_dereg(pUeCtxt, NULL);
return SUCCESS;
}
void send_err_ctxt_rep (St_BsUeCtxt * pUeCtxt)
{
R64_MSG_S msg;
bzero((char *)&msg, sizeof(msg));
msg.u.msContextRep.present.contextPurposeIndicatorPresent = PRESENT;
msg.u.msContextRep.present.msInfoPresent = PRESENT;
msg.u.msContextRep.msInfo.present.msIdPresent = PRESENT;
msg.u.msContextRep.contextPurposeIndicator.indicator = R64_CONTEXT_PURPOSE_MS_ERROR;
msg.u.msContextRep.msInfo.msId = pUeCtxt->msId;
msg.msgHead.functionType = R64_FUNCTION_TYPE_CONTEXT;
msg.msgHead.messageType = R64_ID_CONTEXT_REPORT;
msg.msgHead.msId = pUeCtxt->msId;
msg.msgHead.transId = pUeCtxt->transId;
msg.msgHead.sourceIp = gSourceIp;
msg.msgHead.destinationIp = gDestinationIp;
msg.msgHead.sourceUdpPort = BS_R6_UDP_PORT;
msg.msgHead.destinationUdpPort = GW_R6_UDP_PORT;
msg.msgHead.ifType = IF_TYPE_R6;
bs_r6_msg_send(&msg);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -