安卓的多PDN连接

来源:互联网 发布:开源股票软件 python 编辑:程序博客网 时间:2024/05/24 02:53
PDN:公用数据网 Public Data Network
 PDN连接过程是手机接入分组数据网的一个重要过程,其目的是在UE和分组数据网络间建立一个默认承载

PDP:分组数据协议 Packet Data Protocol
 PDP上下文:PDP上下文是在MS和GSN节 点中存储的与SM有关的信息。这些信息也可以分为预订信息和位置信息两类。
 静态和动态PDP地址:PDP地址是GPRS用户的网络层地址,与标准的网络层地址(如:IPv4地址、IPv6地址、X. 121地址)建立了临时或永久性的关联。
 PDP附着(PDP-Attach):在PDP激活、PDP更新、PDP去激活之前的操作是PDP附着。PDP附着是让终端登录到PS域里,就是登记到SGSN/PDSN的数据库,同时在HLR里进行PS域的location update,此时是control-plane, 还没有流量,相当于拨号成功。
 PDP激活(PDP-activation)就是开始进行数据流通了,也就是开始打开网页上网了,此时有userplane流量了。
 如果是主从PDP的话,就只有1个地址(同一个PDP上下文)。如果都是主PDP的话,那就有多个地址。(多个PDP上下文)
 PDP上下文标准解释不是很清楚,通俗点就是比方说你要用手机上手机网站,那你会用CMWAP这个PDP上下文,而当你把手机当猫用来连接互联网的时候,用的就是CMNET。大概意思就是为了满足不同需求,会分配给你不同的IP地址来接入不同的业务

主PDP上下文(Primary PDP):他们可以连接到不同的PDN;
从PDP上下文(Secondary PDP); 他们提供了到相同PDN的连接,但是具有不同的QOS。
一个Secondary PDP上下文总是和一个Primary PDP上下文关联的。PDP地址和接入点AP都是和Primary上下文一样的。因此Primary和关联的Secondary PDP上下文一起提供了到相同PDN的连接,但区别是具有不同的承诺QOS。
一个Primary PDP上下文可能有多个分配的Secondary上下文。
Primary PDP上下文必须在关联的Secondary上下文激活之前激活。任何的Secondary PDP上下文可以在保持的Primary上下文处于active的状态下进行激活。如果一个Primary PDP上下文去激活了,那也将去激活所有分配关联的Secondary PDP上下文。任何active的primary或secondary PDP上下文的QOS都可以由MS或网络侧发起的PDP context modification流程来修改。


APN
运营商
IP
承载
多连接
QCI:QoS Class Identifier
 QCI (QoS Class Identifier)是一个标度值,用于衡量特定的提供给SDF(服务数据流)的包转发行为(如丢包率,包延迟预算),它同时应用于GBR和Non-GBR承载,用于指定访问节点内定义的控制承载级分组转发方式(如调度权重、接纳门限、队列管理门限、链路层协议配置等),这些都由运营商预先配置到接入网节点中
 根据QoS的不同, 承载(Bearer)可以划分为两大类: GBR(Guranteed Bit Rate) 和 Non-GBR



一个连接就是建立到PDN的一个连接
建立到PDN的一个连接有可能建立多个承载
一个到PDN的连接对应一个主PDP上下文
一个承载对应一个PDP上下文
一个PDP上下文也对应一个IP地址
一个PDP地址就是分配的IP地址
一个PDP上下文也对应一个网络运营商
一个PDP上下文对应一种APN
一个PDP上下文携带有QOS profile信息

多连接就是在手机上建立多个并行的PS连接
即建立多个到PDN的连接
多个到PDN的连接就是多个主PDP和更多个从PDP
多个到PDN的连接意味着更多个承载和更多个QOS profile
但是多个PDN连接只对应多个PDP地址,多个IP地址,一个运营商(只能注册一个RAT下),多个APN

连接到不同的PDN网络对应的是不同的PS业务,因此不同的PDN对应不同的APN类型,即对应不同的APN。
浏览网页和发彩信属于不同的业务,如果不支持多PDN连接就会按照APN优先级去活低优先级的连接,重新建立高优先级的连接。如果是支持多PDN,则可同时进行两种业务。
log如下:


事实上并没有default APN的连接,直接setup新的mms连接


常见的PDP激活失败原因,即无法建立成功PDN连接的原因:
missing or unknown APN:由于未知APN导致会话激活失败

unknown PDP address or PDP type: 未知PDP address or PDP type导致会话激活失败

user authentication failed:用户鉴权失败导致会话激活失败

service option not supported:服务不支持导致会话激活失败的次数

requested service option not subscribed:请求的服务未签约导致会话激活



PDN相关的NV配置:


66008 modem/data/3gpp/lteps/auto_connect_def_pdn  Auto Connect Def PDN

71595  modem/data/3gpp/lteps/attach_fallback_ip_type  Specify Attach PDN dual IP Fall back IP type

67334  modem/data/3gpp/ignore_last_pdn_ia_timer  Ignore Inactivity timer for last PDN


67248 data/3gpp/ds_3gpp_multi_pdn_same_apn   3GPP Multi PDN Same APN

70260  modem/data/3gpp/lteps/allow_def_lte_pdn_teardown     Allow def PDN Teardown

70334  modem/data/3gpp/ps/remove_unused_pdn  Remove unused pdn

71517  modem/data/3gpp/lteps/pdn_conn_limit_handling  Enable/Disable PDN Conn Limit Handling

71520  modem/data/3gpp/global_throttling  Enable/Disable PDP, PDN and service request throttling

71541  modem/data/3gpp/umts/enable_multi_pdn_dun  Enable/Disable Multi-PDN DUN

72560  modem/data/3gpp/ps/reg_pdn_throttling     Enable/Disable Regular PDN Throttling

73591  modem/data/3gpp/ps/enable_pdn_throttling_per_rat 3GPP Ignore Data Settings

另外efs中还有许多针对3gpp2的pdn的配置,如最大失败个数、鉴权等级等等。



建立数据连接时对于是否支持多连接(多PDN)的判定:


 private boolean isOnlySingleDcAllowed(int rilRadioTech) {

        int[] singleDcRats = mPhone.getContext().getResources().getIntArray(

                com.android.internal.R.array.config_onlySingleDcAllowed);

        boolean onlySingleDcAllowed = false;

        if (Build.IS_DEBUGGABLE &&

                SystemProperties.getBoolean("persist.telephony.test.singleDc", false)) {

            onlySingleDcAllowed = true;

        }

        if (singleDcRats != null) {

            for (int i=0; i < singleDcRats.length && onlySingleDcAllowed == false; i++) {

                if (rilRadioTech == singleDcRats[i]) onlySingleDcAllowed = true;

            }

        }



        if (DBG) log("isOnlySingleDcAllowed(" + rilRadioTech + "): " + onlySingleDcAllowed);

        return onlySingleDcAllowed;

    }

从config_onlySingleDcAllowed的配置来看,以下RAT是只支持单连接的:

    <integer-array name="config_onlySingleDcAllowed">

        <item>4</item>  <!-- IS95A -->

        <item>5</item>  <!-- IS95B -->

        <item>6</item>  <!-- 1xRTT -->

        <item>7</item>  <!-- EVDO_0 -->

        <item>8</item>  <!-- EVDO_A -->

        <item>12</item> <!-- EVDO_B -->

    </integer-array>

在建立数据连接时,如果

isOnlySingleDcAllowed判定为true,即只支持单连接,则会判断是否有更高优先级的APN已经激活,如果有则不会去建立本次请求的数据连接,如果没有则会断开当前已经存在的连接再去请求本次数据连接。

如果判定为false,即可支持多个连接,则直接去建立新的连接。在建立数据的过程中判断如下:

 //判断是否是只支持单pdn连接,即DataConnection对象只能有一个存在,判断依据为radioTech

        if (isOnlySingleDcAllowed(radioTech)) {

           //在只支持单连接的情况下,如果更高优先级的apnContext处于激活态,比如mms正在进行,default拨号将会被无视

            if (isHigherPriorityApnContextActive(apnContext)) {

                return false;

            }

            //说明当前请求apnContext是高优先级的,需要断开低优先级的连接

            if (cleanUpAllConnections(true, Phone.REASON_SINGLE_PDN_ARBITRATION)) {

                return false;

            }

        }




以上纯属个人学习总结,如有不对的地方,欢迎讨论指正。
原创粉丝点击