blob: 74750cdd42b9c0a196b8183bc3dd753614dc642d [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 "srp.h"
#include "srp_ports.h"
#include "pvlogger.h"
/************************************************************************/
/* Constants */
/************************************************************************/
const SRP::SrpAction SRP::iSrpStateTable[MAX_STATUS][MAX_EVENT] =
{
/* Event No. 0 1 2 3 4 5 6 7 */
/* Status 0 */ { SRP::ACTION_NOP, SRP::ACTION_0_1, SRP::ACTION_0_2, SRP::ACTION_NOP, SRP::ACTION_NOP, SRP::ACTION_NOP, SRP::ACTION_0_2, SRP::ACTION_NOP} ,
/* Status 1 */ { SRP::ACTION_NOP, SRP::ACTION_1_1, SRP::ACTION_0_2, SRP::ACTION_1_3, SRP::ACTION_1_3, SRP::ACTION_1_4, SRP::ACTION_0_2, SRP::ACTION_1_3}
};
OSCL_EXPORT_REF SRP::SRP() : iN400MaxCounter(N400_DEFAULT_MAX_COUNTER), //changed max # of allowable retries from 10 to 200
//This was done in conjunction with lowering the SRP
//timeout value from 400ms to 50ms
iN402MaxCounter(N402_DEFAULT_MAX_COUNTER), //WNSRP counter
iCrcData(0),
iSendSeqNumber(0),
iRecvSeqNumber(0),
iStatus(STS_IDLE),
iCurWnsrpStatus(WNSRP_TX_SUPPORT),
iT401TimerValue(T401_VALUE_DEFAULT),
iWnsrpCommandSave(NULL),
iCcsrlSduSize(DEFAULT_CCSRL_SIZE),
iRxFrags(NULL),
iFreeRxFragList(NULL),
iPendingRxFragList(NULL),
iFirstCmd(true),
iLLPortOut(NULL),
iLLPortIn(NULL),
iULPortOut(NULL),
iULPortIn(NULL),
iTxMediaMsgPoolAlloc(NULL),
iTxMediaDataImplMemAlloc(NULL),
iTxPacketAlloc(NULL),
iOutstandingTxMediaMsgPoolAlloc(NULL),
iOutstandingTxMediaDataImplMemAlloc(NULL),
iRxMediaMsgPoolAlloc(NULL),
iRxMediaDataImplMemAlloc(NULL),
iRxPacketAlloc(NULL),
iRespMediaMsgPoolAlloc(NULL),
iRespMemAlloc(NULL),
iRespPacketAlloc(NULL),
iNsrpRespMemAlloc(NULL),
iNsrpRespPacketAlloc(NULL),
iNumTxMsgs(DEFAULT_SEND_QUEUE_SIZE),
iUseNSRP(true),
iFirstNSRPResp(false),
iHandleWNSRP(true),
iWNSRPTxWindow(DEFAULT_WNSRP_WINDOW),
iWNSRPRxWindow(DEFAULT_WNSRP_WINDOW),
iOldestWNSRPRetransSeqNum(0),
iT401Resolution(T401_RESOLUTION),
iObserver(NULL)
{
iLogger = PVLogger::GetLoggerObject("3g324m.h324.srp");
}
OSCL_EXPORT_REF SRP::~SRP()
{
}
OSCL_EXPORT_REF void SRP::SrpInitL(void)
{
iLLPortOut = OSCL_NEW(SRPLowerLayerPortOut, ());
OsclError::LeaveIfNull(iLLPortOut);
iLLPortIn = OSCL_NEW(SRPLowerLayerPortIn, (this));
OsclError::LeaveIfNull(iLLPortIn);
iULPortOut = OSCL_NEW(SRPUpperLayerPortOut, ());
OsclError::LeaveIfNull(iULPortOut);
iULPortIn = OSCL_NEW(SRPUpperLayerPortIn, (this));
OsclError::LeaveIfNull(iULPortIn);
uint32 i;
iSrpCommandSave.timerID = iWNSRPTxWindow;
iWnsrpCommandSave = OSCL_ARRAY_NEW(SRPRespTimer, iWNSRPTxWindow);
OsclError::LeaveIfNull(iWnsrpCommandSave);
for (i = 0; i < iWNSRPTxWindow; i++)
{
iWnsrpCommandSave[i].timerID = i;
}
iRxFrags = OSCL_ARRAY_NEW(SRPRxData, iWNSRPRxWindow);
OsclError::LeaveIfNull(iRxFrags);
for (i = 0; i < iWNSRPRxWindow; i++)
{
FreeRxFrag(&iRxFrags[i]);
}
iTxMediaMsgPoolAlloc = OSCL_NEW(OsclMemPoolFixedChunkAllocator, (iNumTxMsgs, 0, &iMemAllocator));
OsclError::LeaveIfNull(iTxMediaMsgPoolAlloc);
iTxMediaDataImplMemAlloc = OSCL_NEW(OsclMemPoolFixedChunkAllocator, (iNumTxMsgs + ((iWNSRPTxWindow + 1) * 2), 0, &iMemAllocator));
OsclError::LeaveIfNull(iTxMediaDataImplMemAlloc);
iTxPacketAlloc = OSCL_NEW(PVMFMediaFragGroupCombinedAlloc<OsclMemAllocator>, (iNumTxMsgs + ((iWNSRPTxWindow + 1) * 2), MAX_SEND_FRAGS_PER_MSG, iTxMediaDataImplMemAlloc));
OsclError::LeaveIfNull(iTxPacketAlloc);
iTxPacketAlloc->create();
iOutstandingTxMediaMsgPoolAlloc = OSCL_NEW(OsclMemPoolFixedChunkAllocator, ((iWNSRPTxWindow + 1) * 2, 0, &iMemAllocator));
OsclError::LeaveIfNull(iOutstandingTxMediaMsgPoolAlloc);
iOutstandingTxMediaDataImplMemAlloc = OSCL_NEW(OsclMemPoolFixedChunkAllocator, ((iWNSRPTxWindow + 1) * 2, 0, &iMemAllocator));
OsclError::LeaveIfNull(iOutstandingTxMediaDataImplMemAlloc);
iRxMediaMsgPoolAlloc = OSCL_NEW(OsclMemPoolFixedChunkAllocator, (iWNSRPRxWindow * 2, 0, &iMemAllocator));
OsclError::LeaveIfNull(iRxMediaMsgPoolAlloc);
iRxMediaDataImplMemAlloc = OSCL_NEW(OsclMemPoolFixedChunkAllocator, (iWNSRPRxWindow * 2, 0, &iMemAllocator));
OsclError::LeaveIfNull(iRxMediaDataImplMemAlloc);
iRxPacketAlloc = OSCL_NEW(PVMFSimpleMediaBufferCombinedAlloc, (iRxMediaDataImplMemAlloc));
OsclError::LeaveIfNull(iRxPacketAlloc);
iRespMediaMsgPoolAlloc = OSCL_NEW(OsclMemPoolFixedChunkAllocator, (MAX_RESP_MSGS, 0, &iMemAllocator));
OsclError::LeaveIfNull(iRespMediaMsgPoolAlloc);
iRespMemAlloc = OSCL_NEW(OsclMemPoolFixedChunkAllocator, (MAX_RESP_MSGS, 0, &iMemAllocator));
OsclError::LeaveIfNull(iRespMemAlloc);
iRespPacketAlloc = OSCL_NEW(PVMFSimpleMediaBufferCombinedAlloc, (iRespMemAlloc));
OsclError::LeaveIfNull(iRespPacketAlloc);
iNsrpRespMemAlloc = OSCL_NEW(OsclMemPoolFixedChunkAllocator, (MAX_RESP_MSGS, 0, &iMemAllocator));
OsclError::LeaveIfNull(iNsrpRespMemAlloc);
iNsrpRespPacketAlloc = OSCL_NEW(PVMFSimpleMediaBufferCombinedAlloc, (iNsrpRespMemAlloc));
OsclError::LeaveIfNull(iNsrpRespPacketAlloc);
iHdrAllocator.size((uint16) iNumTxMsgs*2, (SRP_HEADER_SIZE));
iHdrAllocator.SetLeaveOnAllocFailure(false);
iCcsrlAllocator.size((uint16) iNumTxMsgs*2, CCSRL_HEADER_SIZE + SRP_SEQUENCE_SIZE);
iCcsrlAllocator.SetLeaveOnAllocFailure(false);
iFCSAllocator.size((uint16) iNumTxMsgs*2, SRP_FCS_SIZE);
iFCSAllocator.SetLeaveOnAllocFailure(false);
//Just need 1 fragment for SRP/NSRP messages and 1 for WNSRP messages
iMTEntryNumAllocator.size(NUM_MT_ENTRY_NUMBERS, MT_ENTRY_NUMBER_SIZE);
iMTEntryNumAllocator.SetLeaveOnAllocFailure(false);
iSrpNsrpEntryNumFrag = iMTEntryNumAllocator.get();
*(uint8 *)iSrpNsrpEntryNumFrag.getMemFragPtr() = SRP_NSRP_MT_ENTRY_NUMBER;
iWnsrpEntryNumFrag = iMTEntryNumAllocator.get();
*(uint8 *)iWnsrpEntryNumFrag.getMemFragPtr() = WNSRP_MT_ENTRY_NUMBER;
iSrpWaitQueue.reserve(iNumTxMsgs);
iFreeWnsrpCommandSave.reserve(iWNSRPTxWindow);
iActiveWnsrpCommandSave.reserve(iWNSRPTxWindow);
iSrpCommandSave.T401Timer.SetFrequency(T401_RESOLUTION);
for (i = 0; i < iWNSRPTxWindow; i++)
{
iWnsrpCommandSave[i].T401Timer.SetFrequency(T401_RESOLUTION);
iFreeWnsrpCommandSave.push_back(&iWnsrpCommandSave[i]);
}
//Temporary for now, should be called when tsc does a connect.
SrpStart();
}
OSCL_EXPORT_REF void SRP::SrpReset(void)
{
//Temporary for now, should be called when tsc does a disconnect.
SrpStop();
OsclRefCounterMemFrag temp;
iSrpNsrpEntryNumFrag = temp;
iWnsrpEntryNumFrag = temp;
iActiveWnsrpCommandSave.clear();
iFreeWnsrpCommandSave.clear();
iMTEntryNumAllocator.clear();
iHdrAllocator.clear();
iCcsrlAllocator.clear();
iFCSAllocator.clear();
if (iTxPacketAlloc)
{
iTxPacketAlloc->removeRef();
iTxPacketAlloc = NULL;
}
if (iTxMediaDataImplMemAlloc)
{
OSCL_DELETE(iTxMediaDataImplMemAlloc);
iTxMediaDataImplMemAlloc = NULL;
}
if (iTxMediaMsgPoolAlloc)
{
OSCL_DELETE(iTxMediaMsgPoolAlloc);
iTxMediaMsgPoolAlloc = NULL;
}
if (iOutstandingTxMediaDataImplMemAlloc)
{
OSCL_DELETE(iOutstandingTxMediaDataImplMemAlloc);
iOutstandingTxMediaDataImplMemAlloc = NULL;
}
if (iOutstandingTxMediaMsgPoolAlloc)
{
OSCL_DELETE(iOutstandingTxMediaMsgPoolAlloc);
iOutstandingTxMediaMsgPoolAlloc = NULL;
}
if (iRxPacketAlloc)
{
OSCL_DELETE(iRxPacketAlloc);
iRxPacketAlloc = NULL;
}
if (iRxMediaDataImplMemAlloc)
{
OSCL_DELETE(iRxMediaDataImplMemAlloc);
iRxMediaDataImplMemAlloc = NULL;
}
if (iRxMediaMsgPoolAlloc)
{
OSCL_DELETE(iRxMediaMsgPoolAlloc);
iRxMediaMsgPoolAlloc = NULL;
}
if (iNsrpRespMemAlloc)
{
OSCL_DELETE(iNsrpRespMemAlloc);
iNsrpRespMemAlloc = NULL;
}
if (iNsrpRespPacketAlloc)
{
OSCL_DELETE(iNsrpRespPacketAlloc);
iNsrpRespPacketAlloc = NULL;
}
if (iRespMemAlloc)
{
OSCL_DELETE(iRespMemAlloc);
iRespMemAlloc = NULL;
}
if (iRespPacketAlloc)
{
OSCL_DELETE(iRespPacketAlloc);
iRespPacketAlloc = NULL;
}
if (iRespMediaMsgPoolAlloc)
{
OSCL_DELETE(iRespMediaMsgPoolAlloc);
iRespMediaMsgPoolAlloc = NULL;
}
if (iWnsrpCommandSave)
{
OSCL_ARRAY_DELETE(iWnsrpCommandSave);
iWnsrpCommandSave = NULL;
}
if (iRxFrags)
{
OSCL_ARRAY_DELETE(iRxFrags);
iRxFrags = NULL;
}
if (iLLPortOut)
{
OSCL_DELETE(iLLPortOut);
iLLPortOut = NULL;
}
if (iLLPortIn)
{
OSCL_DELETE(iLLPortIn);
iLLPortIn = NULL;
}
if (iULPortOut)
{
OSCL_DELETE(iULPortOut);
iULPortOut = NULL;
}
if (iULPortIn)
{
OSCL_DELETE(iULPortIn);
iULPortIn = NULL;
}
WnsrpStatusSet(WNSRP_TX_SUPPORT);
iHandleWNSRP = true;
}
OSCL_EXPORT_REF void SRP::SrpStart(void)
{
SrpResetStats();
iFirstCmd = true;
/* Clear receive sequence number */
SrpRecvSeqClear();
/* Clear send sequence number */
SrpSendSeqClear();
/* Clear WNSRP retry counter */
SrpN402Initialize();
/* Set status */
SrpStatusSet(STS_IDLE);
}
OSCL_EXPORT_REF void SRP::SrpStop(void)
{
SRPRxData *pendingRxFrag;
// Cancel any outstanding timer events
if (iSrpCommandSave.isTimerActive)
{
SrpT401Stop(iSrpCommandSave);
iSrpCommandSave.pPkt.Unbind();
}
//Clear all WNSRP resp timers
while (!iActiveWnsrpCommandSave.empty())
{
// Stop response wait timer
SrpT401Stop(*iActiveWnsrpCommandSave[0]);
// Release packet
iActiveWnsrpCommandSave[0]->pPkt.Unbind();
// Remove timer from active list
RemoveActiveWnsrpTimer(iActiveWnsrpCommandSave[0]);
}
WnsrpStatusSet(WNSRP_TX_SUPPORT);
// Flush the queue
iSrpWaitQueue.clear();
// Clear pending received packet.
while (iPendingRxFragList)
{
pendingRxFrag = iPendingRxFragList;
iPendingRxFragList = iPendingRxFragList->next;
FreeRxFrag(pendingRxFrag);
}
/* AR: Switch back to SRP mode */
iUseNSRP = false;
/* Print iStats */
SRPStats tempStats;
SrpGetStats(tempStats);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "SRP Stats:"));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Total frames recv %d", tempStats.totalFramesRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Invalid size frames recv %d", tempStats.totalInvalidSizeFramesRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "CRC errors recv %d", tempStats.totalCRCErrorsRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Cmd frames recv %d", tempStats.totalCommandFramesRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Cmd WNSRP frames recv %d", tempStats.totalWNSRPCommandFramesRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Invalid CCSRL chunk recv %d", tempStats.totalInvalidCCSRLChunkRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "SRP resp recv %d", tempStats.totalSRPRespRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "NSRP resp recv %d", tempStats.totalNSRPRespRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "WNSRP resp recv %d", tempStats.totalWNSRPRespRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "H245 messages recv %d", tempStats.totalH245MessagesRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "CCSRL chunks recv %d", tempStats.totalCCSRLChunksRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Cmd frames sent %d", tempStats.totalCommandFramesSent));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "H245 messages to send %d", tempStats.totalH245MessagesToSend));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "H245 messages fragmented %d", tempStats.totalH245MessagesFragmented));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "CCSRL chunks sent %d", tempStats.totalCCSRLChunksSent));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Num of timeouts %d", tempStats.totalNumTimeouts));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Bytes recv %d", tempStats.totalBytesRecv));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Bytes sent %d", tempStats.totalBytesSent));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Invalid frames %d", tempStats.totalInvalidFrames));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Min response time %d", tempStats.minRespTime));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Max response time %d", tempStats.maxRespTime));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STATISTIC, (0x40000020, "Ave response time %d", tempStats.aveRespTime));
}
/************************************************************************/
/* function name : SrpGetEventNoFromAL1 */
/* function outline : decide event number from received PDU */
/* (H.223 AL1) */
/* function discription: INT SrpGetEventNoFromAL1( */
/* PVMFSharedMediaDataPtr pPkt ) */
/* input data : pPkt - pointer of received packet */
/* output data : event number */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
SRP::SrpEvent SRP::SrpGetEventNoFromAL1(PVMFSharedMediaDataPtr pPkt)
{
SrpEvent EventNo = EV_NOP;
uint8 *pFrame;
uint8 CrcWork[2];
OsclRefCounterMemFrag frag;
OsclSharedPtr<PVMFMediaDataImpl> data;
uint16 Crc16Check(PVMFSharedMediaDataPtr aData);
if (pPkt->getNumFragments() != 1)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP:SrpGetEventNoFromAL1 - fragments not equal to 1, num frags %d", pPkt->getNumFragments()));
return EventNo;
}
if (pPkt->getFilledSize() >= MINIMUM_FRAME_SIZE)
{
pPkt->getMediaDataImpl(data);
CrcClear();
CrcSetToFrame(iCrc.Crc16Check(data, true), &CrcWork[0]);
pPkt->getMediaFragment(0, frag);
pFrame = (uint8 *) frag.getMemFragPtr();
if ((CrcWork[0] == pFrame[pPkt->getFilledSize()-SRP_FCS_SIZE]) &&
(CrcWork[1] == pFrame[pPkt->getFilledSize()-SRP_FCS_SIZE+1]))
{
switch (pFrame[0])
{
case SRP_COMMAND_HEADER:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP:SrpGetEventNoFromAL1 - SRP_COMMAND_HEADER, seq num %d", pFrame[1]));
//Disable WNSRP if 1st command frame does not start with seq num 0
if ((WnsrpStatusGet() == WNSRP_TX_SUPPORT) &&
iFirstCmd &&
(pFrame[1] != 0))
{
WnsrpStatusSet(NO_WNSRP_SUPPORT);
}
iStats.totalCommandFramesRecv++;
pPkt->setSeqNum((uint32) pFrame[1]);
//If using CCSRL method.
if (iCcsrlSduSize > 0)
{
//Check if is a valid CCSRL chunk.
if ((pFrame[2] == INTERMEDIATE_CCSRL_CHUNK) || (pFrame[2] == LAST_CCSRL_CHUNK))
{
EventNo = EV_COMMAND;
}
else
{
// Record invalid CCSRL chunk
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP: Invalid CCSRL Chunk"));
iStats.totalInvalidCCSRLChunkRecv++;
}
}
//Else not using CCSRL method
else
{
EventNo = EV_COMMAND;
}
break;
case SRP_RESPONSE_HEADER: // No sequence number in SRP responses
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP:SrpGetEventNoFromAL1 - SRP_RESPONSE_HEADER"));
if (WnsrpStatusGet() == WNSRP_TX_SUPPORT)
{
SrpN402Count();
if (SrpN402Check() == false)
{
WnsrpStatusSet(NO_WNSRP_SUPPORT);
}
}
iStats.totalSRPRespRecv++;
// If using NSRP
if (iUseNSRP)
{
// If we haven't received an NSRP response yet, keep accepting SRP responses.
if (!iFirstNSRPResp)
{
EventNo = EV_RESPONSE;
}
}
// Else not using NSRP
else
{
EventNo = EV_RESPONSE;
}
break;
case NSRP_RESPONSE_HEADER:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP:SrpGetEventNoFromAL1 - NSRP_RESPONSE_HEADER, seq num %d", pFrame[1]));
if (WnsrpStatusGet() == WNSRP_TX_SUPPORT)
{
SrpN402Count();
if (SrpN402Check() == false)
{
WnsrpStatusSet(NO_WNSRP_SUPPORT);
}
}
iStats.totalNSRPRespRecv++;
// If using NSRP, check sequence number.
if (iUseNSRP)
{
pPkt->setSeqNum((uint32) pFrame[1]);
if (!iFirstNSRPResp)
{
iFirstNSRPResp = true;
}
EventNo = EV_NSRP_RESPONSE;
}
//Else using SRP, just accept as a valid SRP response frame
else
{
EventNo = EV_RESPONSE;
}
break;
case WNSRP_COMMAND_HEADER:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP:SrpGetEventNoFromAL1 - WNSRP_COMMAND_HEADER, status %d, seq num %d", WnsrpStatusGet(), pFrame[1]));
if (!iHandleWNSRP)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP:SrpGetEventNoFromAL1 - WNSRP_COMMAND_HEADER, not handling WNSRP frames"));
break;
}
iStats.totalWNSRPCommandFramesRecv++;
pPkt->setSeqNum((uint32) pFrame[1]);
switch (WnsrpStatusGet())
{
case WNSRP_TX_SUPPORT:
WnsrpStatusSet(WNSRP_FULL_SUPPORT);
//Fall into next case.
case WNSRP_FULL_SUPPORT:
//If using CCSRL method.
if (iCcsrlSduSize > 0)
{
//Check if is a valid CCSRL chunk.
if ((pFrame[2] == INTERMEDIATE_CCSRL_CHUNK) || (pFrame[2] == LAST_CCSRL_CHUNK))
{
EventNo = EV_WNSRP_COMMAND;
}
else
{
// Record invalid CCSRL chunk
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP: Invalid CCSRL Chunk"));
iStats.totalInvalidCCSRLChunkRecv++;
}
}
//Else not using CCSRL method
else
{
EventNo = EV_WNSRP_COMMAND;
}
break;
case NO_WNSRP_SUPPORT:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP:SrpGetEventNoFromAL1 - no WNSRP support"));
break;
}
break;
case WNSRP_RESPONSE_HEADER:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP:SrpGetEventNoFromAL1 - WNSRP_RESPONSE_HEADER, status %d, seq num %d", WnsrpStatusGet(), pFrame[1]));
if (!iHandleWNSRP)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP:SrpGetEventNoFromAL1 - WNSRP_COMMAND_HEADER, not handling WNSRP frames"));
break;
}
iStats.totalWNSRPRespRecv++;
switch (WnsrpStatusGet())
{
case WNSRP_TX_SUPPORT:
WnsrpStatusSet(WNSRP_FULL_SUPPORT);
//Fall into next case.
case WNSRP_FULL_SUPPORT:
//Set sequence number of the response.
pPkt->setSeqNum((uint32) pFrame[1]);
EventNo = EV_WNSRP_RESPONSE;
break;
case NO_WNSRP_SUPPORT:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP:SrpGetEventNoFromAL1 - no WNSRP support"));
break;
}
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP: Unknown SRP command %d", pFrame[0]));
iStats.totalInvalidFrames++;
break;
}
}
// CRC errors.
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP: CRC check failed"));
iStats.totalCRCErrorsRecv++;
}
}
else
{
// Record number of frames received that have an invalid size.
iStats.totalInvalidSizeFramesRecv++;
}
return(EventNo) ;
}
/************************************************************************/
/* function name : SrpStateChange */
/* function outline : decide function to call given the status and */
/* event */
/* function discription: INT SrpGetEventNoFromAL1( void *data ) */
/* input data : status - Status of Srp */
/* event - Incoming event */
/* data - optional state change data */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
int SRP::SrpStateChange(int status, int event, void *data)
{
switch (iSrpStateTable[status][event])
{
case ACTION_NOP:
return (SrpNop());
case ACTION_0_1:
return (Srp_0_1());
case ACTION_0_2:
return (Srp_0_2(*(PVMFSharedMediaDataPtr *) data, event));
case ACTION_1_1:
return (Srp_1_1());
case ACTION_1_3:
return (Srp_1_3(*(PVMFSharedMediaDataPtr *) data, event));
case ACTION_1_4:
return (Srp_1_4(*(int32 *) data));
default:
return 0;
}
}
/************************************************************************/
/* function name : SrpN400Check */
/* function outline : N400 counter check */
/* function discription: INT SrpN400Check(SRPRespTimer &timer) */
/* input data : timer - timer to check */
/* output data : Check result */
/* OK : Not count over */
/* NG : Count over */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
int SRP::SrpN400Check(SRPRespTimer &timer)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP::SrpN400Check - N400Counter=%d N400MaxCounter=%d", timer.N400Counter, iN400MaxCounter));
if (timer.N400Counter < iN400MaxCounter)
{
return true;
}
else
{
return false;
}
}
/************************************************************************/
/* function name : SrpN402Initialize */
/* function outline : N402 counter initialize */
/* function discription: void SrpN402Initialize( void ) */
/* input data : None */
/* output data : None */
/* draw time : '05.08.23 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::SrpN402Initialize()
{
/* Clear counter */
iN402Counter = 0 ;
}
/************************************************************************/
/* function name : SrpN402Check */
/* function outline : N402 counter check */
/* function discription: INT SrpN402Check( void ) */
/* input data : None */
/* output data : Check result */
/* OK : Not count over */
/* NG : Count over */
/* draw time : '05.08.23 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
int SRP::SrpN402Check()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP::SrpN402Check - N402Counter=%d N402MaxCounter=%d", iN402Counter, iN402MaxCounter));
if (iN402Counter < iN402MaxCounter)
{
return true;
}
else
{
return false;
}
}
/************************************************************************/
/* function name : CrcCalc */
/* function outline : CRC calculation */
/* function discription: void CrcCalc( PUCHAR pData, int Size ) */
/* input data : pData - object data pointer */
/* Size - object data size (octet length) */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::CrcCalc(uint8 *pData, int Size)
{
int BitCount;
while (Size--) /* process for all data */
{
for (BitCount = 0 ; BitCount < 8 ; BitCount++) /* process for 8 bit data */
{
if ((iCrcData & 0x8000) != 0) /* MSB=1? */
{
iCrcData <<= 1;
iCrcData |= ((*pData >> BitCount) & 0x01);
iCrcData ^= GX_CRC_12;
}
else
{
iCrcData <<= 1;
iCrcData |= ((*pData >> BitCount) & 0x01);
}
}
/* update pointer of data */
pData++;
}
return ;
}
/************************************************************************/
/* function name : CrcResultGet */
/* function outline : Get result of CRC calculation */
/* function discription: USHORT CrcResultGet( void ) */
/* input data : None */
/* output data : Result of CRC Calculation */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
uint16 SRP::CrcResultGet(void)
{
int BitCount;
for (BitCount = 0 ; BitCount < 16 ; BitCount++) /* process for 16bit */
{
if ((iCrcData & 0x8000) != 0) /* MSB=1? */
{
iCrcData <<= 1;
iCrcData ^= GX_CRC_12;
}
else
{
iCrcData <<= 1;
}
}
return((uint16)iCrcData) ;
}
/************************************************************************/
/* function name : CrcSetToFrame */
/* function outline : Set CRC data to FCS area of frame */
/* function discription: void CrcSetToFrame( USHORT Crc, PUCHAR pFcs ) */
/* input data : None */
/* output data : Crc - CRC data */
/* pFcs - FCS data pointer */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::CrcSetToFrame(uint16 crc, uint8 *pFcs)
{
/* Clear first fcs octet */
*pFcs = 0;
*pFcs = (uint8)(crc & 0x00ff);
pFcs++;
*pFcs = (uint8)((crc & 0xff00) >> 8);
return ;
}
/************************************************************************/
/* function name : SrpCommandCreate */
/* function outline : Create command frame */
/* function discription: void SrpCommandCreate( */
/* PVMFSharedMediaDataPtr pPkt ) */
/* input data : pPkt - data packet to create SRP command frame*/
/* output data : None */
/* draw time : '05.08.24 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
PVMFSharedMediaDataPtr SRP::SrpCommandCreate(PVMFSharedMediaDataPtr pPkt, uint8 header)
{
uint16 crc;
uint16 Crc16Check(PVMFSharedMediaDataPtr aData);
int32 error = OsclErrNone;
OsclSharedPtr<PVMFMediaDataImpl> srpPkt;
PVMFSharedMediaDataPtr txData;
OsclRefCounterMemFrag headerFrag;
OsclRefCounterMemFrag FCSFrag;
OSCL_UNUSED_ARG(error);
switch (header)
{
case SRP_COMMAND_HEADER:
case WNSRP_COMMAND_HEADER:
srpPkt = iTxPacketAlloc->allocate();
if (!srpPkt)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR,
(0x40000020, "SRP::SrpCommandCreate - Unable allocate tx media impl %d", error));
return txData;
}
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpCommandCreate - Unable command type %x", header));
return txData;
}
// Allocate header fragment.
headerFrag = iHdrAllocator.get();
if (headerFrag.getMemFragPtr() == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpCommandCreate Unable to allocate header frag %d", error));
return txData;
}
// Allocate fcs fragment.
FCSFrag = iFCSAllocator.get();
if (FCSFrag.getMemFragPtr() == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpCommandCreate Unable to allocate FCS frag %d", error));
return txData;
}
//Set header value
*(uint8 *) headerFrag.getMemFragPtr() = header;
headerFrag.getMemFrag().len = SRP_HEADER_SIZE;
// Add header to the front of the packet.
srpPkt->appendMediaFragment(headerFrag);
// Add data fragments
for (uint32 i = 0; i < pPkt->getNumFragments(); i++)
{
pPkt->getMediaFragment(i, headerFrag);
srpPkt->appendMediaFragment(headerFrag);
}
// Initialize crc calcuration
CrcClear();
// Calculate crc
crc = iCrc.Crc16Check(srpPkt); // 16bit CRC Infomation Create
// Set crc to fcs
CrcSetToFrame(crc, (uint8 *) FCSFrag.getMemFragPtr());
FCSFrag.getMemFrag().len = SRP_FCS_SIZE;
// Add CRC to the end of the packet.
srpPkt->appendMediaFragment(FCSFrag);
txData = PVMFMediaData::createMediaData(srpPkt, iOutstandingTxMediaMsgPoolAlloc);
if (!txData)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpCommandCreate - Unable allocate tx message %d", error))
return txData;
}
//If SRP
if (header == SRP_COMMAND_HEADER)
{
txData->setFormatSpecificInfo(iSrpNsrpEntryNumFrag);
}
//Else WNSRP
else
{
txData->setFormatSpecificInfo(iWnsrpEntryNumFrag);
}
// Set sequence number
txData->setSeqNum(pPkt->getSeqNum());
iStats.totalCCSRLChunksSent++;
iStats.totalCommandFramesSent++;
/* Record initial time when chunk is sent. */
iInitialTimeChunkSent.set_to_current_time();
return txData;
}
/************************************************************************/
/* function name : SrpCommandClear */
/* function outline : Clear comand frame for re-transmittion */
/* function discription: void SrpCommandClear(SRPRespTimer &timer) */
/* input data : timer - response timer that hold frame to be */
/* retransmitted. */
/* output data : None */
/* draw time : '05.08.24 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::SrpCommandClear(uint32 seqNum)
{
uint32 i;
//Find packet with same sequence number in wait queue and remove
for (i = 0; i < iSrpWaitQueue.size(); i++)
{
if (iSrpWaitQueue[i]->getSeqNum() == seqNum)
{
iSrpWaitQueue.erase(&iSrpWaitQueue[i]);
return;
}
}
return;
}
/************************************************************************/
/* function name : SrpResponseCreate */
/* function outline : Create response frame */
/* function discription: void SrpResponseCreate( uint8 seqNum ) */
/* input data : seqNum - Sequence number of response frame */
/* header - SRP response frame type */
/* output data : pointer to created response packet */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
PVMFSharedMediaDataPtr SRP::SrpResponseCreate(uint8 seqNum, uint8 header)
{
OsclSharedPtr<PVMFMediaDataImpl> resp;
PVMFSharedMediaDataPtr mediaData;
int32 error = OsclErrNone;
uint8* pEditPtr;
uint16 crc;
uint16 Crc16Check(uint8 *, uint16);
OsclRefCounterMemFrag frag;
OSCL_UNUSED_ARG(error);
switch (header)
{
case NSRP_RESPONSE_HEADER:
case WNSRP_RESPONSE_HEADER:
resp = iNsrpRespPacketAlloc->allocate(SRP_HEADER_SIZE + SRP_FCS_SIZE + SRP_SEQUENCE_SIZE); /* WWU_NSRP */
break;
case SRP_RESPONSE_HEADER:
resp = iRespPacketAlloc->allocate(SRP_HEADER_SIZE + SRP_FCS_SIZE); /* SRP */
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpResponseCreate - Unknown response type %d", header));
return mediaData;
}
//Unable to allocate fragment.
if (!resp)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpResponseCreate - Unable to allocate fragment %d", error));
return mediaData;
}
resp->getMediaFragment(0, frag);
pEditPtr = (uint8 *) frag.getMemFragPtr();
/* Initialize crc calcuration */
CrcClear() ;
/* Set header octet */
switch (header)
{
case NSRP_RESPONSE_HEADER:
case WNSRP_RESPONSE_HEADER:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP::SrpResponseCreate - Sending NSRP or WNSRP Response, SeqNum = %d", seqNum));
*pEditPtr++ = header;
*pEditPtr++ = seqNum;
resp->setMediaFragFilledLen(0, SRP_HEADER_SIZE + SRP_FCS_SIZE + SRP_SEQUENCE_SIZE);
crc = iCrc.Crc16Check((uint8 *) frag.getMemFragPtr(), SRP_HEADER_SIZE + SRP_SEQUENCE_SIZE); /* 16bit CRC Infomation Create */
break;
case SRP_RESPONSE_HEADER:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP::SrpResponseCreate - Sending SRP Response"));
*pEditPtr++ = header;
resp->setMediaFragFilledLen(0, SRP_HEADER_SIZE + SRP_FCS_SIZE);
crc = iCrc.Crc16Check((uint8 *) frag.getMemFragPtr(), SRP_HEADER_SIZE); /* 16bit CRC Infomation Create */
break;
default:
return mediaData;
}
/* Set crc to fcs */
CrcSetToFrame(crc, pEditPtr) ;
mediaData = PVMFMediaData::createMediaData(resp, iRespMediaMsgPoolAlloc);
if (!mediaData)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpResponseCreate - Unable to allocate msg %d", error));
return mediaData;
}
mediaData->setSeqNum((uint32) seqNum);
//If SRP
switch (header)
{
case NSRP_RESPONSE_HEADER:
case SRP_RESPONSE_HEADER:
mediaData->setFormatSpecificInfo(iSrpNsrpEntryNumFrag);
break;
case WNSRP_RESPONSE_HEADER:
mediaData->setFormatSpecificInfo(iWnsrpEntryNumFrag);
break;
}
return mediaData;
}
/************************************************************************/
/* function name : SrpMsgCopy */
/* function outline : Get SRP data from in packet and put it in the */
/* out packet. */
/* function discription: bool SrpMsgCopy( */
/* PVMFSharedMediaDataPtr inPkt) */
/* input data : inPkt - Pointer to incoming packet. */
/* outPkt - Pointer to outgoing packet. */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
bool SRP::SrpMsgCopy(PVMFSharedMediaDataPtr inPkt)
{
OsclRefCounterMemFrag frag;
OsclSharedPtr<PVMFMediaDataImpl> data;
SRPRxData *rxData;
int32 error = OsclErrNone;
OSCL_UNUSED_ARG(error);
uint8 *pData;
uint8* pFragPos = NULL;
int fragLen = 0;
inPkt->getMediaFragment(0, frag);
pData = ((uint8 *) frag.getMemFragPtr()) + SRP_HEADER_SIZE + SRP_SEQUENCE_SIZE;
//If using CCSRL method.
if (iCcsrlSduSize > 0)
{
iStats.totalCCSRLChunksRecv++;
pFragPos = pData + CCSRL_HEADER_SIZE;
fragLen = frag.getMemFragSize() - SRP_HEADER_SIZE - SRP_SEQUENCE_SIZE - CCSRL_HEADER_SIZE - SRP_FCS_SIZE;
}
else
{
pFragPos = pData;
fragLen = frag.getMemFragSize() - SRP_HEADER_SIZE - SRP_SEQUENCE_SIZE - SRP_FCS_SIZE;
}
//Data to large. Pass up whatever is buffered in receive packet
if (fragLen > MAX_SIZE_OF_SRP_PDU)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpMsgCopy - incoming data to large to copy %d, max %d", fragLen, MAX_SIZE_OF_SRP_PDU));
return false;
}
rxData = GetRxFrag();
if (rxData == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpMsgCopy - unable to allocate rx data frag %d", error));
return false;
}
if (!AllocateRxPacket(data, rxData))
return 0;
if (!CreateMediaData(rxData, data))
return 0;
rxData->data->getMediaFragment(0, frag);
oscl_memcpy(frag.getMemFragPtr(), pFragPos, fragLen);
rxData->data->setMediaFragFilledLen(0, fragLen);
rxData->seqNum = (uint8) inPkt->getSeqNum();
if (iCcsrlSduSize > 0)
{
// Return true if last CCSRL fragment in original H245 packet.
data->setMarkerInfo(((*pData == LAST_CCSRL_CHUNK) ? true : false));
}
else
{
data->setMarkerInfo(true);
}
//Add to rx pending list
AddPendingRxFrag(rxData);
return true;
}
bool SRP::AllocateRxPacket(OsclSharedPtr<PVMFMediaDataImpl>& data, SRPRxData* rxData)
{
data = iRxPacketAlloc->allocate(MAX_SIZE_OF_SRP_PDU);
if (!data)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpMsgCopy - Unable allocate rx message impl"));
FreeRxFrag(rxData);
return false;
}
return true;
}
bool SRP::CreateMediaData(SRPRxData* rxData, OsclSharedPtr<PVMFMediaDataImpl> data)
{
rxData->data = PVMFMediaData::createMediaData(data, iRxMediaMsgPoolAlloc);
if (!(rxData->data))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::SrpMsgCopy - Unable allocate rx message"));
FreeRxFrag(rxData);
return false;
}
return true;
}
bool SRP::CreateMediaData(PVMFSharedMediaDataPtr& srpPkt,
OsclSharedPtr<PVMFMediaDataImpl> data)
{
srpPkt = PVMFMediaData::createMediaData(data, iTxMediaMsgPoolAlloc);
if (!srpPkt)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR,
(0x40000020, "SRP::UpperLayerRx - Unable allocate tx message"));
return false;
}
return true;
}
/************************************************************************/
/* function name : Srp_0_1 */
/* function outline : PDU received in IDLE */
/* function discription: PVMFSharedMediaDataPtr Srp_0_1() */
/* input data : pPkt - pointer of received packet from corder */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
int SRP::Srp_0_1()
{
PVMFSharedMediaDataPtr pSrpCommandPkt;
PVMFSharedMediaDataPtr pTxPkt;
PVMFSharedMediaDataPtr pFirstPkt;
SRPRespTimer *pTimer;
switch (WnsrpStatusGet())
{
case NO_WNSRP_SUPPORT:
case WNSRP_TX_SUPPORT:
pFirstPkt = SrpSendWaitGet(0);
/* Create SRP command */
pTxPkt = SrpCommandCreate(pFirstPkt, SRP_COMMAND_HEADER);
/* If packet could not be created. */
if (pTxPkt.GetRep() == NULL)
{
return(0);
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::Srp_0_1 - lowerlayertx srp cmd seq num %d", pTxPkt->getSeqNum()));
/* Send SRP command */
LowerLayerTx(pTxPkt);
/* Start response wait timer */
SrpT401Start(iSrpCommandSave, pTxPkt);
if (WnsrpStatusGet() == NO_WNSRP_SUPPORT) break;
//If tx support only, must send srp frame also.
case WNSRP_FULL_SUPPORT:
while (!iFreeWnsrpCommandSave.empty() &&
(iActiveWnsrpCommandSave.size() < iSrpWaitQueue.size()))
{
pSrpCommandPkt = SrpSendWaitGet(iActiveWnsrpCommandSave.size());
//No more outstanding frags to send
if (pSrpCommandPkt.GetRep() == NULL)
{
break;
}
/* Create WNSRP command */
pTxPkt = SrpCommandCreate(pSrpCommandPkt, WNSRP_COMMAND_HEADER);
/* If packet could not be created. */
if (pTxPkt.GetRep() == NULL)
{
return(0);
}
pTimer = GetFreeWnsrpTimer();
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::Srp_0_1 - lowerlayertx wnsrp cmd seq num %d", pTxPkt->getSeqNum()));
/* Send SRP command */
LowerLayerTx(pTxPkt);
/* Start response wait timer */
SrpT401Start(*pTimer, pTxPkt);
AddActiveWnsrpTimer(pTimer);
}
break;
default:
break;
}
/* Set status */
SrpStatusSet(STS_WAIT_RESPONSE);
return (1);
}
/************************************************************************/
/* function name : Srp_0_2 */
/* function outline : SRP command received */
/* in IDLE or WAITING-RESPONSE */
/* function discription: PVMFSharedMediaDataPtr Srp_0_2( */
/* PVMFSharedMediaDataPtr pPkt ) */
/* input data : pPkt - pointer of received packet from AL1C */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
int SRP::Srp_0_2(PVMFSharedMediaDataPtr pPkt, int event)
{
PVMFSharedMediaDataPtr resp;
OsclRefCounterMemFrag frag;
SRPRxData *rxData;
uint8 header;
//If WNSRP command
if (event == EV_WNSRP_COMMAND)
{
header = WNSRP_RESPONSE_HEADER;
}
//Else SRP command
else
{
if (iUseNSRP)
{
header = NSRP_RESPONSE_HEADER;
}
else
{
header = SRP_RESPONSE_HEADER;
}
}
if (iFirstCmd)
{
//WNSRP must always start with 0
if (event == EV_WNSRP_COMMAND)
{
SrpRecvSeqSet(0);
}
else
{
SrpRecvSeqSet((uint8) pPkt->getSeqNum());
}
iFirstCmd = false;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP::Srp_0_2 - Incoming SequenceNumber = %d", pPkt->getSeqNum()));
if (CheckRxSeqNum(pPkt->getSeqNum(), header))
{
if (!SrpMsgCopy(pPkt))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::Srp_0_2 - Unable to copy data"));
return 0;
}
// Create SRP response
resp = SrpResponseCreate((uint8) pPkt->getSeqNum(), header);
if (resp.GetRep() == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::Srp_0_2 - Unable create reponse packet"));
/* If unable to create response message. */
return 0;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::Srp_0_2 - lowerlayertx srp resp seq num %d", resp->getSeqNum()));
// SRP response send
LowerLayerTx(resp);
// Check for full H245 messages
while (iPendingRxFragList &&
(iPendingRxFragList->seqNum == SrpRecvSeqGet()))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::Srp_0_2 - upperlayertx last frag %d", iPendingRxFragList->data->getMarkerInfo()));
UpperLayerTx(iPendingRxFragList->data);
rxData = iPendingRxFragList;
iPendingRxFragList = iPendingRxFragList->next;
FreeRxFrag(rxData);
SrpRecvSeqCount();
}
}
return 1;
}
/************************************************************************/
/* function name : Srp_1_1 */
/* function outline : PDU received from corder in WAITING-RESPONSE */
/* function discription: PVMFSharedMediaDataPtr Srp_1_1() */
/* input data : pPkt - pointer of received packet from corder */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
int SRP::Srp_1_1()
{
PVMFSharedMediaDataPtr pTxPkt;
SRPRespTimer *pTimer;
switch (WnsrpStatusGet())
{
case NO_WNSRP_SUPPORT:
//SRP mode, cannot send until response for last packet is received.
break;
case WNSRP_TX_SUPPORT:
case WNSRP_FULL_SUPPORT:
while (!iFreeWnsrpCommandSave.empty() &&
(iActiveWnsrpCommandSave.size() < iSrpWaitQueue.size()))
{
/* Create WNSRP command */
pTxPkt = SrpCommandCreate(SrpSendWaitGet(iActiveWnsrpCommandSave.size()), WNSRP_COMMAND_HEADER);
/* If packet could not be created. */
if (pTxPkt.GetRep() == NULL)
{
return(0);
}
pTimer = GetFreeWnsrpTimer();
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::Srp_1_1 - lowerlayertx wnsrp cmd seq num %d", pTxPkt->getSeqNum()));
/* Send SRP command */
LowerLayerTx(pTxPkt);
/* Start response wait timer */
SrpT401Start(*pTimer, pTxPkt);
AddActiveWnsrpTimer(pTimer);
}
break;
default:
break;
}
return (1);
}
/************************************************************************/
/* function name : Srp_1_3 */
/* function outline : SRP response received in WAITING-RESPONSE */
/* function discription: PVMFSharedMediaDataPtr Srp_1_3( */
/* PVMFSharedMediaDataPtr pPkt ) */
/* input data : pPkt - pointer of received packet from AL1C */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
int SRP::Srp_1_3(PVMFSharedMediaDataPtr pPkt, int event)
{
PVMFSharedMediaDataPtr pSrpCommandPkt;
SRPRespTimer *pTimer;
uint32 i;
uint32 seqNum = pPkt->getSeqNum();
bool isWaiting;
switch (event)
{
case EV_WNSRP_RESPONSE:
// Remove packet from waiting list
SrpCommandClear(seqNum);
for (isWaiting = false, i = 0; i < iActiveWnsrpCommandSave.size(); i++)
{
if (seqNum == iActiveWnsrpCommandSave[i]->pPkt->getSeqNum())
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::Srp_1_3 - wnsrp timer found %d", i));
// Resend previous WNSRP packets per section A.4.3
for (uint32 k = 0; k < i; k++)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::Srp_1_3 - lowerlayertx EV_WNSRP_RESPONSE wnsrp cmd seq num %d, index k %d", iActiveWnsrpCommandSave[k]->pPkt->getSeqNum(), k));
// Send SRP command
LowerLayerTx(iActiveWnsrpCommandSave[k]->pPkt);
// Stop timer
SrpT401Stop(*iActiveWnsrpCommandSave[k]);
// Restart timer
SrpT401Start(*iActiveWnsrpCommandSave[k], iActiveWnsrpCommandSave[k]->pPkt);
// Count-up retry counter
++iActiveWnsrpCommandSave[k]->N400Counter;
}
// Stop response wait timer
SrpT401Stop(*iActiveWnsrpCommandSave[i]);
// Release packet
iActiveWnsrpCommandSave[i]->pPkt.Unbind();
// Remove timer from active list
RemoveActiveWnsrpTimer(iActiveWnsrpCommandSave[i]);
isWaiting = true;
break;
}
}
if (!isWaiting)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP::Srp_1_3 - WNSRP command with seq %d not waiting for response", seqNum));
return 0;
}
break;
case EV_NSRP_RESPONSE:
// Remove packet from waiting list
SrpCommandClear(seqNum);
//Stop any wnsrp timers with same seq number
for (i = 0; i < iActiveWnsrpCommandSave.size(); i++)
{
if (seqNum == iActiveWnsrpCommandSave[i]->pPkt->getSeqNum())
{
// Stop response wait timer
SrpT401Stop(*iActiveWnsrpCommandSave[i]);
// Release packet
iActiveWnsrpCommandSave[i]->pPkt.Unbind();
// Remove timer from active list
RemoveActiveWnsrpTimer(iActiveWnsrpCommandSave[i]);
break;
}
}
if (iSrpCommandSave.isTimerActive)
{
if (seqNum == iSrpCommandSave.pPkt->getSeqNum())
{
// Stop response wait timer
SrpT401Stop(iSrpCommandSave);
// Release packet
iSrpCommandSave.pPkt.Unbind();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP::Srp_1_3 - NSRP command seq %d does not match NSRP resp seq %d", iSrpCommandSave.pPkt->getSeqNum(), seqNum));
return 0;
}
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP::Srp_1_3 - No command waiting for NSRP response"));
return 0;
}
break;
case EV_RESPONSE:
if (iSrpCommandSave.isTimerActive)
{
//Stop oldest wnsrp timer
if (!iActiveWnsrpCommandSave.empty())
{
// Stop response wait timer
SrpT401Stop(*iActiveWnsrpCommandSave[0]);
// Release packet
iActiveWnsrpCommandSave[0]->pPkt.Unbind();
// Remove timer from active list
RemoveActiveWnsrpTimer(iActiveWnsrpCommandSave[0]);
}
// Remove packet from waiting list
SrpCommandClear(iSrpCommandSave.pPkt->getSeqNum());
// Stop response wait timer
SrpT401Stop(iSrpCommandSave);
// Release packet
iSrpCommandSave.pPkt.Unbind();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP::Srp_1_3 - No command waiting for SRP response"));
return 0;
}
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::Srp_1_3 - Invalid response type %d", event));
return 0;
}
switch (WnsrpStatusGet())
{
case NO_WNSRP_SUPPORT:
case WNSRP_TX_SUPPORT:
// Waiting PDU exists?
if (!iSrpWaitQueue.empty())
{
// Create SRP command
pSrpCommandPkt = SrpCommandCreate(SrpSendWaitGet(0), SRP_COMMAND_HEADER);
if (pSrpCommandPkt.GetRep() == NULL)
{
// Set status
SrpStatusSet(STS_IDLE);
return 0;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::Srp_1_3 - lowerlayertx srp cmd seq num %d", pSrpCommandPkt->getSeqNum()));
// Send SRP command
LowerLayerTx(pSrpCommandPkt);
// Start response wait timer
SrpT401Start(iSrpCommandSave, pSrpCommandPkt);
}
if (WnsrpStatusGet() == NO_WNSRP_SUPPORT)
{
break;
}
//Fall through to next case
case WNSRP_FULL_SUPPORT:
//Check if wnsrp timer is available
if (iActiveWnsrpCommandSave.size() < iSrpWaitQueue.size())
{
/* Create WNSRP command */
pSrpCommandPkt = SrpCommandCreate(SrpSendWaitGet(iActiveWnsrpCommandSave.size()), WNSRP_COMMAND_HEADER);
/* If packet could not be created. */
if (pSrpCommandPkt.GetRep() == NULL)
{
return(0);
}
pTimer = GetFreeWnsrpTimer();
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::Srp_1_3 - lowerlayertx WNSRP_FULL_SUPPORT wnsrp cmd seq num %d", pSrpCommandPkt->getSeqNum()));
/* Send SRP command */
LowerLayerTx(pSrpCommandPkt);
/* Start response wait timer */
SrpT401Start(*pTimer, pSrpCommandPkt);
AddActiveWnsrpTimer(pTimer);
}
break;
}
if (!iSrpCommandSave.isTimerActive && iActiveWnsrpCommandSave.empty())
{
// Set status
SrpStatusSet(STS_IDLE);
}
/* Get total response time for frame. */
UpdateRespStats();
return(1) ;
}
/************************************************************************/
/* function name : Srp_1_4 */
/* function outline : Response wait timer timeout */
/* in WAITING-RESPONSE */
/* function discription: PVMFSharedMediaDataPtr Srp_1_4( */
/* PVMFSharedMediaDataPtr pPkt, */
/* int32 id ) */
/* input data : pPkt - pointer of timeout information */
/* id - id of timer that timed out */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
int SRP::Srp_1_4(int32 id)
{
PVMFSharedMediaDataPtr pSrpCommandPkt;
SRPRespTimer *timer;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP::Srp_1_4 - Response wait timer timeout"));
if (iSrpCommandSave.timerID == id)
{
timer = &iSrpCommandSave;
}
else if ((uint32) id < iWNSRPTxWindow)
{
timer = FindActiveWnsrpTimer(id);
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::Srp_1_4 - unknown SRP timer %d", id));
return 0;
}
// Retry over ?
if (SrpN400Check(*timer) == false)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP::Srp_1_4 - Max retry over"));
// Remove command from wait queue.
SrpCommandClear(timer->pPkt->getSeqNum());
// Stop timer
SrpT401Stop(*timer);
//Release packet
timer->pPkt.Unbind();
// Take timer off WNSRP timer wait list (if it is a WNSRP timer)
RemoveActiveWnsrpTimer(timer);
// If observer exists.
if (iObserver)
{
/* Report transmission failure to TSC.
TSC will stop SRP if necessary. */
iObserver->TransmissionFailure();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::Srp_1_4 - No observer!"));
switch (WnsrpStatusGet())
{
case NO_WNSRP_SUPPORT:
// Set status
SrpStatusSet(STS_IDLE);
break;
case WNSRP_TX_SUPPORT:
case WNSRP_FULL_SUPPORT:
//If no more packets waiting to be sent.
if (!iSrpWaitQueue.empty())
{
// Set status
SrpStatusSet(STS_IDLE);
}
break;
}
}
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0x40000020, "SRP::Srp_1_4 - Create and send SRP command again, seq num %d", timer->pPkt->getSeqNum()));
// Send SRP command
LowerLayerTx(timer->pPkt);
// Count-up retry counter
++timer->N400Counter;
}
return 1;
}
/************************************************************************/
/* function name : SrpSendWaitGet */
/* function outline : Get from queue for waiting transmittion */
/* function discription: PVMFSharedMediaDataPtr SrpSendWaitGet( */
/* uint32 index) */
/* input data : index - index of srp frags */
/* output data : data pointer of waiting transmittion */
/* draw time : '05.08.25 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
PVMFSharedMediaDataPtr SRP::SrpSendWaitGet(uint32 index)
{
if (index < iSrpWaitQueue.size())
{
return iSrpWaitQueue[index];
}
else
{
PVMFSharedMediaDataPtr temp;
return temp;
}
}
/************************************************************************/
/* function name : SrpSendWaitRemove */
/* function outline : Remove from queue for waiting transmission */
/* function discription: PVMFSharedMediaDataPtr SrpSendWaitRemove( */
/* uint32 index) */
/* input data : index - index of srp frags */
/* output data : data pointer of waiting transmittion */
/* draw time : '05.08.25 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
int SRP::SrpSendWaitRemove(uint32 index)
{
if (index < iSrpWaitQueue.size())
{
iSrpWaitQueue.erase(&iSrpWaitQueue[index]);
return 1;
}
else
{
return 0;
}
}
/************************************************************************/
/* function name : SrpSendSeqCount */
/* function outline : Count up sequence number for sending */
/* function discription: void SrpSendSeqCount( void ) */
/* input data : None */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::SrpSendSeqCount()
{
if (iSendSeqNumber < 255)
{
++ iSendSeqNumber;
}
else
{
iSendSeqNumber = 0;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP::SrpSendSeqCount = %d", iSendSeqNumber));
return;
}
/************************************************************************/
/* function name : SrpRecvSeqCount */
/* function outline : Count up sequence number for receiving */
/* function discription: void SrpRecvSeqCount( void ) */
/* input data : None */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::SrpRecvSeqCount()
{
if (iRecvSeqNumber < 255)
{
++iRecvSeqNumber;
}
else
{
iRecvSeqNumber = 0;
}
if (iOldestWNSRPRetransSeqNum < 255)
{
++iOldestWNSRPRetransSeqNum;
}
else
{
iOldestWNSRPRetransSeqNum = 0;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP::SrpRecvSeqCount = %d, oldest retrans = %d", iRecvSeqNumber, iOldestWNSRPRetransSeqNum));
return;
}
/************************************************************************/
/* function name : SrpStatusSet */
/* function outline : Status number set */
/* function discription: void SrpStatusSet( SrpStatus newStatus ) */
/* input data : newStatus - status number */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::SrpStatusSet(SrpStatus newStatus)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP::SrpStatusSet - SrpStatus from %d => %d", iStatus, newStatus));
iStatus = newStatus;
return;
}
/************************************************************************/
/* function name : WnsrpStatusSet */
/* function outline : WNSRP Status number set */
/* function discription: void WnsrpStatusSet( WnsrpStatus newStatus ) */
/* input data : newStatus - status number */
/* output data : None */
/* draw time : '05.08.23 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::WnsrpStatusSet(WnsrpStatus newStatus)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_VERBOSE, (0x40000020, "SRP::WnsrpStatusSet - WnsrpStatus from %d => %d", iCurWnsrpStatus, newStatus));
iCurWnsrpStatus = newStatus;
switch (iCurWnsrpStatus)
{
case NO_WNSRP_SUPPORT:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_INFO, (0x40000020, "SRP::WnsrpStatusSet - Remote does not support WNSRP!"));
//Clear all WNSRP resp timers
while (!iActiveWnsrpCommandSave.empty())
{
// Stop response wait timer
SrpT401Stop(*iActiveWnsrpCommandSave[0]);
// Release packet
iActiveWnsrpCommandSave[0]->pPkt.Unbind();
// Remove timer from active list
RemoveActiveWnsrpTimer(iActiveWnsrpCommandSave[0]);
}
if (iObserver) iObserver->UseWNSRP(false);
break;
case WNSRP_FULL_SUPPORT:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_INFO, (0x40000020, "SRP::WnsrpStatusSet - Remote supports WNSRP!"));
//Disable SRP tx
if (iSrpCommandSave.isTimerActive)
{
// Stop response wait timer
SrpT401Stop(iSrpCommandSave);
// Release packet
iSrpCommandSave.pPkt.Unbind();
}
//Send all WNSRP frames using the default multiplex table entry number 0
*(uint8 *)iWnsrpEntryNumFrag.getMemFragPtr() = SRP_NSRP_MT_ENTRY_NUMBER;
if (iObserver) iObserver->UseWNSRP(true);
break;
default:
break;
}
return;
}
/************************************************************************/
/* function name : SrpT401Start */
/* function outline : T401 timer start */
/* function discription: void SrpT401Start( SRPRespTimer &timer ) */
/* input data : timer - timer to start */
/* output data : None */
/* draw time : '05.08.24 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::SrpT401Start(SRPRespTimer &timer, PVMFSharedMediaDataPtr pPkt)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "SRP::SrpT401Start - id %d, IsPrimaryTimerActive = %d", timer.timerID, timer.isTimerActive));
/* Start timer that is not active. */
if (!timer.isTimerActive)
{
timer.T401Timer.Request(timer.timerID, (int32)this, iT401TimerValue, this, true);
timer.isTimerActive = true;
}
timer.pPkt = pPkt;
timer.N400Counter = 0;
return;
}
/************************************************************************/
/* function name : SrpT401Stop */
/* function outline : T401 timer stop */
/* function discription: void SrpT401Stop( SRPRespTimer &timer ) */
/* input data : timer - timer to stop */
/* output data : None */
/* draw time : '05.08.24 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::SrpT401Stop(SRPRespTimer &timer)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::SrpT401Stop - id %d, IsPrimaryTimerActive = %d", timer.timerID, timer.isTimerActive));
/* Reset active timer */
if (timer.isTimerActive)
{
timer.T401Timer.Cancel(timer.timerID);
timer.isTimerActive = false;
}
return;
}
/************************************************************************/
/* function name : SrpT401Timeout */
/* function outline : T401 timeout */
/* function discription: int SrpT401Timeout(int TimerId, void *Param) */
/* input data : TimerId - timer id */
/* Param - timer parameter */
/* output data : 0 - Reset timer to fire again */
/* 1 - Do not reset timer */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
// OsclTimerObserver virtual function
void SRP::TimeoutOccurred(int32 timerID, int32 param)
{
OSCL_UNUSED_ARG(param);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::TimeoutOccurred, id %d, wnsrp status %d", timerID, iCurWnsrpStatus));
iStats.totalNumTimeouts++;
/* Process call */
SrpStateChange(SrpStatusGet(), EV_TIMEOUT, (void *) &timerID);
}
/************************************************************************/
/* function name : LowerLayerRx */
/* function outline : Lower Layer Receive */
/* function description: void LowerLayerRx(MediaPacket* pPkt) */
/* input data : pPkt - pointer to incoming packet */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::LowerLayerRx(PVMFSharedMediaDataPtr pPkt)
{
int32 error;
OsclSharedPtr<PVMFMediaDataImpl> data;
OSCL_TRY(error, data = iRxPacketAlloc->allocate(MAX_SIZE_OF_SRP_PDU));
OSCL_FIRST_CATCH_ANY(error, PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::LowerLayerRx - Unable allocate rx message impl %d", error));
return);
OsclRefCounterMemFrag frag;
data->getMediaFragment(0, frag);
uint8* pos = (uint8*)frag.getMemFragPtr();
for (unsigned i = 0;i < pPkt->getNumFragments();i++)
{
OsclRefCounterMemFrag src_frag;
pPkt->getMediaFragment(i, src_frag);
oscl_memcpy(pos, src_frag.getMemFragPtr(), src_frag.getMemFragSize());
pos += src_frag.getMemFragSize();
}
data->setMediaFragFilledLen(0, pPkt->getFilledSize());
/* Record number of frames received from lower layer. */
iStats.totalFramesRecv++;
/* Record number of bytes received. */
iStats.totalBytesRecv += pPkt->getFilledSize();
/* Process call */
PVMFSharedMediaDataPtr mediaData;
OSCL_TRY(error, mediaData = PVMFMediaData::createMediaData(data, iRxMediaMsgPoolAlloc));
OSCL_FIRST_CATCH_ANY(error, PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::LowerLayerRx - Unable allocate rx message %d", error));
return);
SrpStateChange(SrpStatusGet(), SrpGetEventNoFromAL1(mediaData), &mediaData);
return;
}
/************************************************************************/
/* function name : UpperLayerRx */
/* function outline : Upper Layer Receive */
/* function description: void UpperLayerRx(MediaPacket* pPkt) */
/* input data : pPkt - pointer to incoming packet */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::UpperLayerRx(PVMFSharedMediaDataPtr pPkt)
{
uint32 offset;
uint8 *buf;
PVMFSharedMediaDataPtr srpPkt;
OsclRefCounterMemFrag newFrag;
OsclRefCounterMemFrag CCSRLFrag;
OsclRefCounterMemFrag frag;
OsclSharedPtr<PVMFMediaDataImpl> data;
uint8 seqNum;
uint32 size;
iStats.totalH245MessagesToSend++;
// IMPORTANT: Assume upper layer is sending 1 fragment in a packet!
if (pPkt->getNumFragments() != 1)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::UpperLayerRx - Num frags of incoming message not equal to 1, %d", pPkt->getNumFragments()));
return;
}
pPkt->getMediaFragment(0, frag);
/* CCSRL */
if (iCcsrlSduSize > 0)
{
//---------------------------------------------------------
// Send the encoded message (pCodeData, GetSize) to SRP
// using the multi-chunk feature of H.324.
//---------------------------------------------------------
size = frag.getMemFragSize();
// If queue cannot hold the number of fragments that will be needed.
// If not enough messages available to send the entire message
if (((size / iCcsrlSduSize) + 1) > iTxPacketAlloc->NumMsgAvail())
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::UpperLayerRx - Unable allocate enough messages, current num %d", iTxPacketAlloc->NumMsgAvail()));
return;
}
if (size > iCcsrlSduSize)
{
iStats.totalH245MessagesFragmented++;
}
buf = (uint8 *) frag.getMemFragPtr();
offset = 0;
while (offset < size)
{
if (!Allocate(data, CCSRLFrag))
return;
newFrag = frag;
newFrag.getMemFrag().ptr = (buf + offset);
/* Set sequence number */
seqNum = (uint8)SrpSendSeqGet();
SrpSendSeqCount();
*(uint8 *)CCSRLFrag.getMemFrag().ptr = seqNum;
CCSRLFrag.getMemFrag().len = SRP_SEQUENCE_SIZE + CCSRL_HEADER_SIZE;
if ((offset + iCcsrlSduSize) >= size)
{
/* Last CCSRL chunk */
*((uint8 *)CCSRLFrag.getMemFrag().ptr + 1) = LAST_CCSRL_CHUNK;
data->appendMediaFragment(CCSRLFrag);
newFrag.getMemFrag().len = size - offset;
offset += (size - offset);
}
else
{
/* Intermediate CCSRL chunk */
*((uint8 *)CCSRLFrag.getMemFrag().ptr + 1) = INTERMEDIATE_CCSRL_CHUNK;
data->appendMediaFragment(CCSRLFrag);
newFrag.getMemFrag().len = iCcsrlSduSize;
offset += iCcsrlSduSize;
}
data->appendMediaFragment(newFrag);
if (!CreateMediaData(srpPkt, data))
return;
srpPkt->setSeqNum(seqNum);
/* Queue received PDU */
SrpSendWaitSet(srpPkt);
}
}
else
{
// If no message available to send the entire message
if (iTxPacketAlloc->NumMsgAvail() == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::UpperLayerRx - no message available"));
return;
}
if (!Allocate(data, CCSRLFrag))
return;
/* Set sequence number */
seqNum = (uint8) SrpSendSeqGet();
SrpSendSeqCount();
*(uint8 *)CCSRLFrag.getMemFrag().ptr = seqNum;
CCSRLFrag.getMemFrag().len = SRP_SEQUENCE_SIZE;
data->appendMediaFragment(CCSRLFrag);
data->appendMediaFragment(frag);
if (!CreateMediaData(srpPkt, data))
return;
//---------------------------------------------------------
// Send the encoded message (pCodeData, GetSize) to SRP
// without using the H.324 multi-chunk method.
//---------------------------------------------------------
srpPkt->setSeqNum(seqNum);
/* Queue received PDU */
SrpSendWaitSet(srpPkt);
}
/* Process call */
SrpStateChange(SrpStatusGet(), EV_PDU, NULL);
return;
}
bool SRP::Allocate(OsclSharedPtr<PVMFMediaDataImpl>& data, OsclRefCounterMemFrag& CCSRLFrag)
{
data = iTxPacketAlloc->allocate();
if (!data)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR,
(0x40000020, "SRP::UpperLayerRx - Unable allocate tx media impl"));
return false;
}
CCSRLFrag = iCcsrlAllocator.get();
return (CCSRLFrag.getMemFragPtr() ? true : false);
}
/************************************************************************/
/* function name : UseNSRP */
/* function outline : Set use of NSRP response frames or not. */
/* function description: void UseNSRP( bool aUseNsrp ) */
/* input data : None */
/* output data : None */
/* draw time : '05.08.23 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::UseNSRP(bool aUseNsrp)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_INFO, (0x40000020, "SRP::UseNSRP - cur %d, new %d", iUseNSRP, aUseNsrp));
if (aUseNsrp == iUseNSRP)
{
return;
}
iUseNSRP = aUseNsrp;
iFirstNSRPResp = false;
return;
}
/************************************************************************/
/* function name : DisableWNSRPSupport */
/* function outline : Disables all support for WNSRP. Must be */
/* called before initailization. */
/* function description: void DisableWNSRPSupport() */
/* input data : None */
/* output data : None */
/* draw time : '05.08.23 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::DisableWNSRPSupport()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::DisableWNSRPSupport"));
if (WnsrpStatusGet() == WNSRP_TX_SUPPORT)
{
WnsrpStatusSet(NO_WNSRP_SUPPORT);
}
iHandleWNSRP = false;
return;
}
/************************************************************************/
/* function name : SrpResetStats */
/* function outline : Reset statistics */
/* function description: void SrpResetStats( void ) */
/* input data : None */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::SrpResetStats()
{
iStats.Reset();
iTotalRespTime = 0;
}
/************************************************************************/
/* function name : SrpGetStats */
/* function outline : Retrieve statistics */
/* function description: void SrpGetStats(SRPStats &aStats) */
/* input data : aStats - iStats object to fill */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::SrpGetStats(SRPStats &aStats)
{
if (iStats.totalCCSRLChunksSent > 0)
{
iStats.aveRespTime = iTotalRespTime / iStats.totalCCSRLChunksSent;
}
else
{
iStats.aveRespTime = 0;
}
aStats = iStats;
}
/************************************************************************/
/* function name : UpdateRespStats */
/* function outline : Update response statistics */
/* function description: void UpdateRespStats() */
/* input data : None */
/* output data : None */
/* draw time : '96.10.29 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 1996 NTT DoCoMo */
/************************************************************************/
void SRP::UpdateRespStats()
{
TimeValue timeNow;
uint32 timeDifference;
timeNow.set_to_current_time();
timeDifference = timeNow.to_msec() - iInitialTimeChunkSent.to_msec();
if (timeDifference > iStats.maxRespTime)
{
iStats.maxRespTime = timeDifference;
}
else if (timeDifference < iStats.minRespTime)
{
iStats.minRespTime = timeDifference;
}
iTotalRespTime += timeDifference;
}
/************************************************************************/
/* function name : GetFreeWnsrpTimer */
/* function outline : Get free WNSRP response timer */
/* function description: SRPRespTimer *GetFreeWnsrpTimer() */
/* input data : None */
/* output data : None */
/* draw time : '05.08.26 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
SRP::SRPRespTimer *SRP::GetFreeWnsrpTimer()
{
SRPRespTimer *timer = NULL;
if (!iFreeWnsrpCommandSave.empty())
{
timer = iFreeWnsrpCommandSave[0];
iFreeWnsrpCommandSave.erase(iFreeWnsrpCommandSave.begin());
}
return timer;
}
/************************************************************************/
/* function name : FindActiveWnsrpTimer */
/* function outline : Get free WNSRP response timer */
/* function description: SRPRespTimer *FindActiveWnsrpTimer( */
/* int32 timerID) */
/* input data : timerID - id of timer */
/* output data : None */
/* draw time : '05.08.26 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
SRP::SRPRespTimer *SRP::FindActiveWnsrpTimer(int32 timerID)
{
for (uint32 i = 0; i < iActiveWnsrpCommandSave.size(); i++)
{
if (iActiveWnsrpCommandSave[i]->timerID == timerID)
{
return iActiveWnsrpCommandSave[i];
}
}
return NULL;
}
/************************************************************************/
/* function name : RemoveActiveWnsrpTimer */
/* function outline : Remove an timer from the active WNSRP timer */
/* list */
/* function description: void RemoveActiveWnsrpTimer( */
/* SRPRespTimer *timer) */
/* input data : timer - timer to remove */
/* output data : None */
/* draw time : '05.08.26 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::RemoveActiveWnsrpTimer(SRPRespTimer *timer)
{
//Timer should be stopped before this method is called.
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::RemoveActiveWnsrpTimer id %d", timer->timerID));
for (uint32 i = 0; i < iActiveWnsrpCommandSave.size(); i++)
{
if (iActiveWnsrpCommandSave[i] == timer)
{
FreeWnsrpTimer(iActiveWnsrpCommandSave[i]);
iActiveWnsrpCommandSave.erase(&iActiveWnsrpCommandSave[i]);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::RemoveActiveWnsrpTimer timer removed index %d", i));
return;
}
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::RemoveActiveWnsrpTimer timer not found"));
return;
}
/************************************************************************/
/* function name : FreeRxFrag */
/* function outline : Free a frag to the free list */
/* function description: void FreeRxFrag(SRPRxData *frag) */
/* input data : timer - timer to remove */
/* output data : None */
/* draw time : '05.08.26 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::FreeRxFrag(SRPRxData *frag)
{
frag->seqNum = 0;
frag->data.Unbind();
frag->next = iFreeRxFragList;
iFreeRxFragList = frag;
return;
}
/************************************************************************/
/* function name : GetRxFrag */
/* function outline : Remove an frag from the free list */
/* function description: SRPRxData *GetRxFrag() */
/* input data : timer - timer to remove */
/* output data : None */
/* draw time : '05.08.26 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
SRP::SRPRxData *SRP::GetRxFrag(void)
{
SRPRxData *free;
if (iFreeRxFragList)
{
free = iFreeRxFragList;
iFreeRxFragList = iFreeRxFragList->next;
return free;
}
else
{
return NULL;
}
}
/************************************************************************/
/* function name : AddPendingRxFrag */
/* function outline : Add a rx frag to the pending list in order of */
/* rx sequence number mod 256. */
/* function description: void AddPendingRxFrag(SRPRxData *frag) */
/* input data : timer - timer to remove */
/* output data : None */
/* draw time : '05.08.26 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
void SRP::AddPendingRxFrag(SRPRxData *frag)
{
SRPRxData *cur = iPendingRxFragList;
SRPRxData *prev = NULL;
while (cur)
{
if (cur->seqNum > frag->seqNum)
{
if (prev)
{
prev->next = frag;
frag->next = cur;
}
else
{
frag->next = iPendingRxFragList;
iPendingRxFragList = frag;
}
return;
}
prev = cur;
cur = cur->next;
}
frag->next = NULL;
if (prev)
{
prev->next = frag;
}
else
{
iPendingRxFragList = frag;
}
return;
}
/************************************************************************/
/* function name : CheckRxSeqNum */
/* function outline : Check Rx sequence number for against the */
/* pending rx frags. */
/* function description: bool CheckRxSeqNum(uint32 seqNum, */
/* uint8 header) */
/* input data : timer - timer to remove */
/* output data : None */
/* draw time : '05.08.26 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
bool SRP::CheckRxSeqNum(uint32 seqNum, uint8 header)
{
PVMFSharedMediaDataPtr resp;
uint32 endSeqNum;
//If WNSRP command
switch (header)
{
case WNSRP_RESPONSE_HEADER:
//Check if data is already pending to be sent up
if (CheckPendingRxList(seqNum))
{
/* Create WNSRP response */
resp = SrpResponseCreate((uint8) seqNum, header);
if (resp.GetRep() == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::CheckRxSeqNum - Unable create WNSRP reponse packet"));
/* If unable to create response message. */
return false;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::CheckRxSeqNum - lowerlayertx wnsrp resp seq num %d", resp->getSeqNum()));
/* SRP response send */
LowerLayerTx(resp);
return false;
}
endSeqNum = (SrpRecvSeqGet() + iWNSRPRxWindow) % 256;
//If rx window does not wrap
if (endSeqNum > SrpRecvSeqGet())
{
//If can't accept sequence number because of rx window
if ((seqNum < SrpRecvSeqGet()) ||
(seqNum > endSeqNum))
{
if (CheckWNSRPRetrans(seqNum))
{
/* Create WNSRP response */
resp = SrpResponseCreate((uint8) seqNum, header);
if (resp.GetRep() == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::CheckRxSeqNum - Unable create WNSRP reponse packet"));
/* If unable to create response message. */
return false;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::CheckRxSeqNum - lowerlayertx wnsrp resp seq num %d", resp->getSeqNum()));
/* SRP response send */
LowerLayerTx(resp);
}
return false;
}
//Else can accept sequence number
}
//Else window wraps around
else
{
//If can accept sequence number
if ((seqNum >= SrpRecvSeqGet()) ||
(seqNum <= endSeqNum))
{
return true;
}
//Else can't accept sequence number
else
{
if (CheckWNSRPRetrans(seqNum))
{
/* Create WNSRP response */
resp = SrpResponseCreate((uint8) seqNum, header);
if (resp.GetRep() == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::CheckRxSeqNum - Unable create WNSRP reponse packet"));
/* If unable to create response message. */
return false;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::CheckRxSeqNum - lowerlayertx wnsrp resp seq num %d", resp->getSeqNum()));
/* SRP response send */
LowerLayerTx(resp);
}
return false;
}
}
return true;
case NSRP_RESPONSE_HEADER:
case SRP_RESPONSE_HEADER:
if (seqNum != SrpRecvSeqGet())
{
if (((seqNum + 1) % 256) == SrpRecvSeqGet())
{
/* Create SRP response */
resp = SrpResponseCreate((uint8) seqNum, header);
if (resp.GetRep() == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0x40000020, "SRP::CheckRxSeqNum - Unable create SRP reponse packet"));
/* If unable to create response message. */
return false;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0x40000020, "SRP::CheckRxSeqNum - lowerlayertx srp resp seq num %d", resp->getSeqNum()));
/* SRP response send */
LowerLayerTx(resp);
}
return false;
}
return true;
default:
return false;
}
}
/************************************************************************/
/* function name : CheckPendingRxList */
/* function outline : Check pending rx list against sequence number */
/* function description: bool CheckRxSeqNum(uint32 seqNum) */
/* input data : seqNum - sequence number to check */
/* output data : None */
/* draw time : '05.08.26 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
bool SRP::CheckPendingRxList(uint32 seqNum)
{
SRPRxData *data = iPendingRxFragList;
while (data)
{
if (data->seqNum == seqNum)
{
return true;
}
data = data->next;
}
return false;
}
/************************************************************************/
/* function name : CheckWNSRPRetrans */
/* function outline : Check Rx sequence number for WNSRP retrans */
/* window. */
/* function description: bool CheckWNSRPRetrans(uint32 seqNum) */
/* input data : timer - timer to remove */
/* output data : None */
/* draw time : '05.08.26 */
/*----------------------------------------------------------------------*/
/* amendent career : */
/* Copyright (C) 2005 PacketVideo Corp. */
/************************************************************************/
bool SRP::CheckWNSRPRetrans(uint32 seqNum)
{
//Retrans window does not wrap
if (iOldestWNSRPRetransSeqNum < SrpRecvSeqGet())
{
if ((seqNum < SrpRecvSeqGet()) &&
(seqNum > iOldestWNSRPRetransSeqNum))
{
return true;
}
}
//Retrans window wraps
else if ((seqNum < SrpRecvSeqGet()) ||
(seqNum > iOldestWNSRPRetransSeqNum))
{
return true;
}
return false;
}