networksecurity/ipsec/ipsec6/src/key_sap.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networksecurity/ipsec/ipsec6/src/key_sap.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,133 @@
+// 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:
+// key_sap.cpp - IPv6/IPv4 IPSEC PFKEY service access point
+// The PFKEY Service Access Point (SAP) -- the socket.
+//
+
+
+
+/**
+ @file key_sap.cpp
+*/
+
+#include "ipsec.h"
+#include "pfkey.h"
+#include "pfkeymsg.h"
+
+//
+CProviderKey::CProviderKey(CProtocolKey& aProtocol) : iProtocol(aProtocol)
+	/**
+	* Constructor.
+	*
+	* @param aProtocol The PFKEY protocol object reference
+	*/
+	{
+	}
+
+
+void CProviderKey::Start()
+	{
+	iListening = 1;
+	}
+
+TUint CProviderKey::Write(const TDesC8 &aDesc, TUint /*aOptions*/, TSockAddr* /*aAddr =NULL*/)
+	/**
+	* Receive PF_KEY v2 messages from the Key Manager application.
+	*
+	* The key manager controls Security Associations in SAD through the PFKEY socket.
+	* Each (datagram) write is a complete PFKEYv2 message. Calls CProtocolKey::Exec()
+	* to process the message.
+	*
+	* @param aDesc The PFKEYv2 message from the application.
+	* @param aOptions Not used.
+	* @param aAddr Not used.
+	* @return Non-zero (datagram accepted).
+	*/
+	{
+	const TInt result = iProtocol.Exec(aDesc, this);
+	if (result != KErrNone)
+		iSocket->Error(result, MSocketNotify::EErrorSend);
+	return 1;	// Datagram sockets return 1 or 0
+	}
+
+TInt CProviderKey::SetOption(TUint aLevel, TUint aName, const TDesC8& aOption)
+	/**
+	* PFKEY SetOpt implementation.
+	*
+	* No options on SAP level, just pass the call to
+	* CProtocolKey::SetOption().
+	*
+	* @param aLevel The option level
+	* @param aName The option name
+	* @param aOption The option parameter
+	* @return Result code.
+	*/
+	{
+	// Note: capability check not needed here, because only
+	// applications with sufficient capability can open this socket.
+	return iProtocol.SetOption(aLevel, aName, aOption);
+	}
+
+
+TInt CProviderKey::GetOption(TUint aLevel, TUint aName, TDes8& aOption) const
+	/**
+	* PFKEY GetOpt implementation.
+	*
+	* No options on SAP level, just pass the call to
+	* CProtocolKey::GetOption().
+	*
+	* @param aLevel The option level
+	* @param aName The option name
+	* @retval aOption The option parameter
+	* @return Result code.
+	*/
+	{
+	// Note: capability check not needed here, because only
+	// applications with sufficient capability can open this socket.
+	return iProtocol.GetOption(aLevel, aName, aOption);
+	}
+
+void CProviderKey::Deliver(const TPfkeyMessage &aMsg)
+	/**
+	* Queue PFKEY v2 messages for delivery to application.
+	*
+	* Convert internal format of PFKEY message into byte stream and
+	* append it into the socket receive queue (it has already been
+	* decided elsewhere that this socket wants this information)
+	*
+	* @param aMsg The PFKEY message.
+	*/
+	{
+	if (iListening)
+		{
+		RMBufRecvPacket packet;
+
+		// Allocate info and fill with dummy values, none of which
+		// make any sense really, nobody is using them anyways for
+		// these packets...
+		TRAP_IGNORE(
+			RMBufRecvInfo *info = packet.NewInfoL();
+			packet.SetInfo(info);
+			info->iProtocol = KProtocolKey;
+			info->iLength = 0;
+			info->iInterfaceIndex = 0;
+			aMsg.ByteStreamL(packet);
+			packet.Pack();
+			CProviderIpsecBase::Deliver(packet);
+			);
+		// Just release any partially constructed packet,
+		// if not properly delivered.
+		packet.Free();
+		}
+	}