--- /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();
+ }
+ }