diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/MobileTermination/CLogPPPFilter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecmgmt/ucc/Source/MobileTermination/CLogPPPFilter.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,268 @@ +/* +* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* CLOGPPPFILTER +* Prints out the details of all PPP frames that pass through the MT. +* System Includes +* +*/ + + + +#include +#include +#include +#ifdef WIN32 +#include +#else +#include +#endif + + +/******************************************************************************* + * + * Local Includes + * + ******************************************************************************/ +#include "CLogPPPFilter.h" + + +/******************************************************************************* + * + * Definitions + * + ******************************************************************************/ +#define MAX_LCP_MESSAGE_ID 11 + + +/******************************************************************************* + * + * Macro Functions + * + ******************************************************************************/ +#define EXTRACT_SHORT(ptr) (htons((*((short*)(ptr)))&0x0000FFFF)) +#define EXTRACT_CHAR(ptr) ((0x000000FF)&(ptr)) + + +/******************************************************************************* + * + * Static vars + * + ******************************************************************************/ +static char *lcp_message_desc[] = { "(invalid)", "Configure-Request", "Configure-Ack", "Configure-Nack", + "Configure-Reject", "Terminate-Request", "Terminate-Ack", "Code-Reject", + "Protocol-Reject", "Echo-Request", "Echo-Reply", "Discard-Request", NULL }; + +/******************************************************************************* + * + * PUBLIC METHOD: Constructor + * + ******************************************************************************/ +CLogPppFilter::CLogPppFilter( TPhoneData *aPhoneData, CLog *aLog ) : iOutgoingFrame("PPP-Log::OutgoingFrame",1), iIncomingFrame("PPP-Log::IncomingFrame",1) +{ + // check params + assert( aPhoneData != NULL ); + assert( aLog != NULL ); + + //set state + iPhoneData = aPhoneData; + iLog = aLog; + iIncomingFrameOverflowFlag = 0; + iOutgoingFrameOverflowFlag = 0; +} + + +/******************************************************************************* + * + * PUBLIC METHOD: Destructor + * + ******************************************************************************/ +CLogPppFilter::~CLogPppFilter() +{ +} + + +/******************************************************************************* + * + * PUBLIC METHOD: IFilter Interface Methods + * + ******************************************************************************/ + +int CLogPppFilter::ProcessIncomingData( char *data, int len ) +{ + int i; + for( i = 0; i < len; i++ ) { + ProcessByte( &iIncomingFrame, data[i], &iIncomingFrameOverflowFlag ); + } + return 0; +} + + +int CLogPppFilter::ProcessOutgoingData( char *data, int len ) +{ + int i; + for( i = 0; i < len; i++ ) { + ProcessByte( &iOutgoingFrame, data[i], &iOutgoingFrameOverflowFlag ); + } + return 0; +} + + +void CLogPppFilter::ProcessByte( CPppFrame *aFrame, char c, int *iOverflowFlag ) +{ + char *framedesc; + TFrameError ferr; + TFrameStatus fstatus; + + // add the byte to the frame buffer + ferr = aFrame->AddByteToFrame( c ); + + // if this causes an overflow then log the warning and return + if( ferr == FE_OVERFLOW ) { + if( *iOverflowFlag == 0 ) { + iLog->WriteLogEntry( SV_WARNING, aFrame->GetFrameName(), "Frame overflow." ); + *iOverflowFlag = 1; + } + return; + } + assert( ferr == FE_NONE ); + + // if the frame isn't completed then return + fstatus = aFrame->GetFrameStatus(); + if( fstatus != FS_COMPLETE ) { + return; + } + + // otherwise print a record about the frame and then clear it + framedesc = CreateFrameDescription( aFrame ); + iLog->WriteLogEntry( SV_INFO, aFrame->GetFrameName(), framedesc ); + aFrame->ClearFrame(); + *iOverflowFlag = 0; +} + + +/******************************************************************************* + * + * PRIVATE METHOD: Create FrameDescription + * + * Protocol [Message Type] (Frame Size) + * IPCP (21) + * LCP Echo-Request (48) + * + ******************************************************************************/ +char *CLogPppFilter::CreateFrameDescription( CPppFrame *aFrame ) +{ + char *frame_ptr; + int frame_size; + int protocol_id; + char *bptr; + + // get the frame + frame_ptr = aFrame->GetFrameBuffer( &frame_size ); + + // clear the description buffer + iFrameDescription[0] = 0; + + // now insert the protocol and message if appropriate + protocol_id = AddProtocolName( frame_ptr, frame_size ); + + // add the length + bptr = &(iFrameDescription[strlen(iFrameDescription)]); + sprintf( bptr, "(%d).", frame_size ); + + // done + return iFrameDescription; +} + + +/***************************************************************************************** + * + * PRIVATE METHOD: AddProtocolName + * + ****************************************************************************************/ +int CLogPppFilter::AddProtocolName( char *aFrameBuffer, int aFrameSize ) +{ + int protocol_id; + int datapos = 0; + char *ptr; + int message_type; + + // find the position of the protocol field (packet format can change a fair bit) + if( aFrameBuffer[0] == 0x7E ) { + datapos++; + if( aFrameBuffer[1] == ((char)0x000000FF) ) { + datapos++; + if( aFrameBuffer[2] == 0x03 ) { + datapos++; + } + } + } + + // get the protocol id and the target pointer + protocol_id = EXTRACT_SHORT(&aFrameBuffer[datapos]); + ptr = &(iFrameDescription[strlen(iFrameDescription)]); + message_type = EXTRACT_CHAR(aFrameBuffer[datapos+2]); + + // now print the protocol name + switch( protocol_id ) { + case 0xc021: + sprintf( ptr, "LCP " ); + AddLcpMessageTypeString( message_type ); + break; + + case 0xc023: + sprintf( ptr, "PAP " ); + break; + + case 0x8021: + sprintf( ptr, "IPCP " ); + break; + + case 0x80FD: + sprintf( ptr, "CCP " ); + break; + + default: + sprintf( ptr, "0x%X ", protocol_id ); + protocol_id = 0; + break; + } + + // return the protocol id + return protocol_id; +} + + +/***************************************************************************************** + * + * PRIVATE METHOD: AddLcpMessageTypeString + * + ****************************************************************************************/ +void CLogPppFilter::AddLcpMessageTypeString( int aMessageType ) +{ + char *bptr; + + // get the ptr to the output buffer + bptr = &(iFrameDescription[strlen(iFrameDescription)]); + + // make sure the message id is known + if( (aMessageType <= 0) || (aMessageType >= MAX_LCP_MESSAGE_ID) ) { + sprintf( bptr, "0x%X ", aMessageType ); + return; + } + + // print the name of the + sprintf( bptr, lcp_message_desc[aMessageType] ); +} +