/*
 * Copyright (C) 2020 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.hardware.radio@1.6;

import @1.0::CdmaSignalStrength;
import @1.0::EvdoSignalStrength;
import @1.0::GsmSignalStrength;
import @1.0::LteSignalStrength;
import @1.0::RadioError;
import @1.0::RadioResponseType;
import @1.0::RegState;
import @1.1::EutranBands;
import @1.1::GeranBands;
import @1.1::ScanStatus;
import @1.1::UtranBands;
import @1.1::ImsiEncryptionInfo;
import @1.2::Call;
import @1.2::CellInfoCdma;
import @1.2::CellConnectionStatus;
import @1.2::TdscdmaSignalStrength;
import @1.2::WcdmaSignalStrength;
import @1.4::DataCallFailCause;
import @1.4::DataConnActiveStatus;
import @1.4::NrSignalStrength;
import @1.4::PdpProtocolType;
import @1.4::RadioTechnology;
import @1.5::CellIdentity;
import @1.5::CellIdentityLte;
import @1.5::CellIdentityNr;
import @1.5::CellInfoGsm;
import @1.5::CellInfoWcdma;
import @1.5::CellInfoTdscdma;
import @1.5::LinkAddress;
import @1.5::NgranBands;
import @1.5::RegStateResult.AccessTechnologySpecificInfo.Cdma2000RegistrationInfo;
import @1.5::RegStateResult.AccessTechnologySpecificInfo.EutranRegistrationInfo;
import @1.5::RegistrationFailCause;
import @1.5::SetupDataCallResult;

import android.hidl.safe_union@1.0::Monostate;

struct QosBandwidth {
    /** Maximum bit rate possible on the bearer */
    int32_t maxBitrateKbps;
    /** Minimum bit rate that is guaranteed to be provided by the network */
    int32_t guaranteedBitrateKbps;
};

/** LTE/EPS Quality of Service parameters as per 3gpp spec 24.301 sec 9.9.4.3. */
struct EpsQos {
    /**
     * Quality of Service Class Identifier (QCI), see 3GPP TS 23.203 and 29.212.
     * The allowed values are standard values(1-9, 65-68, 69-70, 75, 79-80, 82-85)
     * defined in the spec and operator specific values in the range 128-254.
     */
    uint16_t qci;
    QosBandwidth downlink;
    QosBandwidth uplink;
};

/** 5G Quality of Service parameters as per 3gpp spec 24.501 sec 9.11.4.12 */
struct NrQos {
    /**
     * 5G QOS Identifier (5QI), see 3GPP TS 24.501 and 23.501.
     * The allowed values are standard values(1-9, 65-68, 69-70, 75, 79-80, 82-85)
     * defined in the spec and operator specific values in the range 128-254.
     */
    uint16_t fiveQi;
    QosBandwidth downlink;
    QosBandwidth uplink;
    /**
     * QOS flow identifier of the QOS flow description in the
     * range of QosFlowIdRange::MIN to QosFlowIdRange::MAX
     */
    uint8_t qfi;
    uint16_t averagingWindowMs;
};

/** Allowed values for 5G QOS flow identifier */
enum QosFlowIdRange : uint8_t {
    MIN = 1,
    MAX = 63
};

/** EPS or NR QOS parameters */
safe_union Qos {
    Monostate noinit;
    EpsQos eps;
    NrQos nr;
};

/**
 * Next header protocol numbers defined by IANA, RFC 5237
 */
enum QosProtocol : int32_t {
    /** No protocol specified */
    UNSPECIFIED = -1,
    /** Transmission Control Protocol */
    TCP = 6,
    /** User Datagram Protocol */
    UDP = 17,
    /** Encapsulating Security Payload Protocol */
    ESP = 50,
    /** Authentication Header */
    AH = 51,
};

enum QosFilterDirection : int32_t {
    DOWNLINK = 0,
    UPLINK = 1,
    BIDIRECTIONAL = 2,
};

/** Allowed port numbers */
enum QosPortRange : int32_t {
    MIN = 20,
    MAX = 65535
};

enum RadioError : @1.0::RadioError {
    /** 1X voice and SMS are not allowed simulteneously. */
    SIMULTANEOUS_SMS_AND_CALL_NOT_ALLOWED = 67,

    /** Access is barred. */
    ACCESS_BARRED = 68,

    /**
     * SMS is blocked due to call control, e.g., resource unavailable
     * in the SMR entity.
     */
    BLOCKED_DUE_TO_CALL = 69,

    /**
     * Returned from setRadioPowerResponse when detecting RF HW issues. Some RF
     * Front-End(RFFE) components like antenna are considered critical for modem
     * to provide telephony service. This RadioError is used when modem detect
     * such RFFE problem.
     */
    RF_HARDWARE_ISSUE = 70,

    /**
     * Returned from setRadioPowerResponse when detecting no RF calibration
     * issue. Unlike RF_HARDWARE_ISSUE, this is a SW problem and no HW repair is
     * needed.
     */
    NO_RF_CALIBRATION_INFO = 71,
};

/**
 * Overwritten from @1.0::RadioResponseInfo in order to update the RadioError to 1.6 version.
 */
struct RadioResponseInfo {
    RadioResponseType type;               // Response type
    int32_t serial;                       // Serial number of the request
    RadioError error;                     // Response error
};

/**
 * Defines range of ports. start and end are the first and last port numbers
 * (inclusive) in the range. Both start and end are in QosPortRange.MIN to
 * QosPortRange.MAX range. A single port shall be represented by the same
 * start and end value.
 */
struct PortRange {
    int32_t start;
    int32_t end;
};

/** Port is optional, contains either single port or range of ports */
safe_union MaybePort {
    Monostate noinit;
    PortRange range;
};

/** See 3gpp 24.008 10.5.6.12 and 3gpp 24.501 9.11.4.13 */
struct QosFilter {
    /**
     * Local and remote IP addresses, typically one IPv4 or one IPv6
     * or one of each. Addresses could be with optional "/" prefix
     * length, e.g.,"192.0.1.3" or "192.0.1.11/16 2001:db8::1/64".
     * If the prefix length is absent the addresses are assumed to be
     * point to point with IPv4 having a prefix length of 32 and
     * IPv6 128.
     */
    vec<string> localAddresses;
    vec<string> remoteAddresses;

    /** Local and remote port/ranges */
    MaybePort localPort;
    MaybePort remotePort;

    /** QoS protocol */
    QosProtocol protocol;

    /** Type of service value or mask as defined in RFC 1349 */
    safe_union TypeOfService {
         Monostate noinit;
         uint8_t value;
    } tos;

    /** IPv6 flow label as defined in RFC 6437 */
    safe_union Ipv6FlowLabel {
         Monostate noinit;
         uint32_t value;
    } flowLabel;

    /** IPSec security parameter index */
    safe_union IpsecSpi {
         Monostate noinit;
         uint32_t value;
    } spi;

    /** Filter direction */
    QosFilterDirection direction;

    /**
     * Specifies the order in which the filter needs to be matched.
     * A lower numerical(positive) value has a higher precedence.
     * Set -1 when unspecified.
     */
    int32_t precedence;
};

/** QOS session associated with a dedicated bearer */
struct QosSession {
    /** Unique ID of the QoS session within the data call */
    int32_t qosSessionId;

    /** QOS attributes */
    Qos qos;

    /** List of QOS filters associated with this session */
    vec<QosFilter> qosFilters;
};

/** The allowed failure modes on an IWLAN handover failure. */
enum HandoverFailureMode : int32_t {
    /**
     * On data handover failure, fallback to the source data transport when the
     * fail cause is due to a hand off preference change.
     */
    LEGACY = 0,

    /** On data handover failure, fallback to the source data transport. */
    DO_FALLBACK = 1,

    /**
     * On data handover failure, retry the handover instead of falling back to
     * the source data transport.
     */
    NO_FALLBACK_RETRY_HANDOVER = 2,

    /**
     * On data handover failure, setup a new data connection by sending a normal
     * request to the underlying data service.
     */
    NO_FALLBACK_RETRY_SETUP_NORMAL = 3
};

/**
 * Overwritten from @1.5::SetupDataCallResult in order to change the suggestedRetryTime
 * to 64-bit value. In the future, this must be extended instead of overwritten.
 * Also added defaultQos, qosSessions, and handoverFailureMode in this version.
 */
struct SetupDataCallResult {
    /** Data call fail cause. DataCallFailCause.NONE if no error. */
    DataCallFailCause cause;

    /**
     * If cause is not DataCallFailCause.NONE, this field indicates the network suggested data
     * retry back-off time in milliseconds. Negative value indicates network does not give any
     * suggestion. 0 indicates retry should be performed immediately. 0x7fffffffffffffff indicates
     * the device should not retry data setup anymore.
     *
     * During this time, no calls to IRadio@1.6::SetupDataCall for this APN will be made unless
     * IRadioIndication@1.6::unthrottleApn is sent with the same APN.
     */
    int64_t suggestedRetryTime;

    /** Context ID, uniquely identifies this data connection. */
    int32_t cid;

    /** Data connection active status. */
    DataConnActiveStatus active;

    /**
     * PDP protocol type. If cause is DataCallFailCause.ONLY_SINGLE_BEARER_ALLOWED, this is the
     * protocol type supported, such as "IP" or "IPV6".
     */
    PdpProtocolType type;

    /** The network interface name. */
    string ifname;

    /**
     * List of link address.
     */
    vec<LinkAddress> addresses;

    /**
     * List of DNS server addresses, e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1". Empty if no dns
     * server addresses returned.
     */
    vec<string> dnses;

    /**
     * List of default gateway addresses, e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1".
     * When empty, the addresses represent point to point connections.
     */
    vec<string> gateways;

    /**
     * List of P-CSCF(Proxy Call State Control Function) addresses via PCO(Protocol Configuration
     * Option), e.g., "2001:db8::1 2001:db8::2 2001:db8::3". Empty if not IMS client.
     */
    vec<string> pcscf;

    /**
     * MTU received from network for IPv4.
     * Value <= 0 means network has either not sent a value or sent an invalid value.
     */
    int32_t mtuV4;

    /**
     * MTU received from network for IPv6.
     * Value <= 0 means network has either not sent a value or sent an invalid value.
     */
    int32_t mtuV6;

    /** Default bearer QoS. Applicable to LTE and NR */
    Qos defaultQos;

    /**
     * Active QOS sessions of the dedicated bearers. Applicable to
     * PDNs that support dedicated bearers.
     */
    vec<QosSession> qosSessions;

    /** Specifies the fallback mode on an IWLAN handover failure. */
    HandoverFailureMode handoverFailureMode;

    /**
     * The allocated pdu session id for this data call.
     * A value of 0 means no pdu session id was attached to this call.
     *
     * Reference: 3GPP TS 24.007 section 11.2.3.1b
     */
    int32_t pduSessionId;

    /**
     * Slice used for this data call. It is valid only when this data call is on
     * AccessNetwork:NGRAN.
     */
    OptionalSliceInfo sliceInfo;
};

/**
 * NR Dual connectivity state
 */
enum NrDualConnectivityState: int32_t {
    /**
     * Enable NR dual connectivity. Enabled state does not mean dual connectivity
     * is active. It means device is allowed to connect to both primary and secondary.
     */
    ENABLE = 1,
    /**
     * Disable NR dual connectivity. Disabled state does not mean secondary cell is released.
     * Modem will release it only if current bearer is released to avoid radio link failure.
     */
    DISABLE = 2,
    /**
     * Disable NR dual connectivity and force secondary cell to be released if dual connectivity
     * was active. This may result in radio link failure.
     */
    DISABLE_IMMEDIATE= 3,
};

/**
 * Overwritten from @1.2::LinkCapacityEstimate to update LinkCapacityEstimate to 1.6 version.
 */
struct LinkCapacityEstimate {

   /**
    * Estimated downlink capacity in kbps. In case of a dual connected network,
    * this includes capacity of both primary and secondary. This bandwidth estimate shall be
    * the estimated maximum sustainable link bandwidth (as would be measured
    * at the Upper PDCP or SNDCP SAP). If the DL Aggregate Maximum Bit Rate is known,
    * this value shall not exceed the DL-AMBR for the Internet PDN connection.
    * This must be filled with -1 if network is not connected.
    */
   uint32_t downlinkCapacityKbps;

   /**
    * Estimated uplink capacity in kbps. In case of a dual connected network,
    * this includes capacity of both primary and secondary. This bandwidth estimate shall be the
    * estimated maximum sustainable link bandwidth (as would be measured at the
    * Upper PDCP or SNDCP SAP). If the UL Aggregate Maximum Bit Rate is known,
    * this value shall not exceed the UL-AMBR for the Internet PDN connection.
    * This must be filled with -1 if network is not connected.
    */
   uint32_t uplinkCapacityKbps;

   /**
    * Estimated downlink capacity of secondary carrier in a dual connected NR mode in kbps.
    * This bandwidth estimate shall be the estimated maximum sustainable link bandwidth
    * (as would be measured at the Upper PDCP or SNDCP SAP). This is valid only
    * in if device is connected to both primary and secodary in dual connected
    * mode. This must be filled with -1 if secondary is not connected.
    */
   uint32_t secondaryDownlinkCapacityKbps;

   /**
    * Estimated uplink capacity secondary carrier in a dual connected NR mode in kbps.
    * This bandwidth estimate shall be the estimated
    * maximum sustainable link bandwidth (as would be measured at the Upper PDCP or SNDCP SAP).
    * This is valid only in if device is connected to both primary and secodary in dual connected
    * mode.This must be filled with -1 if secondary is not connected.
    */
   uint32_t secondaryUplinkCapacityKbps;
};

enum DataThrottlingAction : int32_t {
    /* Clear all existing data throttling. */
    NO_DATA_THROTTLING = 0,

    /**
     * Enact secondary carrier data throttling and remove any existing data
     * throttling on anchor carrier.
     */
    THROTTLE_SECONDARY_CARRIER = 1,

    /**
     * Enact anchor carrier data throttling and disable data on secondary
     * carrier if currently enabled.
     */
    THROTTLE_ANCHOR_CARRIER = 2,

    /**
     * Immediately hold on to current level of throttling.
     */
    HOLD = 3
};

/**
 * Defines the values for VoPS indicator of NR as per 3gpp spec 24.501 sec 9.10.3.5
 */
enum VopsIndicator : uint8_t {
    /** IMS voice over PS session not supported */
    VOPS_NOT_SUPPORTED = 0,
    /** IMS voice over PS session supported over 3GPP access */
    VOPS_OVER_3GPP = 1,
    /** IMS voice over PS session supported over non-3GPP access */
    VOPS_OVER_NON_3GPP = 2,
};

/**
 * Defines the values for emergency service indicator of NR
 * as per 3gpp spec 24.501 sec 9.10.3.5
 */
enum EmcIndicator : uint8_t {
    /** Emergency services not supported */
    EMC_NOT_SUPPORTED = 0,
    /** Emergency services supported in NR connected to 5GCN only */
    EMC_NR_CONNECTED_TO_5GCN = 1,
    /** Emergency services supported in E-UTRA connected to 5GCN only */
    EMC_EUTRA_CONNECTED_TO_5GCN = 2,
    /** Emergency services supported in NR connected to 5GCN and E-UTRA connected to 5GCN */
    EMC_BOTH_NR_EUTRA_CONNECTED_TO_5GCN = 3
};

/**
 * Defines the values for emergency service fallback indicator of NR
 * as per 3gpp spec 24.501 sec 9.10.3.5
 */
enum EmfIndicator : uint8_t {
    /** Emergency services fallback not supported */
    EMF_NOT_SUPPORTED = 0,
    /** Emergency services fallback supported in NR connected to 5GCN only */
    EMF_NR_CONNECTED_TO_5GCN = 1,
    /** Emergency services fallback supported in E-UTRA connected to 5GCN only */
    EMF_EUTRA_CONNECTED_TO_5GCN = 2,
    /**
     * Emergency services fallback supported in NR connected to 5GCN and E-UTRA
     * connected to 5GCN.
     */
    EMF_BOTH_NR_EUTRA_CONNECTED_TO_5GCN = 3
};

/**
 * Type to define the NR specific network capabilities for voice over PS including
 * emergency and normal voice calls.
 */
struct NrVopsInfo {
    /**
     * This indicates if the camped network supports VoNR services, and what kind of services
     * it supports. This information is received from NR network during NR NAS registration
     * procedure through NR REGISTRATION ACCEPT.
     * Refer 3GPP 24.501 EPS 5GS network feature support -> IMS VoPS
     */
    VopsIndicator vopsSupported;

    /**
     * This indicates if the camped network supports VoNR emergency service. This information
     * is received from NR network through two sources:
     * a. During NR NAS registration procedure through NR REGISTRATION ACCEPT.
     *    Refer 3GPP 24.501 EPS 5GS network feature support -> EMC
     * b. In case the device is not registered on the network.
     *    Refer 3GPP 38.331 SIB1 : ims-EmergencySupport
     *    If device is registered on NR, then this field indicates whether the cell
     *    supports IMS emergency bearer services for UEs in limited service mode.
     */
    EmcIndicator emcSupported;

    /**
     * This indicates if the camped network supports VoNR emergency service fallback. This
     * information is received from NR network during NR NAS registration procedure through
     * NR REGISTRATION ACCEPT.
     * Refer 3GPP 24.501 EPS 5GS network feature support -> EMF
     */
    EmfIndicator emfSupported;
};

struct LteSignalStrength {
    @1.0::LteSignalStrength base;

    /**
     * CSI channel quality indicator (CQI) table index. There are multiple CQI tables.
     * The definition of CQI in each table is different.
     *
     * Reference: 3GPP TS 136.213 section 7.2.3.
     *
     * Range [1, 6], INT_MAX means invalid/unreported.
     */
    uint32_t cqiTableIndex;
};

struct NrSignalStrength {
    @1.4::NrSignalStrength base;

    /**
     * CSI channel quality indicator (CQI) table index. There are multiple CQI tables.
     * The definition of CQI in each table is different.
     *
     * Reference: 3GPP TS 138.214 section 5.2.2.1.
     *
     * Range [1, 3], INT_MAX means invalid/unreported.
     */
    uint32_t csiCqiTableIndex;

    /**
     * CSI channel quality indicator (CQI) for all subbands.
     *
     * If the CQI report is for the entire wideband, a single CQI index is provided.
     * If the CQI report is for all subbands, one CQI index is provided for each subband,
     * in ascending order of subband index.
     * If CQI is not available, the CQI report is empty.
     *
     * Reference: 3GPP TS 138.214 section 5.2.2.1.
     *
     * Range [0, 15], INT_MAX means invalid/unreported.
     */
    vec<uint32_t> csiCqiReport;
};

/**
 * Overwritten from @1.4::SignalStrength in order to update LteSignalStrength and NrSignalStrength.
 */
struct SignalStrength {
    /**
     * If GSM measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    GsmSignalStrength gsm;

    /**
     * If CDMA measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    CdmaSignalStrength cdma;

    /**
     * If EvDO measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    EvdoSignalStrength evdo;

    /**
     * If LTE measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    LteSignalStrength lte;

    /**
     * If TD-SCDMA measurements are provided, this structure must contain valid measurements;
     * otherwise all fields should be set to INT_MAX to mark them as invalid.
     */
    TdscdmaSignalStrength tdscdma;

    /**
     * If WCDMA measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    WcdmaSignalStrength wcdma;

    /**
     * If NR 5G measurements are provided, this structure must contain valid measurements; otherwise
     * all fields should be set to INT_MAX to mark them as invalid.
     */
    NrSignalStrength nr;
};

/** Overwritten from @1.5::CellInfoLte in order to update LteSignalStrength. */
struct CellInfoLte {
    CellIdentityLte cellIdentityLte;
    LteSignalStrength signalStrengthLte;
};

/** Overwritten from @1.5::CellInfoNr in order to update NrSignalStrength. */
struct CellInfoNr {
    CellIdentityNr cellIdentityNr;
    NrSignalStrength signalStrengthNr;
};

/** Overwritten from @1.5::CellInfo in order to update LteSignalStrength and NrSignalStrength. */
struct CellInfo {
    /**
     * True if this cell is registered false if not registered.
     */
    bool registered;
    /**
     * Connection status for the cell.
     */
    CellConnectionStatus connectionStatus;

    safe_union CellInfoRatSpecificInfo {
        /**
         * 3gpp CellInfo types.
         */
        CellInfoGsm gsm;
        CellInfoWcdma wcdma;
        CellInfoTdscdma tdscdma;
        CellInfoLte lte;
        CellInfoNr nr;

        /**
         * 3gpp2 CellInfo types;
         */
        CellInfoCdma cdma;
    } ratSpecificInfo;
};

/** Overwritten from @1.5::NetworkScanResult in order to update the CellInfo to 1.6 version. */
struct NetworkScanResult {
    /**
     * The status of the scan.
     */
    ScanStatus status;

    /**
     * The error code of the incremental result.
     */
    RadioError error;

    /**
     * List of network information as CellInfo.
     */
    vec<CellInfo> networkInfos;
};

/**
 * Overwritten from @1.5::RegStateResult to 1.6 to support NrRegistrationInfo
 * version.
 */
struct RegStateResult {
    /**
     * Registration state
     *
     * If the RAT is indicated as a GERAN, UTRAN, or CDMA2000 technology, this value reports
     * registration in the Circuit-switched domain.
     * If the RAT is indicated as an EUTRAN, NGRAN, or another technology that does not support
     * circuit-switched services, this value reports registration in the Packet-switched domain.
     */
    RegState regState;

    /**
     * Indicates the available voice radio technology, valid values as
     * defined by RadioTechnology.
     */
    RadioTechnology rat;

    /**
     * Cause code reported by the network in case registration fails. This will be a mobility
     * management cause code defined for MM, GMM, MME or equivalent as appropriate for the RAT.
     */
    RegistrationFailCause reasonForDenial;

    /** CellIdentity */
    CellIdentity cellIdentity;

    /**
     * The most-recent PLMN-ID upon which the UE registered (or attempted to register if a failure
     * is reported in the reasonForDenial field). This PLMN shall be in standard format consisting
     * of a 3 digit MCC concatenated with a 2 or 3 digit MNC.
     */
    string registeredPlmn;

    /**
     * Access-technology-specific registration information, such as for CDMA2000.
     */
    safe_union AccessTechnologySpecificInfo {
        Monostate noinit;

        Cdma2000RegistrationInfo cdmaInfo;

        EutranRegistrationInfo eutranInfo;

        struct NgranRegistrationInfo {
            /**
             * Network capabilities for voice over PS services. This info is valid only on NR
             * network and must be present when the device is camped on NR. VopsInfo must be
             * empty when the device is not camped on NR.
             */
            NrVopsInfo nrVopsInfo;
        } ngranInfo;

        struct GeranRegistrationInfo {
            /**
             * True if the dual transfer mode is supported.
             * Refer to 3GPP TS 44.108 section 3.4.25.3
             */
            bool dtmSupported;
        } geranInfo;
    } accessTechnologySpecificInfo;
};

struct Call {
    @1.2::Call base;
    /**
     * Forwarded number. It can set only one forwarded number based on 3GPP rule of the CS.
     * Reference: 3GPP TS 24.008 section 10.5.4.21b
     */
    string forwardedNumber;
};

struct PhysicalChannelConfig {
    /** Connection status for cell. Valid values are PRIMARY_SERVING and SECONDARY_SERVING */
    CellConnectionStatus status;

    /** The radio technology for this physical channel */
    RadioTechnology rat;

    /** Downlink Absolute Radio Frequency Channel Number */
    int32_t downlinkChannelNumber;

    /** Uplink Absolute Radio Frequency Channel Number */
    int32_t uplinkChannelNumber;

    /** Downlink cell bandwidth, in kHz */
    int32_t cellBandwidthDownlink;

    /** Uplink cell bandwidth, in kHz */
    int32_t cellBandwidthUplink;

    /**
     * A list of data calls mapped to this physical channel. The context id must match the cid of
     * @1.5::SetupDataCallResult. An empty list means the physical channel has no data call mapped
     * to it.
     */
    vec<int32_t> contextIds;

    /**
     * The physical cell identifier for this cell.
     *
     * In UTRAN, this value is primary scrambling code. The range is [0, 511].
     * Reference: 3GPP TS 25.213 section 5.2.2.
     *
     * In EUTRAN, this value is physical layer cell identity. The range is [0, 503].
     * Reference: 3GPP TS 36.211 section 6.11.
     *
     * In 5G RAN, this value is physical layer cell identity. The range is [0, 1007].
     * Reference: 3GPP TS 38.211 section 7.4.2.1.
     */
    uint32_t physicalCellId;

    /**
     * The frequency band to scan.
     */
    safe_union Band {
        /** Valid only if radioAccessNetwork = GERAN. */
        GeranBands geranBand;
        /** Valid only if radioAccessNetwork = UTRAN. */
        UtranBands utranBand;
        /** Valid only if radioAccessNetwork = EUTRAN. */
        EutranBands eutranBand;
        /** Valid only if radioAccessNetwork = NGRAN. */
        NgranBands ngranBand;
    } band;
};

/**
 * Extended from @1.5 NgranBands
 * IRadio 1.6 supports NGRAN bands up to V16.5.0
 */
enum NgranBands  : @1.5::NgranBands {
    /** 3GPP TS 38.101-1, Table 5.2-1: FR1 bands */
    BAND_26 = 26,
    BAND_46 = 46,
    BAND_53 = 53,
    BAND_96 = 96,
};

/**
 * This safe_union represents an optional slice info
 */
safe_union OptionalSliceInfo {
    Monostate noinit;
    SliceInfo value;
};

/**
 * This struct represents a S-NSSAI as defined in 3GPP TS 24.501.
 */
struct SliceInfo {
    /**
     * The type of service provided by the slice.
     *
     * see: 3GPP TS 24.501 Section 9.11.2.8.
     */
    SliceServiceType sst;

    /**
     * Slice differentiator is the identifier of a slice that has
     * SliceServiceType as SST. A value of -1 indicates that there is
     * no corresponding SliceInfo of the HPLMN.
     *
     * see: 3GPP TS 24.501 Section 9.11.2.8.
     */
    int32_t sliceDifferentiator;

    /**
     * This SST corresponds to a SliceInfo (S-NSSAI) of the HPLMN; the SST is
     * mapped to this value.
     *
     * see: 3GPP TS 24.501 Section 9.11.2.8.
     */
    SliceServiceType mappedHplmnSst;

    /**
     * Present only if both sliceDifferentiator and mappedHplmnSst are also
     * present. This SD corresponds to a SliceInfo (S-NSSAI) of the HPLMN;
     * sliceDifferentiator is mapped to this value. A value of -1 indicates that
     * there is no corresponding SliceInfo of the HPLMN.
     *
     * see: 3GPP TS 24.501 Section 9.11.2.8.
     */
    int32_t mappedHplmnSD;
};

/**
 * Slice/Service Type as defined in 3GPP TS 23.501.
 */
enum SliceServiceType : uint8_t {
    /* Not specified */
    NONE = 0,

    /* Slice suitable for the handling of 5G enhanced Mobile Broadband */
    EMBB = 1,

    /**
     * Slice suitable for the handling of ultra-reliable low latency
     * communications
     */
    URLLC = 2,

    /* Slice suitable for the handling of massive IoT */
    MIOT = 3,
};

/**
 * Expose more setup data call failures.
 */
enum DataCallFailCause : @1.4::DataCallFailCause {
    /**
     * Data call fail due to the slice not being allowed for the data call.
     */
    SLICE_REJECTED = 0x8CC,
};

/**
 * Public key type from carrier certificate.
 */
enum PublicKeyType : int32_t {
    EPDG    = 1,                   // Key type to be used for ePDG
    WLAN    = 2,                   // Key type to be used for WLAN
};

/**
 * Carrier specific Information sent by the carrier,
 * which will be used to encrypt the IMSI and IMPI.
 */
struct ImsiEncryptionInfo {
    @1.1::ImsiEncryptionInfo base;
    PublicKeyType keyType;         // Public key type
};
