@ -27,6 +27,9 @@
# include <unistd.h>
# include <sstream>
# include <srslte/asn1/liblte_rrc.h>
# include <upper/rrc.h>
# include <srslte/phy/common/phy_common.h>
# include "upper/rrc.h"
# include "srslte/common/security.h"
@ -44,17 +47,14 @@ namespace srsue{
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
rrc : : rrc ( )
: state ( RRC_STATE_IDLE )
, drb_up ( false )
{ }
: state ( RRC_STATE_IDLE ) , drb_up ( false ) { }
static void liblte_rrc_handler ( void * ctx , char * str ) {
rrc * r = ( rrc * ) ctx ;
r - > liblte_rrc_log ( str ) ;
}
void rrc : : liblte_rrc_log ( char * str )
{
void rrc : : liblte_rrc_log ( char * str ) {
if ( rrc_log ) {
rrc_log - > warning ( " [ASN]: %s \n " , str ) ;
} else {
@ -69,8 +69,7 @@ void rrc::init(phy_interface_rrc *phy_,
nas_interface_rrc * nas_ ,
usim_interface_rrc * usim_ ,
mac_interface_timers * mac_timers_ ,
srslte : : log * rrc_log_ )
{
srslte : : log * rrc_log_ ) {
pool = byte_buffer_pool : : get_instance ( ) ;
phy = phy_ ;
mac = mac_ ;
@ -101,19 +100,16 @@ void rrc::init(phy_interface_rrc *phy_,
set_mac_default ( ) ;
}
void rrc : : stop ( )
{
void rrc : : stop ( ) {
thread_running = false ;
wait_thread_finish ( ) ;
}
rrc_state_t rrc : : get_state ( )
{
rrc_state_t rrc : : get_state ( ) {
return state ;
}
void rrc : : set_ue_category ( int category )
{
void rrc : : set_ue_category ( int category ) {
if ( category > = 1 & & category < = 5 ) {
ue_category = category ;
} else {
@ -138,8 +134,7 @@ void rrc::set_ue_category(int category)
NAS interface
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
uint16_t rrc : : get_mcc ( )
{
uint16_t rrc : : get_mcc ( ) {
if ( current_cell ) {
if ( current_cell - > sib1 . N_plmn_ids > 0 ) {
return current_cell - > sib1 . plmn_id [ 0 ] . id . mcc ;
@ -148,8 +143,7 @@ uint16_t rrc::get_mcc()
return 0 ;
}
uint16_t rrc : : get_mnc ( )
{
uint16_t rrc : : get_mnc ( ) {
if ( current_cell ) {
if ( current_cell - > sib1 . N_plmn_ids > 0 ) {
return current_cell - > sib1 . plmn_id [ 0 ] . id . mnc ;
@ -158,15 +152,14 @@ uint16_t rrc::get_mnc()
return 0 ;
}
void rrc : : plmn_search ( )
{
void rrc : : plmn_search ( ) {
rrc_log - > info ( " Starting PLMN search procedure \n " ) ;
state = RRC_STATE_PLMN_SELECTION ;
phy - > cell_search_start ( ) ;
}
void rrc : : plmn_select ( LIBLTE_RRC_PLMN_IDENTITY_STRUCT plmn_id )
{
bool sync_ok = false ;
void rrc : : plmn_select ( LIBLTE_RRC_PLMN_IDENTITY_STRUCT plmn_id ) {
rrc_log - > info ( " PLMN %s selected \n " , plmn_id_to_c_str ( plmn_id ) . c_str ( ) ) ;
state = RRC_STATE_CELL_SELECTING ;
@ -178,17 +171,12 @@ void rrc::plmn_select(LIBLTE_RRC_PLMN_IDENTITY_STRUCT plmn_id)
select_next_cell_in_plmn ( ) ;
}
void rrc : : connect ( )
{
void rrc : : connect ( ) {
pthread_mutex_lock ( & mutex ) ;
if ( RRC_STATE_CELL_SELECTED = = state ) {
if ( si_acquire_state = = SI_ACQUIRE_IDLE ) {
rrc_log - > info ( " RRC in IDLE state - sending connection request. \n " ) ;
state = RRC_STATE_CONNECTING ;
send_con_request ( ) ;
} else {
rrc_log - > warning ( " Received connect() but SI not acquired \n " ) ;
}
} else {
rrc_log - > warning ( " Received connect() but cell is not selected \n " ) ;
}
@ -199,13 +187,38 @@ void rrc::select_next_cell_in_plmn() {
for ( uint32_t i = last_selected_cell + 1 ; i < known_cells . size ( ) ; i + + ) {
for ( uint32_t j = 0 ; j < known_cells [ i ] . sib1 . N_plmn_ids ; j + + ) {
if ( known_cells [ i ] . sib1 . plmn_id [ j ] . id . mcc = = selected_plmn_id . mcc | |
known_cells [ i ] . sib1 . plmn_id [ j ] . id . mnc = = selected_plmn_id . mnc )
{
known_cells [ i ] . sib1 . plmn_id [ j ] . id . mnc = = selected_plmn_id . mnc ) {
rrc_log - > info ( " Selecting cell PCI=%d, EARFCN=%d, Cell ID=0x%x \n " ,
known_cells [ i ] . phy_cell . id , known_cells [ i ] . earfcn ,
known_cells [ i ] . sib1 . cell_id ) ;
rrc_log - > console ( " Selecting cell PCI=%d, EARFCN=%d, Cell ID=0x%x \n " ,
known_cells [ i ] . phy_cell . id , known_cells [ i ] . earfcn ,
known_cells [ i ] . sib1 . cell_id ) ;
// Check that cell satisfies S criteria
if ( phy - > cell_select ( known_cells [ i ] . earfcn , known_cells [ i ] . phy_cell ) ) {
// Give time to the PHY to sync on the new cell
int cnt = 0 ;
while ( ! phy - > sync_status ( ) & & cnt < 100 ) {
usleep ( 1000 ) ;
cnt + + ;
}
if ( phy - > sync_status ( ) ) {
if ( ! known_cells [ i ] . has_valid_sib1 ) {
si_acquire_state = SI_ACQUIRE_SIB1 ;
} else if ( ! known_cells [ i ] . has_valid_sib2 ) {
si_acquire_state = SI_ACQUIRE_SIB2 ;
} else {
si_acquire_state = SI_ACQUIRE_IDLE ;
}
last_selected_cell = i ;
} else {
rrc_log - > warning ( " Selecting cell EARFCN=%d, Cell ID=0x%x: Could not synchronize \n " ,
known_cells [ i ] . earfcn , known_cells [ i ] . sib1 . cell_id ) ;
}
return ;
} else {
rrc_log - > warning ( " Selecting cell EARFCN=%d, Cell ID=0x%x. \n " ,
known_cells [ i ] . earfcn , known_cells [ i ] . sib1 . cell_id ) ;
}
}
}
@ -223,7 +236,8 @@ void rrc::cell_found(uint32_t earfcn, srslte_cell_t phy_cell, float rsrp) {
if ( earfcn = = known_cells [ i ] . earfcn & & phy_cell . id = = known_cells [ i ] . phy_cell . id ) {
known_cells [ i ] . rsrp = rsrp ;
current_cell = & known_cells [ i ] ;
rrc_log - > info ( " Updating cell EARFCN=%d, PCI=%d, RSRP=%d dBm \n " , known_cells [ i ] . earfcn , known_cells [ i ] . phy_cell . id , known_cells [ i ] . rsrp ) ;
rrc_log - > info ( " Updating cell EARFCN=%d, PCI=%d, RSRP=%.1f dBm \n " , known_cells [ i ] . earfcn ,
known_cells [ i ] . phy_cell . id , known_cells [ i ] . rsrp ) ;
return ;
}
}
@ -239,13 +253,20 @@ void rrc::cell_found(uint32_t earfcn, srslte_cell_t phy_cell, float rsrp) {
// save current cell
current_cell = & known_cells . back ( ) ;
rrc_log - > info ( " Found new cell EARFCN=%d, PCI=%d, RSRP=%d dBm \n " , cell . earfcn , cell . phy_cell . id , cell . rsrp ) ;
si_acquire_state = SI_ACQUIRE_SIB1 ;
rrc_log - > info ( " Found Cell: PCI=%d, PRB=%d, Ports=%d, EARFCN=%d, RSRP=%.1f dBm \n " ,
cell . phy_cell . id , cell . phy_cell . nof_prb , cell . phy_cell . nof_ports ,
cell . earfcn , cell . rsrp ) ;
rrc_log - > console ( " Found Cell: PCI=%d, PRB=%d, Ports=%d, EARFCN=%d, RSRP=%.1f dBm \n " ,
cell . phy_cell . id , cell . phy_cell . nof_prb , cell . phy_cell . nof_ports ,
cell . earfcn , cell . rsrp ) ;
}
// Detection of physical layer problems (5.3.11.1)
void rrc : : out_of_sync ( )
{
void rrc : : out_of_sync ( ) {
if ( ! mac_timers - > get ( t311 ) - > is_running ( ) & & ! mac_timers - > get ( t310 ) - > is_running ( ) ) {
n310_cnt + + ;
if ( n310_cnt = = N310 ) {
@ -258,8 +279,7 @@ void rrc::out_of_sync()
}
// Recovery of physical layer problems (5.3.11.2)
void rrc : : in_sync ( )
{
void rrc : : in_sync ( ) {
if ( mac_timers - > get ( t310 ) - > is_running ( ) ) {
n311_cnt + + ;
if ( n311_cnt = = N311 ) {
@ -273,20 +293,17 @@ void rrc::in_sync()
/*******************************************************************************
PDCP interface
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void rrc : : write_pdu_bcch_bch ( byte_buffer_t * pdu )
{
void rrc : : write_pdu_bcch_bch ( byte_buffer_t * pdu ) {
pool - > deallocate ( pdu ) ;
if ( state = = RRC_STATE_PLMN_SELECTION ) {
// Do we need to do something with BCH?
rrc_log - > info_hex ( pdu - > msg , pdu - > N_bytes , " BCCH BCH message received. " ) ;
si_acquire_state = SI_ACQUIRE_SIB1 ;
} else {
rrc_log - > warning ( " Received BCCH BCH in incorrect state \n " ) ;
}
}
void rrc : : write_pdu_bcch_dlsch ( byte_buffer_t * pdu )
{
void rrc : : write_pdu_bcch_dlsch ( byte_buffer_t * pdu ) {
rrc_log - > info_hex ( pdu - > msg , pdu - > N_bytes , " BCCH DLSCH message received. " ) ;
rrc_log - > info ( " BCCH DLSCH message Stack latency: %ld us \n " , pdu - > get_latency_us ( ) ) ;
LIBLTE_RRC_BCCH_DLSCH_MSG_STRUCT dlsch_msg ;
@ -296,8 +313,7 @@ void rrc::write_pdu_bcch_dlsch(byte_buffer_t *pdu)
liblte_rrc_unpack_bcch_dlsch_msg ( ( LIBLTE_BIT_MSG_STRUCT * ) & bit_buf , & dlsch_msg ) ;
if ( dlsch_msg . N_sibs > 0 ) {
if ( LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_1 = = dlsch_msg . sibs [ 0 ] . sib_type & & SI_ACQUIRE_SIB1 = = si_acquire_state )
{
if ( LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_1 = = dlsch_msg . sibs [ 0 ] . sib_type & & SI_ACQUIRE_SIB1 = = si_acquire_state ) {
mac - > bcch_stop_rx ( ) ;
// Handle SIB1
@ -308,64 +324,75 @@ void rrc::write_pdu_bcch_dlsch(byte_buffer_t *pdu)
liblte_rrc_si_window_length_num [ current_cell - > sib1 . si_window_length ] ,
liblte_rrc_si_periodicity_num [ current_cell - > sib1 . sched_info [ 0 ] . si_periodicity ] ) ;
// Send PLMN and TAC to NAS
std : : stringstream ss ;
for ( uint32_t i = 0 ; i < current_cell - > sib1 . N_plmn_ids ; i + + ) {
std : : string mcc ;
std : : string mnc ;
mcc_to_string ( current_cell - > sib1 . plmn_id [ i ] . id . mcc , & mcc ) ;
mnc_to_string ( current_cell - > sib1 . plmn_id [ i ] . id . mnc , & mnc ) ;
ss < < " PLMN Id: MCC " < < mcc < < " MNC " < < mnc ;
nas - > plmn_found ( current_cell - > sib1 . plmn_id [ i ] . id , current_cell - > sib1 . tracking_area_code ) ;
}
// Set TDD Config
if ( current_cell - > sib1 . tdd ) {
phy - > set_config_tdd ( & current_cell - > sib1 . tdd_cnfg ) ;
}
rrc_log - > console ( " SIB1 received, CellID=%d, %s \n " ,
current_cell - > sib1 . cell_id & 0xfff ,
ss . str ( ) . c_str ( ) ) ;
current_cell - > has_valid_sib1 = true ;
// Jump to next state
switch ( state ) {
case RRC_STATE_CELL_SELECTING :
si_acquire_state = SI_ACQUIRE_SIB2 ;
break ;
case RRC_STATE_PLMN_SELECTION :
si_acquire_state = SI_ACQUIRE_IDLE ;
rrc_log - > info ( " SI Acquisition done. Searching next cell... \n " ) ;
usleep ( 5000 ) ;
phy - > cell_search_next ( ) ;
break ;
default :
si_acquire_state = SI_ACQUIRE_IDLE ;
}
} else if ( LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_2 = = dlsch_msg . sibs [ 0 ] . sib_type & & SI_ACQUIRE_SIB2 = = si_acquire_state )
{
// Send PLMN and TAC to NAS
std : : stringstream ss ;
for ( uint32_t i = 0 ; i < current_cell - > sib1 . N_plmn_ids ; i + + ) {
nas - > plmn_found ( current_cell - > sib1 . plmn_id [ i ] . id , current_cell - > sib1 . tracking_area_code ) ;
}
} else if ( LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_2 = = dlsch_msg . sibs [ 0 ] . sib_type & &
SI_ACQUIRE_SIB2 = = si_acquire_state ) {
mac - > bcch_stop_rx ( ) ;
// Handle SIB2
memcpy ( & current_cell - > sib2 , & dlsch_msg . sibs [ 0 ] . sib . sib2 , sizeof ( LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_2_STRUCT ) ) ;
rrc_log - > console ( " SIB2 received \n " ) ;
rrc_log - > info ( " SIB2 received \n " ) ;
apply_sib2_configs ( & current_cell - > sib2 ) ;
current_cell - > has_valid_sib2 = true ;
// Jump to next state
switch ( state ) {
case RRC_STATE_CELL_SELECTING :
si_acquire_state = SI_ACQUIRE_IDLE ;
state = RRC_STATE_CELL_SELECTED ;
nas - > cell_selected ( ) ;
break ;
default :
si_acquire_state = SI_ACQUIRE_IDLE ;
}
}
}
}
// Right now, this thread only controls System Information acquisition procedure
void rrc : : run_thread ( )
{
void rrc : : run_thread ( ) {
uint32_t tti ;
uint32_t si_win_start , si_win_len ;
uint16_t period ;
uint32_t nof_sib1_trials = 0 ;
const int SIB1_SEARCH_TIMEOUT = 30 ;
while ( thread_running )
{
switch ( si_acquire_state )
{
while ( thread_running ) {
switch ( si_acquire_state ) {
case SI_ACQUIRE_SIB1 :
// Instruct MAC to look for SIB1
if ( ! current_cell - > has_valid_sib1 ) {
tti = mac - > get_current_tti ( ) ;
si_win_start = sib_start_tti ( tti , 2 , 5 ) ;
mac - > bcch_start_rx ( si_win_start , 1 ) ;
@ -381,13 +408,10 @@ void rrc::run_thread()
}
nof_sib1_trials = 0 ;
}
} else {
si_acquire_state = SI_ACQUIRE_SIB2 ;
}
usleep ( 20000 ) ;
break ;
case SI_ACQUIRE_SIB2 :
// Instruct MAC to look for SIB2 only when selecting a cell
if ( state = = RRC_STATE_CELL_SELECTING & & ! current_cell - > has_valid_sib2 ) {
tti = mac - > get_current_tti ( ) ;
period = liblte_rrc_si_periodicity_num [ current_cell - > sib1 . sched_info [ 0 ] . si_periodicity ] ;
si_win_start = sib_start_tti ( tti , period , 0 ) ;
@ -396,21 +420,7 @@ void rrc::run_thread()
mac - > bcch_start_rx ( si_win_start , si_win_len ) ;
rrc_log - > debug ( " Instructed MAC to search for SIB2, win_start=%d, win_len=%d \n " ,
si_win_start , si_win_len ) ;
} else {
si_acquire_state = SI_ACQUIRE_DONE ;
}
break ;
case SI_ACQUIRE_DONE :
// After acquiring SI, tell NAS that the cell is selected or go to next cell in case of PLMN selection
if ( state = = RRC_STATE_CELL_SELECTING ) {
nas - > cell_selected ( ) ;
state = RRC_STATE_CELL_SELECTED ;
} else if ( state = = RRC_STATE_PLMN_SELECTION ) {
phy - > cell_search_next ( ) ;
}
si_acquire_state = SI_ACQUIRE_IDLE ;
usleep ( current_cell - > sib1 . si_window_length * 1000 ) ;
break ;
default :
break ;
@ -456,12 +466,10 @@ void rrc::run_thread()
NAS interface
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void rrc : : write_sdu ( uint32_t lcid , byte_buffer_t * sdu )
{
void rrc : : write_sdu ( uint32_t lcid , byte_buffer_t * sdu ) {
rrc_log - > info_hex ( sdu - > msg , sdu - > N_bytes , " RX %s SDU " , rb_id_text [ lcid ] ) ;
switch ( state )
{
switch ( state ) {
case RRC_STATE_CONNECTING :
send_con_setup_complete ( sdu ) ;
break ;
@ -480,8 +488,7 @@ void rrc::write_sdu(uint32_t lcid, byte_buffer_t *sdu)
MAC interface
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Reception of PUCCH/SRS release procedure (Section 5.3.13) */
void rrc : : release_pucch_srs ( )
{
void rrc : : release_pucch_srs ( ) {
// Apply default configuration for PUCCH (CQI and SR) and SRS (release)
set_phy_default_pucch_srs ( ) ;
@ -498,13 +505,11 @@ void rrc::ra_problem() {
GW interface
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
bool rrc : : is_connected ( )
{
bool rrc : : is_connected ( ) {
return ( RRC_STATE_CONNECTED = = state ) ;
}
bool rrc : : have_drb ( )
{
bool rrc : : have_drb ( ) {
return drb_up ;
}
@ -512,13 +517,11 @@ bool rrc::have_drb()
PDCP interface
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void rrc : : write_pdu ( uint32_t lcid , byte_buffer_t * pdu )
{
void rrc : : write_pdu ( uint32_t lcid , byte_buffer_t * pdu ) {
rrc_log - > info_hex ( pdu - > msg , pdu - > N_bytes , " TX %s PDU " , rb_id_text [ lcid ] ) ;
rrc_log - > info ( " TX PDU Stack latency: %ld us \n " , pdu - > get_latency_us ( ) ) ;
switch ( lcid )
{
switch ( lcid ) {
case RB_ID_SRB0 :
parse_dl_ccch ( pdu ) ;
break ;
@ -534,8 +537,7 @@ void rrc::write_pdu(uint32_t lcid, byte_buffer_t *pdu)
}
void rrc : : write_pdu_pcch ( byte_buffer_t * pdu )
{
void rrc : : write_pdu_pcch ( byte_buffer_t * pdu ) {
if ( pdu - > N_bytes > 0 & & pdu - > N_bytes < SRSLTE_MAX_BUFFER_SIZE_BITS ) {
rrc_log - > info_hex ( pdu - > msg , pdu - > N_bytes , " PCCH message received %d bytes \n " , pdu - > N_bytes ) ;
rrc_log - > info ( " PCCH message Stack latency: %ld us \n " , pdu - > get_latency_us ( ) ) ;
@ -582,8 +584,7 @@ void rrc::write_pdu_pcch(byte_buffer_t *pdu)
RLC interface
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void rrc : : max_retx_attempted ( )
{
void rrc : : max_retx_attempted ( ) {
//TODO: Handle the radio link failure
rrc_log - > warning ( " Max RLC reTx attempted \n " ) ;
//radio_link_failure();
@ -593,8 +594,7 @@ void rrc::max_retx_attempted()
Senders
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void rrc : : send_con_request ( )
{
void rrc : : send_con_request ( ) {
rrc_log - > debug ( " Preparing RRC Connection Request \n " ) ;
LIBLTE_RRC_UL_CCCH_MSG_STRUCT ul_ccch_msg ;
LIBLTE_RRC_S_TMSI_STRUCT s_tmsi ;
@ -612,8 +612,7 @@ void rrc::send_con_request()
liblte_rrc_pack_ul_ccch_msg ( & ul_ccch_msg , ( LIBLTE_BIT_MSG_STRUCT * ) & bit_buf ) ;
// Byte align and pack the message bits for PDCP
if ( ( bit_buf . N_bits % 8 ) ! = 0 )
{
if ( ( bit_buf . N_bits % 8 ) ! = 0 ) {
for ( uint32_t i = 0 ; i < 8 - ( bit_buf . N_bits % 8 ) ; i + + )
bit_buf . msg [ bit_buf . N_bits + i ] = 0 ;
bit_buf . N_bits + = 8 - ( bit_buf . N_bits % 8 ) ;
@ -640,8 +639,7 @@ void rrc::send_con_request()
/* RRC connection re-establishment procedure (5.3.7) */
void rrc : : send_con_restablish_request ( )
{
void rrc : : send_con_restablish_request ( ) {
srslte_cell_t cell ;
phy - > get_current_cell ( & cell ) ;
@ -705,8 +703,7 @@ void rrc::send_con_restablish_request()
rrc_log - > info ( " Cell Selection finished. Initiating transmission of RRC Connection Reestablishment Request \n " ) ;
// Byte align and pack the message bits for PDCP
if ( ( bit_buf . N_bits % 8 ) ! = 0 )
{
if ( ( bit_buf . N_bits % 8 ) ! = 0 ) {
for ( uint32_t i = 0 ; i < 8 - ( bit_buf . N_bits % 8 ) ; i + + )
bit_buf . msg [ bit_buf . N_bits + i ] = 0 ;
bit_buf . N_bits + = 8 - ( bit_buf . N_bits % 8 ) ;
@ -730,8 +727,7 @@ void rrc::send_con_restablish_request()
}
void rrc : : send_con_restablish_complete ( )
{
void rrc : : send_con_restablish_complete ( ) {
rrc_log - > debug ( " Preparing RRC Connection Reestablishment Complete \n " ) ;
LIBLTE_RRC_UL_DCCH_MSG_STRUCT ul_dcch_msg ;
@ -741,8 +737,7 @@ void rrc::send_con_restablish_complete()
liblte_rrc_pack_ul_dcch_msg ( & ul_dcch_msg , ( LIBLTE_BIT_MSG_STRUCT * ) & bit_buf ) ;
// Byte align and pack the message bits for PDCP
if ( ( bit_buf . N_bits % 8 ) ! = 0 )
{
if ( ( bit_buf . N_bits % 8 ) ! = 0 ) {
for ( uint32_t i = 0 ; i < 8 - ( bit_buf . N_bits % 8 ) ; i + + )
bit_buf . msg [ bit_buf . N_bits + i ] = 0 ;
bit_buf . N_bits + = 8 - ( bit_buf . N_bits % 8 ) ;
@ -757,8 +752,7 @@ void rrc::send_con_restablish_complete()
pdcp - > write_sdu ( RB_ID_SRB1 , pdcp_buf ) ;
}
void rrc : : send_con_setup_complete ( byte_buffer_t * nas_msg )
{
void rrc : : send_con_setup_complete ( byte_buffer_t * nas_msg ) {
rrc_log - > debug ( " Preparing RRC Connection Setup Complete \n " ) ;
LIBLTE_RRC_UL_DCCH_MSG_STRUCT ul_dcch_msg ;
@ -772,8 +766,7 @@ void rrc::send_con_setup_complete(byte_buffer_t *nas_msg)
liblte_rrc_pack_ul_dcch_msg ( & ul_dcch_msg , ( LIBLTE_BIT_MSG_STRUCT * ) & bit_buf ) ;
// Byte align and pack the message bits for PDCP
if ( ( bit_buf . N_bits % 8 ) ! = 0 )
{
if ( ( bit_buf . N_bits % 8 ) ! = 0 ) {
for ( uint32_t i = 0 ; i < 8 - ( bit_buf . N_bits % 8 ) ; i + + )
bit_buf . msg [ bit_buf . N_bits + i ] = 0 ;
bit_buf . N_bits + = 8 - ( bit_buf . N_bits % 8 ) ;
@ -789,8 +782,7 @@ void rrc::send_con_setup_complete(byte_buffer_t *nas_msg)
pdcp - > write_sdu ( RB_ID_SRB1 , pdcp_buf ) ;
}
void rrc : : send_ul_info_transfer ( uint32_t lcid , byte_buffer_t * sdu )
{
void rrc : : send_ul_info_transfer ( uint32_t lcid , byte_buffer_t * sdu ) {
rrc_log - > debug ( " Preparing RX Info Transfer \n " ) ;
LIBLTE_RRC_UL_DCCH_MSG_STRUCT ul_dcch_msg ;
@ -806,8 +798,7 @@ void rrc::send_ul_info_transfer(uint32_t lcid, byte_buffer_t *sdu)
pdu - > reset ( ) ;
// Byte align and pack the message bits for PDCP
if ( ( bit_buf . N_bits % 8 ) ! = 0 )
{
if ( ( bit_buf . N_bits % 8 ) ! = 0 ) {
for ( uint32_t i = 0 ; i < 8 - ( bit_buf . N_bits % 8 ) ; i + + )
bit_buf . msg [ bit_buf . N_bits + i ] = 0 ;
bit_buf . N_bits + = 8 - ( bit_buf . N_bits % 8 ) ;
@ -821,8 +812,7 @@ void rrc::send_ul_info_transfer(uint32_t lcid, byte_buffer_t *sdu)
pdcp - > write_sdu ( lcid , pdu ) ;
}
void rrc : : send_security_mode_complete ( uint32_t lcid , byte_buffer_t * pdu )
{
void rrc : : send_security_mode_complete ( uint32_t lcid , byte_buffer_t * pdu ) {
rrc_log - > debug ( " Preparing Security Mode Complete \n " ) ;
LIBLTE_RRC_UL_DCCH_MSG_STRUCT ul_dcch_msg ;
ul_dcch_msg . msg_type = LIBLTE_RRC_UL_DCCH_MSG_TYPE_SECURITY_MODE_COMPLETE ;
@ -830,8 +820,7 @@ void rrc::send_security_mode_complete(uint32_t lcid, byte_buffer_t *pdu)
liblte_rrc_pack_ul_dcch_msg ( & ul_dcch_msg , ( LIBLTE_BIT_MSG_STRUCT * ) & bit_buf ) ;
// Byte align and pack the message bits for PDCP
if ( ( bit_buf . N_bits % 8 ) ! = 0 )
{
if ( ( bit_buf . N_bits % 8 ) ! = 0 ) {
for ( uint32_t i = 0 ; i < 8 - ( bit_buf . N_bits % 8 ) ; i + + )
bit_buf . msg [ bit_buf . N_bits + i ] = 0 ;
bit_buf . N_bits + = 8 - ( bit_buf . N_bits % 8 ) ;
@ -844,8 +833,7 @@ void rrc::send_security_mode_complete(uint32_t lcid, byte_buffer_t *pdu)
pdcp - > write_sdu ( lcid , pdu ) ;
}
void rrc : : send_rrc_con_reconfig_complete ( uint32_t lcid , byte_buffer_t * pdu )
{
void rrc : : send_rrc_con_reconfig_complete ( uint32_t lcid , byte_buffer_t * pdu ) {
rrc_log - > debug ( " Preparing RRC Connection Reconfig Complete \n " ) ;
LIBLTE_RRC_UL_DCCH_MSG_STRUCT ul_dcch_msg ;
@ -854,8 +842,7 @@ void rrc::send_rrc_con_reconfig_complete(uint32_t lcid, byte_buffer_t *pdu)
liblte_rrc_pack_ul_dcch_msg ( & ul_dcch_msg , ( LIBLTE_BIT_MSG_STRUCT * ) & bit_buf ) ;
// Byte align and pack the message bits for PDCP
if ( ( bit_buf . N_bits % 8 ) ! = 0 )
{
if ( ( bit_buf . N_bits % 8 ) ! = 0 ) {
for ( uint32_t i = 0 ; i < 8 - ( bit_buf . N_bits % 8 ) ; i + + )
bit_buf . msg [ bit_buf . N_bits + i ] = 0 ;
bit_buf . N_bits + = 8 - ( bit_buf . N_bits % 8 ) ;
@ -868,15 +855,13 @@ void rrc::send_rrc_con_reconfig_complete(uint32_t lcid, byte_buffer_t *pdu)
pdcp - > write_sdu ( lcid , pdu ) ;
}
void rrc : : enable_capabilities ( )
{
void rrc : : enable_capabilities ( ) {
bool enable_ul_64 = ue_category > = 5 & & current_cell - > sib2 . rr_config_common_sib . pusch_cnfg . enable_64_qam ;
rrc_log - > info ( " %s 64QAM PUSCH \n " , enable_ul_64 ? " Enabling " : " Disabling " ) ;
phy - > set_config_64qam_en ( enable_ul_64 ) ;
}
void rrc : : send_rrc_ue_cap_info ( uint32_t lcid , byte_buffer_t * pdu )
{
void rrc : : send_rrc_ue_cap_info ( uint32_t lcid , byte_buffer_t * pdu ) {
rrc_log - > debug ( " Preparing UE Capability Info \n " ) ;
LIBLTE_RRC_UL_DCCH_MSG_STRUCT ul_dcch_msg ;
@ -941,8 +926,7 @@ void rrc::send_rrc_ue_cap_info(uint32_t lcid, byte_buffer_t *pdu)
liblte_rrc_pack_ul_dcch_msg ( & ul_dcch_msg , ( LIBLTE_BIT_MSG_STRUCT * ) & bit_buf ) ;
// Byte align and pack the message bits for PDCP
if ( ( bit_buf . N_bits % 8 ) ! = 0 )
{
if ( ( bit_buf . N_bits % 8 ) ! = 0 ) {
for ( uint32_t i = 0 ; i < 8 - ( bit_buf . N_bits % 8 ) ; i + + )
bit_buf . msg [ bit_buf . N_bits + i ] = 0 ;
bit_buf . N_bits + = 8 - ( bit_buf . N_bits % 8 ) ;
@ -959,8 +943,7 @@ void rrc::send_rrc_ue_cap_info(uint32_t lcid, byte_buffer_t *pdu)
Parsers
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void rrc : : parse_dl_ccch ( byte_buffer_t * pdu )
{
void rrc : : parse_dl_ccch ( byte_buffer_t * pdu ) {
srslte_bit_unpack_vector ( pdu - > msg , bit_buf . msg , pdu - > N_bytes * 8 ) ;
bit_buf . N_bits = pdu - > N_bytes * 8 ;
pool - > deallocate ( pdu ) ;
@ -970,8 +953,7 @@ void rrc::parse_dl_ccch(byte_buffer_t *pdu)
rrc_log - > info ( " SRB0 - Received %s \n " ,
liblte_rrc_dl_ccch_msg_type_text [ dl_ccch_msg . msg_type ] ) ;
switch ( dl_ccch_msg . msg_type )
{
switch ( dl_ccch_msg . msg_type ) {
case LIBLTE_RRC_DL_CCCH_MSG_TYPE_RRC_CON_REJ :
rrc_log - > info ( " Connection Reject received. Wait time: %d \n " ,
dl_ccch_msg . msg . rrc_con_rej . wait_time ) ;
@ -1001,8 +983,7 @@ void rrc::parse_dl_ccch(byte_buffer_t *pdu)
}
}
void rrc : : parse_dl_dcch ( uint32_t lcid , byte_buffer_t * pdu )
{
void rrc : : parse_dl_dcch ( uint32_t lcid , byte_buffer_t * pdu ) {
srslte_bit_unpack_vector ( pdu - > msg , bit_buf . msg , pdu - > N_bytes * 8 ) ;
bit_buf . N_bits = pdu - > N_bytes * 8 ;
liblte_rrc_unpack_dl_dcch_msg ( ( LIBLTE_BIT_MSG_STRUCT * ) & bit_buf , & dl_dcch_msg ) ;
@ -1014,10 +995,10 @@ void rrc::parse_dl_dcch(uint32_t lcid, byte_buffer_t *pdu)
// Reset and reuse pdu buffer if possible
pdu - > reset ( ) ;
switch ( dl_dcch_msg . msg_type )
{
switch ( dl_dcch_msg . msg_type ) {
case LIBLTE_RRC_DL_DCCH_MSG_TYPE_DL_INFO_TRANSFER :
memcpy ( pdu - > msg , dl_dcch_msg . msg . dl_info_transfer . dedicated_info . msg , dl_dcch_msg . msg . dl_info_transfer . dedicated_info . N_bytes ) ;
memcpy ( pdu - > msg , dl_dcch_msg . msg . dl_info_transfer . dedicated_info . msg ,
dl_dcch_msg . msg . dl_info_transfer . dedicated_info . N_bytes ) ;
pdu - > N_bytes = dl_dcch_msg . msg . dl_info_transfer . dedicated_info . N_bytes ;
nas - > write_pdu ( lcid , pdu ) ;
break ;
@ -1038,10 +1019,8 @@ void rrc::parse_dl_dcch(uint32_t lcid, byte_buffer_t *pdu)
break ;
case LIBLTE_RRC_DL_DCCH_MSG_TYPE_UE_CAPABILITY_ENQUIRY :
transaction_id = dl_dcch_msg . msg . ue_cap_enquiry . rrc_transaction_id ;
for ( uint32_t i = 0 ; i < dl_dcch_msg . msg . ue_cap_enquiry . N_ue_cap_reqs ; i + + )
{
if ( LIBLTE_RRC_RAT_TYPE_EUTRA = = dl_dcch_msg . msg . ue_cap_enquiry . ue_capability_request [ i ] )
{
for ( uint32_t i = 0 ; i < dl_dcch_msg . msg . ue_cap_enquiry . N_ue_cap_reqs ; i + + ) {
if ( LIBLTE_RRC_RAT_TYPE_EUTRA = = dl_dcch_msg . msg . ue_cap_enquiry . ue_capability_request [ i ] ) {
send_rrc_ue_cap_info ( lcid , pdu ) ;
break ;
}
@ -1059,8 +1038,7 @@ void rrc::parse_dl_dcch(uint32_t lcid, byte_buffer_t *pdu)
/*******************************************************************************
Timer expiration callback
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void rrc : : timer_expired ( uint32_t timeout_id )
{
void rrc : : timer_expired ( uint32_t timeout_id ) {
if ( timeout_id = = t310 ) {
rrc_log - > info ( " Timer T310 expired: Radio Link Failure \n " ) ;
radio_link_failure ( ) ;
@ -1107,8 +1085,7 @@ void rrc::rrc_connection_release() {
pthread_mutex_unlock ( & mutex ) ;
}
void rrc : : test_con_restablishment ( )
{
void rrc : : test_con_restablishment ( ) {
printf ( " Testing connection Reestablishment \n " ) ;
send_con_restablish_request ( ) ;
}
@ -1132,8 +1109,7 @@ uint32_t rrc::sib_start_tti(uint32_t tti, uint32_t period, uint32_t x) {
return ( period * 10 * ( 1 + tti / ( period * 10 ) ) + x ) % 10240 ; // the 1 means next opportunity
}
void rrc : : apply_sib2_configs ( LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_2_STRUCT * sib2 )
{
void rrc : : apply_sib2_configs ( LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_2_STRUCT * sib2 ) {
// Apply RACH timeAlginmentTimer configuration
mac_interface_rrc : : mac_cfg_t cfg ;
@ -1153,10 +1129,12 @@ void rrc::apply_sib2_configs(LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_2_STRUCT *sib2)
memcpy ( & common . pdsch_cnfg , & sib2 - > rr_config_common_sib . pdsch_cnfg , sizeof ( LIBLTE_RRC_PDSCH_CONFIG_COMMON_STRUCT ) ) ;
memcpy ( & common . pusch_cnfg , & sib2 - > rr_config_common_sib . pusch_cnfg , sizeof ( LIBLTE_RRC_PUSCH_CONFIG_COMMON_STRUCT ) ) ;
memcpy ( & common . pucch_cnfg , & sib2 - > rr_config_common_sib . pucch_cnfg , sizeof ( LIBLTE_RRC_PUCCH_CONFIG_COMMON_STRUCT ) ) ;
memcpy ( & common . ul_pwr_ctrl , & sib2 - > rr_config_common_sib . ul_pwr_ctrl , sizeof ( LIBLTE_RRC_UL_POWER_CONTROL_COMMON_STRUCT ) ) ;
memcpy ( & common . ul_pwr_ctrl , & sib2 - > rr_config_common_sib . ul_pwr_ctrl ,
sizeof ( LIBLTE_RRC_UL_POWER_CONTROL_COMMON_STRUCT ) ) ;
memcpy ( & common . prach_cnfg , & sib2 - > rr_config_common_sib . prach_cnfg , sizeof ( LIBLTE_RRC_PRACH_CONFIG_SIB_STRUCT ) ) ;
if ( sib2 - > rr_config_common_sib . srs_ul_cnfg . present ) {
memcpy ( & common . srs_ul_cnfg , & sib2 - > rr_config_common_sib . srs_ul_cnfg , sizeof ( LIBLTE_RRC_SRS_UL_CONFIG_COMMON_STRUCT ) ) ;
memcpy ( & common . srs_ul_cnfg , & sib2 - > rr_config_common_sib . srs_ul_cnfg ,
sizeof ( LIBLTE_RRC_SRS_UL_CONFIG_COMMON_STRUCT ) ) ;
} else {
// default is release
common . srs_ul_cnfg . present = false ;
@ -1202,8 +1180,7 @@ void rrc::apply_sib2_configs(LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_2_STRUCT *sib2)
}
// Go through all information elements and apply defaults (9.2.4) if not defined
void rrc : : apply_phy_config_dedicated ( LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT * phy_cnfg , bool apply_defaults )
{
void rrc : : apply_phy_config_dedicated ( LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT * phy_cnfg , bool apply_defaults ) {
// Get current configuration
LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT * current_cfg ;
phy_interface_rrc : : phy_cfg_t c ;
@ -1224,7 +1201,8 @@ void rrc::apply_phy_config_dedicated(LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT
current_cfg - > pusch_cnfg_ded . beta_offset_cqi_idx = 15 ;
}
if ( phy_cnfg - > ul_pwr_ctrl_ded_present ) {
memcpy ( & current_cfg - > ul_pwr_ctrl_ded , & phy_cnfg - > ul_pwr_ctrl_ded , sizeof ( LIBLTE_RRC_UL_POWER_CONTROL_DEDICATED_STRUCT ) ) ;
memcpy ( & current_cfg - > ul_pwr_ctrl_ded , & phy_cnfg - > ul_pwr_ctrl_ded ,
sizeof ( LIBLTE_RRC_UL_POWER_CONTROL_DEDICATED_STRUCT ) ) ;
} else if ( apply_defaults ) {
current_cfg - > ul_pwr_ctrl_ded . p0_ue_pusch = 0 ;
current_cfg - > ul_pwr_ctrl_ded . delta_mcs_en = LIBLTE_RRC_DELTA_MCS_ENABLED_EN0 ;
@ -1235,18 +1213,21 @@ void rrc::apply_phy_config_dedicated(LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT
current_cfg - > ul_pwr_ctrl_ded . filter_coeff_present = true ;
}
if ( phy_cnfg - > tpc_pdcch_cnfg_pucch_present ) {
memcpy ( & current_cfg - > tpc_pdcch_cnfg_pucch , & phy_cnfg - > tpc_pdcch_cnfg_pucch , sizeof ( LIBLTE_RRC_TPC_PDCCH_CONFIG_STRUCT ) ) ;
memcpy ( & current_cfg - > tpc_pdcch_cnfg_pucch , & phy_cnfg - > tpc_pdcch_cnfg_pucch ,
sizeof ( LIBLTE_RRC_TPC_PDCCH_CONFIG_STRUCT ) ) ;
} else if ( apply_defaults ) {
current_cfg - > tpc_pdcch_cnfg_pucch . setup_present = false ;
}
if ( phy_cnfg - > tpc_pdcch_cnfg_pusch_present ) {
memcpy ( & current_cfg - > tpc_pdcch_cnfg_pusch , & phy_cnfg - > tpc_pdcch_cnfg_pusch , sizeof ( LIBLTE_RRC_TPC_PDCCH_CONFIG_STRUCT ) ) ;
memcpy ( & current_cfg - > tpc_pdcch_cnfg_pusch , & phy_cnfg - > tpc_pdcch_cnfg_pusch ,
sizeof ( LIBLTE_RRC_TPC_PDCCH_CONFIG_STRUCT ) ) ;
} else {
current_cfg - > tpc_pdcch_cnfg_pusch . setup_present = false ;
}
if ( phy_cnfg - > cqi_report_cnfg_present ) {
if ( phy_cnfg - > cqi_report_cnfg . report_periodic_present ) {
memcpy ( & current_cfg - > cqi_report_cnfg . report_periodic , & phy_cnfg - > cqi_report_cnfg . report_periodic , sizeof ( LIBLTE_RRC_CQI_REPORT_PERIODIC_STRUCT ) ) ;
memcpy ( & current_cfg - > cqi_report_cnfg . report_periodic , & phy_cnfg - > cqi_report_cnfg . report_periodic ,
sizeof ( LIBLTE_RRC_CQI_REPORT_PERIODIC_STRUCT ) ) ;
current_cfg - > cqi_report_cnfg . report_periodic_setup_present = phy_cnfg - > cqi_report_cnfg . report_periodic_setup_present ;
} else if ( apply_defaults ) {
current_cfg - > cqi_report_cnfg . report_periodic_setup_present = false ;
@ -1260,7 +1241,8 @@ void rrc::apply_phy_config_dedicated(LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT
current_cfg - > cqi_report_cnfg . nom_pdsch_rs_epre_offset = phy_cnfg - > cqi_report_cnfg . nom_pdsch_rs_epre_offset ;
}
if ( phy_cnfg - > srs_ul_cnfg_ded_present & & phy_cnfg - > srs_ul_cnfg_ded . setup_present ) {
memcpy ( & current_cfg - > srs_ul_cnfg_ded , & phy_cnfg - > srs_ul_cnfg_ded , sizeof ( LIBLTE_RRC_SRS_UL_CONFIG_DEDICATED_STRUCT ) ) ;
memcpy ( & current_cfg - > srs_ul_cnfg_ded , & phy_cnfg - > srs_ul_cnfg_ded ,
sizeof ( LIBLTE_RRC_SRS_UL_CONFIG_DEDICATED_STRUCT ) ) ;
} else if ( apply_defaults ) {
current_cfg - > srs_ul_cnfg_ded . setup_present = false ;
}
@ -1268,9 +1250,11 @@ void rrc::apply_phy_config_dedicated(LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT
if ( ! phy_cnfg - > antenna_info_default_value ) {
if ( phy_cnfg - > antenna_info_explicit_value . tx_mode ! = LIBLTE_RRC_TRANSMISSION_MODE_1 & &
phy_cnfg - > antenna_info_explicit_value . tx_mode ! = LIBLTE_RRC_TRANSMISSION_MODE_2 ) {
rrc_log - > error ( " Transmission mode TM%s not currently supported by srsUE \n " , liblte_rrc_transmission_mode_text [ phy_cnfg - > antenna_info_explicit_value . tx_mode ] ) ;
rrc_log - > error ( " Transmission mode TM%s not currently supported by srsUE \n " ,
liblte_rrc_transmission_mode_text [ phy_cnfg - > antenna_info_explicit_value . tx_mode ] ) ;
}
memcpy ( & current_cfg - > antenna_info_explicit_value , & phy_cnfg - > antenna_info_explicit_value , sizeof ( LIBLTE_RRC_ANTENNA_INFO_DEDICATED_STRUCT ) ) ;
memcpy ( & current_cfg - > antenna_info_explicit_value , & phy_cnfg - > antenna_info_explicit_value ,
sizeof ( LIBLTE_RRC_ANTENNA_INFO_DEDICATED_STRUCT ) ) ;
} else if ( apply_defaults ) {
current_cfg - > antenna_info_explicit_value . tx_mode = LIBLTE_RRC_TRANSMISSION_MODE_2 ;
current_cfg - > antenna_info_explicit_value . codebook_subset_restriction_present = false ;
@ -1282,7 +1266,8 @@ void rrc::apply_phy_config_dedicated(LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT
current_cfg - > antenna_info_explicit_value . ue_tx_antenna_selection_setup_present = false ;
}
if ( phy_cnfg - > sched_request_cnfg_present ) {
memcpy ( & current_cfg - > sched_request_cnfg , & phy_cnfg - > sched_request_cnfg , sizeof ( LIBLTE_RRC_SCHEDULING_REQUEST_CONFIG_STRUCT ) ) ;
memcpy ( & current_cfg - > sched_request_cnfg , & phy_cnfg - > sched_request_cnfg ,
sizeof ( LIBLTE_RRC_SCHEDULING_REQUEST_CONFIG_STRUCT ) ) ;
} else if ( apply_defaults ) {
current_cfg - > sched_request_cnfg . setup_present = false ;
}
@ -1329,8 +1314,7 @@ void rrc::apply_phy_config_dedicated(LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT
}
void rrc : : apply_mac_config_dedicated ( LIBLTE_RRC_MAC_MAIN_CONFIG_STRUCT * mac_cnfg , bool apply_defaults )
{
void rrc : : apply_mac_config_dedicated ( LIBLTE_RRC_MAC_MAIN_CONFIG_STRUCT * mac_cnfg , bool apply_defaults ) {
// Set Default MAC main configuration (9.2.2)
LIBLTE_RRC_MAC_MAIN_CONFIG_STRUCT default_cfg ;
bzero ( & default_cfg , sizeof ( LIBLTE_RRC_MAC_MAIN_CONFIG_STRUCT ) ) ;
@ -1344,8 +1328,7 @@ void rrc::apply_mac_config_dedicated(LIBLTE_RRC_MAC_MAIN_CONFIG_STRUCT *mac_cnfg
if ( ! apply_defaults ) {
if ( mac_cnfg - > ulsch_cnfg_present )
{
if ( mac_cnfg - > ulsch_cnfg_present ) {
if ( mac_cnfg - > ulsch_cnfg . max_harq_tx_present ) {
default_cfg . ulsch_cnfg . max_harq_tx = mac_cnfg - > ulsch_cnfg . max_harq_tx ;
default_cfg . ulsch_cnfg . max_harq_tx_present = true ;
@ -1415,15 +1398,13 @@ void rrc::apply_rr_config_dedicated(LIBLTE_RRC_RR_CONFIG_DEDICATED_STRUCT *cnfg)
}
}
void rrc : : handle_con_setup ( LIBLTE_RRC_CONNECTION_SETUP_STRUCT * setup )
{
void rrc : : handle_con_setup ( LIBLTE_RRC_CONNECTION_SETUP_STRUCT * setup ) {
// Apply the Radio Resource configuration
apply_rr_config_dedicated ( & setup - > rr_cnfg ) ;
}
/* Reception of RRCConnectionReestablishment by the UE 5.3.7.5 */
void rrc : : handle_con_reest ( LIBLTE_RRC_CONNECTION_REESTABLISHMENT_STRUCT * setup )
{
void rrc : : handle_con_reest ( LIBLTE_RRC_CONNECTION_REESTABLISHMENT_STRUCT * setup ) {
mac_timers - > get ( t301 ) - > stop ( ) ;
// TODO: Restablish DRB1. Not done because never was suspended
@ -1437,8 +1418,8 @@ void rrc::handle_con_reest(LIBLTE_RRC_CONNECTION_REESTABLISHMENT_STRUCT *setup)
}
void rrc : : handle_rrc_con_reconfig ( uint32_t lcid , LIBLTE_RRC_CONNECTION_RECONFIGURATION_STRUCT * reconfig , byte_buffer_t * pdu )
{
void rrc : : handle_rrc_con_reconfig ( uint32_t lcid , LIBLTE_RRC_CONNECTION_RECONFIGURATION_STRUCT * reconfig ,
byte_buffer_t * pdu ) {
uint32_t i ;
if ( reconfig - > rr_cnfg_ded_present ) {
@ -1446,20 +1427,17 @@ void rrc::handle_rrc_con_reconfig(uint32_t lcid, LIBLTE_RRC_CONNECTION_RECONFIGU
} else {
printf ( " received con reconfig no rr confg present \n " ) ;
}
if ( reconfig - > meas_cnfg_present )
{
if ( reconfig - > meas_cnfg_present ) {
//TODO: handle meas_cnfg
}
if ( reconfig - > mob_ctrl_info_present )
{
if ( reconfig - > mob_ctrl_info_present ) {
//TODO: handle mob_ctrl_info
}
send_rrc_con_reconfig_complete ( lcid , pdu ) ;
byte_buffer_t * nas_sdu ;
for ( i = 0 ; i < reconfig - > N_ded_info_nas ; i + + )
{
for ( i = 0 ; i < reconfig - > N_ded_info_nas ; i + + ) {
nas_sdu = pool_allocate ; ;
memcpy ( nas_sdu - > msg , & reconfig - > ded_info_nas_list [ i ] . msg , reconfig - > ded_info_nas_list [ i ] . N_bytes ) ;
nas_sdu - > N_bytes = reconfig - > ded_info_nas_list [ i ] . N_bytes ;
@ -1467,18 +1445,15 @@ void rrc::handle_rrc_con_reconfig(uint32_t lcid, LIBLTE_RRC_CONNECTION_RECONFIGU
}
}
void rrc : : add_srb ( LIBLTE_RRC_SRB_TO_ADD_MOD_STRUCT * srb_cnfg )
{
void rrc : : add_srb ( LIBLTE_RRC_SRB_TO_ADD_MOD_STRUCT * srb_cnfg ) {
// Setup PDCP
pdcp - > add_bearer ( srb_cnfg - > srb_id ) ;
if ( RB_ID_SRB2 = = srb_cnfg - > srb_id )
pdcp - > config_security ( srb_cnfg - > srb_id , k_rrc_enc , k_rrc_int , cipher_algo , integ_algo ) ;
// Setup RLC
if ( srb_cnfg - > rlc_cnfg_present )
{
if ( srb_cnfg - > rlc_default_cnfg_present )
{
if ( srb_cnfg - > rlc_cnfg_present ) {
if ( srb_cnfg - > rlc_default_cnfg_present ) {
rlc - > add_bearer ( srb_cnfg - > srb_id ) ;
} else {
rlc - > add_bearer ( srb_cnfg - > srb_id , & srb_cnfg - > rlc_explicit_cnfg ) ;
@ -1491,19 +1466,15 @@ void rrc::add_srb(LIBLTE_RRC_SRB_TO_ADD_MOD_STRUCT *srb_cnfg)
int prioritized_bit_rate = - 1 ;
int bucket_size_duration = - 1 ;
if ( srb_cnfg - > lc_cnfg_present )
{
if ( srb_cnfg - > lc_default_cnfg_present )
{
if ( srb_cnfg - > lc_cnfg_present ) {
if ( srb_cnfg - > lc_default_cnfg_present ) {
if ( RB_ID_SRB2 = = srb_cnfg - > srb_id )
priority = 3 ;
} else {
if ( srb_cnfg - > lc_explicit_cnfg . log_chan_sr_mask_present )
{
if ( srb_cnfg - > lc_explicit_cnfg . log_chan_sr_mask_present ) {
//TODO
}
if ( srb_cnfg - > lc_explicit_cnfg . ul_specific_params_present )
{
if ( srb_cnfg - > lc_explicit_cnfg . ul_specific_params_present ) {
if ( srb_cnfg - > lc_explicit_cnfg . ul_specific_params . log_chan_group_present )
log_chan_group = srb_cnfg - > lc_explicit_cnfg . ul_specific_params . log_chan_group ;
@ -1519,13 +1490,11 @@ void rrc::add_srb(LIBLTE_RRC_SRB_TO_ADD_MOD_STRUCT *srb_cnfg)
rrc_log - > info ( " Added radio bearer %s \n " , rb_id_text [ srb_cnfg - > srb_id ] ) ;
}
void rrc : : add_drb ( LIBLTE_RRC_DRB_TO_ADD_MOD_STRUCT * drb_cnfg )
{
void rrc : : add_drb ( LIBLTE_RRC_DRB_TO_ADD_MOD_STRUCT * drb_cnfg ) {
if ( ! drb_cnfg - > pdcp_cnfg_present | |
! drb_cnfg - > rlc_cnfg_present | |
! drb_cnfg - > lc_cnfg_present )
{
! drb_cnfg - > lc_cnfg_present ) {
rrc_log - > error ( " Cannot add DRB - incomplete configuration \n " ) ;
return ;
}
@ -1549,8 +1518,7 @@ void rrc::add_drb(LIBLTE_RRC_DRB_TO_ADD_MOD_STRUCT *drb_cnfg)
uint8_t priority = 1 ;
int prioritized_bit_rate = - 1 ;
int bucket_size_duration = - 1 ;
if ( drb_cnfg - > lc_cnfg . ul_specific_params_present )
{
if ( drb_cnfg - > lc_cnfg . ul_specific_params_present ) {
if ( drb_cnfg - > lc_cnfg . ul_specific_params . log_chan_group_present ) {
log_chan_group = drb_cnfg - > lc_cnfg . ul_specific_params . log_chan_group ;
} else {
@ -1573,8 +1541,7 @@ void rrc::add_drb(LIBLTE_RRC_DRB_TO_ADD_MOD_STRUCT *drb_cnfg)
rrc_log - > info ( " Added radio bearer %s \n " , rb_id_text [ lcid ] ) ;
}
void rrc : : release_drb ( uint8_t lcid )
{
void rrc : : release_drb ( uint8_t lcid ) {
// TODO
}
@ -1583,8 +1550,7 @@ void rrc::release_drb(uint8_t lcid)
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
// PHY CONFIG DEDICATED Defaults (3GPP 36.331 v10 9.2.4)
void rrc : : set_phy_default_pucch_srs ( )
{
void rrc : : set_phy_default_pucch_srs ( ) {
phy_interface_rrc : : phy_cfg_t current_cfg ;
phy - > get_config ( & current_cfg ) ;
@ -1602,15 +1568,13 @@ void rrc::set_phy_default_pucch_srs()
mac - > set_config_sr ( & cfg ) ;
}
void rrc : : set_phy_default ( )
{
void rrc : : set_phy_default ( ) {
LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT defaults ;
bzero ( & defaults , sizeof ( LIBLTE_RRC_PHYSICAL_CONFIG_DEDICATED_STRUCT ) ) ;
apply_phy_config_dedicated ( & defaults , true ) ;
}
void rrc : : set_mac_default ( )
{
void rrc : : set_mac_default ( ) {
apply_mac_config_dedicated ( NULL , true ) ;
LIBLTE_RRC_SCHEDULING_REQUEST_CONFIG_STRUCT sr_cfg ;
bzero ( & sr_cfg , sizeof ( LIBLTE_RRC_SCHEDULING_REQUEST_CONFIG_STRUCT ) ) ;