/******************************************************************************
* Copyright (c) 2000-2019  Ericsson AB
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* Contributors:
*   Gabor Szalai - initial implementation and initial documentation
******************************************************************************/
//
//  File:               TS29514_Npcf_PolicyAuthorization.ttcn
//  Description:	      Type definitions for 3GPP TS29514
/////////////////////////////////////////////// 
module TS29514_Npcf_PolicyAuthorization {

  import from TS29122_CommonData all
  import from TS29571_CommonData all
  import from TS29512_CommonData all
  import from TS32291_Nchf_ConvergedCharging all

external function f_enc_AppSessionContextReqData(in AppSessionContextReqData pdu) return octetstring 
with { extension "prototype(convert) encode(JSON)" }

external function f_dec_AppSessionContextReqData(in octetstring stream, out AppSessionContextReqData pdu) return integer 
with { extension "prototype(backtrack) decode(JSON)" }

external function f_enc_AppSessionContext(in AppSessionContext pdu) return octetstring 
with { extension "prototype(convert) encode(JSON)" }

external function f_dec_AppSessionContext(in octetstring stream, out AppSessionContext pdu) return integer 
with { extension "prototype(backtrack) decode(JSON)" }

external function f_enc_TerminationInfo(in TerminationInfo pdu) return octetstring 
with { extension "prototype(convert) encode(JSON)" }

external function f_dec_TerminationInfo(in octetstring stream, out TerminationInfo pdu) return integer 
with { extension "prototype(backtrack) decode(JSON)" }

external function f_enc_EventsNotification(in EventsNotification pdu) return octetstring 
with { extension "prototype(convert) encode(JSON)" }

external function f_dec_EventsNotification(in octetstring stream, out EventsNotification pdu) return integer 
with { extension "prototype(backtrack) decode(JSON)" }

external function f_enc_AppSessionContextUpdateData(in AppSessionContextUpdateData pdu) return octetstring 
with { extension "prototype(convert) encode(JSON)" }

external function f_dec_AppSessionContextUpdateData(in octetstring stream, out AppSessionContextUpdateData pdu) return integer 
with { extension "prototype(backtrack) decode(JSON)" }

external function f_enc_EventsSubscReqData(in EventsSubscReqData pdu) return octetstring 
with { extension "prototype(convert) encode(JSON)" }

external function f_dec_EventsSubscReqData(in octetstring stream, out EventsSubscReqData pdu) return integer 
with { extension "prototype(backtrack) decode(JSON)" }


  type set AppSessionContext {
    AppSessionContextReqData    ascReqData optional,
    AppSessionContextRespData    ascRespData optional,
    EventsNotification    evsNotif optional
  }

  type set AppSessionContextReqData {
    AfAppId    afAppId optional,
    AfChargingId    afChargId optional,
    AfRoutingRequirement    afRoutReq optional,
    AspId    aspId optional,
    TS29122_CommonData.BdtReferenceId    bdtRefId optional,
    TS29571_CommonData.Dnn    dnn optional,
    EventsSubscReqData    evSubsc optional,
    set of record {
      universal charstring key,
      MediaComponent    additionalProperties
    } medComponents optional,
    charstring ipDomain optional,
    charstring mpsId optional,
    TS29122_CommonData.Link    notifUri,
    TS29571_CommonData.Snssai    sliceInfo optional,
    SponId    sponId optional,
    SponsoringStatus    sponStatus optional,
    TS29571_CommonData.Supi    supi optional,
    TS29571_CommonData.SupportedFeatures    suppFeat optional,
    TS29571_CommonData.Ipv4Addr    ueIpv4 optional,
    TS29571_CommonData.Ipv6Addr    ueIpv6 optional,
    TS29571_CommonData.MacAddr48    ueMac optional
  }

  type set AppSessionContextRespData {
    ServAuthInfo    servAuthInfo optional,
    TS29571_CommonData.SupportedFeatures    suppFeat optional
  }

  type set AppSessionContextUpdateData {
    AfAppId    afAppId optional,
    AfRoutingRequirement    afRoutReq optional,
    AspId    aspId optional,
    TS29122_CommonData.BdtReferenceId    bdtRefId optional,
    EventsSubscReqData    evSubsc optional,
    set of record {
      universal charstring key,
      MediaComponent    additionalProperties
    } medComponents optional,
    charstring mpsId optional,
    SponId    sponId optional,
    SponsoringStatus    sponStatus optional
  }

  type set EventsSubscReqData {
    TS29571_CommonData.DnaiChangeType    dnaiChgType optional,
    set of       AfEventSubscription    events,
    TS29122_CommonData.Link    notifUri,
    RequiredAccessInfo    reqAni optional,
    TS29122_CommonData.UsageThreshold    usgThres optional
  }

  type set MediaComponent {
    AfAppId    afAppId optional,
    AfRoutingRequirement    afRoutReq optional,
    ContentVersion    contVer optional,
    set of       CodecData    codecs optional,
    FlowStatus    fStatus optional,
    TS29571_CommonData.BitRate    marBwDl optional,
    TS29571_CommonData.BitRate    marBwUl optional,
    integer medCompN,
    set of record {
      universal charstring key,
      MediaSubComponent    additionalProperties
    } medSubComps optional,
    MediaType    medType optional,
    TS29571_CommonData.BitRate    mirBwDl optional,
    TS29571_CommonData.BitRate    mirBwUl optional,
    ReservPriority    resPrio optional
  }

  type set MediaSubComponent {
    set of       EthFlowDescription    ethfDescs optional,
    integer fNum,
    set of       FlowDescription    fDescs optional,
    FlowStatus    fStatus optional,
    TS29571_CommonData.BitRate    marBwDl optional,
    TS29571_CommonData.BitRate    marBwUl optional,
    TosTrafficClass    tosTrCl optional,
    FlowUsage    flowUsage optional
  }

  type set EventsNotification {
    TS29571_CommonData.AccessType    accessType optional,
    AccessNetChargingAddress    anChargAddr optional,
    set of       AccessNetChargingIdentifier    anChargIds optional,
    AnGwAddress    anGwAddr optional,
    TS29122_CommonData.Link    evSubsUri,
    set of       AfEventNotification    evNotifs,
    set of       ResourcesAllocationInfo    failedResourcAllocReports optional,
    NetLocAccSupp    netLocAccSupp optional,
    set of       OutOfCreditInformation    outOfCredReports optional,
    TS29571_CommonData.PlmnId    plmnCcNc optional,
    TS29571_CommonData.PlmnId    plmnId optional,
    set of       QosNotificationControlInfo    qncReports optional,
    TS29571_CommonData.RatType    ratType optional,
    TS29571_CommonData.UserLocation    ueLoc optional,
    TS29571_CommonData.DateTime    ueLocTime optional,
    TS29571_CommonData.TimeZone    ueTimeZone optional,
    TS29571_CommonData.UserLocation    addUeLoc optional,
    TS29571_CommonData.DateTime    addUeLocTime optional,
    TS29122_CommonData.AccumulatedUsage    usgRep optional
  }

  type set AfEventSubscription {
    AfEvent    event,
    AfNotifMethod    notifMethod optional
  }

  type set AfEventNotification {
    AfEvent    event,
    set of       Flows    flows optional
  }

  type set TerminationInfo {
    TerminationCause    termCause,
    TS29122_CommonData.Link    resUri
  }

  type set AfRoutingRequirement {
    boolean appReloc optional,
    charstring afTransId,
    set of       TS29571_CommonData.RouteToLocation    routeToLocs optional,
    SpatialValidity    spVal optional,
    set of       TemporalValidity    tempVals optional
  }

  type set SpatialValidity {
    set of       charstring praIds optional,
    set of record {
      universal charstring key,
      TS29571_CommonData.PresenceInfo    additionalProperties
    } presenceInfoList optional
  }

  type set AccessNetChargingAddress {
    TS29571_CommonData.Ipv4Addr    anChargIpv4Addr optional,
    TS29571_CommonData.Ipv6Addr    anChargIpv6Addr optional
  }

  type set AccessNetChargingIdentifier {
    charstring anChargIdValue,
    set of       Flows    flows optional
  }

  type set AnGwAddress {
    TS29571_CommonData.Ipv4Addr    anGwIpv4Addr optional,
    TS29571_CommonData.Ipv6Addr    anGwIpv6Addr optional
  }

  type set Flows {
    set of       ContentVersion    contVers optional,
    set of       integer fNums optional,
    integer medCompN
  }

  type set EthFlowDescription {
    TS29571_CommonData.MacAddr48    destMacAddr optional,
    charstring ethType,
    FlowDescription    fDesc optional,
    TS29512_CommonData.FlowDirection    fDir optional,
    TS29571_CommonData.MacAddr48    sourceMacAddr optional,
    charstring vlanTags optional
  }

  type set OutOfCreditInformation {
    TS32291_Nchf_ConvergedCharging.FinalUnitAction    finUnitAct optional,
    set of       Flows    flows optional
  }

  type set ResourcesAllocationInfo {
    MediaComponentResourcesStatus    mcResourcStatus,
    set of       Flows    flows
  }

  type set TemporalValidity {
    TS29571_CommonData.DateTime    startTime optional,
    TS29571_CommonData.DateTime    stopTime optional
  }

  type set QosNotificationControlInfo {
    QosNotifType    notifType,
    set of       Flows    flows optional
  }

  type charstring AfChargingId

  type charstring AfAppId

  type charstring AspId

  type charstring CodecData

  type integer ContentVersion

  type charstring FlowDescription

  type boolean NetLocAccSupp

  type charstring SponId

  type enumerated MediaType_enum { AUDIO, VIDEO, DATA, APPLICATION, CONTROL, TEXT, MESSAGE, OTHER}

  type union MediaType {
    MediaType_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated ReservPriority_enum { PRIO_1, PRIO_2, PRIO_3, PRIO_4, PRIO_5, PRIO_6, PRIO_7, PRIO_8, PRIO_9, PRIO_10, PRIO_11, PRIO_12, PRIO_13, PRIO_14, PRIO_15, PRIO_16}

  type union ReservPriority {
    ReservPriority_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated ServAuthInfo_enum { TP_NOT_KNOWN, TP_EXPIRED, TP_NOT_YET_OCURRED, UNAUTH_TRAFFIC_ROUTING_REQ}

  type union ServAuthInfo {
    ServAuthInfo_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated SponsoringStatus_enum { SPONSOR_DISABLED, SPONSOR_ENABLED}

  type union SponsoringStatus {
    SponsoringStatus_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated AfEvent_enum { ACCESS_TYPE_CHANGE, ANI_REPORT, CHARGING_CORRELATION, DNAI_CHG, FAILED_RESOURCES_ALLOCATION, OUT_OF_CREDIT, PLMN_CHG, QOS_NOTIFICATION_CONTROL, ROUT_REQ_STATUS_CHG, SUCCESSFUL_RESOURCES_ALLOCATION, USAGE_REPORT}

  type union AfEvent {
    AfEvent_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated AfNotifMethod_enum { EVENT_DETECTION, ONE_TIME}

  type union AfNotifMethod {
    AfNotifMethod_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated QosNotifType_enum { FULFILLED, NOT_FULFILLED}

  type union QosNotifType {
    QosNotifType_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated TerminationCause_enum { ALL_SDF_DEACTIVATION, PDU_SESSION_TERMINATION}

  type union TerminationCause {
    TerminationCause_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated RequiredAccessInfo_enum { USER_LOCATION, MS_TIME_ZONE}

  type union RequiredAccessInfo {
    RequiredAccessInfo_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated MediaComponentResourcesStatus_enum { ACTIVE, INACTIVE}

  type union MediaComponentResourcesStatus {
    MediaComponentResourcesStatus_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated FlowUsage_enum { NO_INFO, RTCP}

  type union FlowUsage {
    FlowUsage_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated FlowStatus_enum { ENABLED_UPLINK, ENABLED_DOWNLINK, ENABLED, DISABLED, REMOVED}
  with {
    variant "text 'ENABLED_UPLINK' as 'ENABLED-UPLINK'"
    variant "text 'ENABLED_DOWNLINK' as 'ENABLED-DOWNLINK'"
  }

  type union FlowStatus {
    FlowStatus_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type charstring TosTrafficClass





} with {
  encode "JSON"
}
