osmo-cc-misdn-endpoint/src/libmisdnuser/suppserv/ccbs.c

1667 lines
51 KiB
C

/*
*
* CCBS Supplementary Services ETS 300 359-1
* CCNR Supplementary Services ETS 301 065-1
*
* CCBS/CCNR Facility ie encode/decode
*
* Copyright 2009,2010 by Karsten Keil <kkeil@linux-pingi.de>
*
* This code is free software; you can redistribute it and/or modify
* it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
* version 2.1 as published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU LESSER GENERAL PUBLIC LICENSE for more details.
*
*/
#include "asn1.h"
#include "ccbs.h"
#include <string.h>
/* ------------------------------------------------------------------- */
/* ******************************************************************* */
/*!
* \internal
* \brief Encode the Q.931 ie values used for CCBS/CCNR.
*
* \param Dest Where to put the encoding
* \param Q931ie Q931 ie information to encode.
*
* \retval length
*/
static int encodeQ931ie_CCBS(__u8 * Dest, const struct Q931_Bc_Hlc_Llc *Q931ie)
{
__u8 *p;
/* [APPLICATION 0] IMPLICIT OCTET STRING */
Dest[0] = ASN1_TAG_APPLICATION_WIDE | 0;
p = &Dest[2];
/* Store value */
if (Q931ie->Bc.Length) {
*p++ = 0x04; /* Q.931 Bearer Capability ie tag */
*p++ = Q931ie->Bc.Length;
memcpy(p, Q931ie->Bc.Contents, Q931ie->Bc.Length);
p += Q931ie->Bc.Length;
}
if (Q931ie->Llc.Length) {
*p++ = 0x7C; /* Q.931 Low Layer Compatibility ie tag */
*p++ = Q931ie->Llc.Length;
memcpy(p, Q931ie->Llc.Contents, Q931ie->Llc.Length);
p += Q931ie->Llc.Length;
}
if (Q931ie->Hlc.Length) {
*p++ = 0x7D; /* Q.931 High Layer Compatibility ie tag */
*p++ = Q931ie->Hlc.Length;
memcpy(p, Q931ie->Hlc.Contents, Q931ie->Hlc.Length);
p += Q931ie->Hlc.Length;
}
/* length */
Dest[1] = p - &Dest[2];
return p - Dest;
} /* end encodeQ931ie_CCBS() */
/* ******************************************************************* */
/*!
* \internal
* \brief Parse the Q.931 argument contents for CCBS/CCNR.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param Q931ie Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
static int ParseQ931ie_CCBS(struct asn1_parm *pc, u_char * p, u_char * end, struct Q931_Bc_Hlc_Llc *Q931ie)
{
__u8 Ie_type;
size_t Length;
INIT;
memset(Q931ie, 0, sizeof(*Q931ie));
do {
if (end < p + 2) {
/* Q.931 ie length error */
return -1;
}
Ie_type = *p++;
Length = *p++;
if (end < p + Length) {
/* Q.931 ie length error */
return -1;
}
switch (Ie_type) {
case 0x04: /* Q.931 Bearer Capability ie tag */
if (Length <= sizeof(Q931ie->Bc.Contents)) {
Q931ie->Bc.Length = Length;
memcpy(Q931ie->Bc.Contents, p, Length);
}
break;
case 0x7C: /* Q.931 Low Layer Compatibility ie tag */
if (Length <= sizeof(Q931ie->Llc.Contents)) {
Q931ie->Llc.Length = Length;
memcpy(Q931ie->Llc.Contents, p, Length);
}
break;
case 0x7D: /* Q.931 High Layer Compatibility ie tag */
if (Length <= sizeof(Q931ie->Hlc.Contents)) {
Q931ie->Hlc.Length = Length;
memcpy(Q931ie->Hlc.Contents, p, Length);
}
break;
default:
/* Unknown Q.931 ie in CCBS message */
break;
} /* end switch */
p += Length;
} while (p < end);
return p - beg;
} /* end ParseQ931ie_CCBS() */
/* ******************************************************************* */
/*!
* \internal
* \brief Encode the array of call information details type.
*
* \param Dest Where to put the encoding
* \param CallDetails Array of call detail information to encode.
*
* \retval length
*/
static int encodeCallInformation(__u8 * Dest, const struct FacCallInformation *CallInformation)
{
__u8 *p;
Dest[0] = ASN1_TAG_SEQUENCE;
p = &Dest[2];
p += encodeAddress_Full(p, &CallInformation->AddressOfB);
p += encodeQ931ie_CCBS(p, &CallInformation->Q931ie);
p += encodeInt(p, ASN1_TAG_INTEGER, CallInformation->CCBSReference);
if (CallInformation->SubaddressOfA.Length) {
p += encodePartySubaddress_Full(p, &CallInformation->SubaddressOfA);
}
/* length */
Dest[1] = p - &Dest[2];
return p - Dest;
} /* end encodeCallInformation() */
/* ******************************************************************* */
/*!
* \internal
* \brief Parse the CallInformation argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CallInformation Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
static int ParseCallInformation(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCallInformation *CallInformation)
{
unsigned int CCBSReference;
INIT;
XSEQUENCE_1(ParseAddress_Full, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &CallInformation->AddressOfB);
XSEQUENCE_1(ParseQ931ie_CCBS, ASN1_TAG_APPLICATION_WIDE, 0, &CallInformation->Q931ie);
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CCBSReference);
CallInformation->CCBSReference = CCBSReference;
CallInformation->SubaddressOfA.Length = 0; /* Assume subaddress not present */
if (p < end) {
/* The optional subaddress must be present since there is something left. */
XSEQUENCE_1(ParsePartySubaddress_Full, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &CallInformation->SubaddressOfA);
} else {
CallInformation->SubaddressOfA.Length = 0; /* Subaddress not present */
}
return p - beg;
} /* end ParseCallInformation() */
/* ******************************************************************* */
/*!
* \internal
* \brief Encode the array of call information details type.
*
* \param Dest Where to put the encoding
* \param NumRecords How many records to encode.
* \param CallDetails Array of call detail information to encode.
*
* \retval length
*/
static int encodeCallDetails(__u8 * Dest, unsigned NumRecords, const struct FacCallInformation CallDetails[])
{
unsigned Index;
__u8 *p;
Dest[0] = ASN1_TAG_SEQUENCE;
p = &Dest[1 + ASN1_NUM_OCTETS_LONG_LENGTH_u8];
for (Index = 0; Index < NumRecords; ++Index) {
p += encodeCallInformation(p, &CallDetails[Index]);
} /* end for */
/* length */
encodeLen_Long_u8(&Dest[1], p - &Dest[1 + ASN1_NUM_OCTETS_LONG_LENGTH_u8]);
return p - Dest;
} /* end encodeCallDetails() */
/* ******************************************************************* */
/*!
* \internal
* \brief Parse the array of call information details argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSInterrogate Array of call information details storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
static int ParseCallDetails(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSInterrogate_RES *CCBSInterrogate)
{
INIT;
while (p < end) {
if (CCBSInterrogate->NumRecords < sizeof(CCBSInterrogate->CallDetails) / sizeof(CCBSInterrogate->CallDetails[0])) {
XSEQUENCE_1(ParseCallInformation, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED,
&CCBSInterrogate->CallDetails[CCBSInterrogate->NumRecords]);
++CCBSInterrogate->NumRecords;
} else {
/* Too many records */
return -1;
}
} /* end while */
return p - beg;
} /* end ParseCallDetails() */
/* ******************************************************************* */
/*!
* \brief Encode the StatusRequest facility ie.
*
* \param Dest Where to put the encoding
* \param StatusRequest Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacStatusRequest(__u8 * Dest, const struct asn1_parm *pc, const struct FacStatusRequest *StatusRequest)
{
int Length;
__u8 *p;
__u8 *SeqStart;
switch (pc->comp) {
case CompInvoke:
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_StatusRequest);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeEnum(p, ASN1_TAG_ENUM, StatusRequest->CompatibilityMode);
p += encodeQ931ie_CCBS(p, &StatusRequest->Q931ie);
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
break;
case CompReturnResult:
p = encodeComponent_Head(Dest, asn1ComponentTag_Result);
p += encodeInt(p, ASN1_TAG_INTEGER, pc->u.retResult.invokeId);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeOperationValue(p, Fac_StatusRequest);
p += encodeEnum(p, ASN1_TAG_ENUM, pc->u.retResult.o.StatusRequest.Status);
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
break;
default:
Length = -1;
break;
} /* end switch */
return Length;
} /* end encodeFacStatusRequest() */
/* ******************************************************************* */
/*!
* \brief Parse the StatusRequest invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param StatusRequest Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseStatusRequest(struct asn1_parm *pc, u_char * p, u_char * end, struct FacStatusRequest *StatusRequest)
{
unsigned int CompatibilityMode;
INIT;
XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &CompatibilityMode);
StatusRequest->CompatibilityMode = CompatibilityMode;
XSEQUENCE_1(ParseQ931ie_CCBS, ASN1_TAG_APPLICATION_WIDE, 0, &StatusRequest->Q931ie);
return p - beg;
} /* end ParseStatusRequest() */
/* ******************************************************************* */
/*!
* \brief Parse the StatusRequest result parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse parameters
* \param end End buffer position that must not go past.
* \param StatusRequest Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseStatusRequest_RES(struct asn1_parm *pc, u_char * p, u_char * end, struct FacStatusRequest_RES *StatusRequest)
{
unsigned int Status;
int ret;
u_char *beg;
beg = p;
XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &Status);
StatusRequest->Status = Status;
return p - beg;
} /* end ParseStatusRequest_RES() */
/* ******************************************************************* */
/*!
* \brief Encode the CallInfoRetain facility ie.
*
* \param Dest Where to put the encoding
* \param CallInfoRetain Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCallInfoRetain(__u8 * Dest, const struct asn1_parm *pc, const struct FacCallInfoRetain *CallInfoRetain)
{
int Length;
__u8 *p;
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_CallInfoRetain);
p += encodeInt(p, ASN1_TAG_INTEGER, CallInfoRetain->CallLinkageID);
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCallInfoRetain() */
/* ******************************************************************* */
/*!
* \brief Parse the CallInfoRetain invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CallInfoRetain Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCallInfoRetain(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCallInfoRetain *CallInfoRetain)
{
unsigned int CallLinkageID;
int ret;
u_char *beg;
beg = p;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CallLinkageID);
CallInfoRetain->CallLinkageID = CallLinkageID;
return p - beg;
} /* end ParseCallInfoRetain() */
/* ******************************************************************* */
/*!
* \brief Encode the EraseCallLinkageID facility ie.
*
* \param Dest Where to put the encoding
* \param EraseCallLinkageID Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacEraseCallLinkageID(__u8 * Dest, const struct asn1_parm *pc, const struct FacEraseCallLinkageID *EraseCallLinkageID)
{
int Length;
__u8 *p;
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_EraseCallLinkageID);
p += encodeInt(p, ASN1_TAG_INTEGER, EraseCallLinkageID->CallLinkageID);
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacEraseCallLinkageID() */
/* ******************************************************************* */
/*!
* \brief Parse the EraseCallLinkageID invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param EraseCallLinkageID Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseEraseCallLinkageID(struct asn1_parm *pc, u_char * p, u_char * end, struct FacEraseCallLinkageID *EraseCallLinkageID)
{
unsigned int CallLinkageID;
int ret;
u_char *beg;
beg = p;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CallLinkageID);
EraseCallLinkageID->CallLinkageID = CallLinkageID;
return p - beg;
} /* end ParseEraseCallLinkageID() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBSDeactivate facility ie.
*
* \param Dest Where to put the encoding
* \param CCBSDeactivate Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBSDeactivate(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSDeactivate *CCBSDeactivate)
{
int Length;
__u8 *p;
__u8 *SeqStart;
switch (pc->comp) {
case CompInvoke:
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_CCBSDeactivate);
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSDeactivate->CCBSReference);
Length = encodeComponent_Length(Dest, p);
break;
case CompReturnResult:
p = encodeComponent_Head(Dest, asn1ComponentTag_Result);
p += encodeInt(p, ASN1_TAG_INTEGER, pc->u.retResult.invokeId);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeOperationValue(p, Fac_CCBSDeactivate);
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
break;
default:
Length = -1;
break;
} /* end switch */
return Length;
} /* end encodeFacCCBSDeactivate() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSDeactivate invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSDeactivate Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSDeactivate(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSDeactivate *CCBSDeactivate)
{
unsigned int CCBSReference;
int ret;
u_char *beg;
beg = p;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CCBSReference);
CCBSDeactivate->CCBSReference = CCBSReference;
return p - beg;
} /* end ParseCCBSDeactivate() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBSErase facility ie.
*
* \param Dest Where to put the encoding
* \param CCBSErase Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBSErase(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSErase *CCBSErase)
{
int Length;
__u8 *p;
__u8 *SeqStart;
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_CCBSErase);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeEnum(p, ASN1_TAG_ENUM, CCBSErase->RecallMode);
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSErase->CCBSReference);
p += encodeAddress_Full(p, &CCBSErase->AddressOfB);
p += encodeQ931ie_CCBS(p, &CCBSErase->Q931ie);
p += encodeEnum(p, ASN1_TAG_ENUM, CCBSErase->Reason);
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCCBSErase() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSErase invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSErase Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSErase(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSErase *CCBSErase)
{
unsigned int RecallMode;
unsigned int CCBSReference;
unsigned int EraseReason;
INIT;
XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &RecallMode);
CCBSErase->RecallMode = RecallMode;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CCBSReference);
CCBSErase->CCBSReference = CCBSReference;
XSEQUENCE_1(ParseAddress_Full, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &CCBSErase->AddressOfB);
XSEQUENCE_1(ParseQ931ie_CCBS, ASN1_TAG_APPLICATION_WIDE, 0, &CCBSErase->Q931ie);
XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &EraseReason);
CCBSErase->Reason = EraseReason;
return p - beg;
} /* end ParseCCBSErase() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBSRemoteUserFree facility ie.
*
* \param Dest Where to put the encoding
* \param CCBSRemoteUserFree Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBSRemoteUserFree(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSRemoteUserFree *CCBSRemoteUserFree)
{
int Length;
__u8 *p;
__u8 *SeqStart;
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_CCBSRemoteUserFree);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeEnum(p, ASN1_TAG_ENUM, CCBSRemoteUserFree->RecallMode);
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSRemoteUserFree->CCBSReference);
p += encodeAddress_Full(p, &CCBSRemoteUserFree->AddressOfB);
p += encodeQ931ie_CCBS(p, &CCBSRemoteUserFree->Q931ie);
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCCBSRemoteUserFree() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSRemoteUserFree invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSRemoteUserFree Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSRemoteUserFree(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSRemoteUserFree *CCBSRemoteUserFree)
{
unsigned int RecallMode;
unsigned int CCBSReference;
INIT;
XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &RecallMode);
CCBSRemoteUserFree->RecallMode = RecallMode;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CCBSReference);
CCBSRemoteUserFree->CCBSReference = CCBSReference;
XSEQUENCE_1(ParseAddress_Full, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &CCBSRemoteUserFree->AddressOfB);
XSEQUENCE_1(ParseQ931ie_CCBS, ASN1_TAG_APPLICATION_WIDE, 0, &CCBSRemoteUserFree->Q931ie);
return p - beg;
} /* end ParseCCBSRemoteUserFree() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBSCall facility ie.
*
* \param Dest Where to put the encoding
* \param CCBSCall Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBSCall(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSCall *CCBSCall)
{
int Length;
__u8 *p;
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_CCBSCall);
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSCall->CCBSReference);
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCCBSCall() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSCall invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSCall Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSCall(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSCall *CCBSCall)
{
unsigned int CCBSReference;
int ret;
u_char *beg;
beg = p;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CCBSReference);
CCBSCall->CCBSReference = CCBSReference;
return p - beg;
} /* end ParseCCBSCall() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBSBFree facility ie.
*
* \param Dest Where to put the encoding
* \param CCBSBFree Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBSBFree(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSBFree *CCBSBFree)
{
int Length;
__u8 *p;
__u8 *SeqStart;
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_CCBSBFree);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeEnum(p, ASN1_TAG_ENUM, CCBSBFree->RecallMode);
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSBFree->CCBSReference);
p += encodeAddress_Full(p, &CCBSBFree->AddressOfB);
p += encodeQ931ie_CCBS(p, &CCBSBFree->Q931ie);
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCCBSBFree() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSBFree invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSBFree Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSBFree(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSBFree *CCBSBFree)
{
unsigned int RecallMode;
unsigned int CCBSReference;
INIT;
XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &RecallMode);
CCBSBFree->RecallMode = RecallMode;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CCBSReference);
CCBSBFree->CCBSReference = CCBSReference;
XSEQUENCE_1(ParseAddress_Full, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &CCBSBFree->AddressOfB);
XSEQUENCE_1(ParseQ931ie_CCBS, ASN1_TAG_APPLICATION_WIDE, 0, &CCBSBFree->Q931ie);
return p - beg;
} /* end ParseCCBSBFree() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBSStopAlerting facility ie.
*
* \param Dest Where to put the encoding
* \param CCBSStopAlerting Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBSStopAlerting(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSStopAlerting *CCBSStopAlerting)
{
int Length;
__u8 *p;
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_CCBSStopAlerting);
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSStopAlerting->CCBSReference);
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCCBSStopAlerting() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSStopAlerting invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSStopAlerting Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSStopAlerting(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSStopAlerting *CCBSStopAlerting)
{
unsigned int CCBSReference;
int ret;
u_char *beg;
beg = p;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CCBSReference);
CCBSStopAlerting->CCBSReference = CCBSReference;
return p - beg;
} /* end ParseCCBSStopAlerting() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBSStatusRequest facility ie.
*
* \param Dest Where to put the encoding
* \param CCBSStatusRequest Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBSStatusRequest(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSStatusRequest *CCBSStatusRequest)
{
int Length;
__u8 *p;
__u8 *SeqStart;
switch (pc->comp) {
case CompInvoke:
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, Fac_CCBSStatusRequest);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeEnum(p, ASN1_TAG_ENUM, CCBSStatusRequest->RecallMode);
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSStatusRequest->CCBSReference);
p += encodeQ931ie_CCBS(p, &CCBSStatusRequest->Q931ie);
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
break;
case CompReturnResult:
p = encodeComponent_Head(Dest, asn1ComponentTag_Result);
p += encodeInt(p, ASN1_TAG_INTEGER, pc->u.retResult.invokeId);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeOperationValue(p, Fac_CCBSStatusRequest);
p += encodeBoolean(p, ASN1_TAG_BOOLEAN, pc->u.retResult.o.CCBSStatusRequest.Free);
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
break;
default:
Length = -1;
break;
} /* end switch */
return Length;
} /* end encodeFacCCBSStatusRequest() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSStatusRequest invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSStatusRequest Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSStatusRequest(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSStatusRequest *CCBSStatusRequest)
{
unsigned int RecallMode;
unsigned int CCBSReference;
INIT;
XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &RecallMode);
CCBSStatusRequest->RecallMode = RecallMode;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CCBSReference);
CCBSStatusRequest->CCBSReference = CCBSReference;
XSEQUENCE_1(ParseQ931ie_CCBS, ASN1_TAG_APPLICATION_WIDE, 0, &CCBSStatusRequest->Q931ie);
return p - beg;
} /* end ParseCCBSStatusRequest() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSStatusRequest result parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse parameters
* \param end End buffer position that must not go past.
* \param CCBSStatusRequest Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSStatusRequest_RES(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSStatusRequest_RES *CCBSStatusRequest)
{
int Free;
int ret;
u_char *beg;
beg = p;
XSEQUENCE_1(ParseBoolean, ASN1_TAG_BOOLEAN, ASN1_NOT_TAGGED, &Free);
CCBSStatusRequest->Free = Free;
return p - beg;
} /* end ParseCCBSStatusRequest_RES() */
/* ******************************************************************* */
/*!
* \internal
* \brief Encode the CCBS/CCNR-Request facility invoke ie
*
* \param Dest Where to put the encoding
* \param CCBSRequest Information needed to encode in ie.
* \param MsgType Which facility type to generate
*
* \retval length on success.
* \retval -1 on error.
*/
static int encodeFacCCBSRequest_Invoke(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSRequest *CCBSRequest, enum Operation MsgType)
{
int Length;
__u8 *p;
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, MsgType);
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSRequest->CallLinkageID);
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCCBSRequest_Invoke() */
/* ******************************************************************* */
/*!
* \internal
* \brief Encode the CCBS/CCNR-Request facility result ie.
*
* \param Dest Where to put the encoding
* \param CCBSRequest Information needed to encode in ie.
* \param MsgType Which facility type to generate
*
* \retval length on success.
* \retval -1 on error.
*/
static int encodeFacCCBSRequest_Result(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSRequest_RES *CCBSRequest, enum Operation MsgType)
{
int Length;
__u8 *p;
__u8 *SeqStart;
__u8 *ResultSeqStart;
p = encodeComponent_Head(Dest, asn1ComponentTag_Result);
p += encodeInt(p, ASN1_TAG_INTEGER, pc->u.retResult.invokeId);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeOperationValue(p, MsgType);
ResultSeqStart = p;
ResultSeqStart[0] = ASN1_TAG_SEQUENCE;
p = &ResultSeqStart[2];
p += encodeEnum(p, ASN1_TAG_ENUM, CCBSRequest->RecallMode);
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSRequest->CCBSReference);
/* sequence Length */
ResultSeqStart[1] = p - &ResultSeqStart[2];
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCCBSRequest_Result() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBSRequest facility ie.
*
* \param Dest Where to put the encoding
* \param CCBSRequest Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBSRequest(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSRequest *CCBSRequest)
{
int Length;
switch (pc->comp) {
case CompInvoke:
Length = encodeFacCCBSRequest_Invoke(Dest, pc, CCBSRequest, Fac_CCBSRequest);
break;
case CompReturnResult:
Length = encodeFacCCBSRequest_Result(Dest, pc, &pc->u.retResult.o.CCBSRequest, Fac_CCBSRequest);
break;
default:
Length = -1;
break;
} /* end switch */
return Length;
} /* end encodeFacCCBSRequest() */
/* ******************************************************************* */
/*!
* \brief Encode the CCNRRequest facility ie.
*
* \param Dest Where to put the encoding
* \param CCNRRequest Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCNRRequest(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSRequest *CCNRRequest)
{
int Length;
switch (pc->comp) {
case CompInvoke:
Length = encodeFacCCBSRequest_Invoke(Dest, pc, CCNRRequest, Fac_CCNRRequest);
break;
case CompReturnResult:
Length = encodeFacCCBSRequest_Result(Dest, pc, &pc->u.retResult.o.CCNRRequest, Fac_CCNRRequest);
break;
default:
Length = -1;
break;
} /* end switch */
return Length;
} /* end encodeFacCCNRRequest() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSRequest invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSRequest Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSRequest(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSRequest *CCBSRequest)
{
unsigned int CallLinkageID;
int ret;
u_char *beg;
beg = p;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CallLinkageID);
CCBSRequest->CallLinkageID = CallLinkageID;
return p - beg;
} /* end ParseCCBSRequest() */
/* ******************************************************************* */
/*!
* \brief Parse the CCNRRequest invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCNRRequest Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCNRRequest(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSRequest *CCNRRequest)
{
return ParseCCBSRequest(pc, p, end, CCNRRequest);
} /* end ParseCCNRRequest() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSRequest result parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse parameters
* \param end End buffer position that must not go past.
* \param CCBSRequest Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSRequest_RES(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSRequest_RES *CCBSRequest)
{
unsigned int RecallMode;
unsigned int CCBSReference;
INIT;
XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &RecallMode);
CCBSRequest->RecallMode = RecallMode;
XSEQUENCE_1(ParseUnsignedInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CCBSReference);
CCBSRequest->CCBSReference = CCBSReference;
return p - beg;
} /* end ParseCCBSRequest_RES() */
/* ******************************************************************* */
/*!
* \brief Parse the CCNRRequest result parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse parameters
* \param end End buffer position that must not go past.
* \param CCNRRequest Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCNRRequest_RES(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSRequest_RES *CCNRRequest)
{
return ParseCCBSRequest_RES(pc, p, end, CCNRRequest);
} /* end ParseCCNRRequest_RES() */
/* ******************************************************************* */
/*!
* \internal
* \brief Encode the CCBS/CCNR-Interrogate facility invoke ie.
*
* \param Dest Where to put the encoding
* \param CCBSInterrogate Information needed to encode in ie.
* \param MsgType Which facility type to generate
*
* \retval length on success.
* \retval -1 on error.
*/
static int encodeFacCCBSInterrogate_Invoke(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSInterrogate *CCBSInterrogate, enum Operation MsgType)
{
int Length;
__u8 *p;
__u8 *SeqStart;
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, MsgType);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
if (CCBSInterrogate->CCBSReferencePresent) {
p += encodeInt(p, ASN1_TAG_INTEGER, CCBSInterrogate->CCBSReference);
}
if (CCBSInterrogate->AParty.LengthOfNumber) {
p += encodePartyNumber_Full(p, &CCBSInterrogate->AParty);
}
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCCBSInterrogate_Backend() */
/* ******************************************************************* */
/*!
* \internal
* \brief Encode the CCBS/CCNR-Interrogate facility result ie.
*
* \param Dest Where to put the encoding
* \param CCBSInterrogate Information needed to encode in ie.
* \param MsgType Which facility type to generate
*
* \retval length on success.
* \retval -1 on error.
*/
static int encodeFacCCBSInterrogate_Result(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSInterrogate_RES *CCBSInterrogate, enum Operation MsgType)
{
int Length;
__u8 *p;
__u8 *SeqStart;
__u8 *ResultSeqStart;
p = encodeComponent_Head_Long_u8(Dest, asn1ComponentTag_Result);
p += encodeInt(p, ASN1_TAG_INTEGER, pc->u.retResult.invokeId);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[1 + ASN1_NUM_OCTETS_LONG_LENGTH_u8];
p += encodeOperationValue(p, MsgType);
ResultSeqStart = p;
ResultSeqStart[0] = ASN1_TAG_SEQUENCE;
p = &ResultSeqStart[1 + ASN1_NUM_OCTETS_LONG_LENGTH_u8];
p += encodeEnum(p, ASN1_TAG_ENUM, CCBSInterrogate->RecallMode);
if (CCBSInterrogate->NumRecords) {
p += encodeCallDetails(p, CCBSInterrogate->NumRecords, CCBSInterrogate->CallDetails);
}
/* sequence Length */
encodeLen_Long_u8(&ResultSeqStart[1], p - &ResultSeqStart[1 + ASN1_NUM_OCTETS_LONG_LENGTH_u8]);
/* sequence Length */
encodeLen_Long_u8(&SeqStart[1], p - &SeqStart[1 + ASN1_NUM_OCTETS_LONG_LENGTH_u8]);
Length = encodeComponent_Length_Long_u8(Dest, p);
return Length;
} /* end encodeFacCCBSInterrogate_Backend() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBSInterrogate facility ie.
*
* \param Dest Where to put the encoding
* \param CCBSInterrogate Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBSInterrogate(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSInterrogate *CCBSInterrogate)
{
int Length;
switch (pc->comp) {
case CompInvoke:
Length = encodeFacCCBSInterrogate_Invoke(Dest, pc, CCBSInterrogate, Fac_CCBSInterrogate);
break;
case CompReturnResult:
Length = encodeFacCCBSInterrogate_Result(Dest, pc, &pc->u.retResult.o.CCBSInterrogate, Fac_CCBSInterrogate);
break;
default:
Length = -1;
break;
} /* end switch */
return Length;
} /* end encodeFacCCBSInterrogate() */
/* ******************************************************************* */
/*!
* \brief Encode the CCNRInterrogate facility ie.
*
* \param Dest Where to put the encoding
* \param CCNRInterrogate Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCNRInterrogate(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBSInterrogate *CCNRInterrogate)
{
int Length;
switch (pc->comp) {
case CompInvoke:
Length = encodeFacCCBSInterrogate_Invoke(Dest, pc, CCNRInterrogate, Fac_CCNRInterrogate);
break;
case CompReturnResult:
Length = encodeFacCCBSInterrogate_Result(Dest, pc, &pc->u.retResult.o.CCNRInterrogate, Fac_CCNRInterrogate);
break;
default:
Length = -1;
break;
} /* end switch */
return Length;
} /* end encodeFacCCNRInterrogate() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSInterrogate invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBSInterrogate Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSInterrogate(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSInterrogate *CCBSInterrogate)
{
unsigned int CCBSReference;
INIT;
if (p < end && *p == ASN1_TAG_INTEGER) {
CallASN1(ret, p, end, ParseUnsignedInteger(pc, p, end, &CCBSReference));
CCBSInterrogate->CCBSReference = CCBSReference;
CCBSInterrogate->CCBSReferencePresent = 1;
} else {
CCBSInterrogate->CCBSReferencePresent = 0;
CCBSInterrogate->CCBSReference = 0;
}
CCBSInterrogate->AParty.LengthOfNumber = 0; /* Assume A party number not present */
XSEQUENCE_OPT_1(ParsePartyNumber_Full, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &CCBSInterrogate->AParty);
return p - beg;
} /* end ParseCCBSInterrogate() */
/* ******************************************************************* */
/*!
* \brief Parse the CCNRInterrogate invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCNRInterrogate Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCNRInterrogate(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSInterrogate *CCNRInterrogate)
{
return ParseCCBSInterrogate(pc, p, end, CCNRInterrogate);
} /* end ParseCCNRInterrogate() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBSInterrogate result parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse parameters
* \param end End buffer position that must not go past.
* \param CCBSInterrogate Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBSInterrogate_RES(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSInterrogate_RES *CCBSInterrogate)
{
unsigned int RecallMode;
INIT;
XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &RecallMode);
CCBSInterrogate->RecallMode = RecallMode;
CCBSInterrogate->NumRecords = 0;
XSEQUENCE_OPT_1(ParseCallDetails, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, CCBSInterrogate);
return p - beg;
} /* end ParseCCBSInterrogate_RES() */
/* ******************************************************************* */
/*!
* \brief Parse the CCNRInterrogate result parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse parameters
* \param end End buffer position that must not go past.
* \param CCNRInterrogate Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCNRInterrogate_RES(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBSInterrogate_RES *CCNRInterrogate)
{
return ParseCCBSInterrogate_RES(pc, p, end, CCNRInterrogate);
} /* end ParseCCNRInterrogate_RES() */
/* ******************************************************************* */
/*!
* \internal
* \brief Encode the CCBS_T_xxx event facility ie.
*
* \param Dest Where to put the encoding
* \param InvokeID
* \param OperationValue CCBS_T_xxx message type
*
* \retval length on success.
* \retval -1 on error.
*/
static int encodeFacCCBS_T_Event(__u8 * Dest, int InvokeID, enum Operation OperationValue)
{
int Length;
__u8 *p;
p = encodeComponentInvoke_Head(Dest, InvokeID, OperationValue);
Length = encodeComponent_Length(Dest, p);
return Length;
} /* end encodeFacCCBS_T_Event() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBS_T_Call facility ie.
*
* \param Dest Where to put the encoding
* \param CCBS_T_Call Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBS_T_Call(__u8 * Dest, const struct asn1_parm *pc, const void *val)
{
return encodeFacCCBS_T_Event(Dest, pc->u.inv.invokeId, Fac_CCBS_T_Call);
} /* end encodeFacCCBS_T_Call() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBS_T_Suspend facility ie.
*
* \param Dest Where to put the encoding
* \param CCBS_T_Suspend Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBS_T_Suspend(__u8 * Dest, const struct asn1_parm *pc, const void *val)
{
return encodeFacCCBS_T_Event(Dest, pc->u.inv.invokeId, Fac_CCBS_T_Suspend);
} /* end encodeFacCCBS_T_Suspend() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBS_T_Resume facility ie.
*
* \param Dest Where to put the encoding
* \param CCBS_T_Resume Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBS_T_Resume(__u8 * Dest, const struct asn1_parm *pc, const void *val)
{
return encodeFacCCBS_T_Event(Dest, pc->u.inv.invokeId, Fac_CCBS_T_Resume);
} /* end encodeFacCCBS_T_Resume() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBS_T_RemoteUserFree facility ie.
*
* \param Dest Where to put the encoding
* \param CCBS_T_RemoteUserFree Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBS_T_RemoteUserFree(__u8 * Dest, const struct asn1_parm *pc, const void *val)
{
return encodeFacCCBS_T_Event(Dest, pc->u.inv.invokeId, Fac_CCBS_T_RemoteUserFree);
} /* end encodeFacCCBS_T_RemoteUserFree() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBS_T_Available facility ie.
*
* \param Dest Where to put the encoding
* \param CCBS_T_Available Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBS_T_Available(__u8 * Dest, const struct asn1_parm *pc, const void *val)
{
return encodeFacCCBS_T_Event(Dest, pc->u.inv.invokeId, Fac_CCBS_T_Available);
} /* end encodeFacCCBS_T_Available() */
/* ******************************************************************* */
/*!
* \internal
* \brief Encode the CCBS-T/CCNR-T-Request facility ie backend.
*
* \param Dest Where to put the encoding
* \param CCBS_T_Request Information needed to encode in ie.
* \param MsgType Which facility type to generate
*
* \retval length on success.
* \retval -1 on error.
*/
static int encodeFacCCBS_T_Request_Backend(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBS_T_Request *CCBS_T_Request, __u8 RetentionSupported, enum Operation MsgType)
{
int Length;
__u8 *p;
__u8 *SeqStart;
switch (pc->comp) {
case CompInvoke:
p = encodeComponentInvoke_Head(Dest, pc->u.inv.invokeId, MsgType);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeAddress_Full(p, &CCBS_T_Request->Destination);
p += encodeQ931ie_CCBS(p, &CCBS_T_Request->Q931ie);
if (CCBS_T_Request->RetentionSupported) {
/* Not the DEFAULT value */
p += encodeBoolean(p, ASN1_TAG_CONTEXT_SPECIFIC | 1, CCBS_T_Request->RetentionSupported);
}
if (CCBS_T_Request->PresentationAllowedIndicatorPresent) {
p += encodeBoolean(p, ASN1_TAG_CONTEXT_SPECIFIC | 2,
CCBS_T_Request->PresentationAllowedIndicator);
}
if (CCBS_T_Request->Originating.Party.LengthOfNumber) {
p += encodeAddress_Full(p, &CCBS_T_Request->Originating);
}
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
break;
case CompReturnResult:
p = encodeComponent_Head(Dest, asn1ComponentTag_Result);
p += encodeInt(p, ASN1_TAG_INTEGER, pc->u.retResult.invokeId);
SeqStart = p;
SeqStart[0] = ASN1_TAG_SEQUENCE;
p = &SeqStart[2];
p += encodeOperationValue(p, MsgType);
p += encodeBoolean(p, ASN1_TAG_BOOLEAN, RetentionSupported);
/* sequence Length */
SeqStart[1] = p - &SeqStart[2];
Length = encodeComponent_Length(Dest, p);
break;
default:
Length = -1;
break;
} /* end switch */
return Length;
} /* end encodeFacCCBS_T_Request_Backend() */
/* ******************************************************************* */
/*!
* \brief Encode the CCBS_T_Request facility ie.
*
* \param Dest Where to put the encoding
* \param CCBS_T_Request Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCBS_T_Request(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBS_T_Request *CCBS_T_Request)
{
return encodeFacCCBS_T_Request_Backend(Dest, pc, CCBS_T_Request,
pc->u.retResult.o.CCBS_T_Request.RetentionSupported, Fac_CCBS_T_Request);
} /* end encodeFacCCBS_T_Request() */
/* ******************************************************************* */
/*!
* \brief Encode the CCNR_T_Request facility ie.
*
* \param Dest Where to put the encoding
* \param CCNR_T_Request Information needed to encode in ie.
*
* \retval length on success.
* \retval -1 on error.
*/
int encodeFacCCNR_T_Request(__u8 * Dest, const struct asn1_parm *pc, const struct FacCCBS_T_Request *CCNR_T_Request)
{
return encodeFacCCBS_T_Request_Backend(Dest, pc, CCNR_T_Request,
pc->u.retResult.o.CCNR_T_Request.RetentionSupported, Fac_CCNR_T_Request);
} /* end encodeFacCCNR_T_Request() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBS_T_Request invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCBS_T_Request Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBS_T_Request(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBS_T_Request *CCBS_T_Request)
{
int Value;
INIT;
XSEQUENCE_1(ParseAddress_Full, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &CCBS_T_Request->Destination);
XSEQUENCE_1(ParseQ931ie_CCBS, ASN1_TAG_APPLICATION_WIDE, 0, &CCBS_T_Request->Q931ie);
Value = 0; /* DEFAULT RetentionSupported value (FALSE) */
XSEQUENCE_OPT_1(ParseBoolean, ASN1_TAG_CONTEXT_SPECIFIC, 1, &Value);
CCBS_T_Request->RetentionSupported = Value;
if (p < end && *p == (ASN1_TAG_CONTEXT_SPECIFIC | 2)) {
CallASN1(ret, p, end, ParseBoolean(pc, p, end, &Value));
CCBS_T_Request->PresentationAllowedIndicator = Value;
CCBS_T_Request->PresentationAllowedIndicatorPresent = 1;
} else {
CCBS_T_Request->PresentationAllowedIndicator = 0;
CCBS_T_Request->PresentationAllowedIndicatorPresent = 0;
}
CCBS_T_Request->Originating.Party.LengthOfNumber = 0; /* Assume Originating party number not present */
XSEQUENCE_OPT_1(ParseAddress_Full, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &CCBS_T_Request->Originating);
return p - beg;
} /* end ParseCCBS_T_Request() */
/* ******************************************************************* */
/*!
* \brief Parse the CCNR_T_Request invoke argument parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse arguments
* \param end End buffer position that must not go past.
* \param CCNR_T_Request Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCNR_T_Request(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBS_T_Request *CCNR_T_Request)
{
return ParseCCBS_T_Request(pc, p, end, CCNR_T_Request);
} /* end ParseCCNR_T_Request() */
/* ******************************************************************* */
/*!
* \brief Parse the CCBS_T_Request result parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse parameters
* \param end End buffer position that must not go past.
* \param CCBS_T_Request Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCBS_T_Request_RES(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBS_T_Request_RES *CCBS_T_Request)
{
int RetentionSupported;
int ret;
u_char *beg;
beg = p;
XSEQUENCE_1(ParseBoolean, ASN1_TAG_BOOLEAN, ASN1_NOT_TAGGED, &RetentionSupported);
CCBS_T_Request->RetentionSupported = RetentionSupported;
return p - beg;
} /* end ParseCCBS_T_Request_RES() */
/* ******************************************************************* */
/*!
* \brief Parse the CCNR_T_Request result parameters.
*
* \param pc Complete component message storage data.
* \param p Starting buffer position to parse parameters
* \param end End buffer position that must not go past.
* \param CCNR_T_Request Parameter storage to fill.
*
* \retval length of buffer consumed
* \retval -1 on error.
*/
int ParseCCNR_T_Request_RES(struct asn1_parm *pc, u_char * p, u_char * end, struct FacCCBS_T_Request_RES *CCNR_T_Request)
{
return ParseCCBS_T_Request_RES(pc, p, end, CCNR_T_Request);
} /* end ParseCCNR_T_Request_RES() */
/* ------------------------------------------------------------------- */
/* end asn1_ccbs.c */