Merge "APIs for 5G slicing" into sc-dev

This commit is contained in:
Sarah Chin
2021-02-24 17:36:45 +00:00
committed by Android (Google) Code Review
14 changed files with 296 additions and 43 deletions

View File

@@ -26279,6 +26279,7 @@ package android.net {
field public static final int NET_CAPABILITY_CBS = 5; // 0x5 field public static final int NET_CAPABILITY_CBS = 5; // 0x5
field public static final int NET_CAPABILITY_DUN = 2; // 0x2 field public static final int NET_CAPABILITY_DUN = 2; // 0x2
field public static final int NET_CAPABILITY_EIMS = 10; // 0xa field public static final int NET_CAPABILITY_EIMS = 10; // 0xa
field public static final int NET_CAPABILITY_ENTERPRISE = 29; // 0x1d
field public static final int NET_CAPABILITY_FOREGROUND = 19; // 0x13 field public static final int NET_CAPABILITY_FOREGROUND = 19; // 0x13
field public static final int NET_CAPABILITY_FOTA = 3; // 0x3 field public static final int NET_CAPABILITY_FOTA = 3; // 0x3
field public static final int NET_CAPABILITY_IA = 7; // 0x7 field public static final int NET_CAPABILITY_IA = 7; // 0x7
@@ -41225,6 +41226,7 @@ package android.telephony {
field public static final int ACTIVATION_REJECT_GGSN = 30; // 0x1e field public static final int ACTIVATION_REJECT_GGSN = 30; // 0x1e
field public static final int ACTIVATION_REJECT_UNSPECIFIED = 31; // 0x1f field public static final int ACTIVATION_REJECT_UNSPECIFIED = 31; // 0x1f
field public static final int ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED = 65; // 0x41 field public static final int ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED = 65; // 0x41
field public static final int ALL_MATCHING_RULES_FAILED = 2254; // 0x8ce
field public static final int APN_DISABLED = 2045; // 0x7fd field public static final int APN_DISABLED = 2045; // 0x7fd
field public static final int APN_DISALLOWED_ON_ROAMING = 2059; // 0x80b field public static final int APN_DISALLOWED_ON_ROAMING = 2059; // 0x80b
field public static final int APN_MISMATCH = 2054; // 0x806 field public static final int APN_MISMATCH = 2054; // 0x806
@@ -41374,6 +41376,7 @@ package android.telephony {
field public static final int LTE_NAS_SERVICE_REQUEST_FAILED = 2117; // 0x845 field public static final int LTE_NAS_SERVICE_REQUEST_FAILED = 2117; // 0x845
field public static final int LTE_THROTTLING_NOT_REQUIRED = 2127; // 0x84f field public static final int LTE_THROTTLING_NOT_REQUIRED = 2127; // 0x84f
field public static final int MAC_FAILURE = 2183; // 0x887 field public static final int MAC_FAILURE = 2183; // 0x887
field public static final int MATCH_ALL_RULE_NOT_ALLOWED = 2253; // 0x8cd
field public static final int MAXIMIUM_NSAPIS_EXCEEDED = 2157; // 0x86d field public static final int MAXIMIUM_NSAPIS_EXCEEDED = 2157; // 0x86d
field public static final int MAXINUM_SIZE_OF_L2_MESSAGE_EXCEEDED = 2166; // 0x876 field public static final int MAXINUM_SIZE_OF_L2_MESSAGE_EXCEEDED = 2166; // 0x876
field public static final int MAX_ACCESS_PROBE = 2079; // 0x81f field public static final int MAX_ACCESS_PROBE = 2079; // 0x81f

View File

@@ -12251,6 +12251,7 @@ package android.telephony.data {
method public long getRetryDurationMillis(); method public long getRetryDurationMillis();
method @Nullable public android.telephony.data.SliceInfo getSliceInfo(); method @Nullable public android.telephony.data.SliceInfo getSliceInfo();
method @Deprecated public int getSuggestedRetryTime(); method @Deprecated public int getSuggestedRetryTime();
method @NonNull public java.util.List<android.telephony.data.TrafficDescriptor> getTrafficDescriptors();
method public void writeToParcel(android.os.Parcel, int); method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR; field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR;
field public static final int HANDOVER_FAILURE_MODE_DO_FALLBACK = 1; // 0x1 field public static final int HANDOVER_FAILURE_MODE_DO_FALLBACK = 1; // 0x1
@@ -12286,6 +12287,7 @@ package android.telephony.data {
method @NonNull public android.telephony.data.DataCallResponse.Builder setRetryDurationMillis(long); method @NonNull public android.telephony.data.DataCallResponse.Builder setRetryDurationMillis(long);
method @NonNull public android.telephony.data.DataCallResponse.Builder setSliceInfo(@Nullable android.telephony.data.SliceInfo); method @NonNull public android.telephony.data.DataCallResponse.Builder setSliceInfo(@Nullable android.telephony.data.SliceInfo);
method @Deprecated @NonNull public android.telephony.data.DataCallResponse.Builder setSuggestedRetryTime(int); method @Deprecated @NonNull public android.telephony.data.DataCallResponse.Builder setSuggestedRetryTime(int);
method @NonNull public android.telephony.data.DataCallResponse.Builder setTrafficDescriptors(@NonNull java.util.List<android.telephony.data.TrafficDescriptor>);
} }
public final class DataProfile implements android.os.Parcelable { public final class DataProfile implements android.os.Parcelable {
@@ -12356,7 +12358,7 @@ package android.telephony.data {
method public void setDataProfile(@NonNull java.util.List<android.telephony.data.DataProfile>, boolean, @NonNull android.telephony.data.DataServiceCallback); method public void setDataProfile(@NonNull java.util.List<android.telephony.data.DataProfile>, boolean, @NonNull android.telephony.data.DataServiceCallback);
method public void setInitialAttachApn(@NonNull android.telephony.data.DataProfile, boolean, @NonNull android.telephony.data.DataServiceCallback); method public void setInitialAttachApn(@NonNull android.telephony.data.DataProfile, boolean, @NonNull android.telephony.data.DataServiceCallback);
method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @NonNull android.telephony.data.DataServiceCallback); method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @NonNull android.telephony.data.DataServiceCallback);
method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @IntRange(from=0, to=15) int, @Nullable android.telephony.data.SliceInfo, @NonNull android.telephony.data.DataServiceCallback); method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @IntRange(from=0, to=15) int, @Nullable android.telephony.data.SliceInfo, @Nullable android.telephony.data.TrafficDescriptor, boolean, @NonNull android.telephony.data.DataServiceCallback);
} }
public class DataServiceCallback { public class DataServiceCallback {
@@ -12455,6 +12457,15 @@ package android.telephony.data {
method @NonNull public android.telephony.data.ThrottleStatus.Builder setTransportType(int); method @NonNull public android.telephony.data.ThrottleStatus.Builder setTransportType(int);
} }
public final class TrafficDescriptor implements android.os.Parcelable {
ctor public TrafficDescriptor(@Nullable String, @Nullable String);
method public int describeContents();
method @Nullable public String getDnn();
method @Nullable public String getOsAppId();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.TrafficDescriptor> CREATOR;
}
} }
package android.telephony.euicc { package android.telephony.euicc {

View File

@@ -205,6 +205,7 @@ public final class NetworkCapabilities implements Parcelable {
NET_CAPABILITY_OEM_PRIVATE, NET_CAPABILITY_OEM_PRIVATE,
NET_CAPABILITY_VEHICLE_INTERNAL, NET_CAPABILITY_VEHICLE_INTERNAL,
NET_CAPABILITY_NOT_VCN_MANAGED, NET_CAPABILITY_NOT_VCN_MANAGED,
NET_CAPABILITY_ENTERPRISE,
}) })
public @interface NetCapability { } public @interface NetCapability { }
@@ -415,8 +416,17 @@ public final class NetworkCapabilities implements Parcelable {
@SystemApi @SystemApi
public static final int NET_CAPABILITY_NOT_VCN_MANAGED = 28; public static final int NET_CAPABILITY_NOT_VCN_MANAGED = 28;
/**
* Indicates that this network is intended for enterprise use.
* <p>
* 5G URSP rules may indicate that all data should use a connection dedicated for enterprise
* use. If the enterprise capability is requested, all enterprise traffic will be routed over
* the connection with this capability.
*/
public static final int NET_CAPABILITY_ENTERPRISE = 29;
private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS; private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS;
private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_NOT_VCN_MANAGED; private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_ENTERPRISE;
/** /**
* Network capabilities that are expected to be mutable, i.e., can change while a particular * Network capabilities that are expected to be mutable, i.e., can change while a particular
@@ -474,7 +484,8 @@ public final class NetworkCapabilities implements Parcelable {
| (1 << NET_CAPABILITY_MCX) | (1 << NET_CAPABILITY_MCX)
| (1 << NET_CAPABILITY_RCS) | (1 << NET_CAPABILITY_RCS)
| (1 << NET_CAPABILITY_VEHICLE_INTERNAL) | (1 << NET_CAPABILITY_VEHICLE_INTERNAL)
| (1 << NET_CAPABILITY_XCAP); | (1 << NET_CAPABILITY_XCAP)
| (1 << NET_CAPABILITY_ENTERPRISE);
/** /**
* Capabilities that force network to be restricted. * Capabilities that force network to be restricted.
@@ -2028,8 +2039,9 @@ public final class NetworkCapabilities implements Parcelable {
case NET_CAPABILITY_PARTIAL_CONNECTIVITY: return "PARTIAL_CONNECTIVITY"; case NET_CAPABILITY_PARTIAL_CONNECTIVITY: return "PARTIAL_CONNECTIVITY";
case NET_CAPABILITY_TEMPORARILY_NOT_METERED: return "TEMPORARILY_NOT_METERED"; case NET_CAPABILITY_TEMPORARILY_NOT_METERED: return "TEMPORARILY_NOT_METERED";
case NET_CAPABILITY_OEM_PRIVATE: return "OEM_PRIVATE"; case NET_CAPABILITY_OEM_PRIVATE: return "OEM_PRIVATE";
case NET_CAPABILITY_VEHICLE_INTERNAL: return "NET_CAPABILITY_VEHICLE_INTERNAL"; case NET_CAPABILITY_VEHICLE_INTERNAL: return "VEHICLE_INTERNAL";
case NET_CAPABILITY_NOT_VCN_MANAGED: return "NOT_VCN_MANAGED"; case NET_CAPABILITY_NOT_VCN_MANAGED: return "NOT_VCN_MANAGED";
case NET_CAPABILITY_ENTERPRISE: return "ENTERPRISE";
default: return Integer.toString(capability); default: return Integer.toString(capability);
} }
} }

View File

@@ -111,6 +111,7 @@ public class Annotation {
public @interface NetworkType { public @interface NetworkType {
} }
// TODO(b/180542000): remove and replace references with @ApnSetting.ApnType
@IntDef(flag = true, prefix = {"TYPE_"}, value = { @IntDef(flag = true, prefix = {"TYPE_"}, value = {
ApnSetting.TYPE_DEFAULT, ApnSetting.TYPE_DEFAULT,
ApnSetting.TYPE_MMS, ApnSetting.TYPE_MMS,
@@ -124,6 +125,7 @@ public class Annotation {
ApnSetting.TYPE_EMERGENCY, ApnSetting.TYPE_EMERGENCY,
ApnSetting.TYPE_MCX, ApnSetting.TYPE_MCX,
ApnSetting.TYPE_XCAP, ApnSetting.TYPE_XCAP,
// ApnSetting.TYPE_ENTERPRISE
}) })
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface ApnType { public @interface ApnType {

View File

@@ -5321,7 +5321,7 @@ public class CarrierConfigManager {
sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_ORIGINATOR_STRING_ARRAY, sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_ORIGINATOR_STRING_ARRAY,
new String[0]); new String[0]);
sDefaults.putStringArray(KEY_APN_PRIORITY_STRING_ARRAY, new String[] { sDefaults.putStringArray(KEY_APN_PRIORITY_STRING_ARRAY, new String[] {
"default:0", "mms:2", "supl:2", "dun:2", "hipri:3", "fota:2", "default:0", "enterprise:1", "mms:2", "supl:2", "dun:2", "hipri:3", "fota:2",
"ims:2", "cbs:2", "ia:2", "emergency:2", "mcx:3", "xcap:3" "ims:2", "cbs:2", "ia:2", "emergency:2", "mcx:3", "xcap:3"
}); });
sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_PATTERN_STRING_ARRAY, new String[0]); sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_PATTERN_STRING_ARRAY, new String[0]);

View File

@@ -917,6 +917,10 @@ public final class DataFailCause {
public static final int HANDOFF_PREFERENCE_CHANGED = 0x8CB; public static final int HANDOFF_PREFERENCE_CHANGED = 0x8CB;
/** Data call fail due to the slice not being allowed for the data call. */ /** Data call fail due to the slice not being allowed for the data call. */
public static final int SLICE_REJECTED = 0x8CC; public static final int SLICE_REJECTED = 0x8CC;
/** No matching rule available for the request, and match-all rule is not allowed for it. */
public static final int MATCH_ALL_RULE_NOT_ALLOWED = 0x8CD;
/** If connection failed for all matching URSP rules. */
public static final int ALL_MATCHING_RULES_FAILED = 0x8CE;
//IKE error notifications message as specified in 3GPP TS 24.302 (Section 8.1.2.2). //IKE error notifications message as specified in 3GPP TS 24.302 (Section 8.1.2.2).

View File

@@ -28,8 +28,6 @@ import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.provider.Telephony; import android.provider.Telephony;
import android.provider.Telephony.Carriers; import android.provider.Telephony.Carriers;
import android.telephony.Annotation;
import android.telephony.Annotation.ApnType;
import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.NetworkType;
import android.telephony.ServiceState; import android.telephony.ServiceState;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@@ -116,6 +114,31 @@ public class ApnSetting implements Parcelable {
public static final int TYPE_MCX = ApnTypes.MCX; public static final int TYPE_MCX = ApnTypes.MCX;
/** APN type for XCAP. */ /** APN type for XCAP. */
public static final int TYPE_XCAP = ApnTypes.XCAP; public static final int TYPE_XCAP = ApnTypes.XCAP;
/**
* APN type for ENTERPRISE.
* @hide
*/
public static final int TYPE_ENTERPRISE = TYPE_XCAP << 1;
/** @hide */
@IntDef(flag = true, prefix = {"TYPE_"}, value = {
TYPE_DEFAULT,
TYPE_MMS,
TYPE_SUPL,
TYPE_DUN,
TYPE_HIPRI,
TYPE_FOTA,
TYPE_IMS,
TYPE_CBS,
TYPE_IA,
TYPE_EMERGENCY,
TYPE_MCX,
TYPE_XCAP,
TYPE_ENTERPRISE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ApnType {
}
// Possible values for authentication types. // Possible values for authentication types.
/** No authentication type. */ /** No authentication type. */
@@ -151,6 +174,7 @@ public class ApnSetting implements Parcelable {
TYPE_MMS_STRING, TYPE_MMS_STRING,
TYPE_SUPL_STRING, TYPE_SUPL_STRING,
TYPE_XCAP_STRING, TYPE_XCAP_STRING,
TYPE_ENTERPRISE_STRING,
}, prefix = "TYPE_", suffix = "_STRING") }, prefix = "TYPE_", suffix = "_STRING")
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface ApnTypeString {} public @interface ApnTypeString {}
@@ -291,6 +315,12 @@ public class ApnSetting implements Parcelable {
@SystemApi @SystemApi
public static final String TYPE_XCAP_STRING = "xcap"; public static final String TYPE_XCAP_STRING = "xcap";
/**
* APN type for ENTERPRISE traffic.
* @hide
*/
public static final String TYPE_ENTERPRISE_STRING = "enterprise";
/** @hide */ /** @hide */
@IntDef(prefix = { "AUTH_TYPE_" }, value = { @IntDef(prefix = { "AUTH_TYPE_" }, value = {
@@ -370,6 +400,7 @@ public class ApnSetting implements Parcelable {
APN_TYPE_STRING_MAP.put(TYPE_EMERGENCY_STRING, TYPE_EMERGENCY); APN_TYPE_STRING_MAP.put(TYPE_EMERGENCY_STRING, TYPE_EMERGENCY);
APN_TYPE_STRING_MAP.put(TYPE_MCX_STRING, TYPE_MCX); APN_TYPE_STRING_MAP.put(TYPE_MCX_STRING, TYPE_MCX);
APN_TYPE_STRING_MAP.put(TYPE_XCAP_STRING, TYPE_XCAP); APN_TYPE_STRING_MAP.put(TYPE_XCAP_STRING, TYPE_XCAP);
APN_TYPE_STRING_MAP.put(TYPE_ENTERPRISE_STRING, TYPE_ENTERPRISE);
APN_TYPE_INT_MAP = new ArrayMap<>(); APN_TYPE_INT_MAP = new ArrayMap<>();
APN_TYPE_INT_MAP.put(TYPE_DEFAULT, TYPE_DEFAULT_STRING); APN_TYPE_INT_MAP.put(TYPE_DEFAULT, TYPE_DEFAULT_STRING);
@@ -384,6 +415,7 @@ public class ApnSetting implements Parcelable {
APN_TYPE_INT_MAP.put(TYPE_EMERGENCY, TYPE_EMERGENCY_STRING); APN_TYPE_INT_MAP.put(TYPE_EMERGENCY, TYPE_EMERGENCY_STRING);
APN_TYPE_INT_MAP.put(TYPE_MCX, TYPE_MCX_STRING); APN_TYPE_INT_MAP.put(TYPE_MCX, TYPE_MCX_STRING);
APN_TYPE_INT_MAP.put(TYPE_XCAP, TYPE_XCAP_STRING); APN_TYPE_INT_MAP.put(TYPE_XCAP, TYPE_XCAP_STRING);
APN_TYPE_INT_MAP.put(TYPE_ENTERPRISE, TYPE_ENTERPRISE_STRING);
PROTOCOL_STRING_MAP = new ArrayMap<>(); PROTOCOL_STRING_MAP = new ArrayMap<>();
PROTOCOL_STRING_MAP.put("IP", PROTOCOL_IP); PROTOCOL_STRING_MAP.put("IP", PROTOCOL_IP);
@@ -1490,7 +1522,7 @@ public class ApnSetting implements Parcelable {
* @hide * @hide
*/ */
@SystemApi @SystemApi
public static @NonNull @ApnTypeString String getApnTypeString(@Annotation.ApnType int apnType) { public static @NonNull @ApnTypeString String getApnTypeString(@ApnType int apnType) {
if (apnType == TYPE_ALL) { if (apnType == TYPE_ALL) {
return "*"; return "*";
} }
@@ -1503,7 +1535,7 @@ public class ApnSetting implements Parcelable {
* when provided with an invalid int for compatibility purposes. * when provided with an invalid int for compatibility purposes.
* @hide * @hide
*/ */
public static @NonNull String getApnTypeStringInternal(@Annotation.ApnType int apnType) { public static @NonNull String getApnTypeStringInternal(@ApnType int apnType) {
String result = getApnTypeString(apnType); String result = getApnTypeString(apnType);
return TextUtils.isEmpty(result) ? "Unknown" : result; return TextUtils.isEmpty(result) ? "Unknown" : result;
} }
@@ -1517,7 +1549,7 @@ public class ApnSetting implements Parcelable {
* @hide * @hide
*/ */
@SystemApi @SystemApi
public static @Annotation.ApnType int getApnTypeInt(@NonNull @ApnTypeString String apnType) { public static @ApnType int getApnTypeInt(@NonNull @ApnTypeString String apnType) {
return APN_TYPE_STRING_MAP.getOrDefault(apnType.toLowerCase(), 0); return APN_TYPE_STRING_MAP.getOrDefault(apnType.toLowerCase(), 0);
} }
@@ -2162,7 +2194,7 @@ public class ApnSetting implements Parcelable {
public ApnSetting build() { public ApnSetting build() {
if ((mApnTypeBitmask & (TYPE_DEFAULT | TYPE_MMS | TYPE_SUPL | TYPE_DUN | TYPE_HIPRI if ((mApnTypeBitmask & (TYPE_DEFAULT | TYPE_MMS | TYPE_SUPL | TYPE_DUN | TYPE_HIPRI
| TYPE_FOTA | TYPE_IMS | TYPE_CBS | TYPE_IA | TYPE_EMERGENCY | TYPE_MCX | TYPE_FOTA | TYPE_IMS | TYPE_CBS | TYPE_IA | TYPE_EMERGENCY | TYPE_MCX
| TYPE_XCAP)) == 0 | TYPE_XCAP | TYPE_ENTERPRISE)) == 0
|| TextUtils.isEmpty(mApnName) || TextUtils.isEmpty(mEntryName)) { || TextUtils.isEmpty(mApnName) || TextUtils.isEmpty(mEntryName)) {
return null; return null;
} }

View File

@@ -138,6 +138,7 @@ public final class DataCallResponse implements Parcelable {
private final Qos mDefaultQos; private final Qos mDefaultQos;
private final List<QosBearerSession> mQosBearerSessions; private final List<QosBearerSession> mQosBearerSessions;
private final SliceInfo mSliceInfo; private final SliceInfo mSliceInfo;
private final List<TrafficDescriptor> mTrafficDescriptors;
/** /**
* @param cause Data call fail cause. {@link DataFailCause#NONE} indicates no error. * @param cause Data call fail cause. {@link DataFailCause#NONE} indicates no error.
@@ -189,6 +190,7 @@ public final class DataCallResponse implements Parcelable {
mDefaultQos = null; mDefaultQos = null;
mQosBearerSessions = new ArrayList<>(); mQosBearerSessions = new ArrayList<>();
mSliceInfo = null; mSliceInfo = null;
mTrafficDescriptors = new ArrayList<>();
} }
private DataCallResponse(@DataFailureCause int cause, long suggestedRetryTime, int id, private DataCallResponse(@DataFailureCause int cause, long suggestedRetryTime, int id,
@@ -198,7 +200,7 @@ public final class DataCallResponse implements Parcelable {
@Nullable List<InetAddress> pcscfAddresses, int mtu, int mtuV4, int mtuV6, @Nullable List<InetAddress> pcscfAddresses, int mtu, int mtuV4, int mtuV6,
@HandoverFailureMode int handoverFailureMode, int pduSessionId, @HandoverFailureMode int handoverFailureMode, int pduSessionId,
@Nullable Qos defaultQos, @Nullable List<QosBearerSession> qosBearerSessions, @Nullable Qos defaultQos, @Nullable List<QosBearerSession> qosBearerSessions,
@Nullable SliceInfo sliceInfo) { @Nullable SliceInfo sliceInfo, @Nullable List<TrafficDescriptor> trafficDescriptors) {
mCause = cause; mCause = cause;
mSuggestedRetryTime = suggestedRetryTime; mSuggestedRetryTime = suggestedRetryTime;
mId = id; mId = id;
@@ -219,8 +221,11 @@ public final class DataCallResponse implements Parcelable {
mHandoverFailureMode = handoverFailureMode; mHandoverFailureMode = handoverFailureMode;
mPduSessionId = pduSessionId; mPduSessionId = pduSessionId;
mDefaultQos = defaultQos; mDefaultQos = defaultQos;
mQosBearerSessions = qosBearerSessions; mQosBearerSessions = (qosBearerSessions == null)
? new ArrayList<>() : new ArrayList<>(qosBearerSessions);
mSliceInfo = sliceInfo; mSliceInfo = sliceInfo;
mTrafficDescriptors = (trafficDescriptors == null)
? new ArrayList<>() : new ArrayList<>(trafficDescriptors);
} }
/** @hide */ /** @hide */
@@ -249,6 +254,8 @@ public final class DataCallResponse implements Parcelable {
mQosBearerSessions = new ArrayList<>(); mQosBearerSessions = new ArrayList<>();
source.readList(mQosBearerSessions, QosBearerSession.class.getClassLoader()); source.readList(mQosBearerSessions, QosBearerSession.class.getClassLoader());
mSliceInfo = source.readParcelable(SliceInfo.class.getClassLoader()); mSliceInfo = source.readParcelable(SliceInfo.class.getClassLoader());
mTrafficDescriptors = new ArrayList<>();
source.readList(mTrafficDescriptors, TrafficDescriptor.class.getClassLoader());
} }
/** /**
@@ -381,7 +388,6 @@ public final class DataCallResponse implements Parcelable {
* *
* @hide * @hide
*/ */
@Nullable @Nullable
public Qos getDefaultQos() { public Qos getDefaultQos() {
return mDefaultQos; return mDefaultQos;
@@ -406,6 +412,14 @@ public final class DataCallResponse implements Parcelable {
return mSliceInfo; return mSliceInfo;
} }
/**
* @return The traffic descriptors related to this data connection.
*/
@NonNull
public List<TrafficDescriptor> getTrafficDescriptors() {
return mTrafficDescriptors;
}
@NonNull @NonNull
@Override @Override
public String toString() { public String toString() {
@@ -429,6 +443,7 @@ public final class DataCallResponse implements Parcelable {
.append(" defaultQos=").append(mDefaultQos) .append(" defaultQos=").append(mDefaultQos)
.append(" qosBearerSessions=").append(mQosBearerSessions) .append(" qosBearerSessions=").append(mQosBearerSessions)
.append(" sliceInfo=").append(mSliceInfo) .append(" sliceInfo=").append(mSliceInfo)
.append(" trafficDescriptors=").append(mTrafficDescriptors)
.append("}"); .append("}");
return sb.toString(); return sb.toString();
} }
@@ -443,15 +458,22 @@ public final class DataCallResponse implements Parcelable {
DataCallResponse other = (DataCallResponse) o; DataCallResponse other = (DataCallResponse) o;
final boolean isQosSame = (mDefaultQos == null || other.mDefaultQos == null) ? final boolean isQosSame = (mDefaultQos == null || other.mDefaultQos == null)
mDefaultQos == other.mDefaultQos : ? mDefaultQos == other.mDefaultQos
mDefaultQos.equals(other.mDefaultQos); : mDefaultQos.equals(other.mDefaultQos);
final boolean isQosBearerSessionsSame = (mQosBearerSessions == null || mQosBearerSessions == null) ? final boolean isQosBearerSessionsSame =
mQosBearerSessions == other.mQosBearerSessions : (mQosBearerSessions == null || other.mQosBearerSessions == null)
mQosBearerSessions.size() == other.mQosBearerSessions.size() ? mQosBearerSessions == other.mQosBearerSessions
: mQosBearerSessions.size() == other.mQosBearerSessions.size()
&& mQosBearerSessions.containsAll(other.mQosBearerSessions); && mQosBearerSessions.containsAll(other.mQosBearerSessions);
final boolean isTrafficDescriptorsSame =
(mTrafficDescriptors == null || other.mTrafficDescriptors == null)
? mTrafficDescriptors == other.mTrafficDescriptors
: mTrafficDescriptors.size() == other.mTrafficDescriptors.size()
&& mTrafficDescriptors.containsAll(other.mTrafficDescriptors);
return mCause == other.mCause return mCause == other.mCause
&& mSuggestedRetryTime == other.mSuggestedRetryTime && mSuggestedRetryTime == other.mSuggestedRetryTime
&& mId == other.mId && mId == other.mId
@@ -473,7 +495,8 @@ public final class DataCallResponse implements Parcelable {
&& mPduSessionId == other.mPduSessionId && mPduSessionId == other.mPduSessionId
&& isQosSame && isQosSame
&& isQosBearerSessionsSame && isQosBearerSessionsSame
&& Objects.equals(mSliceInfo, other.mSliceInfo); && Objects.equals(mSliceInfo, other.mSliceInfo)
&& isTrafficDescriptorsSame;
} }
@Override @Override
@@ -481,7 +504,7 @@ public final class DataCallResponse implements Parcelable {
return Objects.hash(mCause, mSuggestedRetryTime, mId, mLinkStatus, mProtocolType, return Objects.hash(mCause, mSuggestedRetryTime, mId, mLinkStatus, mProtocolType,
mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mPcscfAddresses, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mPcscfAddresses,
mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId, mDefaultQos, mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId, mDefaultQos,
mQosBearerSessions, mSliceInfo); mQosBearerSessions, mSliceInfo, mTrafficDescriptors);
} }
@Override @Override
@@ -517,6 +540,7 @@ public final class DataCallResponse implements Parcelable {
} }
dest.writeList(mQosBearerSessions); dest.writeList(mQosBearerSessions);
dest.writeParcelable(mSliceInfo, flags); dest.writeParcelable(mSliceInfo, flags);
dest.writeList(mTrafficDescriptors);
} }
public static final @android.annotation.NonNull Parcelable.Creator<DataCallResponse> CREATOR = public static final @android.annotation.NonNull Parcelable.Creator<DataCallResponse> CREATOR =
@@ -602,6 +626,8 @@ public final class DataCallResponse implements Parcelable {
private SliceInfo mSliceInfo; private SliceInfo mSliceInfo;
private List<TrafficDescriptor> mTrafficDescriptors = new ArrayList<>();
/** /**
* Default constructor for Builder. * Default constructor for Builder.
*/ */
@@ -840,6 +866,24 @@ public final class DataCallResponse implements Parcelable {
return this; return this;
} }
/**
* The traffic descriptors for this data connection, as defined in 3GPP TS 24.526
* Section 5.2. They are used for URSP traffic matching as described in 3GPP TS 24.526
* Section 4.2.2. They includes an optional DNN, which, if present, must be used for traffic
* matching; it does not specify the end point to be used for the data call. The end point
* is specified by {@link DataProfile}, which must be used as the end point if one is not
* specified through URSP rules.
*
* @param trafficDescriptors the traffic descriptors for the data call.
*
* @return The same instance of the builder.
*/
public @NonNull Builder setTrafficDescriptors(
@NonNull List<TrafficDescriptor> trafficDescriptors) {
mTrafficDescriptors = trafficDescriptors;
return this;
}
/** /**
* Build the DataCallResponse. * Build the DataCallResponse.
* *
@@ -849,7 +893,7 @@ public final class DataCallResponse implements Parcelable {
return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus, return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus,
mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses,
mPcscfAddresses, mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId, mPcscfAddresses, mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId,
mDefaultQos, mQosBearerSessions, mSliceInfo); mDefaultQos, mQosBearerSessions, mSliceInfo, mTrafficDescriptors);
} }
} }
} }

View File

@@ -200,6 +200,17 @@ public abstract class DataService extends Service {
* handover is occurring from EPDG to 5G. If the slice passed is rejected, then * handover is occurring from EPDG to 5G. If the slice passed is rejected, then
* {@link DataCallResponse#getCause()} is * {@link DataCallResponse#getCause()} is
* {@link android.telephony.DataFailCause#SLICE_REJECTED}. * {@link android.telephony.DataFailCause#SLICE_REJECTED}.
* @param trafficDescriptor {@link TrafficDescriptor} for which data connection needs to be
* established. It is used for URSP traffic matching as described in 3GPP TS 24.526
* Section 4.2.2. It includes an optional DNN which, if present, must be used for
* traffic matching; it does not specify the end point to be used for the data call.
* @param matchAllRuleAllowed Indicates if using default match-all URSP rule for this
* request is allowed. If false, this request must not use the match-all URSP rule
* and if a non-match-all rule is not found (or if URSP rules are not available) then
* {@link DataCallResponse#getCause()} is
* {@link android.telephony.DataFailCause#MATCH_ALL_RULE_NOT_ALLOWED}. This is needed
* as some requests need to have a hard failure if the intention cannot be met,
* for example, a zero-rating slice.
* @param callback The result callback for this request. * @param callback The result callback for this request.
*/ */
public void setupDataCall(int accessNetworkType, @NonNull DataProfile dataProfile, public void setupDataCall(int accessNetworkType, @NonNull DataProfile dataProfile,
@@ -207,6 +218,7 @@ public abstract class DataService extends Service {
@SetupDataReason int reason, @SetupDataReason int reason,
@Nullable LinkProperties linkProperties, @Nullable LinkProperties linkProperties,
@IntRange(from = 0, to = 15) int pduSessionId, @Nullable SliceInfo sliceInfo, @IntRange(from = 0, to = 15) int pduSessionId, @Nullable SliceInfo sliceInfo,
@Nullable TrafficDescriptor trafficDescriptor, boolean matchAllRuleAllowed,
@NonNull DataServiceCallback callback) { @NonNull DataServiceCallback callback) {
/* Call the old version since the new version isn't supported */ /* Call the old version since the new version isn't supported */
setupDataCall(accessNetworkType, dataProfile, isRoaming, allowRoaming, reason, setupDataCall(accessNetworkType, dataProfile, isRoaming, allowRoaming, reason,
@@ -403,10 +415,13 @@ public abstract class DataService extends Service {
public final LinkProperties linkProperties; public final LinkProperties linkProperties;
public final int pduSessionId; public final int pduSessionId;
public final SliceInfo sliceInfo; public final SliceInfo sliceInfo;
public final TrafficDescriptor trafficDescriptor;
public final boolean matchAllRuleAllowed;
public final IDataServiceCallback callback; public final IDataServiceCallback callback;
SetupDataCallRequest(int accessNetworkType, DataProfile dataProfile, boolean isRoaming, SetupDataCallRequest(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
boolean allowRoaming, int reason, LinkProperties linkProperties, boolean allowRoaming, int reason, LinkProperties linkProperties, int pduSessionId,
int pduSessionId, SliceInfo sliceInfo, IDataServiceCallback callback) { SliceInfo sliceInfo, TrafficDescriptor trafficDescriptor,
boolean matchAllRuleAllowed, IDataServiceCallback callback) {
this.accessNetworkType = accessNetworkType; this.accessNetworkType = accessNetworkType;
this.dataProfile = dataProfile; this.dataProfile = dataProfile;
this.isRoaming = isRoaming; this.isRoaming = isRoaming;
@@ -415,6 +430,8 @@ public abstract class DataService extends Service {
this.reason = reason; this.reason = reason;
this.pduSessionId = pduSessionId; this.pduSessionId = pduSessionId;
this.sliceInfo = sliceInfo; this.sliceInfo = sliceInfo;
this.trafficDescriptor = trafficDescriptor;
this.matchAllRuleAllowed = matchAllRuleAllowed;
this.callback = callback; this.callback = callback;
} }
} }
@@ -525,7 +542,8 @@ public abstract class DataService extends Service {
setupDataCallRequest.dataProfile, setupDataCallRequest.isRoaming, setupDataCallRequest.dataProfile, setupDataCallRequest.isRoaming,
setupDataCallRequest.allowRoaming, setupDataCallRequest.reason, setupDataCallRequest.allowRoaming, setupDataCallRequest.reason,
setupDataCallRequest.linkProperties, setupDataCallRequest.pduSessionId, setupDataCallRequest.linkProperties, setupDataCallRequest.pduSessionId,
setupDataCallRequest.sliceInfo, setupDataCallRequest.sliceInfo, setupDataCallRequest.trafficDescriptor,
setupDataCallRequest.matchAllRuleAllowed,
(setupDataCallRequest.callback != null) (setupDataCallRequest.callback != null)
? new DataServiceCallback(setupDataCallRequest.callback) ? new DataServiceCallback(setupDataCallRequest.callback)
: null); : null);
@@ -690,11 +708,12 @@ public abstract class DataService extends Service {
public void setupDataCall(int slotIndex, int accessNetworkType, DataProfile dataProfile, public void setupDataCall(int slotIndex, int accessNetworkType, DataProfile dataProfile,
boolean isRoaming, boolean allowRoaming, int reason, boolean isRoaming, boolean allowRoaming, int reason,
LinkProperties linkProperties, int pduSessionId, SliceInfo sliceInfo, LinkProperties linkProperties, int pduSessionId, SliceInfo sliceInfo,
TrafficDescriptor trafficDescriptor, boolean matchAllRuleAllowed,
IDataServiceCallback callback) { IDataServiceCallback callback) {
mHandler.obtainMessage(DATA_SERVICE_REQUEST_SETUP_DATA_CALL, slotIndex, 0, mHandler.obtainMessage(DATA_SERVICE_REQUEST_SETUP_DATA_CALL, slotIndex, 0,
new SetupDataCallRequest(accessNetworkType, dataProfile, isRoaming, new SetupDataCallRequest(accessNetworkType, dataProfile, isRoaming,
allowRoaming, reason, linkProperties, pduSessionId, sliceInfo, allowRoaming, reason, linkProperties, pduSessionId, sliceInfo,
callback)) trafficDescriptor, matchAllRuleAllowed, callback))
.sendToTarget(); .sendToTarget();
} }

View File

@@ -20,6 +20,7 @@ import android.net.LinkProperties;
import android.telephony.data.DataProfile; import android.telephony.data.DataProfile;
import android.telephony.data.IDataServiceCallback; import android.telephony.data.IDataServiceCallback;
import android.telephony.data.SliceInfo; import android.telephony.data.SliceInfo;
import android.telephony.data.TrafficDescriptor;
/** /**
* {@hide} * {@hide}
@@ -30,7 +31,9 @@ oneway interface IDataService
void removeDataServiceProvider(int slotId); void removeDataServiceProvider(int slotId);
void setupDataCall(int slotId, int accessNetwork, in DataProfile dataProfile, boolean isRoaming, void setupDataCall(int slotId, int accessNetwork, in DataProfile dataProfile, boolean isRoaming,
boolean allowRoaming, int reason, in LinkProperties linkProperties, boolean allowRoaming, int reason, in LinkProperties linkProperties,
int pduSessionId, in SliceInfo sliceInfo, IDataServiceCallback callback); int pduSessionId, in SliceInfo sliceInfo,
in TrafficDescriptor trafficDescriptor, boolean matchAllRuleAllowed,
IDataServiceCallback callback);
void deactivateDataCall(int slotId, int cid, int reason, IDataServiceCallback callback); void deactivateDataCall(int slotId, int cid, int reason, IDataServiceCallback callback);
void setInitialAttachApn(int slotId, in DataProfile dataProfile, boolean isRoaming, void setInitialAttachApn(int slotId, in DataProfile dataProfile, boolean isRoaming,
IDataServiceCallback callback); IDataServiceCallback callback);

View File

@@ -0,0 +1,20 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @hide */
package android.telephony.data;
parcelable TrafficDescriptor;

View File

@@ -0,0 +1,111 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.telephony.data;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Objects;
/**
* A traffic descriptor, as defined in 3GPP TS 24.526 Section 5.2. It is used for URSP traffic
* matching as described in 3GPP TS 24.526 Section 4.2.2. It includes an optional DNN, which,
* if present, must be used for traffic matching; it does not specify the end point to be used for
* the data call.
* @hide
*/
@SystemApi
public final class TrafficDescriptor implements Parcelable {
private final String mDnn;
private final String mOsAppId;
private TrafficDescriptor(@NonNull Parcel in) {
mDnn = in.readString();
mOsAppId = in.readString();
}
/**
* Create a traffic descriptor, as defined in 3GPP TS 24.526 Section 5.2
* @param dnn optional DNN, which must be used for traffic matching, if present
* @param osAppId OsId + osAppId of the traffic descriptor
*/
public TrafficDescriptor(@Nullable String dnn, @Nullable String osAppId) {
mDnn = dnn;
mOsAppId = osAppId;
}
/**
* DNN stands for Data Network Name and represents an APN as defined in 3GPP TS 23.003.
* @return the DNN of this traffic descriptor.
*/
public @Nullable String getDnn() {
return mDnn;
}
/**
* OsAppId represents the OsId + OsAppId as defined in 3GPP TS 24.526 Section 5.2.
* @return the OS App ID of this traffic descriptor.
*/
public @Nullable String getOsAppId() {
return mOsAppId;
}
@Override
public int describeContents() {
return 0;
}
@NonNull @Override
public String toString() {
return "TrafficDescriptor={mDnn=" + mDnn + ", mOsAppId=" + mOsAppId + "}";
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeString(mDnn);
dest.writeString(mOsAppId);
}
public static final @NonNull Parcelable.Creator<TrafficDescriptor> CREATOR =
new Parcelable.Creator<TrafficDescriptor>() {
@Override
public @NonNull TrafficDescriptor createFromParcel(@NonNull Parcel source) {
return new TrafficDescriptor(source);
}
@Override
public @NonNull TrafficDescriptor[] newArray(int size) {
return new TrafficDescriptor[size];
}
};
@Override
public boolean equals(@Nullable Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TrafficDescriptor that = (TrafficDescriptor) o;
return Objects.equals(mDnn, that.mDnn) && Objects.equals(mOsAppId, that.mOsAppId);
}
@Override
public int hashCode() {
return Objects.hash(mDnn, mOsAppId);
}
}

View File

@@ -126,6 +126,7 @@ public class PhoneConstants {
* connections.<br/> * connections.<br/>
* APN_TYPE_ALL is a special type to indicate that this APN entry can * APN_TYPE_ALL is a special type to indicate that this APN entry can
* service all data connections. * service all data connections.
* TODO: remove these and use the reference to ApnSetting.TYPE_XXX_STRING instead
*/ */
public static final String APN_TYPE_ALL = ApnSetting.TYPE_ALL_STRING; public static final String APN_TYPE_ALL = ApnSetting.TYPE_ALL_STRING;
/** APN type for default data traffic */ /** APN type for default data traffic */
@@ -153,20 +154,8 @@ public class PhoneConstants {
public static final String APN_TYPE_MCX = ApnSetting.TYPE_MCX_STRING; public static final String APN_TYPE_MCX = ApnSetting.TYPE_MCX_STRING;
/** APN type for XCAP */ /** APN type for XCAP */
public static final String APN_TYPE_XCAP = ApnSetting.TYPE_XCAP_STRING; public static final String APN_TYPE_XCAP = ApnSetting.TYPE_XCAP_STRING;
/** Array of all APN types */ // /** APN type for enterprise */
public static final String[] APN_TYPES = {APN_TYPE_DEFAULT, // public static final String APN_TYPE_ENTERPRISE = ApnSetting.TYPE_ENTERPRISE_STRING;
APN_TYPE_MMS,
APN_TYPE_SUPL,
APN_TYPE_DUN,
APN_TYPE_HIPRI,
APN_TYPE_FOTA,
APN_TYPE_IMS,
APN_TYPE_CBS,
APN_TYPE_IA,
APN_TYPE_EMERGENCY,
APN_TYPE_MCX,
APN_TYPE_XCAP,
};
public static final int RIL_CARD_MAX_APPS = 8; public static final int RIL_CARD_MAX_APPS = 8;

View File

@@ -53,6 +53,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS; import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
import static android.net.NetworkCapabilities.NET_CAPABILITY_EIMS; import static android.net.NetworkCapabilities.NET_CAPABILITY_EIMS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_ENTERPRISE;
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND; import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND;
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOTA; import static android.net.NetworkCapabilities.NET_CAPABILITY_FOTA;
import static android.net.NetworkCapabilities.NET_CAPABILITY_IA; import static android.net.NetworkCapabilities.NET_CAPABILITY_IA;
@@ -2787,7 +2788,8 @@ public class ConnectivityServiceTest {
if (capability == NET_CAPABILITY_CBS || capability == NET_CAPABILITY_DUN || if (capability == NET_CAPABILITY_CBS || capability == NET_CAPABILITY_DUN ||
capability == NET_CAPABILITY_EIMS || capability == NET_CAPABILITY_FOTA || capability == NET_CAPABILITY_EIMS || capability == NET_CAPABILITY_FOTA ||
capability == NET_CAPABILITY_IA || capability == NET_CAPABILITY_IMS || capability == NET_CAPABILITY_IA || capability == NET_CAPABILITY_IMS ||
capability == NET_CAPABILITY_RCS || capability == NET_CAPABILITY_XCAP) { capability == NET_CAPABILITY_RCS || capability == NET_CAPABILITY_XCAP
|| capability == NET_CAPABILITY_ENTERPRISE) {
assertFalse(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); assertFalse(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED));
} else { } else {
assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED));
@@ -2886,6 +2888,7 @@ public class ConnectivityServiceTest {
tryNetworkFactoryRequests(NET_CAPABILITY_IA); tryNetworkFactoryRequests(NET_CAPABILITY_IA);
tryNetworkFactoryRequests(NET_CAPABILITY_RCS); tryNetworkFactoryRequests(NET_CAPABILITY_RCS);
tryNetworkFactoryRequests(NET_CAPABILITY_XCAP); tryNetworkFactoryRequests(NET_CAPABILITY_XCAP);
tryNetworkFactoryRequests(NET_CAPABILITY_ENTERPRISE);
tryNetworkFactoryRequests(NET_CAPABILITY_EIMS); tryNetworkFactoryRequests(NET_CAPABILITY_EIMS);
tryNetworkFactoryRequests(NET_CAPABILITY_NOT_METERED); tryNetworkFactoryRequests(NET_CAPABILITY_NOT_METERED);
tryNetworkFactoryRequests(NET_CAPABILITY_INTERNET); tryNetworkFactoryRequests(NET_CAPABILITY_INTERNET);