/******************************************************************************
* 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:               TS29510_Nnrf_NFManagement.ttcn
//  Description:	      Type definitions for 3GPP TS29510
/////////////////////////////////////////////// 
module TS29510_Nnrf_NFManagement {

  import from TS29571_CommonData all
  import from TS29518_Namf_Communication all
  import from JSON_Generic all;

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

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

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

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

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

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

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

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


  type set NFProfile {
    TS29571_CommonData.NfInstanceId    nfInstanceId,
    NFType    nfType,
    NFStatus    nfStatus,
    TS29571_CommonData.PlmnId    plmn optional,
    set of       TS29571_CommonData.Snssai    sNssais optional,
    set of       charstring nsiList optional,
    Fqdn    fqdn optional,
    Fqdn    interPlmnFqdn optional,
    set of       TS29571_CommonData.Ipv4Addr    ipv4Addresses optional,
    set of       TS29571_CommonData.Ipv6Addr    ipv6Addresses optional,
    integer priority (0..65535) optional,
    integer capacity (0..65535) optional,
    integer load (0..100) optional,
    charstring locality optional,
    UdrInfo    udrInfo optional,
    UdmInfo    udmInfo optional,
    AusfInfo    ausfInfo optional,
    AmfInfo    amfInfo optional,
    SmfInfo    smfInfo optional,
    UpfInfo    upfInfo optional,
    PcfInfo    pcfInfo optional,
    BsfInfo    bsfInfo optional,
    JSON_generic_val customInfo optional,
    TS29571_CommonData.DateTime    recoveryTime optional,
    set of       NFService    nfServices optional
  }

  type set NFService {
    charstring serviceInstanceId,
    ServiceName    serviceName,
    set of       NFServiceVersion    versions,
    TS29571_CommonData.UriScheme    scheme,
    NFServiceStatus    nfServiceStatus,
    Fqdn    fqdn optional,
    Fqdn    interPlmnFqdn optional,
    set of       IpEndPoint    ipEndPoints optional,
    charstring apiPrefix optional,
    set of       DefaultNotificationSubscription    defaultNotificationSubscriptions optional,
    set of       TS29571_CommonData.PlmnId    allowedPlmns optional,
    set of       NFType    allowedNfTypes optional,
    set of       charstring allowedNfDomains optional,
    set of       TS29571_CommonData.Snssai    allowedNssais optional,
    integer priority (0..65535) optional,
    integer capacity (0..65535) optional,
    integer load (0..100) optional,
    TS29571_CommonData.DateTime    recoveryTime optional,
    TS29571_CommonData.SupportedFeatures    supportedFeatures optional
  }

  type enumerated NFType_enum { NRF, UDM, AMF, SMF, AUSF, NEF, PCF, SMSF, NSSF, UDR, LMF, GMLC, FIVEG_EIR, SEPP, UPF, N3IWF, AF, UDSF, BSF, CHF, NWDAF}
  with {
    variant "text 'FIVEG_EIR' as '5G_EIR'"
  }

  type union NFType {
    NFType_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type charstring Fqdn

  type set IpEndPoint {
    TS29571_CommonData.Ipv4Addr    ipv4Address optional,
    TS29571_CommonData.Ipv6Addr    ipv6Address optional,
    TransportProtocol    transport optional,
    integer port_ optional
  } with {
    variant (port_) "name as 'port'"
  }


  type set SubscriptionData {
    charstring nfStatusNotificationUri,
    charstring subscriptionId, // (pattern "^([0-9]{5,6}-)?[^-]+$"),
    TS29571_CommonData.DateTime    validityTime optional,
    set of       NotificationEventType    reqNotifEvents optional,
    TS29571_CommonData.PlmnId    plmnId optional,
    TS29571_CommonData.NfInstanceId    nfInstanceId optional,
    NFType    nfType optional,
    ServiceName    serviceName optional,
    charstring amfSetId optional,
    charstring amfRegionId optional,
    set of       TS29571_CommonData.Guami    guamiList optional
  }

  type set UdrInfo {
    charstring groupId optional,
    set of       SupiRange    supiRanges optional,
    set of       IdentityRange    gpsiRanges optional,
    set of       IdentityRange    externalGroupIdentityfiersRanges optional,
    set of       DataSetId    supportedDataSets optional
  }

  type set SupiRange {
    charstring start_ optional,
    charstring end optional,
    charstring pattern_ optional
  } with {
    variant (start_) "name as 'start'"
    variant (pattern_) "name as 'pattern'"
  }


  type set IdentityRange {
    charstring start_ optional,
    charstring end optional,
    charstring pattern_ optional
  } with {
    variant (start_) "name as 'start'"
    variant (pattern_) "name as 'pattern'"
  }


  type enumerated DataSetId_enum { SUBSCRIPTION, POLICY, EXPOSURE, APPLICATION}

  type union DataSetId {
    DataSetId_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type set UdmInfo {
    charstring groupId optional,
    set of       SupiRange    supiRanges optional,
    set of       IdentityRange    gpsiRanges optional,
    set of       IdentityRange    externalGroupIdentityfiersRanges optional,
    set of       charstring routingIndicators optional
  }

  type set AusfInfo {
    charstring groupId optional,
    set of       SupiRange    supiRanges optional,
    set of       charstring routingIndicators optional
  }

  type set AmfInfo {
    charstring amfSetId,
    charstring amfRegionId,
    set of       TS29571_CommonData.Guami    guamiList,
    set of       TS29571_CommonData.Tai    taiList optional,
    set of       TaiRange    taiRangeList optional,
    set of       TS29571_CommonData.Guami    backupInfoAmfFailure optional,
    set of       TS29571_CommonData.Guami    backupInfoAmfRemoval optional,
    N2InterfaceAmfInfo    n2InterfaceAmfInfo optional
  }

  type set SmfInfo {
    set of       TS29571_CommonData.Dnn    dnnList,
    set of       TS29571_CommonData.Tai    taiList optional,
    set of       TaiRange    taiRangeList optional,
    Fqdn    pgwFqdn optional
  }

  type set UpfInfo {
    set of       SnssaiUpfInfoItem    sNssaiUpfInfoList,
    set of       charstring smfServingArea optional,
    set of       InterfaceUpfInfoItem    interfaceUpfInfoList optional
  }

  type set SnssaiUpfInfoItem {
    TS29571_CommonData.Snssai    sNssai,
    set of       DnnUpfInfoItem    dnnUpfInfoList
  }

  type set DnnUpfInfoItem {
    TS29571_CommonData.Dnn    dnn
  }

  type set InterfaceUpfInfoItem {
    UPInterfaceType    interfaceType,
    set of       TS29571_CommonData.Ipv4Addr    ipv4EndpointAddress optional,
    set of       TS29571_CommonData.Ipv6Addr    ipv6EndpointAddress optional,
    Fqdn    endpointFqdn optional,
    charstring networkInstance optional
  }

  type enumerated UPInterfaceType_enum { N3, N6, N9}

  type union UPInterfaceType {
    UPInterfaceType_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type set PcfInfo {
    set of       TS29571_CommonData.Dnn    dnnList optional,
    set of       SupiRange    supiRangeList optional
  }

  type set BsfInfo {
    set of       Ipv4AddressRange    ipv4AddressRanges optional,
    set of       Ipv6PrefixRange    ipv6PrefixRanges optional
  }

  type set Ipv4AddressRange {
    TS29571_CommonData.Ipv4Addr    start_ optional,
    TS29571_CommonData.Ipv4Addr    end optional
  } with {
    variant (start_) "name as 'start'"
  }

  type set Ipv6PrefixRange {
    TS29571_CommonData.Ipv6Prefix    start_ optional,
    TS29571_CommonData.Ipv6Prefix    end optional
  } with {
    variant (start_) "name as 'start'"
  }


  type set DefaultNotificationSubscription {
    NotificationType    notificationType,
    TS29571_CommonData.Uri    callbackUri,
    TS29518_Namf_Communication.N1MessageClass    n1MessageClass optional,
    TS29518_Namf_Communication.N2InformationClass    n2InformationClass optional
  }

  type enumerated NotificationType_enum { N1_MESSAGES, N2_INFORMATION, LOCATION_NOTIFICATION, DATA_REMOVAL_NOTIFICATION, DATA_CHANGE_NOTIFICATION}

  type union NotificationType {
    NotificationType_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated TransportProtocol_enum { TCP}

  type union TransportProtocol {
    TransportProtocol_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated NotificationEventType_enum { NF_REGISTERED, NF_DEREGISTERED, NF_PROFILE_CHANGED}

  type union NotificationEventType {
    NotificationEventType_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type set NotificationData {
    NotificationEventType    event,
    TS29571_CommonData.Uri    nfInstanceUri,
    NFProfile    newProfile optional
  }

  type enumerated NFStatus_enum { REGISTERED, SUSPENDED}

  type union NFStatus {
    NFStatus_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type set NFRegistrationData {
    integer heartBeatTimer,
    NFProfile    nfProfile
  }

  type set NFServiceVersion {
    charstring apiVersionInUri,
    charstring apiFullVersion,
    TS29571_CommonData.DateTime    expiry optional
  }

  type enumerated ServiceName_enum { nnrf_nfm, nnrf_disc, nudm_sdm, nudm_uecm, nudm_ueau, nudm_ee, nudm_pp, namf_comm, namf_evts, namf_mt, namf_location, nsmf_pdusession, nsmf_event_exposure, nausf_auth, nausf_sorprotection, nnef_pfdmanagement, npcf_am_policy_control, npcf_smpolicycontrol, npcf_policyauthorization, npcf_bdtpolicycontrol, nsmsf_sms, nnssf_nsselection, nnssf_nssaiavailability, nudr_dr, nlmf_loc, n5g_eir_eic, nbsf_management, nchf_spendinglimitcontrol, nnwdaf_eventsubscription, nnwdaf_analyticsinfo} with {
    variant "text 'nnrf_nfm' as 'nnrf-nfm'"
    variant "text 'nnrf_disc' as 'nnrf-disc'"
    variant "text 'nudm_sdm' as 'nudm-sdm'"
    variant "text 'nudm_uecm' as 'nudm-uecm'"
    variant "text 'nudm_ueau' as 'nudm-uea'"
    variant "text 'nudm_ee' as 'nudm-ee'"
    variant "text 'nudm_pp' as 'nudm-pp'"
    variant "text 'namf_comm' as 'namf-comm'"
    variant "text 'namf_evts' as 'namf-evts'"
    variant "text 'namf_mt' as 'namf-mt'"
    variant "text 'namf_location' as 'namf-location'"
    variant "text 'nsmf_pdusession' as 'nsmf-pdusession'"
    variant "text 'nsmf_event_exposure' as 'nsmf-event-exposure'"
    variant "text 'nausf_auth' as 'nausf-auth'"
    variant "text 'nausf_sorprotection' as 'nausf-sorprotection'"
    variant "text 'nnef_pfdmanagement' as 'nnef-pfdmanagement'"
    variant "text 'npcf_am_policy_control' as 'npcf-am-policy-control'"
    variant "text 'npcf_smpolicycontrol' as 'npcf-smpolicycontrol'"
    variant "text 'npcf_policyauthorization' as 'npcf-policyauthorization'"
    variant "text 'npcf_bdtpolicycontrol' as 'npcf-bdtpolicycontrol'"
    variant "text 'nsmsf_sms' as 'nsmsf-sms'"
    variant "text 'nnssf_nsselection' as 'nnssf-nsselection'"
    variant "text 'nnssf_nssaiavailability' as 'nnssf-nssaiavailability'"
    variant "text 'nudr_dr' as 'nudr-dr'"
    variant "text 'nlmf_loc' as 'nlmf-loc'"
    variant "text 'n5g_eir_eic' as 'n5g-eir-eic'"
    variant "text 'nbsf_management' as 'nbsf-management'"
    variant "text 'nchf_spendinglimitcontrol' as 'nchf-spendinglimitcontrol'"
    variant "text 'nnwdaf_eventsubscription' as 'nnwdaf-eventsubscription'"
    variant "text 'nnwdaf_analyticsinfo' as 'nnwdaf-analyticsinfo'"
  }

  type union ServiceName {
    ServiceName_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type set N2InterfaceAmfInfo {
    set of       TS29571_CommonData.Ipv4Addr    ipv4EndpointAddress optional,
    set of       TS29571_CommonData.Ipv6Addr    ipv6EndpointAddress optional,
    TS29571_CommonData.AmfName    amfName optional
  }

  type enumerated NFServiceStatus_enum { REGISTERED, SUSPENDED}

  type union NFServiceStatus {
    NFServiceStatus_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type set TaiRange {
    TS29571_CommonData.PlmnId    plmnId,
    set of       TacRange    tacRangeList optional
  }

  type set TacRange {
    charstring start_  optional,// (pattern "^([A-Fa-f0-9]{4}|[A-Fa-f0-9]{6})$")
    charstring end optional,// (pattern "^([A-Fa-f0-9]{4}|[A-Fa-f0-9]{6})$") 
    charstring pattern_ optional
  } with {
    variant (start_) "name as 'start'"
    variant (pattern_) "name as 'pattern'"
  }






} with {
  encode "JSON"
}
