diff -r 000000000000 -r af10295192d8 networkingtestandutils/ipprobe/src/sap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkingtestandutils/ipprobe/src/sap.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,194 @@ +// Copyright (c) 2004-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: +// sap.cpp - Packet Probe Hook +// + +#include "sap.h" + +CProviderProbe::CProviderProbe(CProtocolProbe* aProtocol) : iProtocol(aProtocol) + { + __DECLARE_NAME(_S("CProviderProbe")); + iQueueLimit = 8000; + } + +CProviderProbe::~CProviderProbe() + { + if (iProtocol) + iProtocol->CancelSAP(this); + } + +void CProviderProbe::Start() + { + } + +TInt CProviderProbe::GetOption(TUint /*aLevel*/, TUint /*aName*/, TDes8& /*aOption*/) const + { + return KErrNotSupported; + } + +TInt CProviderProbe::SetOption(TUint /*aLevel*/, TUint /*aName*/, const TDesC8& /*aOption*/) + { +// return KErrNotSupported; + return KErrNone; + } + +void CProviderProbe::Ioctl(TUint /*level*/,TUint /*name*/,TDes8* /*anOption*/) + { + Panic(EProbePanic_NotSupported); + } + +void CProviderProbe::CancelIoctl(TUint /*aLevel*/,TUint /*aName*/) + { + Panic(EProbePanic_NotSupported); + } + + +TUint CProviderProbe::Write(const TDesC8 &/*aDesc*/, TUint /*aOptions*/, TSockAddr* /*aAddr*/) + { + // For now, Write does nothing on probe socket + return 1; + } + +void CProviderProbe::Shutdown(TCloseType /*option*/,const TDesC8& /*aDisconnectionData*/) + { + Panic(EProbePanic_NotSupported); + } + +void CProviderProbe::Shutdown(TCloseType aOption) + { + switch(aOption) + { + case EStopInput: + iInputStopped = ETrue; + iRecvQ.Free(); + iSocket->Error(KErrNone,MSocketNotify::EErrorClose); // Complete KErrNone + break; + + case EStopOutput: + iSocket->Error(KErrNone,MSocketNotify::EErrorClose); // Complete KErrNone + break; + + default: + if (aOption != EImmediate) + iSocket->CanClose(); + } + } + +TInt CProviderProbe::SetLocalName(TSockAddr &/*aAddr*/) + { + return 0; // Ignore silently + } + +void CProviderProbe::AutoBind() + { + // Ignore silently + } + +// CProviderProbe::Error +// ********************* +// Soft errors are not immediately reported to the socket server. +// A soft error is indicated by a zero aOperationMask. +// +// The socket error can be cleared by calling this routing with +// aError == KErrNone. +// +void CProviderProbe::Error(TInt aError, TUint aOperationMask) + { + if (aError <= KErrNone && !FatalState()) + { + if (aError == KErrNone) + iErrorMask = aOperationMask; + else + iErrorMask |= aOperationMask; + if (iSocket && aOperationMask) + iSocket->Error(aError, aOperationMask); + } + } + +// +// CProviderProbe::Process() +// ************************* +// Process incoming data from the protocol object. +// +void CProviderProbe::Process(RMBufChain& aPacket, CProtocolBase * /*aSourceProtocol*/) + { + // iInputStopped is set at ShutDown() and no packets should be coming + // from the protocol after that. However, without knowing the exact + // details of the process model/threads, it could be possible that + // a Process() call has been initiated by the protocol and interrupted + // before the shutdown, thus there may be a need for this iInputStopped + // flag, although I would prefer to do without... NEED TO VERIFY IF + // iInputStopped is really needed!!! -- msa + // + if(!(iInputStopped || + (iErrorMask & (MSocketNotify::EErrorFatal|MSocketNotify::EErrorConnect|MSocketNotify::EErrorRecv)))) + { + iQueueLimit -= RMBufPacketBase::PeekInfoInChain(aPacket)->iLength; + iRecvQ.Append(aPacket); + iSocket->NewData(1); + } + else + aPacket.Free(); + } + +// CProviderProbe::IsReceiving +// *************************** +// +TBool CProviderProbe::IsReceiving(const RMBufPktInfo & /*aInfo*/) + { + if (iQueueLimit < 0) + { + // Receive Queue limit is full, cannot receive this packet + iPacketsDropped++; + return FALSE; + } + return TRUE; + } + + +// CProviderProbe::GetData +// *********************** +void CProviderProbe::GetData(TDes8 &aDesc, TUint aOptions, TSockAddr *anAddr) + { + RMBufPacketBase packet; + if (!iRecvQ.Remove(packet)) + Panic(EProbePanic_NoData); + + const RMBufPktInfo *const info = packet.Unpack(); + + packet.CopyOut(aDesc, 0); + + if (anAddr!=NULL) + *anAddr = info->iSrcAddr; + + if (aOptions & KSockReadPeek) + { + packet.Pack(); + iRecvQ.Prepend(packet); + iSocket->NewData(1); + } + else + { + iQueueLimit += info->iLength; // Allow more packets in.. + packet.Free(); + } + } + +#ifdef TCPIP6_CAPABILITY +TInt CProviderProbe::SecurityCheck(MProvdSecurityChecker *aChecker) + { + _LIT_SECURITY_POLICY_C1(KPolicyNetworkControl, ECapabilityNetworkControl); + return aChecker->CheckPolicy(KPolicyNetworkControl, "PROBE HOOK SAP"); + } +#endif