u8 attach_ue0(char *sdu) { u8 Size; u16 Size16; u8 lcid=0; UE_rrc_inst[0].Info[0].State = RRC_SI_RECEIVED; rrc_ue_generate_RRCConnectionRequest(0,131,0); Size = mac_rrc_data_req(0, 131, CCCH,1, &sdu[sizeof(SCH_SUBHEADER_FIXED)],0, 0); Size16 = (u16)Size; generate_ulsch_header((u8 *)sdu, // mac header 1, // num sdus 0, // short padding &Size16, // sdu length &lcid, // sdu lcid NULL, // power headroom NULL, // crnti NULL, // truncated bsr NULL, // short bsr NULL, 0); // post padding return(Size+sizeof(SCH_SUBHEADER_FIXED)); }
RRC_status_t rrc_rx_tx(uint8_t Mod_id, const frame_t frameP, const eNB_flag_t eNB_flagP,uint8_t index,int CC_id){ uint8_t UE_id; int32_t current_timestamp_ms, ref_timestamp_ms; struct timeval ts; if(eNB_flagP == 0) { // check timers if (UE_rrc_inst[Mod_id].Info[index].T300_active == 1) { if ((UE_rrc_inst[Mod_id].Info[index].T300_cnt % 10) == 0) LOG_D(RRC, "[UE %d][RAPROC] Frame %d T300 Count %d ms\n", Mod_id, frameP, UE_rrc_inst[Mod_id].Info[index].T300_cnt); if (UE_rrc_inst[Mod_id].Info[index].T300_cnt == T300[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t300]) { UE_rrc_inst[Mod_id].Info[index].T300_active = 0; // ALLOW CCCH to be used UE_rrc_inst[Mod_id].Srb0[index].Tx_buffer.payload_size = 0; rrc_ue_generate_RRCConnectionRequest (Mod_id, frameP, index); return (RRC_ConnSetup_failed); } UE_rrc_inst[Mod_id].Info[index].T300_cnt++; } if (UE_rrc_inst[Mod_id].sib2[index]) { if (UE_rrc_inst[Mod_id].Info[index].N310_cnt == N310[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.n310]) { UE_rrc_inst[Mod_id].Info[index].T310_active = 1; } } else { // in case we have not received SIB2 yet if (UE_rrc_inst[Mod_id].Info[index].N310_cnt == 100) { UE_rrc_inst[Mod_id].Info[index].N310_cnt = 0; return RRC_PHY_RESYNCH; } } if (UE_rrc_inst[Mod_id].Info[index].T310_active == 1) { if (UE_rrc_inst[Mod_id].Info[index].N311_cnt == N311[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.n311]) { UE_rrc_inst[Mod_id].Info[index].T310_active = 0; UE_rrc_inst[Mod_id].Info[index].N311_cnt = 0; } if ((UE_rrc_inst[Mod_id].Info[index].T310_cnt % 10) == 0) LOG_D(RRC, "[UE %d] Frame %d T310 Count %d ms\n", Mod_id, frameP, UE_rrc_inst[Mod_id].Info[index].T310_cnt); if (UE_rrc_inst[Mod_id].Info[index].T310_cnt == T310[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t310]) { UE_rrc_inst[Mod_id].Info[index].T310_active = 0; rrc_t310_expiration (frameP, Mod_id, index); return (RRC_PHY_RESYNCH); } UE_rrc_inst[Mod_id].Info[index].T310_cnt++; } if (UE_rrc_inst[Mod_id].Info[index].T304_active==1) { if ((UE_rrc_inst[Mod_id].Info[index].T304_cnt % 10) == 0) LOG_D(RRC,"[UE %d][RAPROC] Frame %d T304 Count %d ms\n",Mod_id,frameP, UE_rrc_inst[Mod_id].Info[index].T304_cnt); if (UE_rrc_inst[Mod_id].Info[index].T304_cnt == 0) { UE_rrc_inst[Mod_id].Info[index].T304_active = 0; UE_rrc_inst[Mod_id].HandoverInfoUe.measFlag = 1; LOG_E(RRC,"[UE %d] Handover failure..initiating connection re-establishment procedure... \n"); //Implement 36.331, section 5.3.5.6 here return(RRC_Handover_failed); } UE_rrc_inst[Mod_id].Info[index].T304_cnt--; } // Layer 3 filtering of RRC measurements if (UE_rrc_inst[Mod_id].QuantityConfig[0] != NULL) { ue_meas_filtering(Mod_id,frameP,index); } ue_measurement_report_triggering(Mod_id,frameP,index); if (UE_rrc_inst[Mod_id].Info[0].handoverTarget > 0) LOG_I(RRC,"[UE %d] Frame %d : RRC handover initiated\n", Mod_id, frameP); if((UE_rrc_inst[Mod_id].Info[index].State == RRC_HO_EXECUTION) && (UE_rrc_inst[Mod_id].HandoverInfoUe.targetCellId != 0xFF)) { UE_rrc_inst[Mod_id].Info[index].State= RRC_IDLE; return(RRC_HO_STARTED); } } else { // eNB check_handovers(Mod_id,frameP); // counetr, and get the value and aggregate #ifdef LOCALIZATION /* for the localization, only primary CC_id might be relevant*/ gettimeofday(&ts, NULL); current_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000; ref_timestamp_ms = eNB_rrc_inst[Mod_id].reference_timestamp_ms; for (UE_id=0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { if ((current_timestamp_ms - ref_timestamp_ms > eNB_rrc_inst[Mod_id].aggregation_period_ms) && rrc_get_estimated_ue_distance(Mod_id,frameP,UE_id, CC_id,eNB_rrc_inst[Mod_id].loc_type) != -1) { LOG_D(LOCALIZE, " RRC [UE/id %d -> eNB/id %d] timestamp %d frame %d estimated r = %f\n", UE_id, Mod_id, current_timestamp_ms, frameP, rrc_get_estimated_ue_distance(Mod_id,frameP,UE_id, CC_id,eNB_rrc_inst[Mod_id].loc_type)); LOG_D(LOCALIZE, " RRC status %d\n", eNB_rrc_inst[Mod_id].Info.UE[UE_id].Status); push_front(&eNB_rrc_inst[Mod_id].loc_list, rrc_get_estimated_ue_distance(Mod_id,frameP,UE_id, CC_id,eNB_rrc_inst[Mod_id].loc_type)); eNB_rrc_inst[Mod_id].reference_timestamp_ms = current_timestamp_ms; } } #endif } return (RRC_OK); }