networkprotocols/tcpipv4v6prt/src/ip6_sap.cpp
changeset 0 af10295192d8
--- /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;
+	}