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

📄 bs_msghandle.c

📁 wimax bs模拟器
💻 C
📖 第 1 页 / 共 3 页
字号:

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 + -