blob: 27302de9322bc91a91b15ba2b483f1fb311a441b [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.
//
// -----------------------------------------------------------------------
#include "tscmain.h"
#include "tsc_sub.h" /* Sub Routine Information Header */
#include "tsc_component.h"
#define MAX_VENDOR_ID_OID_LEN 512 /* Max len of object identifier sequence */
/*****************************************************************************/
/* function name : Tsc_IdcVi */
/* function outline : VendorIdentification procedure */
/* function discription : Tsc_IdcVi( void ) */
/* input data : None */
/* output data : None */
/* draw time : '96.11.29 */
/*---------------------------------------------------------------------------*/
/* amendent career : */
/* */
/* Copyright (C) 1996 NTT DoCoMo */
/*****************************************************************************/
void TSC_324m::Tsc_IdcVi(void)
{
S_ControlMsgHeader infHeader;
PS_VendorIdentification pVendorIdentification;
if (iVendor == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m:Tsc_IdcVi - Not sending vendor id\n"));
return;
}
/* Buffer Allocate */
pVendorIdentification = (PS_VendorIdentification)OSCL_DEFAULT_MALLOC(sizeof(S_VendorIdentification));
oscl_memset(pVendorIdentification, 0, sizeof(S_VendorIdentification));
if (iVendor->GetVendorType() == EObjectIdentifier)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m:Tsc_IdcVi - EObjectIdentifier\n"));
pVendorIdentification->vendor.index = 0; /* object */
pVendorIdentification->vendor.object = (PS_OBJECTIDENT) OSCL_DEFAULT_MALLOC(sizeof(S_OBJECTIDENT));
uint16 sz = 0;
uint8* data = ((TPVH245VendorObjectIdentifier*)iVendor)->GetVendor(&sz);
pVendorIdentification->vendor.object->size = sz;
pVendorIdentification->vendor.object->data = (uint8*)OSCL_DEFAULT_MALLOC(sz);
oscl_memcpy(pVendorIdentification->vendor.object->data, data, sz);
}
else if (iVendor->GetVendorType() == EH221NonStandard)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m:Tsc_IdcVi - EH221NonStandard\n"));
pVendorIdentification->vendor.index = 1; /* H221Nonstandard */
pVendorIdentification->vendor.h221NonStandard =
(struct _H221NonStandard *)OSCL_DEFAULT_MALLOC(sizeof(struct _H221NonStandard));
pVendorIdentification->vendor.h221NonStandard->manufacturerCode =
(uint16)((TPVVendorH221NonStandard*)iVendor)->GetManufacturerCode();
pVendorIdentification->vendor.h221NonStandard->t35CountryCode =
((TPVVendorH221NonStandard*)iVendor)->GetT35CountryCode();
pVendorIdentification->vendor.h221NonStandard->t35Extension =
((TPVVendorH221NonStandard*)iVendor)->GetT35Extension();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m:Tsc_IdcVi - ERROR - Invalid vendor type\n"));
OSCL_DEFAULT_FREE(pVendorIdentification);
return;
}
pVendorIdentification->option_of_productNumber = false;
if (iProductNumberLen)
{
pVendorIdentification->option_of_productNumber = true;
pVendorIdentification->productNumber.size =
(uint16)iProductNumberLen;
pVendorIdentification->productNumber.data =
(uint8*)OSCL_DEFAULT_MALLOC(iProductNumberLen);
oscl_memcpy(pVendorIdentification->productNumber.data,
iProductNumber, iProductNumberLen);
}
pVendorIdentification->option_of_versionNumber = false;
if (iVersionNumberLen)
{
pVendorIdentification->option_of_versionNumber = true;
pVendorIdentification->versionNumber.size =
(uint16)iVersionNumberLen;
pVendorIdentification->versionNumber.data =
(uint8*)OSCL_DEFAULT_MALLOC(iVersionNumberLen);
oscl_memcpy(pVendorIdentification->versionNumber.data,
iVersionNumber, iVersionNumberLen);
}
Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Vi, 0, 0,
(uint8*)pVendorIdentification, sizeof(S_VendorIdentification));
/* Primitive Send */
iH245->DispatchControlMessage(&infHeader);
Delete_VendorIdentification(pVendorIdentification);
OSCL_DEFAULT_FREE(pVendorIdentification);
return;
}
uint32 TSC_324m::VendorIdRecv(PS_ControlMsgHeader pReceiveInf)
{
PS_VendorIdentification pVendorIdentification =
(PS_VendorIdentification)pReceiveInf->pParameter;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: Vendor Id Received - vendor index(%d), opn(%d), ovn(%d)\n",
pVendorIdentification->vendor.index,
pVendorIdentification->option_of_productNumber,
pVendorIdentification->option_of_versionNumber));
if (iVendorR)
{
OSCL_DELETE(iVendorR);
iVendorR = NULL;
}
if (iProductNumberR)
{
OSCL_DEFAULT_FREE(iProductNumberR);
iProductNumberR = NULL;
iProductNumberLenR = 0;
}
if (iVersionNumberR)
{
OSCL_DEFAULT_FREE(iVersionNumberR);
iVersionNumberR = NULL;
iVersionNumberLenR = 0;
}
if (pVendorIdentification->vendor.index == 0) // object identifier
{
if (pVendorIdentification->vendor.object->size &&
(pVendorIdentification->vendor.object->size < MAX_VENDOR_ID_OID_LEN))
{
if (pVendorIdentification->vendor.object->data[pVendorIdentification->vendor.object->size - 1] == '\0')
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: Vendor Id - %s\n",
pVendorIdentification->vendor.object->data));
}
iVendorR = new TPVH245VendorObjectIdentifier((uint8*)pVendorIdentification->vendor.object->data,
pVendorIdentification->vendor.object->size);
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m:VendorIdRecv - Error - invalid length(%d)\n",
pVendorIdentification->vendor.object->size));
return iTerminalStatus;
}
}
else if (pVendorIdentification->vendor.index == 1) // H221NonStandard
{
iVendorR = new TPVVendorH221NonStandard(pVendorIdentification->vendor.h221NonStandard->t35CountryCode,
pVendorIdentification->vendor.h221NonStandard->t35Extension,
pVendorIdentification->vendor.h221NonStandard->manufacturerCode);
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m:VendorIdRecv - Error - invalid index(%d)\n",
pVendorIdentification->vendor.index));
return iTerminalStatus;
}
if (pVendorIdentification->option_of_productNumber)
{
iProductNumberLenR = pVendorIdentification->productNumber.size;
}
if (iProductNumberLenR)
{
if (pVendorIdentification->productNumber.data[iProductNumberLenR-1] == '\0')
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: Product Number - %s\n",
pVendorIdentification->productNumber.data));
}
iProductNumberR = (uint8*)OSCL_DEFAULT_MALLOC(iProductNumberLenR);
oscl_memcpy(iProductNumberR, pVendorIdentification->productNumber.data,
iProductNumberLenR);
}
if (pVendorIdentification->option_of_versionNumber)
{
iVersionNumberLenR = pVendorIdentification->versionNumber.size;
}
if (iVersionNumberLenR)
{
if (pVendorIdentification->versionNumber.data[iVersionNumberLenR-1] == '\0')
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: Version Number - %s\n",
pVendorIdentification->versionNumber.data));
}
iVersionNumberR = (uint8*)OSCL_DEFAULT_MALLOC(iVersionNumberLenR);
oscl_memcpy(iVersionNumberR, pVendorIdentification->versionNumber.data, iVersionNumberLenR);
}
if (iTSC_324mObserver)
{
iTSC_324mObserver->IncomingVendorId(iVendorR, iProductNumberR,
(uint16)iProductNumberLenR, iVersionNumberR, (uint16)iVersionNumberLenR);
}
return iTerminalStatus;
}
//-----------------------------------------------------------------------------
// Tsc_UII_DTMF() (RAN-UII)
//
// This routine sends a DTMF signal via H.245 UserInputIndication message.
// It takes two input values:
//
// uint8 dtmf_value (ascii value of a character in [0123456789#*ABCD!])
// uint16 dtmf_duration (duration of pulse in mSec; 0 means no duration)
//-----------------------------------------------------------------------------
void TSC_324m::Tsc_UII_DTMF(uint8 dtmf_value, uint16 dtmf_duration)
{
S_ControlMsgHeader infHeader;
PS_UserInputIndication pUserInputIndication;
// Allocate the UII structure
pUserInputIndication = (PS_UserInputIndication)OSCL_DEFAULT_MALLOC(sizeof(S_UserInputIndication));
// Fill in the 'signal'
pUserInputIndication->index = 3; /* signal */
pUserInputIndication->signal = (PS_Signal) OSCL_DEFAULT_MALLOC(sizeof(S_Signal));
pUserInputIndication->signal->option_of_signalRtp = 0;
pUserInputIndication->signal->signalType.size = 1;
pUserInputIndication->signal->signalType.data = (uint8*) OSCL_DEFAULT_MALLOC(1 * sizeof(uint8));
pUserInputIndication->signal->signalType.data[0] = dtmf_value;
if (dtmf_duration == 0)
{
pUserInputIndication->signal->option_of_duration = 0;
}
else
{
pUserInputIndication->signal->option_of_duration = 1;
pUserInputIndication->signal->duration = dtmf_duration;
}
// Send the message
Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Ui, 0, 0, (uint8*)pUserInputIndication,
sizeof(S_UserInputIndication));
iH245->DispatchControlMessage(&infHeader);
Delete_UserInputIndication(pUserInputIndication);
OSCL_DEFAULT_FREE(pUserInputIndication);
return;
}
void TSC_324m::Tsc_UII_Alphanumeric(const uint8* str, uint16 str_len)
{
S_ControlMsgHeader infHeader;
PS_UserInputIndication pUserInputIndication;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m:Tsc_UII_Alphanumeric - len(%d)", str_len));
// Allocate the UII structure
pUserInputIndication = (PS_UserInputIndication)OSCL_DEFAULT_MALLOC(sizeof(S_UserInputIndication));
// Fill in the 'signal'
pUserInputIndication->index = 1; /* alphanumeric */
pUserInputIndication->alphanumeric = (PS_int8STRING) OSCL_DEFAULT_MALLOC(sizeof(S_int8STRING));
pUserInputIndication->alphanumeric->size = str_len;
pUserInputIndication->alphanumeric->data = (uint8*) OSCL_DEFAULT_MALLOC(str_len * sizeof(uint8));
oscl_memcpy(pUserInputIndication->alphanumeric->data, str, str_len);
// Send the message
Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Ui, 0, 0, (uint8*)pUserInputIndication,
sizeof(S_UserInputIndication));
iH245->DispatchControlMessage(&infHeader);
Delete_UserInputIndication(pUserInputIndication);
OSCL_DEFAULT_FREE(pUserInputIndication);
return;
}
uint32 TSC_324m::UserInputIndicationRecv(PS_ControlMsgHeader pReceiveInf)
{
PS_UserInputIndication pUserInputIndication = (PS_UserInputIndication)pReceiveInf->pParameter;
CPVUserInput* uii = NULL;
uint16 duration = 0;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: User Input Indication Received - index(%d)\n", pUserInputIndication->index));
switch (pUserInputIndication->index)
{
case 1: /* alphanumeric */
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: User Input Indication Received - alphanumeric size(%d)",
pUserInputIndication->alphanumeric->size));
uii = OSCL_NEW(CPVUserInputAlphanumeric, (pUserInputIndication->alphanumeric->data,
pUserInputIndication->alphanumeric->size));
break;
case 3: /* signal */
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: User Input Indication Received - signal option_of_duration(%d), option_of_signalRtp(%d), signalType(%d)", pUserInputIndication->signal->option_of_duration, pUserInputIndication->signal->option_of_signalRtp, pUserInputIndication->signal->signalType.size));
if (pUserInputIndication->signal->option_of_duration)
{
duration = pUserInputIndication->signal->duration;
}
uii = OSCL_NEW(CPVUserInputDtmf, (*pUserInputIndication->signal->signalType.data,
false, duration));
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: User Input Indication Received - unrecognized type\n"));
}
if (uii)
{
if (iTSC_324mObserver)
iTSC_324mObserver->UserInputReceived(uii);
OSCL_DELETE(uii);
}
return iTerminalStatus;
}
void TSC_324m::IndicationMisc(TIndicationMisc type,
TPVChannelId channelId,
uint32 param,
OsclAny* param1)
{
OSCL_UNUSED_ARG(param1);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::IndicationMisc type(%d), channelId(%d), param(%d), param1(%x)",
type, channelId, param, param1));
S_ControlMsgHeader infHeader;
S_MiscellaneousIndication miscellaneousIndication;
oscl_memset(&miscellaneousIndication, 0, sizeof(S_MiscellaneousIndication));
switch (type)
{
case EVideoTemporalSpatialTradeOffIdc:
miscellaneousIndication.logicalChannelNumber = (uint16)channelId;
miscellaneousIndication.miType.index = 9;
miscellaneousIndication.miType.videoTemporalSpatialTradeOff = (uint8)param;
break;
default:
return;
}
Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Mscl, 0, 0,
(uint8*)&miscellaneousIndication, sizeof(S_MiscellaneousIndication));
iH245->DispatchControlMessage(&infHeader);
}
void TSC_324m::Tsc_IdcSkew(TPVChannelId lcn1, TPVChannelId lcn2, uint16 skew)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::Tsc_IdcSkew lcn1(%d), lcn2(%d), skew(%d)",
lcn1, lcn2, skew));
S_ControlMsgHeader infHeader;
S_H223SkewIndication skewIndication;
oscl_memset(&skewIndication, 0, sizeof(S_H223SkewIndication));
skewIndication.logicalChannelNumber1 = (uint16)lcn1;
skewIndication.logicalChannelNumber2 = (uint16)lcn2;
skewIndication.skew = skew;
Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_H223skw, 0, 0,
(uint8*)&skewIndication, sizeof(S_H223SkewIndication));
iH245->DispatchControlMessage(&infHeader);
}
uint32 TSC_324m::MiscIndicationRecv(PS_ControlMsgHeader pReceiveInf)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MiscIndicationRecv"));
PS_MiscellaneousIndication indication = (PS_MiscellaneousIndication)pReceiveInf->pParameter;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MiscIndicationRecv lcn(%d),index(%d)",
indication->logicalChannelNumber, indication->miType.index));
switch (indication->miType.index)
{
case 9:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MiscIndicationRecv videoSpatialTemporalTradeoff(%d)",
indication->miType.videoTemporalSpatialTradeOff));
if (iTSC_324mObserver)
{
iTSC_324mObserver->VideoSpatialTemporalTradeoffIndicationReceived(indication->logicalChannelNumber,
indication->miType.videoTemporalSpatialTradeOff);
}
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MiscIndicationRecv Indication not handled"));
break;
}
return iTerminalStatus;
}
uint32 TSC_324m::SkewIndicationRecv(PS_ControlMsgHeader pReceiveInf)
{
PS_H223SkewIndication indication = (PS_H223SkewIndication)pReceiveInf->pParameter;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SkewIndicationRecv lcn1(%d), lcn2(%d), skew(%d)",
indication->logicalChannelNumber1,
indication->logicalChannelNumber2,
indication->skew));
uint16 skew = indication->skew;
if (skew > PV_2WAY_MAX_SKEW_MS)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SkewIndicationRecv skew(%d) > max skew(%d)",
indication->skew, PV_2WAY_MAX_SKEW_MS));
skew = PV_2WAY_MAX_SKEW_MS;
}
/* Validate the skew indication */
OlcParam* olcparam = iTSCcomponent->FindOlc(INCOMING, PV_AUDIO, OLC_ESTABLISHED);
if (!olcparam)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::SkewIndicationRecv Established incoming audio lcn not found"));
return iTerminalStatus ;
}
if (indication->logicalChannelNumber2 != olcparam->GetChannelId())
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::SkewIndicationRecv indication->logicalChannelNumber2=%d != audio lcn id=%d",
indication->logicalChannelNumber2, olcparam->GetChannelId()));
//return iTerminalStatus ;
}
olcparam = iTSCcomponent->FindOlc(INCOMING, PV_VIDEO, OLC_ESTABLISHED);
if (!olcparam)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::SkewIndicationRecv Established incoming video lcn not found"));
return iTerminalStatus ;
}
if (indication->logicalChannelNumber1 != olcparam->GetChannelId())
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::SkewIndicationRecv indication->logicalChannelNumber1=%d != video lcn id=%d",
indication->logicalChannelNumber1, olcparam->GetChannelId()));
//return iTerminalStatus ;
}
if (iTSC_324mObserver)
{
iTSC_324mObserver->SkewIndicationReceived(indication->logicalChannelNumber1,
indication->logicalChannelNumber2, skew);
}
//Obtain logical channel #1, and transmit the skew duration
OsclSharedPtr<H223IncomingChannel> channel;
PVMFStatus retVal = iH223->GetIncomingChannel(indication->logicalChannelNumber1, channel);
if (retVal != PVMFSuccess)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0, "TSC_324m::SkewIndicationRecv Error - Failed to lookup logical channel %d", indication->logicalChannelNumber1));
return iTerminalStatus;
}
channel->SetTimestampOffset(skew);
return iTerminalStatus;
}
void TSC_324m::SendFunctionNotSupportedIndication(uint16 cause,
uint8* function,
uint16 len)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SendFunctionNotSupportedIndication"));
S_ControlMsgHeader infHeader;
S_FunctionNotSupported fnsIndication;
oscl_memset(&fnsIndication, 0, sizeof(S_FunctionNotSupported));
fnsIndication.fnsCause.index = cause;
if (function && len)
{
fnsIndication.option_of_returnedFunction = 1;
fnsIndication.returnedFunction.size = len;
fnsIndication.returnedFunction.data = function;
}
Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Fns, 0, 0,
(uint8*)&fnsIndication, sizeof(S_FunctionNotSupported));
iH245->DispatchControlMessage(&infHeader);
return;
}
uint32 TSC_324m::FunctionNotSupportedIndicationReceived(PS_ControlMsgHeader pReceiveInf)
{
OSCL_UNUSED_ARG(pReceiveInf);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::FunctionNotSupportedIndicationReceived"));
return iTerminalStatus;
}
uint32 TSC_324m::FlowControlIndicationReceived(PS_ControlMsgHeader pReceiveInf)
{
OSCL_UNUSED_ARG(pReceiveInf);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::FlowControlIndicationReceived"));
return iTerminalStatus;
}