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

}
Exemplo n.º 2
0
//---------------------------------------------------------------------------
// 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]);
}