/*
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2019 Ericsson Telecom 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
///////////////////////////////////////////////////////////////////////////////
//
//  File:          Revised_CCBS_Operation_and_Errors.asn
//  Description:   Functional protocol for ISDN
//
//  References:    ETSI EN 300 359-1 
//                 Integrated Services Digital Network (ISDN);
//                 Generic functional protocol for the support
//                 of supplementary services;
//  Rev:          R3C
//  Prodnr:       CNL 113 435
//  Updated:      2012.04.19.
//  Contact:      http://ttcn.ericsson.se
*/

Revised-CCBS-Operation-and-Errors {itu-t identified-organization etsi(0) 359 operations-and-errors (1)}

DEFINITIONS EXPLICIT TAGS ::=

 
BEGIN

 
  EXPORTS
      callInfoRetain,
      eraseCallLinkageID,
      cCBSRequest,
      cCBSDeactivate,
      cCBSInterrogate,
      cCBSErase,
      cCBSRemoteUserFree,
      cCBSCall,
      cCBSStatusRequest,
      cCBSBFree,
      cCBSStopAlerting,
      invalidCallLinkageID,
      invalidCCBSReference,
      longTermDenial,
      shortTermDenial,
      cCBSIsAlreadyActivated,
      alreadyAccepted,
      outgoingCCBSQueueFull,
      callFailureReasonNotBusy,
      notReadyForCall;


  IMPORTS
      OPERATION,
      ERROR
    FROM Remote-Operations-Information-Objects
    {joint-iso-itu-t remote-operations (4) notation (0)} 

 
      notSubscribed,
      supplementaryServiceInteractionNotAllowed
    FROM Revised-General-Errors
    {itu-t identified-organization etsi (0) 196 general-errors (2)}

 
      Address,
      PartyNumber,
      PartySubaddress
    FROM Revised-Addressing-Data-Elements
    {itu-t identified-organization etsi (0) 196 addressing-data-elements (6)}

 
      Q931InformationElement
    FROM Revised-Embedded-Q931-Types
    {itu-t identified-organization etsi (0) 196 embedded-q931-types (7)};

  callInfoRetain OPERATION::=
    {  
      ARGUMENT CallLinkageID
      
      CODE global: {cCBSOID 1}
    }
 
  eraseCallLinkageID OPERATION::=
    {
      ARGUMENT CallLinkageID 
      
      CODE global: {cCBSOID 10}         
    }
 
  cCBSRequest OPERATION::=
    {
      ARGUMENT CallLinkageID      
     
      RESULT
        SEQUENCE {
          recallMode    RecallMode,
          cCBCReference CCBSReference }

 
      ERRORS {
        notSubscribed |
        invalidCallLinkageID |
        shortTermDenial |
        longTermDenial |
        cCBSIsAlreadyActivated |
        supplementaryServiceInteractionNotAllowed |
        outgoingCCBSQueueFull |
        callFailureReasonNotBusy }        
        
      CODE global: {cCBSOID 2}  
    }

 
  cCBSInterrogate OPERATION::=
    {
      ARGUMENT SEQUENCE {
          cCBSReference     CCBSReference OPTIONAL,
          partyNumberOfA    PartyNumber OPTIONAL }

 
      RESULT SEQUENCE {
        recallMode        RecallMode,
        callDetails       CallDetails OPTIONAL }

 
      ERRORS {
        invalidCCBSReference |
        notSubscribed }    
        
      CODE global: {cCBSOID 4}      
    }

 
  cCBSDeactivate OPERATION::=
    {
      ARGUMENT CCBSReference
 
      ERRORS {
        invalidCCBSReference }     
        
      CODE global: {cCBSOID 3}     
    }

 
  cCBSErase OPERATION::=
    {
      ARGUMENT SEQUENCE {
          recallMode        RecallMode,
          cCBSReference     CCBSReference,
          addressOfB        Address,
          q931InfoElement   Q931InformationElement,
          eraseReason       CCBSEraseReason }
          -- The Bearer capability, High layer compatibility (optional) and
          -- Low layer compatibility (optional) information elements shall be
          -- embedded in q931InfoElement. 
          
      CODE global: {cCBSOID 5}             
    }

 
  cCBSRemoteUserFree OPERATION::=
    {  
      ARGUMENT SEQUENCE {
        recallMode        RecallMode,
        cCBSReference     CCBSReference,
        addressOfB        Address,
        q931InfoElement   Q931InformationElement }
          -- The Bearer capability, High layer compatibility (optional) and
          -- Low layer compatibility (optional) information elements shall be
          -- embedded in q931InfoElement.   
          
      CODE global: {cCBSOID 6}           
    }

 
  cCBSBFree OPERATION::=
    {  
      ARGUMENT SEQUENCE {
          recallMode        RecallMode,
          cCBSReference     CCBSReference,
          addressOfB        Address,
          q931InfoElement   Q931InformationElement }
          -- The Bearer capability, High layer compatibility (optional) and
          -- Low layer compatibility (optional) information elements shall be
          -- embedded in q931InfoElement.  
          
      CODE global: {cCBSOID 9}            
    }

 
  cCBSCall OPERATION::=
    {
      ARGUMENT CCBSReference

 
      ERRORS {
        invalidCCBSReference |
        alreadyAccepted |
        notReadyForCall }  
        
      CODE global: {cCBSOID 7}        
    }

 
  cCBSStatusRequest OPERATION::=
    {
        ARGUMENT SEQUENCE {
          recallMode        RecallMode,
          cCBSReference     CCBSReference,
          q931InfoElement   Q931InformationElement }
          -- The Bearer capability, High layer compatibility (optional) and
          -- Low layer compatibility (optional) information elements shall be
          -- embedded in q931InfoElement.
          
 
        RESULT BOOLEAN -- free=TRUE, busy=FALSE    
        
        CODE global: {cCBSOID 8}    
    }

 
  cCBSStopAlerting OPERATION::=
    {
      ARGUMENT CCBSReference
      
      CODE global: {cCBSOID 11}          
    }

 
  CallDetails ::= SEQUENCE SIZE(1..5) OF CallInformation

 
  CallInformation ::=
      SEQUENCE {
        addressOfB        Address,
        q931InfoElement   Q931InformationElement,
        cCBSReference     CCBSReference,
        subAddressOfA     PartySubaddress OPTIONAL }
        -- The Bearer capability, High layer compatibility (optional) and Low
        -- layer compatibility (optional) information elements shall be
        -- embedded in q931InfoElement.

 
  CallLinkageID ::= INTEGER (0..127)
  CCBSReference ::= INTEGER (0..127)

 
  CCBSEraseReason ::=
      ENUMERATED {
        normal-unspecified (0),
        t-CCBS2-timeout    (1),
        t-CCBS3-timeout    (2),
        basic-call-failed  (3) }

 
  RecallMode ::=
      ENUMERATED {
        globalRecall   (0),
        specificRecall (1) }

 
  cCBSOID OBJECT IDENTIFIER ::= {itu-t identified-organization etsi (0) 359
                                 operations-and-errors (1)}

 
  invalidCallLinkageID         ERROR ::={ CODE global:{cCBSOID 20}}
  invalidCCBSReference         ERROR ::={ CODE global:{cCBSOID 21}}
  longTermDenial               ERROR ::={ CODE global:{cCBSOID 22}}
  shortTermDenial              ERROR ::={ CODE global:{cCBSOID 23}}
  cCBSIsAlreadyActivated       ERROR ::={ CODE global:{cCBSOID 24}}
  alreadyAccepted              ERROR ::={ CODE global:{cCBSOID 25}}
  outgoingCCBSQueueFull        ERROR ::={ CODE global:{cCBSOID 26}}
  callFailureReasonNotBusy     ERROR ::={ CODE global:{cCBSOID 27}}
  notReadyForCall              ERROR ::={ CODE global:{cCBSOID 28}}


 
END -- of CCBS-Operations-and-Errors
