简介
通过OTA/OMADM 运营商服务器可以下发消息实现disable APN,从而影响Data PDN建立。APN被disable了会导致无法正常上网。
在Android 和 KaiOS 系统实现上有区别,不过都是通过carrier_enabled 这类字段实现判断控制。
- Android:上层 Telephony 根据APN carrier_enabled 值判断是否下发PDN
- KaiOS:上层 gecko DataCall 不做判断,随DataProfile 传给Modem(QCOM),底层决定是否建立PDN。
Android
Telephony 上层DataProfileManager 会根据网络请求选择APN,如果APN 被disable了,ApnSetting 在canHandleType 校验过程中会直接return false。
canBeSatisfiedBy => canHandleType
代码逻辑说明:
- frameworks/base/telephony/java/android/telephony/data/ApnSetting.java(Android U)
- Android 9 参考:http://androidxref.com/9.0.0_r3/xref/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/ApnSetting.java#482
- 早期DcTracker 和 DataConnection会使用,在DataConnection的PDN初始化(接口 initConnection)中校验;在 Android U上已经替换
- frameworks/opt/telephony/src/java/com/android/internal/telephony/data/TelephonyNetworkRequest.java
//Android U 功能逻辑
//【TelephonyNetworkRequest.java】 选择满足PDN请求的类型
/**
* Check if this network request can be satisfied by a data profile.
*
* @param dataProfile The data profile to check.
* @return {@code true} if this network request can be satisfied by the data profile.
*/
public boolean canBeSatisfiedBy(@NonNull DataProfile dataProfile) {
//返回满足请求的APN列表
return apnTypes.stream().allMatch(dataProfile.getApnSetting()::canHandleType);
}
//【ApnSetting.java】 校验
/** @hide */
public boolean canHandleType(@ApnType int type) {
if (!mCarrierEnabled) {
return false;
}
// DEFAULT can handle HIPRI.
return hasApnType(type);
}
日志举例:根据 ApnSetting结构打印字段顺序找到CarrierEnabled 的值。
CarrierEnabled is false, so can not find the profile to setup data PDN.
[DataProfile=[ApnSetting] INTERNET, 3086, 310590, INTERNET, , null, , null, null, 0, supl | hipri | default, IPV4V6, IP, false, 0, true, 0, 0, 0, 0, 0, gid, A1, false, UNKNOWN, UNKNOWN, 0, -1, -1, false, 961, TrafficDescriptor={mDnn=INTERNET, null}, preferred=false],
KaiOS
gecko 不对 APN 的 enable 情况做校验拦截,会随着 RIL_REQUEST_SETUP_DATA_CALL 的请求,将其转换成DataProfile的enabled传给qcom。具体QCOM校验需要看其逻辑。
若上层想通过carrier_enabled参数决定是否使用该APN请求网络,可以尝试在以下接口函数中过滤APN,然后再执行DataCall相关流程。
- gecko/dom/system/gonk/radio/DataCallManager.jsm
//把disable的APN在aNewApnSettings数据中剔除,再执行后续DataCall流程
updateApnSettings(aNewApnSettings) {
const kApnSettingKey = "ril.data.apnSettings.sim"
}
原文地址:https://blog.csdn.net/qq_38666896/article/details/135688168
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_60604.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!