mirror of https://github.com/PentHertz/srsLTE.git
Read Home PLMN from IMSI
This commit is contained in:
parent
a5b384da4a
commit
c7d5231251
|
@ -54,6 +54,7 @@ class usim_interface_nas
|
||||||
public:
|
public:
|
||||||
virtual void get_imsi_vec(uint8_t* imsi_, uint32_t n) = 0;
|
virtual void get_imsi_vec(uint8_t* imsi_, uint32_t n) = 0;
|
||||||
virtual void get_imei_vec(uint8_t* imei_, uint32_t n) = 0;
|
virtual void get_imei_vec(uint8_t* imei_, uint32_t n) = 0;
|
||||||
|
virtual int get_home_plmn_id(LIBLTE_RRC_PLMN_IDENTITY_STRUCT *home_plmn_id) = 0;
|
||||||
virtual void generate_authentication_response(uint8_t *rand,
|
virtual void generate_authentication_response(uint8_t *rand,
|
||||||
uint8_t *autn_enb,
|
uint8_t *autn_enb,
|
||||||
uint16_t mcc,
|
uint16_t mcc,
|
||||||
|
|
|
@ -95,7 +95,6 @@ public:
|
||||||
|
|
||||||
// UE interface
|
// UE interface
|
||||||
void attach_request();
|
void attach_request();
|
||||||
|
|
||||||
void deattach_request();
|
void deattach_request();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -61,6 +61,7 @@ public:
|
||||||
// NAS interface
|
// NAS interface
|
||||||
void get_imsi_vec(uint8_t* imsi_, uint32_t n);
|
void get_imsi_vec(uint8_t* imsi_, uint32_t n);
|
||||||
void get_imei_vec(uint8_t* imei_, uint32_t n);
|
void get_imei_vec(uint8_t* imei_, uint32_t n);
|
||||||
|
int get_home_plmn_id(LIBLTE_RRC_PLMN_IDENTITY_STRUCT *home_plmn_id);
|
||||||
|
|
||||||
void generate_authentication_response(uint8_t *rand,
|
void generate_authentication_response(uint8_t *rand,
|
||||||
uint8_t *autn_enb,
|
uint8_t *autn_enb,
|
||||||
|
@ -119,6 +120,8 @@ private:
|
||||||
uint8_t k_asme[32];
|
uint8_t k_asme[32];
|
||||||
uint8_t k_enb[32];
|
uint8_t k_enb[32];
|
||||||
|
|
||||||
|
bool initiated;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace srsue
|
} // namespace srsue
|
||||||
|
|
|
@ -181,11 +181,10 @@ bool ue::init(all_args_t *args_)
|
||||||
rlc.init(&pdcp, &rrc, this, &rlc_log, &mac, 0 /* RB_ID_SRB0 */);
|
rlc.init(&pdcp, &rrc, this, &rlc_log, &mac, 0 /* RB_ID_SRB0 */);
|
||||||
pdcp.init(&rlc, &rrc, &gw, &pdcp_log, 0 /* RB_ID_SRB0 */, SECURITY_DIRECTION_UPLINK);
|
pdcp.init(&rlc, &rrc, &gw, &pdcp_log, 0 /* RB_ID_SRB0 */, SECURITY_DIRECTION_UPLINK);
|
||||||
|
|
||||||
|
usim.init(&args->usim, &usim_log);
|
||||||
nas.init(&usim, &rrc, &gw, &nas_log, 1 /* RB_ID_SRB1 */);
|
nas.init(&usim, &rrc, &gw, &nas_log, 1 /* RB_ID_SRB1 */);
|
||||||
gw.init(&pdcp, &nas, &gw_log, 3 /* RB_ID_DRB1 */);
|
gw.init(&pdcp, &nas, &gw_log, 3 /* RB_ID_DRB1 */);
|
||||||
|
|
||||||
usim.init(&args->usim, &usim_log);
|
|
||||||
|
|
||||||
rrc.init(&phy, &mac, &rlc, &pdcp, &nas, &usim, &mac, &rrc_log);
|
rrc.init(&phy, &mac, &rlc, &pdcp, &nas, &usim, &mac, &rrc_log);
|
||||||
rrc.set_ue_category(atoi(args->expert.ue_cateogry.c_str()));
|
rrc.set_ue_category(atoi(args->expert.ue_cateogry.c_str()));
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,12 @@ void nas::init(usim_interface_nas *usim_,
|
||||||
nas_log = nas_log_;
|
nas_log = nas_log_;
|
||||||
state = EMM_STATE_DEREGISTERED;
|
state = EMM_STATE_DEREGISTERED;
|
||||||
plmn_selection = PLMN_NOT_SELECTED;
|
plmn_selection = PLMN_NOT_SELECTED;
|
||||||
|
|
||||||
|
if (usim->get_home_plmn_id(&home_plmn)) {
|
||||||
|
nas_log->error("Getting Home PLMN Id from USIM. Defaulting to 001-01\n");
|
||||||
home_plmn.mcc = 61441; // This is 001
|
home_plmn.mcc = 61441; // This is 001
|
||||||
home_plmn.mnc = 65281; // This is 01
|
home_plmn.mnc = 65281; // This is 01
|
||||||
|
}
|
||||||
cfg = cfg_;
|
cfg = cfg_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,6 +68,7 @@ emm_state_t nas::get_state() {
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
UE interface
|
UE interface
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
void nas::attach_request() {
|
void nas::attach_request() {
|
||||||
nas_log->info("Attach Request\n");
|
nas_log->info("Attach Request\n");
|
||||||
if (state == EMM_STATE_DEREGISTERED) {
|
if (state == EMM_STATE_DEREGISTERED) {
|
||||||
|
@ -137,7 +142,7 @@ void nas::plmn_search_end() {
|
||||||
|
|
||||||
rrc->plmn_select(known_plmns[0]);
|
rrc->plmn_select(known_plmns[0]);
|
||||||
} else {
|
} else {
|
||||||
nas_log->info("Finished searching PLMN in current EARFCN set but no networks were found.\n");
|
nas_log->debug("Finished searching PLMN in current EARFCN set but no networks were found.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -458,7 +458,7 @@ void rrc::cell_found(uint32_t earfcn, srslte_cell_t phy_cell, float rsrp) {
|
||||||
|
|
||||||
// PHY indicates that has gone through all known EARFCN
|
// PHY indicates that has gone through all known EARFCN
|
||||||
void rrc::earfcn_end() {
|
void rrc::earfcn_end() {
|
||||||
rrc_log->info("Finished searching cells in EARFCN set while in state %s\n", rrc_state_text[state]);
|
rrc_log->debug("Finished searching cells in EARFCN set while in state %s\n", rrc_state_text[state]);
|
||||||
|
|
||||||
// If searching for PLMN, indicate NAS we scanned all frequencies
|
// If searching for PLMN, indicate NAS we scanned all frequencies
|
||||||
if (state == RRC_STATE_PLMN_SELECTION) {
|
if (state == RRC_STATE_PLMN_SELECTION) {
|
||||||
|
|
|
@ -25,13 +25,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
#include "upper/usim.h"
|
#include "upper/usim.h"
|
||||||
|
#include "srslte/common/bcd_helpers.h"
|
||||||
|
|
||||||
using namespace srslte;
|
using namespace srslte;
|
||||||
|
|
||||||
namespace srsue{
|
namespace srsue{
|
||||||
|
|
||||||
usim::usim()
|
usim::usim() : initiated(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void usim::init(usim_args_t *args, srslte::log *usim_log_)
|
void usim::init(usim_args_t *args, srslte::log *usim_log_)
|
||||||
|
@ -91,6 +93,7 @@ void usim::init(usim_args_t *args, srslte::log *usim_log_)
|
||||||
if("xor" == args->algo) {
|
if("xor" == args->algo) {
|
||||||
auth_algo = auth_algo_xor;
|
auth_algo = auth_algo_xor;
|
||||||
}
|
}
|
||||||
|
initiated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void usim::stop()
|
void usim::stop()
|
||||||
|
@ -102,6 +105,11 @@ void usim::stop()
|
||||||
|
|
||||||
void usim::get_imsi_vec(uint8_t* imsi_, uint32_t n)
|
void usim::get_imsi_vec(uint8_t* imsi_, uint32_t n)
|
||||||
{
|
{
|
||||||
|
if (!initiated)
|
||||||
|
{
|
||||||
|
usim_log->error("Getting IMSI: USIM not initiated\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(NULL == imsi_ || n < 15)
|
if(NULL == imsi_ || n < 15)
|
||||||
{
|
{
|
||||||
usim_log->error("Invalid parameters to get_imsi_vec");
|
usim_log->error("Invalid parameters to get_imsi_vec");
|
||||||
|
@ -118,6 +126,11 @@ void usim::get_imsi_vec(uint8_t* imsi_, uint32_t n)
|
||||||
|
|
||||||
void usim::get_imei_vec(uint8_t* imei_, uint32_t n)
|
void usim::get_imei_vec(uint8_t* imei_, uint32_t n)
|
||||||
{
|
{
|
||||||
|
if (!initiated)
|
||||||
|
{
|
||||||
|
usim_log->error("Getting IMEI: USIM not initiated\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(NULL == imei_ || n < 15)
|
if(NULL == imei_ || n < 15)
|
||||||
{
|
{
|
||||||
usim_log->error("Invalid parameters to get_imei_vec");
|
usim_log->error("Invalid parameters to get_imei_vec");
|
||||||
|
@ -132,6 +145,43 @@ void usim::get_imei_vec(uint8_t* imei_, uint32_t n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int usim::get_home_plmn_id(LIBLTE_RRC_PLMN_IDENTITY_STRUCT *home_plmn_id)
|
||||||
|
{
|
||||||
|
if (!initiated)
|
||||||
|
{
|
||||||
|
usim_log->error("Getting Home PLMN Id: USIM not initiated\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t mcc_len = 3;
|
||||||
|
uint32_t mnc_len = 2;
|
||||||
|
|
||||||
|
uint8_t imsi_vec[15];
|
||||||
|
get_imsi_vec(imsi_vec, 15);
|
||||||
|
|
||||||
|
std::ostringstream mcc_str, mnc_str;
|
||||||
|
|
||||||
|
for (int i=0;i<mcc_len;i++) {
|
||||||
|
mcc_str << (int) imsi_vec[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// US MCC uses 3 MNC digits
|
||||||
|
if (!mcc_str.str().compare("310")) {
|
||||||
|
mnc_len = 3;
|
||||||
|
}
|
||||||
|
for (int i=mcc_len;i<mcc_len+mnc_len;i++) {
|
||||||
|
mnc_str << (int) imsi_vec[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
string_to_mcc(mcc_str.str(), &home_plmn_id->mcc);
|
||||||
|
string_to_mnc(mnc_str.str(), &home_plmn_id->mnc);
|
||||||
|
|
||||||
|
usim_log->info("Read Home PLMN Id=%s\n",
|
||||||
|
plmn_id_to_string(*home_plmn_id).c_str());
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void usim::generate_authentication_response(uint8_t *rand,
|
void usim::generate_authentication_response(uint8_t *rand,
|
||||||
uint8_t *autn_enb,
|
uint8_t *autn_enb,
|
||||||
uint16_t mcc,
|
uint16_t mcc,
|
||||||
|
|
Loading…
Reference in New Issue