一.BP侧流程
1.sim卡初始化
1>主要卡文件读取
参考3GPP TS 31.102
2>主要NV
NV10:Digital/Analog Mode Preference,接入技术,对应上层设置的网络模式
NV00849:Network Selection Mode Preference,设置手动搜网与自动搜网
NV00850:Service Domain Preference,服务域选取,仅PS/仅CS/PS&CS
NV6828:LTE band config,UE支持的LTE band
NV65633:lte bandpref /nv/item_files/modem/mmode/lte_bandpref
2.plmn,rat选择
plmn和rat选择在reg模块中完成,通过CM_SERVICE_REQ发起,分为手动模式和自动模式
1>手动搜网
协议:23.122 4.4.3.1.1 Automatic Network Selection Mode Procedure
按照协议规定的优先级去搜索网,即RPLMN->HPLMN->UPLMN->OPLMN
2>自动搜网
协议:23.122 4.4.3.1.2 Manual Network Selection Mode Procedure
UE会将所有的PLMN,包括不可用的PLMN列出来,供用户选择注册
3>流程
开机后会先从sim卡获取EF_LRPLMNSI,如果是1,先获取HPLMN,如果是0,先获取RPLMN
若先获取RPLMN,设备会先读取NV_RPLMNACT_I,获得最后注册的网络模式,并根据该网络制式去获取对应的PLMN
若NV_RPLMNACT_I = LTE,对应的RPLMN从EF_EPSLOCI获取
若NV_RPLMNACT_I = UMTS or GSM,继续检查NV_SERVICE_DOMAIN_PREF_I
若NV_SERVICE_DOMAIN_PREF_I = CS only or CS&PS,RPLMN从EFLOCI获得。
若NV_SERVICE_DOMAIN_PREF_I = PS only RPLMN信息从EFPSLOCI中获得。
当找到可用plmn时,发起MMR_REG_REQ PLMN请求
log:
//network_selection_mode 0代表自动选网
02:16:36.506793 MM/LowFreq/High/REG [ reg_state.c 2356] DS: SUB 0 =REG= CM_SERVICE_REQ Scan Scope type=0 network_selection_mode 0 Additional_info=0 RAT Enabled BM = 0x214, BST BM = 0x2001
//选择的rplmn,rat
02:16:36.507431 MM/LowFreq/High/REG [ reg_send.c 2176] DS: SUB 0 =REG= MMR_REG_REQ PLMN(460-11) RAT(0-GSM,1-W,2-LTE,3-TDS,4-NR5G) = 2 trans_id 8, scan_scope=01
4.小区选择
MM模块收到reg模块发来的注册请求,根据传来的intial_rat 发送rrc_service_req去激活对应协议栈,在接入层模块进行扫频,小区搜索,小区选择等。
小区搜索分为band scan与system scan
band scan:根据UE支持的band来进行频点搜索
system scan:根据acq_db文件中保存的频点来搜索
//log:
//system scan
06:59:19.253845 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 26478] CSP: Processing service request1
06:59:19.278490 LRRC/HighFreq/High/LRRC [ lte_rrc_llc.c 1937] Sent System Scan Request
06:59:19.349307 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 34633] CSP: Received System Scan Cnf
06:59:19.349308 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 34655] CSP: System Scan Cnf returned 3 systems1
06:59:19.349372 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 24665] CSP: Prioritization of system scan results complete1 //查看扫频结果
06:59:19.349470 LML1/LowFreq/High/LML1 [ lte_ml1_mgr_stm.c 4181] LTE_CPHY_ACQ_REQ Trans id 8 Band 3 earfcn 1650 rest_cfg 0 # black_cells 0 acq_type 0 acq_cell_id 0,num earfcn 11
//cell select
06:59:19.433037 LML1/LowFreq/High/LML1 [lte_ml1_sm_idle_cell_select_stm.c 1546] Entering IDLE CELL SELECT STM1
06:59:19.440858 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 39583] CSP: Proceeding to cell select request1
06:59:19.440895 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 8641] CSP: Sent Cell Selection Request1
06:59:19.444017 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 41121] CSP: Received Cell Select Cnf1
06:59:19.444021 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 41294] CSP: Cell select req is success1
06:59:19.349451 LRRC/HighFreq/High/LRRC [ lte_rrc_llc.c 1948] Sent Acq Request1
06:59:19.440591 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 39078] CSP: Adding cell to Acq DB1 //保存在acq db中
06:59:19.598790 LML1/LowFreq/High/LML1 [lte_ml1_sm_idle_cell_select_stm.c 1591] Exiting IDLE CELL SELECT STM1
5.附着网络
1>随机接入,RRC连接
UE通过小区搜索成功驻留到LTE网络,通过随机接入与小区建立RRC链接并取得上行同步。
随机接入主要目的:获取上行同步;为UE分配一个唯一的标识C-RNTI
log:
信令:
02:13:47.716920 [0xB0C0] UL_CCCH / RRCConnectionRequest
02:13:47.750050 [0xB167] LTE Random Access Request (MSG1) Report
02:13:47.758430 [0xB168] LTE Random Access Response (MSG2) Report
02:13:47.758600 [0xB169] LTE UE Identification Message (MSG3) Report
02:13:47.770454 [0xB16A] LTE Contention Resolution Message (MSG4) Report
02:13:47.770507 [0xB0C0] DL_CCCH / RRCConnectionSetup
02:13:47.774524 [0xB0C0] UL_DCCH / RRCConnectionSetupComplete
//NAS ,AS
02:13:47.716822 MM/LowFreq/High/MM [ emm_rrc_if.c 1312] DS: SUB 0 =EMM= Sent LTE_RRC_CONN_EST_REQ w/ cause 3, msg_id=651
02:13:47.716834 MM/HighFreq/High/MM [ emm_database.c 189] DS: SUB 0 =EMM= Set connection state 1
02:13:47.716841 LRRC/HighFreq/High/LRRC [ lte_rrc_cep.c 1834] RRC CEP: RegisteredMME is present in CONN_EST_REQ
02:13:47.716843 LRRC/HighFreq/High/LRRC [ lte_rrc_cep.c 6017] RRC CEP: Recvd Conn Est Req; Controller state = 2
02:13:47.716858 LRRC/HighFreq/High/LRRC [ lte_rrc_cep.c 4662] RRC CEP:LTE_RRC_EST_CAUSE_MO_SIGNALING volte_opt:est_calltype = 0
02:13:47.716873 LRRC/HighFreq/High/LRRC [lte_rrc_controller.c 9009] RRCC_DSDS: Received TRM Priority Indi. From:0, Pri: 6, Proc: 5
02:13:47.716897 LRRC/HighFreq/High/LRRC [ lte_rrc_cep.c 5213] RRC CEP: Building ConnectionRequest message
02:13:47.716928 LL2/LowFreq/High/LRLC [ lte_mac_ctrl.c 2701] Start Access Request for reason=0, RAID=255 //随机接入
02:13:47.716942 LRRC/HighFreq/High/LRRC [lte_rrc_controller.c 8025] RRCC: Received conn_est_started_indi
2>attach流程
log:
02:13:47.716720 LTE NAS EMM Plain OTA Outgoing Message Attach request Msg 1
02:13:48.241882 LTE NAS EMM Plain OTA Incoming Message Attach accept Msg 1
02:13:48.246848 LTE NAS EMM Plain OTA Outgoing Message Attach complete Msg 1
02:13:48.324604 LTE NAS ESM Plain OTA Outgoing Message PDN connectivity request Msg1
02:13:48.429165 LTE NAS ESM Plain OTA Incoming Message Activate default EPS bearer context request Msg1
02:13:48.433425 LTE NAS ESM Plain OTA Outgoing Message Activate default EPS bearer context accept Msg1
02:13:49.798700 IMS Registration Length: 177
二.AP侧流程
1.拨号
收到注册成功的消息(DATA_REGISTRATION_STATE)→apn连接(trySetupData)→卡loaded–>trySetupData
关键log: < DATA_REGISTRATION_STATE|trySetupData|onDataSetupComplete
第一次拨号使用default类型的拨号,但此时卡文件还没加载完成,拨号失败
第二次拨号:
使用ims类型的apn 拨号成功
apn配置在apns-conf.xml文件中 ,一般位于/system/etc/下
优先级:data/misc/apns/apns-conf.xml >product/etc/apns-conf.xml >oem/telephony/apns-conf.xml >system/etc/apns-conf.xml
但是apns-conf.xml中关于电信卡46011 有好几个,会选哪个进行拨号呢
源码中调用堆栈为 ,为DcTracker收到EVENT_RECORDS_LOADED消息进行处理
查看setupDataOnAllConnectableApns,重点关注apnContext参数,源码如下
private void setupDataOnAllConnectableApns(String reason, RetryFailures retryFailures) {
if (VDBG) log("setupDataOnAllConnectableApns: " + reason);
if (DBG && !VDBG) {
StringBuilder sb = new StringBuilder(120);
for (ApnContext apnContext : mPrioritySortedApnContexts) {
sb.append(apnContext.getApnType());
sb.append(":[state=");
sb.append(apnContext.getState());
sb.append(",enabled=");
sb.append(apnContext.isEnabled());
sb.append("] ");
}
log("setupDataOnAllConnectableApns: " + reason + " " + sb);
}
for (ApnContext apnContext : mPrioritySortedApnContexts) {
Log.d(TAG,"apnContext is "+apnContext);
setupDataOnConnectableApn(apnContext, reason, retryFailures);
}
}
mPrioritySortedApnContexts定义如下 ,为一个初始长度为5,从大到小排序
private final PriorityQueue<ApnContext>mPrioritySortedApnContexts =
new PriorityQueue<ApnContext>(5,
new Comparator<ApnContext>() {
public int compare(ApnContext c1, ApnContext c2) {
return c2.priority - c1.priority;
}
} );
//添加元素
private void initApnContexts() {
log("initApnContexts: E");
// Load device network attributes from resources
String[] networkConfigStrings = mPhone.getContext().getResources().getStringArray(
com.android.internal.R.array.networkAttributes); //frameworks\base\core\res\res\values\config.xml
for (String networkConfigString : networkConfigStrings) {
NetworkConfig networkConfig = new NetworkConfig(networkConfigString);
ApnContext apnContext;
switch (networkConfig.type) {
case NETWORK_TYPE_DEFAULT:
apnContext = addApnContext(PhoneConstants.APN_TYPE_DEFAULT, networkConfig);
break;
case NETWORK_TYPE_MMS:
apnContext = addApnContext(PhoneConstants.APN_TYPE_MMS, networkConfig);
break;
case NETWORK_TYPE_SUPL:
apnContext = addApnContext(PhoneConstants.APN_TYPE_SUPL, networkConfig);
break;
case NETWORK_TYPE_DUN:
apnContext = addApnContext(PhoneConstants.APN_TYPE_DUN, networkConfig);
break;
case NETWORK_TYPE_HIPRI:
apnContext = addApnContext(PhoneConstants.APN_TYPE_HIPRI, networkConfig);
break;
case NETWORK_TYPE_FOTA:
apnContext = addApnContext(PhoneConstants.APN_TYPE_FOTA, networkConfig);
break;
case NETWORK_TYPE_IMS:
apnContext = addApnContext(PhoneConstants.APN_TYPE_IMS, networkConfig);
break;
case NETWORK_TYPE_CBS:
apnContext = addApnContext(PhoneConstants.APN_TYPE_CBS, networkConfig);
break;
case NETWORK_TYPE_IA:
apnContext = addApnContext(PhoneConstants.APN_TYPE_IA, networkConfig);
break;
case NETWORK_TYPE_EMERGENCY:
apnContext = addApnContext(PhoneConstants.APN_TYPE_EMERGENCY, networkConfig);
break;
case NETWORK_TYPE_MCX:
apnContext = addApnContext(PhoneConstants.APN_TYPE_MCX, networkConfig);
break;
default:
log("initApnContexts: skipping unknown type=" + networkConfig.type);
continue;
}
log("initApnContexts: apnContext=" + apnContext);
}
if (VDBG) log("initApnContexts: X mApnContexts=" + mApnContexts);
}
查看frameworks\base\core\res\res\values\config.xml,networkAttributes定义如下:
<string-array translatable="false" name="networkAttributes">
<item>"wifi,1,1,1,-1,true"</item>
<item>"mobile,0,0,0,-1,true"</item>
<item>"mobile_mms,2,0,2,60000,true"</item>
<item>"mobile_supl,3,0,2,60000,true"</item>
<item>"mobile_dun,4,0,2,60000,true"</item>
<item>"mobile_hipri,5,0,3,60000,true"</item>
<item>"mobile_fota,10,0,2,60000,true"</item>
<item>"mobile_ims,11,0,2,60000,true"</item>
<item>"mobile_cbs,12,0,2,60000,true"</item>
<item>"wifi_p2p,13,1,0,-1,true"</item>
<item>"mobile_ia,14,0,2,-1,true"</item>
<item>"mobile_emergency,15,0,2,-1,true"</item>
</string-array>
添加log打印的顺序如下:
08-14 17:23:32.062 2230 2230 D DcTracker: apnContext is {mApnType=emergency mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062 2230 2230 D DcTracker: apnContext is {mApnType=mms mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062 2230 2230 D DcTracker: apnContext is {mApnType=supl mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062 2230 2230 D DcTracker: apnContext is {mApnType=hipri mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062 2230 2230 D DcTracker: apnContext is {mApnType=dun mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062 2230 2230 D DcTracker: apnContext is {mApnType=fota mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062 2230 2230 D DcTracker: apnContext is {mApnType=ims mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062 2230 2230 D DcTracker: apnContext is {mApnType=default mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062 2230 2230 D DcTracker: apnContext is {mApnType=cbs mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
源码分析:
1>pollState来源
1.SST收到EVENT_RADIO_STATE_CHANGED且当前radio状态为RADIO_POWER_OFF
2.SST收到EVENT_SIM_READY或者EVENT_RUIM_READY
3.SST收到EVENT_CARRIER_CONFIG_CHANGED
2>modemTriggeredPollState来源
1.SST收到EVENT_PHONE_TYPE_SWITCHED或者EVENT_RADIO_STATE_CHANGED
2.SST收到EVENT_NETWORK_STATE_CHANGED
3>trySetupData来源
1.DcTracker收到EVENT_ENABLE_APN<--TelephonyNetworkFactory中的needNetworkFor
2.DcTrackers收到EVENT_DATA_RAT_CHANGED
3.DcTracker收到EVENT_DATA_CONNECTION_ATTACHED
4.DcTracker收到EVENT_RECORDS_LOADED
2.重连机制
主要有以下三种方式触发重连网络(data stall)
1.SETUP_DATA_CALL 时返回错误
2.Modem上报DATA_CALL_LIST包含错误码或者链接中断
3.一段时间内没有上下行数据(TX/RX)
具体参考https://blog.csdn.net/huangling07031190/article/details/125348072