Files
openairinterface5g/openair2/RRC/CELLULAR/rrc_rg_msg_peer.c
T
2013-06-25 09:05:02 +00:00

597 lines
26 KiB
C
Executable File

/***************************************************************************
rrc_rg_msg_peer.c - description
-------------------
begin : Jan 6, 2003
copyright : (C) 2003, 2010 by Eurecom
email : Michelle.Wetterwald@eurecom.fr
**************************************************************************
Procedures to perform encoding/decoding of RRC messages in RG
***************************************************************************/
/********************
//OpenAir definitions
********************/
#include "LAYER2/MAC/extern.h"
#include "UTIL/MEM/mem_block.h"
/********************
// RRC definitions
********************/
#include "rrc_rg_vars.h"
#include "rrc_msg_class.h"
//-----------------------------------------------------------------------------
#include "rrc_proto_msg.h"
#include "rrc_proto_int.h"
#include "rrc_proto_fsm.h"
/**************************************************************/
/* Uplink CCCH messages - Decode */
/**************************************************************/
/* RRCConnectionRequest */
//-----------------------------------------------------------------------------
int rrc_rg_msg_connreq(int * pUE ,UL_CCCH_Message * ul_ccch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
int UE_Id;
if ((UE_Id = get_new_UE_Id(&(ul_ccch_msg->message.content.rrcConnectionRequest.imei))) == 999)
return FAILURE;
*pUE = UE_Id;
status = rrc_PERDec_RRCConnectionRequest(UE_Id,(RRCConnectionRequest*) &(ul_ccch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Connection Request Received - status : %d\n", status);
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* CellUpdate */
//-----------------------------------------------------------------------------
int rrc_rg_msg_cellUpdate(int* pUE ,UL_CCCH_Message * ul_ccch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
int UE_Id;
if (ul_ccch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_CellUpdate(pUE,(CellUpdate*) &(ul_ccch_msg->message.content));
if (status == SUCCESS)
UE_Id = *pUE ;
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Cell Update Received - status : %d\n", status);
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/**************************************************************/
/* Uplink DCCH messages - Decode */
/**************************************************************/
/* RRCConnectionSetupComplete */
//-----------------------------------------------------------------------------
int rrc_rg_msg_connsucompl(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
status = rrc_PERDec_RRCConnectionSetupComplete(UE_Id,(RRCConnectionSetupComplete*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Connection Setup Complete Received - status : %d\n", status);
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* RRCConnectionRelease_UL */
//-----------------------------------------------------------------------------
int rrc_rg_msg_connrelUL(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (ul_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_RRCConnectionRelease_UL(UE_Id,(RRCConnectionRelease_UL*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] RRC Connection Release UL Received - status : %d\n", status);
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* InitialDirectTransfer */
//-----------------------------------------------------------------------------
int rrc_rg_msg_initXfer(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (ul_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_InitialDirectTransfer(UE_Id,(InitialDirectTransfer*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Initial Direct Transfer Received - status : %d\n", status);
//rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* UplinkDirectTransfer */
//-----------------------------------------------------------------------------
int rrc_rg_msg_ulXfer(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (ul_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_UplinkDirectTransfer(UE_Id,(UplinkDirectTransfer*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Uplink Direct Transfer Received - status : %d\n", status);
//rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* RadioBearerSetupComplete */
//-----------------------------------------------------------------------------
int rrc_rg_msg_rbsetupcompl(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (ul_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_RadioBearerSetupComplete(UE_Id,(RadioBearerSetupComplete*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Setup Complete Received - status : %d\n", status);
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* RadioBearerSetupFailure */
//-----------------------------------------------------------------------------
int rrc_rg_msg_rbsetupfail(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (ul_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_RadioBearerSetupFailure(UE_Id,(RadioBearerSetupFailure*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Setup Failure Received - status : %d\n", status);
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* RadioBearerReleaseComplete */
//-----------------------------------------------------------------------------
int rrc_rg_msg_rbreleasecompl(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (ul_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_RadioBearerReleaseComplete(UE_Id,(RadioBearerReleaseComplete*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Release Complete Received - status : %d\n", status);
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* RadioBearerReleaseFailure */
//-----------------------------------------------------------------------------
int rrc_rg_msg_rbreleasefail(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (ul_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_RadioBearerReleaseFailure(UE_Id,(RadioBearerReleaseFailure*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Release Failure Received - status : %d\n", status);
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* Measurement Report */
//-----------------------------------------------------------------------------
int rrc_rg_msg_measrepr(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (ul_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_MeasurementReport(UE_Id,(MeasurementReport*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Measurement Report Received - status : %d\n", status);
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/* UE Capability Information */
//-----------------------------------------------------------------------------
int rrc_rg_msg_ueCapInfo(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (ul_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_UECapabilityInformation(UE_Id,(UECapabilityInformation*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] UE Capability Information Received - status : %d\n", status);
msg("[RRC_MSG] UE_Id = %d, Kernel Release = %d, ", UE_Id, protocol_bs->rrc.Mobile_List[UE_Id].ind_eurecomKernelRelease);
msg("Access Stratum Release = ");
switch(protocol_bs->rrc.Mobile_List[UE_Id].ind_accessStratumRelease){
case ACCESS_STRATUM_RELEASE_INDICATOR_REL_4: msg("REL-4\n"); break;
case ACCESS_STRATUM_RELEASE_INDICATOR_REL_5: msg("REL-5\n"); break;
case ACCESS_STRATUM_RELEASE_INDICATOR_REL_6: msg("REL-6\n"); break;
default: msg("Unrecoginized!\n");
}
rrc_mt_list_print(UE_Id);
#endif
return status;
}
/**************************************************************/
/* Downlink CCCH messages - Encode */
/**************************************************************/
/* RRCConnectionSetup */
//-----------------------------------------------------------------------------
void rrc_rg_msg_connsetup(int UE_Id, int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
DL_CCCH_Message * dl_ccch_msg;
mem_block_t *p;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_CCCH_rrcConnectionSetup;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
//
// prepare encoding
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
*Message_Id = UE_Id;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
MSG_HEAD_LGTH + sizeof(RRCConnectionSetup);
// Temp - Test/Messages
// dl_ccch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
// memset (dl_ccch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
dl_ccch_msg = (struct DL_CCCH_Message *)p->data;
//
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_ccch_msg;
// Encode
dl_ccch_msg->integrityCheckInfo = 0; // No check with RRC Connection Setup
dl_ccch_msg->message.type = DL_CCCH_rrcConnectionSetup;
status = rrc_PEREnc_RRCConnectionSetup(UE_Id,(RRCConnectionSetup*) &(dl_ccch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] RRC Connection Setup - status : %d - length : %d\n",
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
#endif
}
/* RRCConnectionReject */
//-----------------------------------------------------------------------------
void rrc_rg_msg_connreject(int UE_Id, int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
DL_CCCH_Message * dl_ccch_msg;
mem_block_t *p;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_CCCH_rrcConnectionReject;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
//
// prepare encoding
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
*Message_Id = UE_Id;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(RRCConnectionReject);
// Temp - Test/Messages
// dl_ccch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
// memset (dl_ccch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
dl_ccch_msg = (struct DL_CCCH_Message *)p->data;
//
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_ccch_msg;
// Encode
dl_ccch_msg->integrityCheckInfo = 0; // No check with RRC Connection Reject
dl_ccch_msg->message.type = DL_CCCH_rrcConnectionReject;
status = rrc_PEREnc_RRCConnectionReject(UE_Id,(RRCConnectionReject*) &(dl_ccch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] RRC Connection Reject - status : %d - length : %d\n",
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
#endif
}
/* CellUpdateConfirm_CCCH */
//-----------------------------------------------------------------------------
void rrc_rg_msg_cellupdatecnfccch(int UE_Id, int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
DL_CCCH_Message * dl_ccch_msg;
mem_block_t *p;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_CCCH_cellUpdateConfirm;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
//
// prepare encoding
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
*Message_Id = UE_Id;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(CellUpdateConfirm_CCCH);
// Temp - Test/Messages
// dl_ccch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
// memset (dl_ccch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
dl_ccch_msg = (struct DL_CCCH_Message *)p->data;
//
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_ccch_msg;
// Encode
dl_ccch_msg->integrityCheckInfo = 123;
dl_ccch_msg->message.type = DL_CCCH_cellUpdateConfirm;
status = rrc_PEREnc_CellUpdateConfirm_CCCH(UE_Id,(CellUpdateConfirm_CCCH*) &(dl_ccch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Cell Update Confirm (CCCH) - status : %d - length : %d\n",
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
#endif
}
/**************************************************************/
/* Downlink DCCH messages - Encode */
/**************************************************************/
/* RadioBearerSetup */
//-----------------------------------------------------------------------------
void rrc_rg_msg_rbsetup(int UE_Id, int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
DL_DCCH_Message * dl_dcch_msg;
mem_block_t *p;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_radioBearerSetup;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
//
// prepare encoding
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
*Message_Id = UE_Id;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
MSG_HEAD_LGTH + sizeof(RadioBearerSetup);
// Temp - Test/Messages
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
//
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
// Encode
dl_dcch_msg->integrityCheckInfo = 123;
dl_dcch_msg->message.type = DL_DCCH_radioBearerSetup;
status = rrc_PEREnc_RadioBearerSetup(UE_Id,(RadioBearerSetup*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Setup - status : %d - length : %d\n",
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
#endif
}
/* RadioBearerRelease */
//-----------------------------------------------------------------------------
void rrc_rg_msg_rbrelease(int UE_Id, int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
DL_DCCH_Message * dl_dcch_msg;
mem_block_t *p;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_radioBearerRelease;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
//
// prepare encoding
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
*Message_Id = UE_Id;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
MSG_HEAD_LGTH + sizeof(RadioBearerRelease);
// Temp - Test/Messages
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
//
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
// Encode
dl_dcch_msg->integrityCheckInfo = 123;
dl_dcch_msg->message.type = DL_DCCH_radioBearerRelease;
status = rrc_PEREnc_RadioBearerRelease(UE_Id,(RadioBearerRelease*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Release - status : %d - length : %d\n",
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
#endif
}
/* DownlinkDirectTransfer */
//-----------------------------------------------------------------------------
void rrc_rg_msg_dlXfer(int UE_Id, int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
DL_DCCH_Message * dl_dcch_msg;
mem_block_t *p;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_downlinkDirectTransfer;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
//
// prepare encoding
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
*Message_Id = UE_Id;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
MSG_HEAD_LGTH + sizeof(DownlinkDirectTransfer);
// Temp - Test/Messages
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
//
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
// Encode
dl_dcch_msg->integrityCheckInfo = 123;
dl_dcch_msg->message.type = DL_DCCH_downlinkDirectTransfer;
status = rrc_PEREnc_DownlinkDirectTransfer(UE_Id,(DownlinkDirectTransfer*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Downlink Direct Transfer - status : %d - length : %d\n",
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
#endif
}
/* PagingType2 */
//-----------------------------------------------------------------------------
void rrc_rg_msg_pagingt2(int UE_Id, int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
DL_DCCH_Message * dl_dcch_msg;
mem_block_t *p;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_pagingType2;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
//
// prepare encoding
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
*Message_Id = UE_Id;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
MSG_HEAD_LGTH + sizeof(PagingType2);
// Temp - Test/Messages
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
//
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
// Encode
dl_dcch_msg->integrityCheckInfo = 123;
dl_dcch_msg->message.type = DL_DCCH_pagingType2;
status = rrc_PEREnc_PagingType2(UE_Id,(PagingType2*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Paging Type 2 - status : %d - length : %d\n",
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
#endif
}
/* Measurement Control */
//-----------------------------------------------------------------------------
void rrc_rg_msg_measctl(int UE_Id, int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
DL_DCCH_Message * dl_dcch_msg;
mem_block_t *p;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_measurementControl;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
//
// prepare encoding
*Message_Id = UE_Id;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(MeasurementControl);
// Temp - Test/Messages
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
//
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
// Encode
dl_dcch_msg->integrityCheckInfo = 123;
dl_dcch_msg->message.type = DL_DCCH_measurementControl;
status = rrc_PEREnc_MeasurementControl(UE_Id,(MeasurementControl*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Measurement Control - status : %d - length : %d\n",
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
#endif
}
/* UE Capability Information Confirm */
//-----------------------------------------------------------------------------
void rrc_rg_msg_ueCapInfoCnf(int UE_Id, int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
DL_DCCH_Message * dl_dcch_msg;
mem_block_t *p;
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_measurementControl;
// TODO
//protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
// (protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
// prepare encoding
*Message_Id = UE_Id;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(UECapabilityInformationConfirm);
//Allocation
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
//
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
// Encode
dl_dcch_msg->integrityCheckInfo = 123;
dl_dcch_msg->message.type = DL_DCCH_ueCapabilityInformationConfirm;
status = rrc_PEREnc_UECapabilityInformationConfirm(UE_Id, (UECapabilityInformationConfirm*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Measurement Control - status : %d - length : %d\n",
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
#endif
}