diff options
author | Hongbo Zeng <hongbozeng@google.com> | 2021-01-21 17:23:45 +0800 |
---|---|---|
committer | Hongbo Zeng <hongbozeng@google.com> | 2021-02-26 16:15:15 +0800 |
commit | 55487e1e79031983da70c25589cd921e2dfd0d84 (patch) | |
tree | c3f9f59d1ba0ba43beb81a10e8aa81a6af3ae4a6 /radio/1.6 | |
parent | 20a99acbfbe35f142e3a12b615d430eec9cf37b8 (diff) | |
download | platform_hardware_interfaces-55487e1e79031983da70c25589cd921e2dfd0d84.tar.gz platform_hardware_interfaces-55487e1e79031983da70c25589cd921e2dfd0d84.tar.bz2 platform_hardware_interfaces-55487e1e79031983da70c25589cd921e2dfd0d84.zip |
Update HAL 1.6 for 5G Slicing
- add trafficDescriptor and matchAllRuleAllowed to setupDataCall
- add trafficDescriptors to SetupDataCallResult
- create structs TrafficDescriptor and OSAppId base on the
definition in TS 24.526 Section 5.2
- add MATCH_ALL_RULE_NOT_ALLOWED and ALL_MATCHING_RULES_FAILED
as DataCallFailCause
Bug: 178075054
Test: make VtsHalRadioV1_6TargetTest
Change-Id: Ibf6d92d50c8c2c3fce51522677d75bf33127320f
Merged-In: Ibf6d92d50c8c2c3fce51522677d75bf33127320f
Diffstat (limited to 'radio/1.6')
-rw-r--r-- | radio/1.6/IRadio.hal | 15 | ||||
-rw-r--r-- | radio/1.6/types.hal | 71 | ||||
-rw-r--r-- | radio/1.6/vts/functional/radio_hidl_hal_api.cpp | 83 | ||||
-rw-r--r-- | radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h | 1 | ||||
-rw-r--r-- | radio/1.6/vts/functional/radio_response.cpp | 3 |
5 files changed, 170 insertions, 3 deletions
diff --git a/radio/1.6/IRadio.hal b/radio/1.6/IRadio.hal index da81317d3e..aa9297548e 100644 --- a/radio/1.6/IRadio.hal +++ b/radio/1.6/IRadio.hal @@ -123,6 +123,18 @@ interface IRadio extends @1.5::IRadio { * @param sliceInfo SliceInfo to be used for the data connection when a handover occurs from * EPDG to 5G. It is valid only when accessNetwork is AccessNetwork:NGRAN. If the slice * passed from EPDG is rejected, then the data failure cause must be DataCallFailCause:SLICE_REJECTED. + * @param trafficDescriptor TrafficDescriptor for which data connection needs to be + * established. It is used for URSP traffic matching as described in 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. The end + * point is specified by DataProfileInfo.apn; DataProfileInfo.apn must be used as the end + * point if one is not specified through URSP rules. + * @param matchAllRuleAllowed bool to indicate 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) it should return + * failure with cause DataCallFailCause: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. * * Response function is IRadioResponse.setupDataCallResponse_1_6() * @@ -131,7 +143,8 @@ interface IRadio extends @1.5::IRadio { oneway setupDataCall_1_6(int32_t serial, AccessNetwork accessNetwork, DataProfileInfo dataProfileInfo, bool roamingAllowed, DataRequestReason reason, vec<LinkAddress> addresses, vec<string> dnses, - int32_t pduSessionId, OptionalSliceInfo sliceInfo); + int32_t pduSessionId, OptionalSliceInfo sliceInfo, + OptionalTrafficDescriptor trafficDescriptor, bool matchAllRuleAllowed); /** * Send an SMS message diff --git a/radio/1.6/types.hal b/radio/1.6/types.hal index 238ffb489c..28c9fa87be 100644 --- a/radio/1.6/types.hal +++ b/radio/1.6/types.hal @@ -366,6 +366,13 @@ struct SetupDataCallResult { * AccessNetwork:NGRAN. */ OptionalSliceInfo sliceInfo; + + /** + * TrafficDescriptors for which this data call must be used. It only includes + * the TDs for which a data call has been requested so far; it is not an + * exhaustive list. + */ + vec<TrafficDescriptor> trafficDescriptors; }; /** @@ -898,6 +905,70 @@ enum DataCallFailCause : @1.4::DataCallFailCause { * Data call fail due to the slice not being allowed for the data call. */ SLICE_REJECTED = 0x8CC, + + /** + * No matching rule available for the request, and match-all rule is not allowed for it. + */ + MATCH_ALL_RULE_NOT_ALLOWED = 0x8CD, + + /** + * If connection failed for all matching URSP rules + */ + ALL_MATCHING_RULES_FAILED = 0x8CE, +}; + +/** + * This safe_union represents an optional DNN. DNN stands for Data Network Name + * and represents an APN as defined in 3GPP TS 23.003. + */ +safe_union OptionalDNN { + Monostate noinit; + string value; +}; + +/** + * This safe_union represents an optional OSAppId. + */ +safe_union OptionalOSAppId { + Monostate noinit; + OSAppId value; +}; + +/** + * This safe_union represents an optional TrafficDescriptor. + */ +safe_union OptionalTrafficDescriptor { + Monostate noinit; + TrafficDescriptor value; +}; + +/** + * This struct represents a traffic descriptor. A valid struct must have at least + * one of the optional values present. This is based on the definition of traffic + * descriptor in TS 24.526 Section 5.2. + */ +struct TrafficDescriptor { + /** + * DNN stands for Data Network Name and represents an APN as defined in + * 3GPP TS 23.003. + */ + OptionalDNN dnn; + /** + * Indicates the OSId + OSAppId (used as category in Android). + */ + OptionalOSAppId osAppId; +}; + +/** + * This struct represents the OSId + OSAppId as defined in TS 24.526 Section 5.2 + */ +struct OSAppId { + /** + * Byte array representing OSId + OSAppId. The minimum length of the array is + * 18 and maximum length is 272 (16 bytes for OSId + 1 byte for OSAppId length + * + up to 255 bytes for OSAppId). + */ + vec<uint8_t> osAppId; }; /** diff --git a/radio/1.6/vts/functional/radio_hidl_hal_api.cpp b/radio/1.6/vts/functional/radio_hidl_hal_api.cpp index 1b476a49fe..a460c727a8 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_api.cpp +++ b/radio/1.6/vts/functional/radio_hidl_hal_api.cpp @@ -59,9 +59,88 @@ TEST_P(RadioHidlTest_v1_6, setupDataCall_1_6) { ::android::hardware::radio::V1_6::OptionalSliceInfo optionalSliceInfo; memset(&optionalSliceInfo, 0, sizeof(optionalSliceInfo)); + ::android::hardware::radio::V1_6::OptionalTrafficDescriptor optionalTrafficDescriptor; + memset(&optionalTrafficDescriptor, 0, sizeof(optionalTrafficDescriptor)); + + bool matchAllRuleAllowed = true; + + Return<void> res = + radio_v1_6->setupDataCall_1_6(serial, accessNetwork, dataProfileInfo, roamingAllowed, + reason, addresses, dnses, -1, optionalSliceInfo, + optionalTrafficDescriptor, matchAllRuleAllowed); + ASSERT_OK(res); + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); + if (cardStatus.base.base.base.cardState == CardState::ABSENT) { + ASSERT_TRUE(CheckAnyOfErrors( + radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::SIM_ABSENT, + ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, + ::android::hardware::radio::V1_6::RadioError::OP_NOT_ALLOWED_BEFORE_REG_TO_NW})); + } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) { + ASSERT_TRUE(CheckAnyOfErrors( + radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::NONE, + ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, + ::android::hardware::radio::V1_6::RadioError::OP_NOT_ALLOWED_BEFORE_REG_TO_NW})); + } +} + +TEST_P(RadioHidlTest_v1_6, setupDataCall_1_6_osAppId) { + serial = GetRandomSerialNumber(); + + ::android::hardware::radio::V1_5::AccessNetwork accessNetwork = + ::android::hardware::radio::V1_5::AccessNetwork::EUTRAN; + + android::hardware::radio::V1_5::DataProfileInfo dataProfileInfo; + memset(&dataProfileInfo, 0, sizeof(dataProfileInfo)); + dataProfileInfo.profileId = DataProfileId::DEFAULT; + dataProfileInfo.apn = hidl_string("internet"); + dataProfileInfo.protocol = PdpProtocolType::IP; + dataProfileInfo.roamingProtocol = PdpProtocolType::IP; + dataProfileInfo.authType = ApnAuthType::NO_PAP_NO_CHAP; + dataProfileInfo.user = hidl_string("username"); + dataProfileInfo.password = hidl_string("password"); + dataProfileInfo.type = DataProfileInfoType::THREE_GPP; + dataProfileInfo.maxConnsTime = 300; + dataProfileInfo.maxConns = 20; + dataProfileInfo.waitTime = 0; + dataProfileInfo.enabled = true; + dataProfileInfo.supportedApnTypesBitmap = 320; + dataProfileInfo.bearerBitmap = 161543; + dataProfileInfo.mtuV4 = 0; + dataProfileInfo.mtuV6 = 0; + dataProfileInfo.preferred = true; + dataProfileInfo.persistent = false; + + bool roamingAllowed = false; + + std::vector<::android::hardware::radio::V1_5::LinkAddress> addresses = {}; + std::vector<hidl_string> dnses = {}; + + ::android::hardware::radio::V1_2::DataRequestReason reason = + ::android::hardware::radio::V1_2::DataRequestReason::NORMAL; + + ::android::hardware::radio::V1_6::OptionalSliceInfo optionalSliceInfo; + memset(&optionalSliceInfo, 0, sizeof(optionalSliceInfo)); + + ::android::hardware::radio::V1_6::OptionalTrafficDescriptor optionalTrafficDescriptor; + memset(&optionalTrafficDescriptor, 0, sizeof(optionalTrafficDescriptor)); + + ::android::hardware::radio::V1_6::TrafficDescriptor trafficDescriptor; + ::android::hardware::radio::V1_6::OSAppId osAppId; + osAppId.osAppId = 1; + trafficDescriptor.osAppId.value(osAppId); + optionalTrafficDescriptor.value(trafficDescriptor); + + bool matchAllRuleAllowed = true; + Return<void> res = radio_v1_6->setupDataCall_1_6(serial, accessNetwork, dataProfileInfo, roamingAllowed, - reason, addresses, dnses, -1, optionalSliceInfo); + reason, addresses, dnses, -1, optionalSliceInfo, + optionalTrafficDescriptor, matchAllRuleAllowed); ASSERT_OK(res); EXPECT_EQ(std::cv_status::no_timeout, wait()); @@ -79,6 +158,8 @@ TEST_P(RadioHidlTest_v1_6, setupDataCall_1_6) { {::android::hardware::radio::V1_6::RadioError::NONE, ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, ::android::hardware::radio::V1_6::RadioError::OP_NOT_ALLOWED_BEFORE_REG_TO_NW})); + EXPECT_EQ(optionalTrafficDescriptor.value().osAppId.value().osAppId, + radioRsp_v1_6->setupDataCallResult.trafficDescriptors[0].osAppId.value().osAppId); } } diff --git a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h index b94cd96b7d..7f64ba2f10 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h +++ b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h @@ -89,6 +89,7 @@ class RadioResponse_v1_6 : public ::android::hardware::radio::V1_6::IRadioRespon // Data ::android::hardware::radio::V1_4::DataRegStateResult dataRegResp; + ::android::hardware::radio::V1_6::SetupDataCallResult setupDataCallResult; // SimLock status ::android::hardware::radio::V1_4::CarrierRestrictionsWithPriority carrierRestrictionsResp; diff --git a/radio/1.6/vts/functional/radio_response.cpp b/radio/1.6/vts/functional/radio_response.cpp index feb9e03ee6..3c611f9f54 100644 --- a/radio/1.6/vts/functional/radio_response.cpp +++ b/radio/1.6/vts/functional/radio_response.cpp @@ -1053,8 +1053,9 @@ Return<void> RadioResponse_v1_6::setRadioPowerResponse_1_6( Return<void> RadioResponse_v1_6::setupDataCallResponse_1_6( const ::android::hardware::radio::V1_6::RadioResponseInfo& info, - const android::hardware::radio::V1_6::SetupDataCallResult& /* dcResponse */) { + const android::hardware::radio::V1_6::SetupDataCallResult& dcResponse) { rspInfo = info; + setupDataCallResult = dcResponse; parent_v1_6.notify(info.serial); return Void(); } |