--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocols/tcpipv4v6prt/src/ip6_sap.cpp Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,76 @@
+// 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:
+// ip6_sap.cpp - IPv6 service access point
+//
+
+#include "ip6.h"
+#include <ip6_hdr.h>
+#include "in_net.h"
+
+class CProviderIP6 : public CProviderInet6Network
+ {
+public:
+ CProviderIP6(CProtocolInet6Base* aProtocol);
+ virtual TInt DoWrite(RMBufSendPacket &aPacket, RMBufSendInfo &aInfo, TUint aOptions, TUint aOffset);
+ virtual TInt SecurityCheck(MProvdSecurityChecker *aChecker);
+ };
+
+//
+// IP6::NewSAPL
+// ************
+CServProviderBase *IP6::NewSAPL(TUint aSockType, CProtocolInet6Base *aProtocol, TInt /*aId*/)
+ {
+ LOG(Log::Printf(_L("NewSAPL\t%S SockType=%d"), &aProtocol->ProtocolName(), aSockType));
+ if (aSockType != KSockDatagram)
+ User::Leave(KErrNotSupported);
+ CProviderIP6 *provider = new (ELeave) CProviderIP6(aProtocol);
+ CleanupStack::PushL(provider);
+ provider->InitL();
+ CleanupStack::Pop();
+ LOG(Log::Printf(_L("NewSAPL\t%S SAP[%u] OK"), &aProtocol->ProtocolName(), (TInt)provider));
+ return provider;
+ }
+
+//
+
+CProviderIP6::CProviderIP6(CProtocolInet6Base* aProtocol) : CProviderInet6Network(aProtocol)
+ {
+ __DECLARE_NAME(_S("CProviderIP6"));
+ }
+
+TInt CProviderIP6::DoWrite(RMBufSendPacket &aPacket, RMBufSendInfo &aInfo, TUint /*aOptions*/, TUint /*aOffset*/)
+ {
+ iFlow.SetNotify(this);
+ if (aInfo.iSrcAddr.Family())
+ iFlow.SetLocalAddr(aInfo.iSrcAddr);
+ if (aInfo.iDstAddr.Family())
+ iFlow.SetRemoteAddr(aInfo.iDstAddr);
+
+ const TInt status = aPacket.Info()->iFlow.Open(iFlow, aPacket.Info());
+ if (status == KErrNone)
+ {
+ // Should compute the IPv6 checksum for the "upper" layer,
+ // if requested by the application (advanced api option in
+ // IPv6. Not for IPv4.)
+ }
+ return status;
+ }
+
+TInt CProviderIP6::SecurityCheck(MProvdSecurityChecker *aChecker)
+ {
+ const TInt res = CProviderInet6Network::SecurityCheck(aChecker);
+ if (res == KErrNone)
+ return CheckPolicy(KPolicyNetworkControl, "TCPIP IP SAP");
+ return res;
+ }