//--------------------------------------------------------------------------------------------------------------------- void mRAL_rx_rrc_ral_system_information_indication(instance_t instanceP, MessageDef *msg_pP) //--------------------------------------------------------------------------------------------------------------------- { MIH_C_LINK_DET_INFO_T link_det_info; int i; module_id_t mod_id = instanceP - NB_eNB_INST; memset(&link_det_info, 0, sizeof(MIH_C_LINK_DET_INFO_T)); // save cell parameters g_ue_ral_obj[mod_id].cell_id = RRC_RAL_SYSTEM_INFORMATION_IND(msg_pP).cell_id; memcpy(&g_ue_ral_obj[mod_id].plmn_id, &RRC_RAL_SYSTEM_INFORMATION_IND(msg_pP).plmn_id, sizeof(g_ue_ral_obj[mod_id].plmn_id)); // link id link_det_info.link_tuple_id.link_id.link_type = MIH_C_WIRELESS_LTE; #ifdef USE_3GPP_ADDR_AS_LINK_ADDR link_det_info.link_tuple_id.link_id.link_addr.choice = (MIH_C_CHOICE_T)MIH_C_CHOICE_3GPP_ADDR; MIH_C_3GPP_ADDR_load_3gpp_str_address(mod_id, &link_det_info.link_tuple_id.link_id.link_addr._union._3gpp_addr, (u_int8_t*)UE_DEFAULT_3GPP_ADDRESS); #else link_det_info.link_tuple_id.link_id.link_addr.choice = MIH_C_CHOICE_3GPP_3G_CELL_ID; // preserve byte order of plmn id memcpy(link_det_info.link_tuple_id.link_id.link_addr._union._3gpp_3g_cell_id.plmn_id.val, &RRC_RAL_SYSTEM_INFORMATION_IND(msg_pP).plmn_id, 3); link_det_info.link_tuple_id.link_id.link_addr._union._3gpp_3g_cell_id.cell_id = RRC_RAL_SYSTEM_INFORMATION_IND(msg_pP).cell_id; LOG_D(RAL_UE, "PLMN ID %d.%d.%d\n", link_det_info.link_tuple_id.link_id.link_addr._union._3gpp_3g_cell_id.plmn_id.val[0], link_det_info.link_tuple_id.link_id.link_addr._union._3gpp_3g_cell_id.plmn_id.val[1], link_det_info.link_tuple_id.link_id.link_addr._union._3gpp_3g_cell_id.plmn_id.val[2]); LOG_D(RAL_UE, "CELL ID %d\n", link_det_info.link_tuple_id.link_id.link_addr._union._3gpp_3g_cell_id.cell_id); #endif //The optional LINK_ADDR may contains a link address of PoA. link_det_info.link_tuple_id.choice = MIH_C_LINK_TUPLE_ID_CHOICE_NULL; MIH_C_NETWORK_ID_set(&link_det_info.network_id, (u_int8_t *)PREDEFINED_MIH_NETWORK_ID, strlen(PREDEFINED_MIH_NETWORK_ID)); MIH_C_NET_AUX_ID_set(&link_det_info.net_aux_id, (u_int8_t *)PREDEFINED_MIH_NETAUX_ID, strlen(PREDEFINED_MIH_NETAUX_ID)); link_det_info.sig_strength.choice = MIH_C_SIG_STRENGTH_CHOICE_DBM; link_det_info.sig_strength._union.dbm = RRC_RAL_SYSTEM_INFORMATION_IND(msg_pP).dbm; link_det_info.sinr = RRC_RAL_SYSTEM_INFORMATION_IND(msg_pP).sinr; link_det_info.link_data_rate = RRC_RAL_SYSTEM_INFORMATION_IND(msg_pP).link_data_rate; link_det_info.link_mihcap_flag = g_ue_ral_obj[mod_id].link_mihcap_flag; link_det_info.net_caps = g_ue_ral_obj[mod_id].net_caps; mRAL_send_link_detected_indication(instanceP, &g_ue_ral_obj[mod_id].transaction_id, &link_det_info); g_ue_ral_obj[mod_id].transaction_id ++; }
//--------------------------------------------------------------------------- // poll for measures in NAS void rallte_NAS_measures_polling(void){ //--------------------------------------------------------------------------- MIH_C_LINK_GD_REASON_T going_down_reason_code; MIH_C_LINK_DN_REASON_T down_reason_code; MIH_C_TRANSACTION_ID_T transaction_id; MIH_C_LINK_TUPLE_ID_T link_identifier; MIH_C_LINK_DET_INFO_T link_detected_info; MIH_C_UNSIGNED_INT2_T time_interval; //MIH_C_LINK_PARAM_RPT_LIST_T link_parameters_report_list; IAL_process_DNAS_message(IO_OBJ_MEAS, IO_CMD_LIST, 0); // hard-coded trigger for test #ifdef MRALU_SIMU_LINKDOWN meas_counter ++; if (meas_counter == 4){ ralpriv->curr_signal_level = ralpriv->curr_signal_level/10; IAL_integrate_measure(ralpriv->curr_signal_level, 0); DEBUG ("\n signal level %d , integrated new value : %d\n",ralpriv->curr_signal_level, ralpriv->integrated_meas_level[0]); } if (meas_counter == 5){ ralpriv->curr_signal_level = 40; IAL_integrate_measure(ralpriv->curr_signal_level, 0); DEBUG ("\n signal level %d , integrated new value : %d\n",ralpriv->curr_signal_level, ralpriv->integrated_meas_level[0]); } if (meas_counter == 6){ ralpriv->curr_signal_level = 0; IAL_integrate_measure(ralpriv->curr_signal_level, 0); DEBUG ("\n signal level %d , integrated new value : %d\n",ralpriv->curr_signal_level, ralpriv->integrated_meas_level[0]); } #endif DEBUG ("signal level %d , integrated new value : %d , integrated old value : (%d)\n", ralpriv->curr_signal_level, ralpriv->integrated_meas_level[0], ralpriv->prev_integrated_meas_level[0]); // condition still TBD - message dropped or level = 0 if ((!ralpriv->curr_signal_level) && (ralpriv->link_to_be_detected == MIH_C_BOOLEAN_FALSE) && (ralpriv->state != DISCONNECTED) ) { transaction_id = MIH_C_get_new_transaction_id(); down_reason_code = MIH_C_LINK_DOWN_REASON_NO_RESOURCE; link_identifier.link_id.link_type = MIH_C_WIRELESS_UMTS; link_identifier.link_id.link_addr.choice = (MIH_C_CHOICE_T)MIH_C_CHOICE_3GPP_ADDR; MIH_C_3GPP_ADDR_load_3gpp_str_address(&link_identifier.link_id.link_addr._union._3gpp_addr, (u_int8_t*)DEFAULT_ADDRESS_3GPP); link_identifier.choice = MIH_C_LINK_TUPLE_ID_CHOICE_NULL; mRALlte_send_link_down_indication(&transaction_id, &link_identifier, NULL, &down_reason_code); ralpriv->link_to_be_detected = MIH_C_BOOLEAN_TRUE; // warning may be repeated several times } else if ((ralpriv->link_to_be_detected == MIH_C_BOOLEAN_FALSE) && (ralpriv->curr_signal_level <= ralpriv->integrated_meas_level[0]) && (ralpriv->integrated_meas_level[0] < ralpriv->prev_integrated_meas_level[0]) && (ralpriv->integrated_meas_level[0] < PREDEFINED_LINK_GOING_DOWN_INDICATION_SIG_STRENGTH) && (ralpriv->state != DISCONNECTED) ) { transaction_id = MIH_C_get_new_transaction_id(); link_identifier.link_id.link_type = MIH_C_WIRELESS_UMTS; link_identifier.link_id.link_addr.choice = (MIH_C_CHOICE_T)MIH_C_CHOICE_3GPP_ADDR; MIH_C_3GPP_ADDR_load_3gpp_str_address(&link_identifier.link_id.link_addr._union._3gpp_addr, (u_int8_t*)DEFAULT_ADDRESS_3GPP); link_identifier.choice = MIH_C_LINK_TUPLE_ID_CHOICE_NULL; time_interval = (MIH_C_UNSIGNED_INT2_T)0; // unknown going_down_reason_code = MIH_C_LINK_GOING_DOWN_REASON_LINK_PARAMETER_DEGRADING; mRALlte_send_link_going_down_indication(&transaction_id, &link_identifier, &time_interval, &going_down_reason_code); } else if ((ralpriv->link_to_be_detected == MIH_C_BOOLEAN_TRUE) && (ralpriv->curr_signal_level > PREDEFINED_LINK_DETECTED_INDICATION_SIG_STRENGTH)) { transaction_id = MIH_C_get_new_transaction_id(); // MIH_C_LINK_TUPLE_ID_T link_detected_info.link_tuple_id.link_id.link_type = MIH_C_WIRELESS_UMTS; link_detected_info.link_tuple_id.link_id.link_addr.choice = (MIH_C_CHOICE_T)MIH_C_CHOICE_3GPP_ADDR; MIH_C_3GPP_ADDR_set(&link_detected_info.link_tuple_id.link_id.link_addr._union._3gpp_addr, (u_int8_t*)DEFAULT_ADDRESS_3GPP, strlen(DEFAULT_ADDRESS_3GPP)); link_detected_info.link_tuple_id.choice = MIH_C_LINK_TUPLE_ID_CHOICE_NULL; // MIH_C_NETWORK_ID_T MIH_C_NETWORK_ID_set(&link_detected_info.network_id, (u_int8_t *)PREDEFINED_MIH_NETWORK_ID, strlen(PREDEFINED_MIH_NETWORK_ID)); // MIH_C_NET_AUX_ID_T MIH_C_NET_AUX_ID_set(&link_detected_info.net_aux_id, (u_int8_t *)PREDEFINED_MIH_NETAUX_ID, strlen(PREDEFINED_MIH_NETAUX_ID)); // MIH_C_SIG_STRENGTH_T link_detected_info.sig_strength.choice = MIH_C_SIG_STRENGTH_CHOICE_PERCENTAGE; link_detected_info.sig_strength._union.percentage = ralpriv->curr_signal_level; // sinr link_detected_info.sinr = PREDEFINED_LINK_DETECTED_INDICATION_SINR; // MIH_C_LINK_DATA_RATE_T link_detected_info.link_data_rate = PREDEFINED_LINK_DETECTED_INDICATION_LINK_DATA_RATE; // MIH_C_LINK_MIHCAP_FLAG link_detected_info.link_mihcap_flag = MIH_C_BIT_EVENT_SERVICE_SUPPORTED | MIH_C_BIT_COMMAND_SERVICE_SUPPORTED | MIH_C_BIT_INFORMATION_SERVICE_SUPPORTED; // MIH_C_NET_CAPS_T link_detected_info.net_caps = MIH_C_BIT_NET_CAPS_QOS_CLASS0 | MIH_C_BIT_NET_CAPS_QOS_CLASS1 | MIH_C_BIT_NET_CAPS_INTERNET_ACCESS; mRALlte_send_link_detected_indication(&transaction_id, &link_detected_info); ralpriv->link_to_be_detected = MIH_C_BOOLEAN_FALSE; } // LG: TO DO CHECK IF INDEX IS 0 mRALlte_check_thresholds_signal_strength(ralpriv->integrated_meas_level[0], ralpriv->prev_integrated_meas_level[0]); }