openLTE中的MME

MME
Mme_procedure有4种,LTE_FDD_ENB_MME_PROC_IDLE = 0,
LTE_FDD_ENB_MME_PROC_ATTACH,
LTE_FDD_ENB_MME_PROC_SERVICE_REQUEST,
LTE_FDD_ENB_MME_PROC_DETACH,。.
mme_state有13种,LTE_FDD_ENB_MME_STATE_IDLE = 0,
LTE_FDD_ENB_MME_STATE_ID_REQUEST_IMSI,
LTE_FDD_ENB_MME_STATE_REJECT,
LTE_FDD_ENB_MME_STATE_AUTHENTICATE,
LTE_FDD_ENB_MME_STATE_AUTH_REJECTED,
LTE_FDD_ENB_MME_STATE_ENABLE_SECURITY,
LTE_FDD_ENB_MME_STATE_RELEASE,
LTE_FDD_ENB_MME_STATE_RRC_SECURITY,
LTE_FDD_ENB_MME_STATE_ESM_INFO_TRANSFER,
LTE_FDD_ENB_MME_STATE_ATTACH_ACCEPT,
LTE_FDD_ENB_MME_STATE_ATTACHED,
LTE_FDD_ENB_MME_STATE_SETUP_DRB,
LTE_FDD_ENB_MME_STATE_SEND_DETACH_ACCEPT。
Security head type
Protocol discriminator
Message type

Security head type有4个比特,用来显示该信息是否进行了加密和完整性保护。可以分成6种,分别是:
1. PLAIN_NAS
2. INTEGRITY
3. INTEGRITY_AND_CIPHERED
4. INTEGRITY_WITH_NEW_EPS_SECURITY_CONTEXT
5. INTEGRITY_AND_CIPHERED_WITH_NEW_EPS_SECURITY_CONTEXT
6. SERVICE_REQUEST
  Protocol discriminator有4个比特,用来区分该信息是EMM信息还是ESM信息。
Message type有8个比特,用来显示该信息是什么种类
handle_rrc_msg()函数的输入是LTE_FDD_ENB_MESSAGE_STRUCT,首先看输入结构的type,如果是MME_NAS_MSG_READY,就调用handle_nas_msg()函数,如果type是MME_RRC_CMD_RESP,那么就调用handle_rrc_cmd_resp()函数。
  send_identity_request()函数的输入是user,rb和id_type,这里的id_type是IMSI,把信息打包成LIBLTE_BYTE_MSG_STRUCT结构的NAS msg,其中Security head type是PLAIN_NAS,Protocol discriminator是EMM。然后发送给RRC。
  parse_identity_response()的输入是user,rb和LIBLTE_BYTE_MSG_STRUCT结构的NAS msg,从NAS msg解码出imsi_num,如果hss允许这个imsi_num,就把rb中的mme_state改成LTE_FDD_ENB_MME_STATE_AUTHENTICATE,并且设置user的id。
  send_authentication_request()函数的输入是user和rb。首先设置auth_req,里面包含有autn(Authentication token), rand(A random number), nas_ksi, tsc_flag。根据hss设置好autn, rand,把tsc_flag设置成SECURITY_CONTEXT_FLAG_NATIVE,把nas_ksi设置成0。把auth_req打包成结构为LIBLTE_BYTE_MSG_STRUCT的msg,发送给RRC。
  parse_authentication_response()的输入是user,rb和LIBLTE_BYTE_MSG_STRUCT的msg。将输入的msg分解成auth_resp,auth_resp是一个有16个char的数组,由UE根据在send_authentication_request()过程中MME向UE发送的autn, rand和nas_ksi计算得到。然后从hss中得到相应UE的auth_vec->res[],这也是一个有16个char的数组,如果与auth_resp一一对应,那么核对成功,把该rb中的mme_state改成 LTE_FDD_ENB_MME_STATE_ENABLE_SECURITY,。
  send_security_mode_command()函数的输入是user和rb。首先设置sec_mode_cmd,里面包含有eea,eia,tsc_flag,nas_ksi,imeisv_req等信息。把eea与加密有关设置成EEA0,eia与完整性保护有关,设置成128_EIA2,tsc_flag设置成SECURITY_CONTEXT_FLAG_NATIVE,nas_ksi设置成0,imeisv_req设置成IMEISV_REQUESTED。把sec_mode_cmd打包成结构为LIBLTE_BYTE_MSG_STRUCT的msg,发送给RRC。
  parse_security_mode_complete()函数的输入是user,rb和LIBLTE_BYTE_MSG_STRUCT的msg。将输入的msg分解成 sec_mode_comp,可以从sec_mode_comp得到imei_num,如果和user中的imei一样,那么security mode设置成功,最后把rb的mme_state改成LTE_FDD_ENB_MME_STATE_RRC_SECURITY。
parse_attach_request()函数的输入是user,rb和LIBLTE_BYTE_MSG_STRUCT的msg。将输入的msg分解成attach_req,attach_req里面记录的UE的能力和UE的身份。首先根据attach_req中UE能力的信息设置user的eea,eia,uea,uia,gea。如果该UE不支持eea的EEA0配置或者不支持eia 的128_EIA2配置,那么就把rb中的mme_state改成LTE_FDD_ENB_MME_STATE_REJECT,意味着无法进行attach的操作。然后根据attach_req中UE身份的信息设置rb的mme_state,如果UE身份种类是guti,那么就在user_mgr中找相应的UE的记录,如果找到了,就把mme_state设置成LTE_FDD_ENB_MME_STATE_AUTHENTICATE,意味着下一个步骤是authneticate,如果在user_mgr中找不到相应UE身份的记录,那么就把mme_state设置成LTE_FDD_ENB_MME_STATE_ID_REQUEST_IMSI,意味着下一步MME要进行identity request的过程。如果UE的身份种类是imsi,那么看hss是否允许这个imsi,如果允许,就把mme_state设置成LTE_FDD_ENB_MME_STATE_AUTHENTICATE,意味着下一个步骤是authneticate。
  send_attach_accept()函数的输入是user和rb。首先会给相应的UE分配IP地址,然后会设置attach_accept,attach_accept里面有该UE的guti的信息把attach_accept打包成结构为LIBLTE_BYTE_MSG_STRUCT的msg,发送给RRC。
  send_emm_information()函数输入是user和rb。该函数将emm信息发送给UE,包括网络的名称,所处的时区和时间等信息。
  send_activate_dedicated_eps_bearer_context_request()函数和parse_activate_default_eps_bearer_context_accept()函数用来设置EPS bearer。
  send_esm_information_request()函数的输入是user和rb。首先组成一个esm_info_req,esm_info_req中的eps_bearer_id设置成0,再根据user设置esm_info_req中的proc_transaction_id。把esm_info_req打包成结构为LIBLTE_BYTE_MSG_STRUCT的msg,发送给RRC。
  parse_esm_information_response()函数的输入是user,rb和LIBLTE_BYTE_MSG_STRUCT的msg。将msg解码成esm_info_resp,把mme_state改成LTE_FDD_ENB_MME_STATE_ATTACH_ACCEPT。
parse_service_request()函数的输入是user,rb和LIBLTE_BYTE_MSG_STRUCT的msg。将msg解码后可以得到ksi_和seq_num的信息。
 

你可能感兴趣的:(LTE)