blob: aa29153d306d3ded16ee0e58b8400258cf9b8f2c [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
// ----------------------------------------------------------------------
//
// This Software is an original work of authorship of PacketVideo Corporation.
// Portions of the Software were developed in collaboration with NTT DoCoMo,
// Inc. or were derived from the public domain or materials licensed from
// third parties. Title and ownership, including all intellectual property
// rights in and to the Software shall remain with PacketVideo Corporation
// and NTT DoCoMo, Inc.
//
// -----------------------------------------------------------------------
//====================================================================
// FILE: codemain.c
//
// Main contact routines for PER encoding/decoding of H.245 messages.
//====================================================================
#include "h245.h"
#include "h245def.h"
#include "h245msg.h" /* H245 Message I/F Header */
#include "per.h"
#include "se.h"
#include "genericper.h"
#include "h245_decoder.h"
#include "h245_encoder.h"
#include "h245_deleter.h"
#include "h245_analysis.h"
#include "oscl_mem.h"
#include "pvlogger.h"
#include "oscl_file_io.h"
#include "oscl_mem.h"
/* ---------------------------------------- */
/* H.245 PER Analysis Routines */
/* ---------------------------------------- */
#ifdef PVANALYZER
#include "analyzeper.h"
void MultiSysCtrlMessage_analyze(uint16 tag, uint8 type1, uint8 type2, uint8* message);
void RequestMessage_analyze(uint16 tag, uint8 type2, uint8* message);
void ResponseMessage_analyze(uint16 tag, uint8 type2, uint8* message);
void CommandMessage_analyze(uint16 tag, uint8 type2, uint8* message);
void IndicationMessage_analyze(uint16 tag, uint8 type2, uint8* message);
void ShowH245Hex(uint16 tag, uint8 type1, uint8 type2, uint16 size, uint8* data);
void ShowHexData(uint16 tag, uint16 indent, uint16 size, uint8* data);
#endif //PVANALYZER
// ========================================================
// Constructor()
//
// ========================================================
OSCL_EXPORT_REF PER::PER() :
MyH245(NULL)
, MySe(NULL)
, MyLogger(NULL)
{
MyLogger = PVLogger::GetLoggerObject("3g324m.h245.per");
}
// ========================================================
// Destructor()
//
// ========================================================
OSCL_EXPORT_REF PER::~PER()
{
}
// ========================================================
// Encode()
//
// This is the main call for the PER Encoder. It encodes
// the H.245 message in pMsg, calls the analyzer functions
// as needed, and then sends the binary coded message to
// SRP.
// ========================================================
OSCL_EXPORT_REF void PER::Encode(PS_H245Msg pMsg)
{
uint16 GetSize = 0;
uint8* pCodeData;
// -----------------------
// Analyzer output
// -----------------------
#ifdef PVANALYZER
MultiSysCtrlMessage_analyze(ANALYZER_PERE, pMsg->Type1, pMsg->Type2, pMsg->pData);
#endif
// -----------------------
// Message encoding
// -----------------------
MultiSysCtrlMessage_encode(&GetSize, &pCodeData, pMsg->pData, pMsg->Type1, pMsg->Type2);
// -----------------------
// Analyzer output (HEX)
// -----------------------
#ifdef PVANALYZER
ShowH245Hex(ANALYZER_PEREH, pMsg->Type1, pMsg->Type2, GetSize, pCodeData);
#endif
// send encoded message
if (MyH245)
{
MyH245->LowerLayerTx((unsigned char*)pCodeData, (int)GetSize);
}
OSCL_DEFAULT_FREE(pCodeData);
}
// ========================================================
// Reset()
//
// ========================================================
OSCL_EXPORT_REF void PER::Reset()
{
// tells the decoder to stop processing remaining messages
decodeSizeLeft = 0;
}
class DecodedMsgDestructDealloc : public OsclDestructDealloc
{
public:
DecodedMsgDestructDealloc(uint8 amsgtype1, uint8 amsgtype2, uint8* apdata) :
msgtype1(amsgtype1), msgtype2(amsgtype2), pdata(apdata)
{}
virtual void destruct_and_dealloc(OsclAny *ptr)
{
// delete message
PER::DeleteMessage(msgtype1, msgtype2, pdata);
// destruct ref counter
((OsclRefCounterDA*)ptr)->~OsclRefCounterDA();
// destruct this
this->~DecodedMsgDestructDealloc();
// free memory holding all
OSCL_DEFAULT_FREE(ptr);
}
private:
uint8 msgtype1;
uint8 msgtype2;
uint8 *pdata;
};
// ========================================================
// Decode()
//
// ========================================================
OSCL_EXPORT_REF void PER::Decode(uint8* pBuffer, uint32 size)
{
uint8 MsgType1 = 0;
uint8 MsgType2 = 0;
uint16 GetSize = 0;
uint8* pData = NULL;
uint8* pBufferTop = NULL;
int nBytes = 0;
decodeSizeLeft = size;
// Save original start of pBuffer (for later freeing)
pBufferTop = pBuffer;
#if 0 // saved for testing purposes
Oscl_FileServer infileserv;
Oscl_File infile;
infileserv.Connect();
if (infile.Open("test.245", Oscl_File::MODE_READ, infileserv) == 0)
{
uint8 codeword[2000];
pBuffer = codeword;
decodeSizeLeft = infile.Read(codeword, 1, 2000);
infile.Close();
}
infileserv.Close();
#endif
// ----------------------------------------------------------
// Decode messages from pBuffer. There may be multiple msgs.
// ----------------------------------------------------------
while (decodeSizeLeft > 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, MyLogger, PVLOGMSG_DEBUG, (0, "PER::Decode - decodeSizeLeft(%d)", decodeSizeLeft));
// ------------------------------------
// Decode the current message to pData
// ------------------------------------
if (!Decode(nBytes, pBuffer, GetSize, pData, MsgType1, MsgType2))
{
return;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, MyLogger, PVLOGMSG_DEBUG, (0, "PER::Decode - num bytes decoded(%d), bytes:", nBytes));
PVLOGGER_LOGBIN(PVLOGMSG_INST_LLDBG, MyLogger, PVLOGMSG_DEBUG, (0, 1, nBytes, pBuffer));
#ifdef PVANALYZER
// ----------------------
// Analyzer output
// ----------------------
MultiSysCtrlMessage_analyze(ANALYZER_PERD, MsgType1, MsgType2, pData);
#endif
// ----------------------------
// Send decoded message to SE
// ----------------------------
if (GetSize)
{
// pass message up via smart pointer. Some messages are held by user.
uint8 *space = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(OsclRefCounterDA) + sizeof(DecodedMsgDestructDealloc));
DecodedMsgDestructDealloc *destructor = new(space + sizeof(OsclRefCounterDA)) DecodedMsgDestructDealloc(MsgType1, MsgType2, pData);
OsclRefCounter *decodedMsgRefCnter = new(space) OsclRefCounterDA(space, destructor);
OsclSharedPtr<uint8> decodedMsgPtr(pData, decodedMsgRefCnter);
MySe->MessageRecv(MsgType1, MsgType2, decodedMsgPtr, pBuffer, nBytes);
}
// Skip to the next message in pBuffer
decodeSizeLeft -= nBytes;
if (decodeSizeLeft < 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, MyLogger, PVLOGMSG_DEBUG, (0, "PER::Decode - decodeSizeLeft=%d", decodeSizeLeft));
}
pBuffer += nBytes;
}
// Free the original pBuffer space
OSCL_DEFAULT_FREE(pBufferTop);
}
bool PER::Decode(int& nBytes, uint8* pBuffer, uint16& GetSize, uint8*& pData,
uint8& MsgType1, uint8& MsgType2)
{
int32 leave_status = 0;
OSCL_TRY(leave_status, nBytes = MultiSysCtrlMessage_decode(pBuffer, &GetSize,
&pData, &MsgType1, &MsgType2));
OSCL_FIRST_CATCH_ANY(leave_status,
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, MyLogger, PVLOGMSG_ERR, (0, "PER::Decode - caught LEAVE during decode"));
return false;
);
return true;
}
// ========================================================
// DeleteMessage()
// Deep delete the message structure
// ========================================================
void PER::DeleteMessage(uint8 MsgType1, uint8 MsgType2, uint8* pData)
{
switch (MsgType1)
{
case 0:
S_RequestMessage request;
request.index = MsgType2;
request.nonStandard = (PS_NonStandardMessage)pData;
Delete_RequestMessage(&request);
break;
case 1:
S_ResponseMessage response;
response.index = MsgType2;
response.nonStandard = (PS_NonStandardMessage)pData;
Delete_ResponseMessage(&response);
break;
case 2:
S_CommandMessage command;
command.index = MsgType2;
command.nonStandard = (PS_NonStandardMessage)pData;
Delete_CommandMessage(&command);
break;
case 3:
S_IndicationMessage indication;
indication.index = MsgType2;
indication.nonStandard = (PS_NonStandardMessage)pData;
Delete_IndicationMessage(&indication);
break;
}
}
// ========================================================
// MultiSysCtrlMessage_encode()
//
// ========================================================
void PER::MultiSysCtrlMessage_encode(uint16* pGetSize,
uint8* *ppDataOut,
uint8* pDataIn,
uint8 type1,
uint8 type2)
{
PS_OutStream stream;
stream = NewOutStream();
PutChoiceIndex(4, 1, type1, stream);
switch (type1)
{
case 0:
RequestMessage_encode(pDataIn, type2, stream);
break;
case 1:
ResponseMessage_encode(pDataIn, type2, stream);
break;
case 2:
CommandMessage_encode(pDataIn, type2, stream);
break;
case 3:
IndicationMessage_encode(pDataIn, type2, stream);
break;
default:
ErrorMessageAndLeave("MultiSysCtrlMessage_encode: Illegal CHOICE index");
}
WriteRemainingBits(stream);
*ppDataOut = stream->data;
*pGetSize = stream->byteIndex;
OSCL_DEFAULT_FREE(stream);
return;
}
// ========================================================
// RequestMessage_encode()
//
// ========================================================
void PER::RequestMessage_encode(uint8* pDataIn,
uint8 type2,
PS_OutStream stream)
{
PutChoiceIndex(11, 1, type2, stream);
switch (type2)
{
case 0:
Encode_NonStandardMessage((PS_NonStandardMessage)pDataIn, stream);
//Delete_NonStandardMessage((PS_NonStandardMessage)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 1:
Encode_MasterSlaveDetermination((PS_MasterSlaveDetermination)pDataIn, stream);
//Delete_MasterSlaveDetermination((PS_MasterSlaveDetermination)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 2:
Encode_TerminalCapabilitySet((PS_TerminalCapabilitySet)pDataIn, stream);
//Delete_TerminalCapabilitySet((PS_TerminalCapabilitySet)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 3:
Encode_OpenLogicalChannel((PS_OpenLogicalChannel)pDataIn, stream);
//Delete_OpenLogicalChannel((PS_OpenLogicalChannel)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 4:
Encode_CloseLogicalChannel((PS_CloseLogicalChannel)pDataIn, stream);
//Delete_CloseLogicalChannel((PS_CloseLogicalChannel)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 5:
Encode_RequestChannelClose((PS_RequestChannelClose)pDataIn, stream);
//Delete_RequestChannelClose((PS_RequestChannelClose)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 6:
Encode_MultiplexEntrySend((PS_MultiplexEntrySend)pDataIn, stream);
//Delete_MultiplexEntrySend((PS_MultiplexEntrySend)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 7:
Encode_RequestMultiplexEntry((PS_RequestMultiplexEntry)pDataIn, stream);
//Delete_RequestMultiplexEntry((PS_RequestMultiplexEntry)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 8:
Encode_RequestMode((PS_RequestMode)pDataIn, stream);
//Delete_RequestMode((PS_RequestMode)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 9:
Encode_RoundTripDelayRequest((PS_RoundTripDelayRequest)pDataIn, stream);
//Delete_RoundTripDelayRequest((PS_RoundTripDelayRequest)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 10:
Encode_MaintenanceLoopRequest((PS_MaintenanceLoopRequest)pDataIn, stream);
//Delete_MaintenanceLoopRequest((PS_MaintenanceLoopRequest)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 11:
PutExtensionItem(EPASS Encode_CommunicationModeRequest, pDataIn, stream);
//Delete_CommunicationModeRequest((PS_CommunicationModeRequest)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 12:
PutExtensionItem(EPASS Encode_ConferenceRequest, pDataIn, stream);
//Delete_ConferenceRequest((PS_ConferenceRequest)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 13:
PutExtensionItem(EPASS Encode_MultilinkRequest, pDataIn, stream);
//Delete_MultilinkRequest((PS_MultilinkRequest)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 14:
PutExtensionItem(EPASS Encode_LogicalChannelRateRequest, pDataIn, stream);
//Delete_LogicalChannelRateRequest((PS_LogicalChannelRateRequest)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
default:
ErrorMessageAndLeave("Encode_RequestMessage: Illegal CHOICE index");
}
}
// ========================================================
// ResponseMessage_encode()
//
// ========================================================
void PER::ResponseMessage_encode(uint8* pDataIn,
uint8 type2,
PS_OutStream stream)
{
PutChoiceIndex(19, 1, type2, stream);
switch (type2)
{
case 0:
Encode_NonStandardMessage((PS_NonStandardMessage)pDataIn, stream);
//Delete_NonStandardMessage((PS_NonStandardMessage)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 1:
Encode_MasterSlaveDeterminationAck((PS_MasterSlaveDeterminationAck)pDataIn, stream);
//Delete_MasterSlaveDeterminationAck((PS_MasterSlaveDeterminationAck)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 2:
Encode_MasterSlaveDeterminationReject((PS_MasterSlaveDeterminationReject)pDataIn, stream);
//Delete_MasterSlaveDeterminationReject((PS_MasterSlaveDeterminationReject)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 3:
Encode_TerminalCapabilitySetAck((PS_TerminalCapabilitySetAck)pDataIn, stream);
//Delete_TerminalCapabilitySetAck((PS_TerminalCapabilitySetAck)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 4:
Encode_TerminalCapabilitySetReject((PS_TerminalCapabilitySetReject)pDataIn, stream);
//Delete_TerminalCapabilitySetReject((PS_TerminalCapabilitySetReject)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 5:
Encode_OpenLogicalChannelAck((PS_OpenLogicalChannelAck)pDataIn, stream);
//Delete_OpenLogicalChannelAck((PS_OpenLogicalChannelAck)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 6:
Encode_OpenLogicalChannelReject((PS_OpenLogicalChannelReject)pDataIn, stream);
//Delete_OpenLogicalChannelReject((PS_OpenLogicalChannelReject)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 7:
Encode_CloseLogicalChannelAck((PS_CloseLogicalChannelAck)pDataIn, stream);
//Delete_CloseLogicalChannelAck((PS_CloseLogicalChannelAck)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 8:
Encode_RequestChannelCloseAck((PS_RequestChannelCloseAck)pDataIn, stream);
//Delete_RequestChannelCloseAck((PS_RequestChannelCloseAck)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 9:
Encode_RequestChannelCloseReject((PS_RequestChannelCloseReject)pDataIn, stream);
//Delete_RequestChannelCloseReject((PS_RequestChannelCloseReject)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 10:
Encode_MultiplexEntrySendAck((PS_MultiplexEntrySendAck)pDataIn, stream);
//Delete_MultiplexEntrySendAck((PS_MultiplexEntrySendAck)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 11:
Encode_MultiplexEntrySendReject((PS_MultiplexEntrySendReject)pDataIn, stream);
//Delete_MultiplexEntrySendReject((PS_MultiplexEntrySendReject)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 12:
Encode_RequestMultiplexEntryAck((PS_RequestMultiplexEntryAck)pDataIn, stream);
//Delete_RequestMultiplexEntryAck((PS_RequestMultiplexEntryAck)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 13:
Encode_RequestMultiplexEntryReject((PS_RequestMultiplexEntryReject)pDataIn, stream);
//Delete_RequestMultiplexEntryReject((PS_RequestMultiplexEntryReject)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 14:
Encode_RequestModeAck((PS_RequestModeAck)pDataIn, stream);
//Delete_RequestModeAck((PS_RequestModeAck)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 15:
Encode_RequestModeReject((PS_RequestModeReject)pDataIn, stream);
//Delete_RequestModeReject((PS_RequestModeReject)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 16:
Encode_RoundTripDelayResponse((PS_RoundTripDelayResponse)pDataIn, stream);
//Delete_RoundTripDelayResponse((PS_RoundTripDelayResponse)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 17:
Encode_MaintenanceLoopAck((PS_MaintenanceLoopAck)pDataIn, stream);
//Delete_MaintenanceLoopAck((PS_MaintenanceLoopAck)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 18:
Encode_MaintenanceLoopReject((PS_MaintenanceLoopReject)pDataIn, stream);
//Delete_MaintenanceLoopReject((PS_MaintenanceLoopReject)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 19:
PutExtensionItem(EPASS Encode_CommunicationModeResponse, pDataIn, stream);
//Delete_CommunicationModeResponse((PS_CommunicationModeResponse)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 20:
PutExtensionItem(EPASS Encode_ConferenceResponse, pDataIn, stream);
//Delete_ConferenceResponse((PS_ConferenceResponse)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 21:
PutExtensionItem(EPASS Encode_MultilinkResponse, pDataIn, stream);
//Delete_MultilinkResponse((PS_MultilinkResponse)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 22:
PutExtensionItem(EPASS Encode_LogicalChannelRateAcknowledge, pDataIn, stream);
//Delete_LogicalChannelRateAcknowledge((PS_LogicalChannelRateAcknowledge)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 23:
PutExtensionItem(EPASS Encode_LogicalChannelRateReject, pDataIn, stream);
//Delete_LogicalChannelRateReject((PS_LogicalChannelRateReject)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
default:
ErrorMessageAndLeave("Encode_ResponseMessage: Illegal CHOICE index");
}
}
// ========================================================
// CommandMessage_encode()
//
// ========================================================
void PER::CommandMessage_encode(uint8* pDataIn,
uint8 type2,
PS_OutStream stream)
{
PutChoiceIndex(7, 1, type2, stream);
switch (type2)
{
case 0:
Encode_NonStandardMessage((PS_NonStandardMessage)pDataIn, stream);
//Delete_NonStandardMessage((PS_NonStandardMessage)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 1:
Encode_MaintenanceLoopOffCommand((PS_MaintenanceLoopOffCommand)pDataIn, stream);
//Delete_MaintenanceLoopOffCommand((PS_MaintenanceLoopOffCommand)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 2:
Encode_SendTerminalCapabilitySet((PS_SendTerminalCapabilitySet)pDataIn, stream);
//Delete_SendTerminalCapabilitySet((PS_SendTerminalCapabilitySet)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 3:
Encode_EncryptionCommand((PS_EncryptionCommand)pDataIn, stream);
//Delete_EncryptionCommand((PS_EncryptionCommand)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 4:
Encode_FlowControlCommand((PS_FlowControlCommand)pDataIn, stream);
//Delete_FlowControlCommand((PS_FlowControlCommand)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 5:
Encode_EndSessionCommand((PS_EndSessionCommand)pDataIn, stream);
//Delete_EndSessionCommand((PS_EndSessionCommand)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 6:
Encode_MiscellaneousCommand((PS_MiscellaneousCommand)pDataIn, stream);
//Delete_MiscellaneousCommand((PS_MiscellaneousCommand)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 7:
PutExtensionItem(EPASS Encode_CommunicationModeCommand, pDataIn, stream);
//Delete_CommunicationModeCommand((PS_CommunicationModeCommand)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 8:
PutExtensionItem(EPASS Encode_ConferenceCommand, pDataIn, stream);
//Delete_ConferenceCommand((PS_ConferenceCommand)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 9:
PutExtensionItem(EPASS Encode_H223MultiplexReconfiguration, pDataIn, stream);
//Delete_H223MultiplexReconfiguration((PS_H223MultiplexReconfiguration)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 10:
PutExtensionItem(EPASS Encode_NewATMVCCommand, pDataIn, stream);
//Delete_NewATMVCCommand((PS_NewATMVCCommand)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
default:
ErrorMessageAndLeave("Encode_CommandMessage: Illegal CHOICE index");
}
}
// ========================================================
// IndicationMessage_encode()
//
// ========================================================
void PER::IndicationMessage_encode(uint8* pDataIn,
uint8 type2,
PS_OutStream stream)
{
PutChoiceIndex(14, 1, type2, stream);
switch (type2)
{
case 0:
Encode_NonStandardMessage((PS_NonStandardMessage)pDataIn, stream);
//Delete_NonStandardMessage((PS_NonStandardMessage)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 1:
Encode_FunctionNotUnderstood((PS_FunctionNotUnderstood)pDataIn, stream);
//Delete_FunctionNotUnderstood((PS_FunctionNotUnderstood)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 2:
Encode_MasterSlaveDeterminationRelease((PS_MasterSlaveDeterminationRelease)pDataIn, stream);
//Delete_MasterSlaveDeterminationRelease((PS_MasterSlaveDeterminationRelease)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 3:
Encode_TerminalCapabilitySetRelease((PS_TerminalCapabilitySetRelease)pDataIn, stream);
//Delete_TerminalCapabilitySetRelease((PS_TerminalCapabilitySetRelease)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 4:
Encode_OpenLogicalChannelConfirm((PS_OpenLogicalChannelConfirm)pDataIn, stream);
//Delete_OpenLogicalChannelConfirm((PS_OpenLogicalChannelConfirm)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 5:
Encode_RequestChannelCloseRelease((PS_RequestChannelCloseRelease)pDataIn, stream);
//Delete_RequestChannelCloseRelease((PS_RequestChannelCloseRelease)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 6:
Encode_MultiplexEntrySendRelease((PS_MultiplexEntrySendRelease)pDataIn, stream);
//Delete_MultiplexEntrySendRelease((PS_MultiplexEntrySendRelease)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 7:
Encode_RequestMultiplexEntryRelease((PS_RequestMultiplexEntryRelease)pDataIn, stream);
//Delete_RequestMultiplexEntryRelease((PS_RequestMultiplexEntryRelease)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 8:
Encode_RequestModeRelease((PS_RequestModeRelease)pDataIn, stream);
//Delete_RequestModeRelease((PS_RequestModeRelease)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 9:
Encode_MiscellaneousIndication((PS_MiscellaneousIndication)pDataIn, stream);
//Delete_MiscellaneousIndication((PS_MiscellaneousIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 10:
Encode_JitterIndication((PS_JitterIndication)pDataIn, stream);
//Delete_JitterIndication((PS_JitterIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 11:
Encode_H223SkewIndication((PS_H223SkewIndication)pDataIn, stream);
//Delete_H223SkewIndication((PS_H223SkewIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 12:
Encode_NewATMVCIndication((PS_NewATMVCIndication)pDataIn, stream);
//Delete_NewATMVCIndication((PS_NewATMVCIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 13:
Encode_UserInputIndication((PS_UserInputIndication)pDataIn, stream);
//Delete_UserInputIndication((PS_UserInputIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 14:
PutExtensionItem(EPASS Encode_H2250MaximumSkewIndication, pDataIn, stream);
//Delete_H2250MaximumSkewIndication((PS_H2250MaximumSkewIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 15:
PutExtensionItem(EPASS Encode_MCLocationIndication, pDataIn, stream);
//Delete_MCLocationIndication((PS_MCLocationIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 16:
PutExtensionItem(EPASS Encode_ConferenceIndication, pDataIn, stream);
//Delete_ConferenceIndication((PS_ConferenceIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 17:
PutExtensionItem(EPASS Encode_VendorIdentification, pDataIn, stream);
//Delete_VendorIdentification((PS_VendorIdentification)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 18:
PutExtensionItem(EPASS Encode_FunctionNotSupported, pDataIn, stream);
//Delete_FunctionNotSupported((PS_FunctionNotSupported)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 19:
PutExtensionItem(EPASS Encode_MultilinkIndication, pDataIn, stream);
//Delete_MultilinkIndication((PS_MultilinkIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 20:
PutExtensionItem(EPASS Encode_LogicalChannelRateRelease, pDataIn, stream);
//Delete_LogicalChannelRateRelease((PS_LogicalChannelRateRelease)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
case 21:
PutExtensionItem(EPASS Encode_FlowControlIndication, pDataIn, stream);
//Delete_FlowControlIndication((PS_FlowControlIndication)pDataIn);
//OSCL_DEFAULT_FREE(pDataIn);
break;
default:
ErrorMessageAndLeave("Encode_IndicationMessage: Illegal CHOICE index");
}
}
// ========================================================
// MultiSysCtrlMessage_decode()
//
// ========================================================
int PER::MultiSysCtrlMessage_decode(uint8* pDataIn,
uint16* pGetSize,
uint8* *ppDataOut,
uint8* pType1,
uint8* pType2)
{
PS_InStream stream;
stream = (PS_InStream) OSCL_DEFAULT_MALLOC(sizeof(S_InStream));
stream->bitIndex = 0;
stream->data = pDataIn;
*pType1 = (uint8)GetChoiceIndex(4, 1, stream);
switch (*pType1)
{
case 0:
RequestMessage_decode(ppDataOut, pType2, stream);
break;
case 1:
ResponseMessage_decode(ppDataOut, pType2, stream);
break;
case 2:
CommandMessage_decode(ppDataOut, pType2, stream);
break;
case 3:
IndicationMessage_decode(ppDataOut, pType2, stream);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
default:
ErrorMessage("MultiSysCtrlMessage_decode: Unsupported extension (skipping)");
SkipOneExtension(stream);
}
ReadRemainingBits(stream);
*pGetSize = (uint16)(stream->data - pDataIn);
OSCL_DEFAULT_FREE(stream);
return *pGetSize;
}
// ========================================================
// RequestMessage_decode()
//
// ========================================================
void PER::RequestMessage_decode(uint8* *ppDataOut, uint8* pType2, PS_InStream stream)
{
*pType2 = (uint8)GetChoiceIndex(11, 1, stream);
switch (*pType2)
{
case 0:
*ppDataOut = (uint8*) OSCL_DEFAULT_MALLOC(sizeof(S_NonStandardMessage));
Decode_NonStandardMessage((PS_NonStandardMessage) *ppDataOut, stream);
break;
case 1:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MasterSlaveDetermination));
Decode_MasterSlaveDetermination((PS_MasterSlaveDetermination) *ppDataOut, stream);
break;
case 2:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_TerminalCapabilitySet));
Decode_TerminalCapabilitySet((PS_TerminalCapabilitySet) *ppDataOut, stream);
break;
case 3:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_OpenLogicalChannel));
Decode_OpenLogicalChannel((PS_OpenLogicalChannel) *ppDataOut, stream);
break;
case 4:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_CloseLogicalChannel));
Decode_CloseLogicalChannel((PS_CloseLogicalChannel) *ppDataOut, stream);
break;
case 5:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestChannelClose));
Decode_RequestChannelClose((PS_RequestChannelClose) *ppDataOut, stream);
break;
case 6:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MultiplexEntrySend));
Decode_MultiplexEntrySend((PS_MultiplexEntrySend) *ppDataOut, stream);
break;
case 7:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestMultiplexEntry));
Decode_RequestMultiplexEntry((PS_RequestMultiplexEntry) *ppDataOut, stream);
break;
case 8:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestMode));
Decode_RequestMode((PS_RequestMode) *ppDataOut, stream);
break;
case 9:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RoundTripDelayRequest));
Decode_RoundTripDelayRequest((PS_RoundTripDelayRequest) *ppDataOut, stream);
break;
case 10:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MaintenanceLoopRequest));
Decode_MaintenanceLoopRequest((PS_MaintenanceLoopRequest) *ppDataOut, stream);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 11:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_CommunicationModeRequest));
Decode_CommunicationModeRequest((PS_CommunicationModeRequest) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 12:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_ConferenceRequest));
Decode_ConferenceRequest((PS_ConferenceRequest) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 13:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MultilinkRequest));
Decode_MultilinkRequest((PS_MultilinkRequest) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 14:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_LogicalChannelRateRequest));
Decode_LogicalChannelRateRequest((PS_LogicalChannelRateRequest) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
default:
ErrorMessage("Decode_RequestMessage: Unsupported extension (skipping)");
SkipOneExtension(stream);
}
}
// ========================================================
// ResponseMessage_decode()
//
// ========================================================
void PER::ResponseMessage_decode(uint8* *ppDataOut, uint8* pType2, PS_InStream stream)
{
*pType2 = (uint8) GetChoiceIndex(19, 1, stream);
switch (*pType2)
{
case 0:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_NonStandardMessage));
Decode_NonStandardMessage((PS_NonStandardMessage) *ppDataOut, stream);
break;
case 1:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MasterSlaveDeterminationAck));
Decode_MasterSlaveDeterminationAck((PS_MasterSlaveDeterminationAck) *ppDataOut, stream);
break;
case 2:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MasterSlaveDeterminationReject));
Decode_MasterSlaveDeterminationReject((PS_MasterSlaveDeterminationReject) *ppDataOut, stream);
break;
case 3:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_TerminalCapabilitySetAck));
Decode_TerminalCapabilitySetAck((PS_TerminalCapabilitySetAck) *ppDataOut, stream);
break;
case 4:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_TerminalCapabilitySetReject));
Decode_TerminalCapabilitySetReject((PS_TerminalCapabilitySetReject) *ppDataOut, stream);
break;
case 5:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_OpenLogicalChannelAck));
Decode_OpenLogicalChannelAck((PS_OpenLogicalChannelAck) *ppDataOut, stream);
break;
case 6:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_OpenLogicalChannelReject));
Decode_OpenLogicalChannelReject((PS_OpenLogicalChannelReject) *ppDataOut, stream);
break;
case 7:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_CloseLogicalChannelAck));
Decode_CloseLogicalChannelAck((PS_CloseLogicalChannelAck) *ppDataOut, stream);
break;
case 8:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestChannelCloseAck));
Decode_RequestChannelCloseAck((PS_RequestChannelCloseAck) *ppDataOut, stream);
break;
case 9:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestChannelCloseReject));
Decode_RequestChannelCloseReject((PS_RequestChannelCloseReject) *ppDataOut, stream);
break;
case 10:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MultiplexEntrySendAck));
Decode_MultiplexEntrySendAck((PS_MultiplexEntrySendAck) *ppDataOut, stream);
break;
case 11:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MultiplexEntrySendReject));
Decode_MultiplexEntrySendReject((PS_MultiplexEntrySendReject) *ppDataOut, stream);
break;
case 12:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestMultiplexEntryAck));
Decode_RequestMultiplexEntryAck((PS_RequestMultiplexEntryAck) *ppDataOut, stream);
break;
case 13:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestMultiplexEntryReject));
Decode_RequestMultiplexEntryReject((PS_RequestMultiplexEntryReject) *ppDataOut, stream);
break;
case 14:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestModeAck));
Decode_RequestModeAck((PS_RequestModeAck) *ppDataOut, stream);
break;
case 15:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestModeReject));
Decode_RequestModeReject((PS_RequestModeReject) *ppDataOut, stream);
break;
case 16:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RoundTripDelayResponse));
Decode_RoundTripDelayResponse((PS_RoundTripDelayResponse) *ppDataOut, stream);
break;
case 17:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MaintenanceLoopAck));
Decode_MaintenanceLoopAck((PS_MaintenanceLoopAck) *ppDataOut, stream);
break;
case 18:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MaintenanceLoopReject));
Decode_MaintenanceLoopReject((PS_MaintenanceLoopReject) *ppDataOut, stream);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 19:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_CommunicationModeResponse));
Decode_CommunicationModeResponse((PS_CommunicationModeResponse) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 20:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_ConferenceResponse));
Decode_ConferenceResponse((PS_ConferenceResponse) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 21:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MultilinkResponse));
Decode_MultilinkResponse((PS_MultilinkResponse) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 22:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_LogicalChannelRateAcknowledge));
Decode_LogicalChannelRateAcknowledge((PS_LogicalChannelRateAcknowledge) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 23:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_LogicalChannelRateReject));
Decode_LogicalChannelRateReject((PS_LogicalChannelRateReject) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
default:
ErrorMessage("Decode_ResponseMessage: Unsupported extension (skipping)");
SkipOneExtension(stream);
}
}
// ========================================================
// CommandMessage_decode()
//
// ========================================================
void PER::CommandMessage_decode(uint8* *ppDataOut, uint8* pType2, PS_InStream stream)
{
*pType2 = (uint8) GetChoiceIndex(7, 1, stream);
switch (*pType2)
{
case 0:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_NonStandardMessage));
Decode_NonStandardMessage((PS_NonStandardMessage) *ppDataOut, stream);
break;
case 1:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MaintenanceLoopOffCommand));
Decode_MaintenanceLoopOffCommand((PS_MaintenanceLoopOffCommand) *ppDataOut, stream);
break;
case 2:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_SendTerminalCapabilitySet));
Decode_SendTerminalCapabilitySet((PS_SendTerminalCapabilitySet) *ppDataOut, stream);
break;
case 3:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_EncryptionCommand));
Decode_EncryptionCommand((PS_EncryptionCommand) *ppDataOut, stream);
break;
case 4:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_FlowControlCommand));
Decode_FlowControlCommand((PS_FlowControlCommand) *ppDataOut, stream);
break;
case 5:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_EndSessionCommand));
Decode_EndSessionCommand((PS_EndSessionCommand) *ppDataOut, stream);
break;
case 6:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MiscellaneousCommand));
Decode_MiscellaneousCommand((PS_MiscellaneousCommand) *ppDataOut, stream);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 7:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_CommunicationModeCommand));
Decode_CommunicationModeCommand((PS_CommunicationModeCommand) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 8:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_ConferenceCommand));
Decode_ConferenceCommand((PS_ConferenceCommand) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 9:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_H223MultiplexReconfiguration));
Decode_H223MultiplexReconfiguration((PS_H223MultiplexReconfiguration) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 10:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_NewATMVCCommand));
Decode_NewATMVCCommand((PS_NewATMVCCommand) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
default:
ErrorMessage("Decode_CommandMessage: Unsupported extension (skipping)");
SkipOneExtension(stream);
}
}
// ========================================================
// IndicationMessage_decode()
//
// ========================================================
void PER::IndicationMessage_decode(uint8* *ppDataOut, uint8* pType2, PS_InStream stream)
{
*pType2 = (uint8)GetChoiceIndex(14, 1, stream);
switch (*pType2)
{
case 0:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_NonStandardMessage));
Decode_NonStandardMessage((PS_NonStandardMessage) *ppDataOut, stream);
break;
case 1:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_FunctionNotUnderstood));
Decode_FunctionNotUnderstood((PS_FunctionNotUnderstood) *ppDataOut, stream);
break;
case 2:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MasterSlaveDeterminationRelease));
Decode_MasterSlaveDeterminationRelease((PS_MasterSlaveDeterminationRelease) *ppDataOut, stream);
break;
case 3:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_TerminalCapabilitySetRelease));
Decode_TerminalCapabilitySetRelease((PS_TerminalCapabilitySetRelease) *ppDataOut, stream);
break;
case 4:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_OpenLogicalChannelConfirm));
Decode_OpenLogicalChannelConfirm((PS_OpenLogicalChannelConfirm) *ppDataOut, stream);
break;
case 5:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestChannelCloseRelease));
Decode_RequestChannelCloseRelease((PS_RequestChannelCloseRelease) *ppDataOut, stream);
break;
case 6:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MultiplexEntrySendRelease));
Decode_MultiplexEntrySendRelease((PS_MultiplexEntrySendRelease) *ppDataOut, stream);
break;
case 7:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestMultiplexEntryRelease));
Decode_RequestMultiplexEntryRelease((PS_RequestMultiplexEntryRelease) *ppDataOut, stream);
break;
case 8:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_RequestModeRelease));
Decode_RequestModeRelease((PS_RequestModeRelease) *ppDataOut, stream);
break;
case 9:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MiscellaneousIndication));
Decode_MiscellaneousIndication((PS_MiscellaneousIndication) *ppDataOut, stream);
break;
case 10:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_JitterIndication));
Decode_JitterIndication((PS_JitterIndication) *ppDataOut, stream);
break;
case 11:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_H223SkewIndication));
Decode_H223SkewIndication((PS_H223SkewIndication) *ppDataOut, stream);
break;
case 12:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_NewATMVCIndication));
Decode_NewATMVCIndication((PS_NewATMVCIndication) *ppDataOut, stream);
break;
case 13:
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_UserInputIndication));
Decode_UserInputIndication((PS_UserInputIndication) *ppDataOut, stream);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 14:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_H2250MaximumSkewIndication));
Decode_H2250MaximumSkewIndication((PS_H2250MaximumSkewIndication) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 15:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MCLocationIndication));
Decode_MCLocationIndication((PS_MCLocationIndication) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 16:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_ConferenceIndication));
Decode_ConferenceIndication((PS_ConferenceIndication) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 17:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_VendorIdentification));
Decode_VendorIdentification((PS_VendorIdentification) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 18:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_FunctionNotSupported));
Decode_FunctionNotSupported((PS_FunctionNotSupported) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 19:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_MultilinkIndication));
Decode_MultilinkIndication((PS_MultilinkIndication) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 20:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_LogicalChannelRateRelease));
Decode_LogicalChannelRateRelease((PS_LogicalChannelRateRelease) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
case 21:
GetLengthDet(stream);
*ppDataOut = (uint8*)OSCL_DEFAULT_MALLOC(sizeof(S_FlowControlIndication));
Decode_FlowControlIndication((PS_FlowControlIndication) *ppDataOut, stream);
ReadRemainingBits(stream);
break;
default:
ErrorMessage("Decode_IndicationMessage: Unsupported extension (skipping)");
SkipOneExtension(stream);
}
}
#ifdef PVANALYZER
/* ---------------------------------------- */
/* ---------------------------------------- */
/* (RAN) H.245 PER Analysis Routines */
/* ---------------------------------------- */
/* ---------------------------------------- */
/* ======================================================= */
/* PER Analysis for Top Level H.245 Messages (RAN) */
/* Input Arguments: */
/* uint16 tag; Identifies source of message */
/* uint8 type1,type2; Choice indices (top 2 levels) */
/* uint8* message; Message data */
/* ======================================================= */
void MultiSysCtrlMessage_analyze(uint16 tag, uint8 type1, uint8 type2, uint8* message)
{
Show245(tag, 0, "<============= BEGIN H.245 MESSAGE ANALYSIS =============>");
switch (type1)
{
case 0:
RequestMessage_analyze(tag, type2, message);
break;
case 1:
ResponseMessage_analyze(tag, type2, message);
break;
case 2:
CommandMessage_analyze(tag, type2, message);
break;
case 3:
IndicationMessage_analyze(tag, type2, message);
break;
default:
ErrorMessage("MultiSysCtrlMessage_analyze: Illegal CHOICE index");
}
Show245(tag, 0, "<============== END H.245 MESSAGE ANALYSIS ==============>");
Show245(tag, 0, " ");
}
/* ================================================= */
/* PER Analysis for RequestMessage (RAN) */
/* ================================================= */
void RequestMessage_analyze(uint16 tag, uint8 type2, uint8* message)
{
int8 origin[] = "requestMessage";
switch (type2)
{
case 0:
Analyze_NonStandardMessage((PS_NonStandardMessage)message, origin, tag, 0);
break;
case 1:
Analyze_MasterSlaveDetermination((PS_MasterSlaveDetermination)message, origin, tag, 0);
break;
case 2:
Analyze_TerminalCapabilitySet((PS_TerminalCapabilitySet)message, origin, tag, 0);
break;
case 3:
Analyze_OpenLogicalChannel((PS_OpenLogicalChannel)message, origin, tag, 0);
break;
case 4:
Analyze_CloseLogicalChannel((PS_CloseLogicalChannel)message, origin, tag, 0);
break;
case 5:
Analyze_RequestChannelClose((PS_RequestChannelClose)message, origin, tag, 0);
break;
case 6:
Analyze_MultiplexEntrySend((PS_MultiplexEntrySend)message, origin, tag, 0);
break;
case 7:
Analyze_RequestMultiplexEntry((PS_RequestMultiplexEntry)message, origin, tag, 0);
break;
case 8:
Analyze_RequestMode((PS_RequestMode)message, origin, tag, 0);
break;
case 9:
Analyze_RoundTripDelayRequest((PS_RoundTripDelayRequest)message, origin, tag, 0);
break;
case 10:
Analyze_MaintenanceLoopRequest((PS_MaintenanceLoopRequest)message, origin, tag, 0);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 11:
Analyze_CommunicationModeRequest((PS_CommunicationModeRequest)message, origin, tag, 0);
break;
case 12:
Analyze_ConferenceRequest((PS_ConferenceRequest)message, origin, tag, 0);
break;
case 13:
Analyze_MultilinkRequest((PS_MultilinkRequest)message, origin, tag, 0);
break;
case 14:
Analyze_LogicalChannelRateRequest((PS_LogicalChannelRateRequest)message, origin, tag, 0);
break;
default:
ErrorMessage("RequestMessage_analyze: Illegal CHOICE index");
}
}
/* ================================================= */
/* PER Analysis for ResponseMessage (RAN) */
/* ================================================= */
void ResponseMessage_analyze(uint16 tag, uint8 type2, uint8* message)
{
int8 origin[] = "responseMessage";
switch (type2)
{
case 0:
Analyze_NonStandardMessage((PS_NonStandardMessage)message, origin, tag, 0);
break;
case 1:
Analyze_MasterSlaveDeterminationAck((PS_MasterSlaveDeterminationAck)message, origin, tag, 0);
break;
case 2:
Analyze_MasterSlaveDeterminationReject((PS_MasterSlaveDeterminationReject)message, origin, tag, 0);
break;
case 3:
Analyze_TerminalCapabilitySetAck((PS_TerminalCapabilitySetAck)message, origin, tag, 0);
break;
case 4:
Analyze_TerminalCapabilitySetReject((PS_TerminalCapabilitySetReject)message, origin, tag, 0);
break;
case 5:
Analyze_OpenLogicalChannelAck((PS_OpenLogicalChannelAck)message, origin, tag, 0);
break;
case 6:
Analyze_OpenLogicalChannelReject((PS_OpenLogicalChannelReject)message, origin, tag, 0);
break;
case 7:
Analyze_CloseLogicalChannelAck((PS_CloseLogicalChannelAck)message, origin, tag, 0);
break;
case 8:
Analyze_RequestChannelCloseAck((PS_RequestChannelCloseAck)message, origin, tag, 0);
break;
case 9:
Analyze_RequestChannelCloseReject((PS_RequestChannelCloseReject)message, origin, tag, 0);
break;
case 10:
Analyze_MultiplexEntrySendAck((PS_MultiplexEntrySendAck)message, origin, tag, 0);
break;
case 11:
Analyze_MultiplexEntrySendReject((PS_MultiplexEntrySendReject)message, origin, tag, 0);
break;
case 12:
Analyze_RequestMultiplexEntryAck((PS_RequestMultiplexEntryAck)message, origin, tag, 0);
break;
case 13:
Analyze_RequestMultiplexEntryReject((PS_RequestMultiplexEntryReject)message, origin, tag, 0);
break;
case 14:
Analyze_RequestModeAck((PS_RequestModeAck)message, origin, tag, 0);
break;
case 15:
Analyze_RequestModeReject((PS_RequestModeReject)message, origin, tag, 0);
break;
case 16:
Analyze_RoundTripDelayResponse((PS_RoundTripDelayResponse)message, origin, tag, 0);
break;
case 17:
Analyze_MaintenanceLoopAck((PS_MaintenanceLoopAck)message, origin, tag, 0);
break;
case 18:
Analyze_MaintenanceLoopReject((PS_MaintenanceLoopReject)message, origin, tag, 0);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 19:
Analyze_CommunicationModeResponse((PS_CommunicationModeResponse)message, origin, tag, 0);
break;
case 20:
Analyze_ConferenceResponse((PS_ConferenceResponse)message, origin, tag, 0);
break;
case 21:
Analyze_MultilinkResponse((PS_MultilinkResponse)message, origin, tag, 0);
break;
case 22:
Analyze_LogicalChannelRateAcknowledge((PS_LogicalChannelRateAcknowledge)message, origin, tag, 0);
break;
case 23:
Analyze_LogicalChannelRateReject((PS_LogicalChannelRateReject)message, origin, tag, 0);
break;
default:
ErrorMessage("ResponseMessage_analyze: Illegal CHOICE index");
}
}
/* ================================================= */
/* PER Analysis for CommandMessage (RAN) */
/* ================================================= */
void CommandMessage_analyze(uint16 tag, uint8 type2, uint8* message)
{
int8 origin[] = "commandMessage";
switch (type2)
{
case 0:
Analyze_NonStandardMessage((PS_NonStandardMessage)message, origin, tag, 0);
break;
case 1:
Analyze_MaintenanceLoopOffCommand((PS_MaintenanceLoopOffCommand)message, origin, tag, 0);
break;
case 2:
Analyze_SendTerminalCapabilitySet((PS_SendTerminalCapabilitySet)message, origin, tag, 0);
break;
case 3:
Analyze_EncryptionCommand((PS_EncryptionCommand)message, origin, tag, 0);
break;
case 4:
Analyze_FlowControlCommand((PS_FlowControlCommand)message, origin, tag, 0);
break;
case 5:
Analyze_EndSessionCommand((PS_EndSessionCommand)message, origin, tag, 0);
break;
case 6:
Analyze_MiscellaneousCommand((PS_MiscellaneousCommand)message, origin, tag, 0);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 7:
Analyze_CommunicationModeCommand((PS_CommunicationModeCommand)message, origin, tag, 0);
break;
case 8:
Analyze_ConferenceCommand((PS_ConferenceCommand)message, origin, tag, 0);
break;
case 9:
Analyze_H223MultiplexReconfiguration((PS_H223MultiplexReconfiguration)message, origin, tag, 0);
break;
case 10:
Analyze_NewATMVCCommand((PS_NewATMVCCommand)message, origin, tag, 0);
break;
default:
ErrorMessage("CommandMessage_analyze: Illegal CHOICE index");
}
}
/* ================================================= */
/* PER Analysis for IndicationMessage (RAN) */
/* ================================================= */
void IndicationMessage_analyze(uint16 tag, uint8 type2, uint8* message)
{
int8 origin[] = "indicationMessage";
switch (type2)
{
case 0:
Analyze_NonStandardMessage((PS_NonStandardMessage)message, origin, tag, 0);
break;
case 1:
Analyze_FunctionNotUnderstood((PS_FunctionNotUnderstood)message, origin, tag, 0);
break;
case 2:
Analyze_MasterSlaveDeterminationRelease((PS_MasterSlaveDeterminationRelease)message, origin, tag, 0);
break;
case 3:
Analyze_TerminalCapabilitySetRelease((PS_TerminalCapabilitySetRelease)message, origin, tag, 0);
break;
case 4:
Analyze_OpenLogicalChannelConfirm((PS_OpenLogicalChannelConfirm)message, origin, tag, 0);
break;
case 5:
Analyze_RequestChannelCloseRelease((PS_RequestChannelCloseRelease)message, origin, tag, 0);
break;
case 6:
Analyze_MultiplexEntrySendRelease((PS_MultiplexEntrySendRelease)message, origin, tag, 0);
break;
case 7:
Analyze_RequestMultiplexEntryRelease((PS_RequestMultiplexEntryRelease)message, origin, tag, 0);
break;
case 8:
Analyze_RequestModeRelease((PS_RequestModeRelease)message, origin, tag, 0);
break;
case 9:
Analyze_MiscellaneousIndication((PS_MiscellaneousIndication)message, origin, tag, 0);
break;
case 10:
Analyze_JitterIndication((PS_JitterIndication)message, origin, tag, 0);
break;
case 11:
Analyze_H223SkewIndication((PS_H223SkewIndication)message, origin, tag, 0);
break;
case 12:
Analyze_NewATMVCIndication((PS_NewATMVCIndication)message, origin, tag, 0);
break;
case 13:
Analyze_UserInputIndication((PS_UserInputIndication)message, origin, tag, 0);
break;
/* ------------------------------- */
/* ---- Extension Begins Here ---- */
/* ------------------------------- */
case 14:
Analyze_H2250MaximumSkewIndication((PS_H2250MaximumSkewIndication)message, origin, tag, 0);
break;
case 15:
Analyze_MCLocationIndication((PS_MCLocationIndication)message, origin, tag, 0);
break;
case 16:
Analyze_ConferenceIndication((PS_ConferenceIndication)message, origin, tag, 0);
break;
case 17:
Analyze_VendorIdentification((PS_VendorIdentification)message, origin, tag, 0);
break;
case 18:
Analyze_FunctionNotSupported((PS_FunctionNotSupported)message, origin, tag, 0);
break;
case 19:
Analyze_MultilinkIndication((PS_MultilinkIndication)message, origin, tag, 0);
break;
case 20:
Analyze_LogicalChannelRateRelease((PS_LogicalChannelRateRelease)message, origin, tag, 0);
break;
case 21:
Analyze_FlowControlIndication((PS_FlowControlIndication)message, origin, tag, 0);
break;
default:
ErrorMessage("IndicationMessage_analyze: Illegal CHOICE index");
}
}
/*********************************************/
/* Text Descriptions of Codewords */
/* (For printing to codeword.txt) */
/*********************************************/
char *EncodeDescription[ 4][ 24 ] =
{
/* Request Message */
{ "NonStandardMessage", /* 0: NonStandardMessage */
"MasterSlaveDetermination", /* 1: MasterSlaveDetermination */
"TerminalCapabilitySet", /* 2: TerminalCapabilitySet */
"OpenLogicalChannel", /* 3: OpenLogicalChannel */
"CloseLogicalChannel", /* 4: CloseLogicalChannel */
"RequestChannelClose", /* 5: RequestChannelClose */
"MultiplexEntrySend", /* 6: MultiplexEntrySend */
"RequestMultiplexEntry", /* 7: RequestMultiplexEntry */
"RequestMode", /* 8: RequestMode */
"RoundTripDelayRequest", /* 9: RoundTripDelayRequest */
"MaintenanceLoopRequest", /* A: MaintenanceLoopRequest */
"CommunicationModeRequest", /* B: CommunicationModeRequest */
"ConferenceRequest", /* C: ConferenceRequest */
"H223AnnexAReConfiguration", /* D: H223AnnexAReconfiguration */
"(Not Defined)", /* E: ( Not Define ) */
"(Not Defined)", /* 10: ( Not Define ) */
"(Not Defined)", /* 11: ( Not Define ) */
"(Not Defined)", /* 12: ( Not Define ) */
"(Not Defined)", /* 13: ( Not Define ) */
"(Not Defined)", /* 14: ( Not Define ) */
"(Not Defined)", /* 15: ( Not Define ) */
"(Not Defined)" }, /* 16: ( Not Define ) */
/* Response Messeage */
{ "NonStandardMessage", /* 0: NonStandradMessage */
"MasterSlaveDeterminationAck", /* 1: MasterSlaveDeterminationAck */
"MasterSlaveDeterminationReject", /* 2: MasterSlaveDeterminationReject */
"TerminalCapabilitySetAck", /* 3: TerminalCapabilitySetAck */
"TerminalCapabilitySetReject", /* 4: TerminalCapabilitySetReject */
"OpenLogicalChannelAck", /* 5: OpenLogicalChannelAck */
"OpenLogicalChannelReject", /* 6: OpenLogicalChannelReject */
"CloseLogicalChannelAck", /* 7: CloseLogicalChannelAck */
"RequestChannelCloseAck", /* 8: RequestChannelCloseAck */
"RequestChannelCloseReject", /* 9: RequestChannelCloseReject */
"MultiplexEntrySendAck", /* A: MultiplexEntrySendAck */
"MultiplexEntrySendReject", /* B: MultiplexEntrySendReject */
"RequestMultiplexEntryAck", /* C: RequestMultiplexEntryAck */
"RequestMultiplexEntryReject", /* D: RequestMultiplexEntryReject */
"RequestModeAck", /* E: RequestModeAck */
"RequestModeReject", /* F RequestModeReject */
"RoundTripDelayResponse", /* 10 RoundTripDelayResponse */
"MaintenanceLoopAck", /* 11 MaintenanceLoopAck */
"MaintenanceLoopReject", /* 12 MaintenanceLoopReject */
"CommunicationModeResponse", /* 13 CommunicationModeResponse */
"ConferenceResponse", /* 14 ConferenceResponse */
"H223AnnexAReConfigurationAck", /* 15 H223AnnexAReconfigurationAck */
"H223AnnexAReConfigurationReject" }, /* 16 H223AnnexAReconfigurationReject */
/* Command Messeage */
{ "NonStandardMessage", /* 0: NonStandradMessage */
"MaintenanceLoopOffCommand", /* 1: MaintenanceLoopOffCommand */
"SendTerminalCapabilitySet", /* 2: SendTerminalCapabilitySet */
"EncryptionCommand", /* 3: EncryptionCommand */
"FlowControlCommand", /* 4: FlowControlCommand */
"EndSessionCommand", /* 5: EndSessionCommand */
"MiscellaneousCommand", /* 6: MiscellaneousCommand */
"CommunicationModeCommand", /* 7: CommunicationModeCommand */
"ConferenceCommand", /* 8: ConferenceCommand */
"H223MultiplexReconfiguration",
"(Not Defined)", /* B: ( Not Define ) */
"(Not Defined)", /* C: ( Not Define ) */
"(Not Defined)", /* D: ( Not Define ) */
"(Not Defined)", /* E: ( Not Define ) */
"(Not Defined)", /* F: ( Not Define ) */
"(Not Defined)", /* 10: ( Not Define ) */
"(Not Defined)", /* 11: ( Not Define ) */
"(Not Defined)", /* 12: ( Not Define ) */
"(Not Defined)", /* 13: ( Not Define ) */
"(Not Defined)", /* 14: ( Not Define ) */
"(Not Defined)", /* 15: ( Not Define ) */
"(Not Defined)" }, /* 16: ( Not Define ) */
/* Indication Message */
{ "NonStandardMessage", /* 0: NonStandradMessage */
"FunctionNotUnderstood", /* 1: FunctionNotUnderstood */
"MasterSlaveDeterminationRelease", /* 2: MasterSlaveDeterminationRelease */
"TerminalCapabilitySetRelease", /* 3: TerminalCapabilitySetRelease */
"OpenLogicalChannelConfirm", /* 4: OpenLogicalChannelConfirm */
"RequestChannelCloseRelease", /* 5: RequestChannelCloseRelease */
"MultiplexEntrySendRelease", /* 6: MultiplexEntrySendRelease */
"RequestMultiplexEntryRelease", /* 7: RequestMultiplexEntryRelease */
"RequestModeRelease", /* 8: RequestModeRelease */
"MiscellaneousIndication", /* 9: MiscellaneousIndication */
"JitterIndication", /* A: JitterIndication */
"H223SkewIndication", /* B: H223SkewIndication */
"NewATMVCIndication", /* C: NewATMVCIndication */
"UserInputIndication", /* D: UserInputIndication */
"H2250MaximumSkewIndication", /* E: H2250MaximumSkewIndication */
"MCLocationIndication", /* F: MCLocationIndication */
"ConferenceIndication", /* 10:ConferenceIndication */
"VendorIdentification", /* 11:VendorIndication */
"FunctionNotSupported", /* 12:FunctionNotSupported */
"(Not Defined)", /* 13: ( Not Define ) */
"(Not Defined)", /* 14: ( Not Define ) */
"FlowControlCommand", /* WWU_IND 15: FlowControl */
"(Not Defined)" } /* 16: ( Not Define ) */
};
/* ================================================= */
/* Display an H.245 Message Bitstream as Hex */
/* ================================================= */
void ShowH245Hex(uint16 tag, uint8 type1, uint8 type2, uint16 size, uint8* data)
{
Show245(tag, 0, "<============= BEGIN H.245 MESSAGE (HEX) =============>");
Show245(tag, 0, EncodeDescription[type1][type2]);
ShowHexData(tag, 2, size, data);
Show245(tag, 0, "<============== END H.245 MESSAGE (HEX) ==============>");
Show245(tag, 0, " ");
}
#endif /* end PVANALYZER */