-- This is a manually-crafted simplified TCAP ASN.1 syntax, created
-- for the signerl project by Harald Welte <laforge@gnumonks.org>
--
-- The "problem" with the real TCAP spec is its use of templates,
-- which is nice if you want to create a fully integrated TCAP + MAP
-- decoder, but in this case we simply want to parse all the common
-- parts and ignore the application-specific parameters/rsults of the
-- respective operation.

TC

DEFINITIONS IMPLICIT TAGS

::=

BEGIN

Components ::= [APPLICATION 12] SEQUENCE SIZE (1..MAX) OF Component

Component ::= CHOICE {
	invoke		[1] Invoke,
	returnResult	[2] ReturnResult,
	returnError	[3] ReturnError,
	reject		[4] Reject,
	returnResultNotLast [7] ReturnResult
}

Invoke ::= SEQUENCE {
	invokeId InvokeId,
	linkedId CHOICE {
		present	[0] IMPLICIT present < InvokeId,
		absent	[1] IMPLICIT NULL
	} OPTIONAL,
	opcode Code,
	argument Param
}

ReturnResult ::= SEQUENCE {
	invokeId InvokeId,
	result SEQUENCE {
		opcode Code,
		result Param OPTIONAL
	}
}

ReturnError ::= SEQUENCE {
	invokeId InvokeId,
	errcode Code,
	parameter Param OPTIONAL
}

Reject ::= SEQUENCE {
	invokeId InvokeId,
	problem CHOICE {
		general		[0]	GeneralProblem,
		invoke		[1]	InvokeProblem,
		returnResult	[2]	ReturnResultProblem,
		returnError	[3]	ReturnErrorProblem
	}
}

GeneralProblem ::= INTEGER {
  unrecognizedPDU(0), mistypedPDU(1), badlyStructuredPDU(2)}

InvokeProblem ::= INTEGER {
  duplicateInvocation(0), unrecognizedOperation(1), mistypedArgument(2),
  resourceLimitation(3), releaseInProgress(4), unrecognizedLinkedId(5),
  linkedResponseUnexpected(6), unexpectedLinkedOperation(7)}

ReturnResultProblem ::= INTEGER {
  unrecognizedInvocation(0), resultResponseUnexpected(1), mistypedResult(2)
}

ReturnErrorProblem ::= INTEGER {
  unrecognizedInvocation(0), errorResponseUnexpected(1), unrecognizedError(2),
  unexpectedError(3), mistypedParameter(4)}

RejectProblem ::= INTEGER {
  general-unrecognizedPDU(0), general-mistypedPDU(1),
  general-badlyStructuredPDU(2), invoke-duplicateInvocation(10),
  invoke-unrecognizedOperation(11), invoke-mistypedArgument(12),
  invoke-resourceLimitation(13), invoke-releaseInProgress(14),
  invoke-unrecognizedLinkedId(15), invoke-linkedResponseUnexpected(16),
  invoke-unexpectedLinkedOperation(17),
  returnResult-unrecognizedInvocation(20),
  returnResult-resultResponseUnexpected(21), returnResult-mistypedResult(22),
  returnError-unrecognizedInvocation(30),
  returnError-errorResponseUnexpected(31), returnError-unrecognizedError(32),
  returnError-unexpectedError(33), returnError-mistypedParameter(34)}

InvokeId ::= CHOICE {present  INTEGER,
                     absent   NULL
}

Code ::= CHOICE {local   INTEGER,
                 global  OBJECT IDENTIFIER
}

Param ::= ANY

END
