networksecurity/ipsec/lib_pfkey/include/lib_pfkey.h
changeset 0 af10295192d8
child 20 7e41d162e158
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networksecurity/ipsec/lib_pfkey/include/lib_pfkey.h	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,211 @@
+// Copyright (c) 2003-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:
+//
+
+/**
+ @file 
+ @publishedPartner
+ @released
+*/
+
+#ifndef __LIB_PFKEY_H__
+#define __LIB_PFKEY_H__
+
+#include <e32std.h>
+#include <in_sock.h>
+
+#include <networking/pfkeyv2.h>
+
+/**
+ *	This class is only used directly by the incoming packet processing path.
+ *	Here we are only interested in the start position of the extension here.
+ */
+class TPfkeyAnyExt : public TPtrC8
+	{
+public:
+	/**
+	 * Create an extension from a ByteStream, checking for basic length
+	 */
+	inline TPfkeyAnyExt(const TDesC8& aDes);
+	inline TPfkeyAnyExt();
+	inline TUint16 ExtLen() const;
+	inline TUint16 ExtType() const;
+
+protected:
+	/**
+	 * Gets a reference to the extension header
+	 */ 
+	inline const struct sadb_ext& ExtHdr() const;
+	inline struct sadb_ext& ExtHdr();
+	/**
+	 * Base class copy constructor will work
+	 * Assignment operator is banned in the base class
+	 */
+	};
+
+/**
+ * TPfkeyExt is the whole extension including the data in the extension
+ * This is aware of the Size and Start position of the Header, as well 
+ */
+// Outgoing messages have access to the type
+// Incoming ones do not
+template <class T>
+class TPfkeyExt : public TBuf8<sizeof(T)> 
+	{
+public:
+    /**
+	 * Gets a reference to the raw extension
+	 */
+	inline const T& Ext() const;
+	inline T& Ext();
+
+protected:
+	/**
+	 * Default Constructor
+	 */
+	inline TPfkeyExt();
+	};
+
+/** 
+ *  The base class for all messages to and from the SADB.
+ */  
+#ifdef SYMBIAN_NETWORKING_IPSEC_IKE_V2
+#ifdef  SYMBIAN_IPSEC_VOIP_SUPPORT
+static const TInt KPfkeyMsgMaxLen = 1600;
+#else
+static const TInt KPfkeyMsgMaxLen = 800;
+#endif // SYMBIAN_IPSEC_VOIP_SUPPORT
+#else
+static const TInt KPfkeyMsgMaxLen = 400;
+#endif
+class TPfkeyMsgBase : public TBuf8<KPfkeyMsgMaxLen>
+	{
+public:
+	/**
+	 */
+	inline const struct sadb_msg& MsgHdr() const;
+	inline struct sadb_msg& MsgHdr();
+
+protected:
+	/**
+	 *  Creates a Pfkey mesage of minimal(sadb_msg) size
+	 */
+	inline TPfkeyMsgBase();
+	inline TPfkeyMsgBase(const TDesC8& aOther);
+	};
+
+/**
+ *  Concrete class used for sending messages
+ *  The class is completely generic and can be used for all messages.
+ *  Has convenience functions to build up the message when demanded.
+ */
+class RSADB;
+class TPfkeySendMsgBase : public TPfkeyMsgBase
+	{
+public:
+	/**
+	 *  This initializes the packet stream and sets the packet header 
+	 *  This can leave
+	 */  
+	IMPORT_C TPfkeySendMsgBase(TUint8 aType, TUint8 aSatype, TInt aRequestCount, TInt aPid);
+	
+	IMPORT_C TPfkeySendMsgBase();
+	/**
+	 */
+	IMPORT_C void Reset(TUint8 aType, TUint8 aSaType, TInt aRequestCount, TInt aPid);
+	/**
+	 *  This adds the extensions in the list to the message,
+	 *  @param aExtHdr
+	 *		extension header to be added to the message
+	 *  @param aExtData
+	 *		extension data to be added to the message
+	 */
+	IMPORT_C TInt AddExt(const TPfkeyAnyExt& aExtHdr, const TDesC8& aExtData = KNullDesC8);
+
+	IMPORT_C void Finalize();
+	};
+
+/** 
+ *  Concrete class used for receiving messages
+ *  Has convenience functions to decode the message when demanded
+ */
+class TPfkeyRecvMsg : public TPfkeyMsgBase
+	{
+public:
+	/** 
+	 *  Read the next extension from the header and put it in the 
+	 *  descriptor passed to it.
+	 *	@return
+	 *		KErrNone If this is a valid extension
+	 *		KErrNotFound If there are no more extensions
+	 *		KErrGeneral If this extension was invalid
+	 *  Try our best not to Leave.
+	 */  
+	IMPORT_C TInt NextExtension(TPfkeyAnyExt& aExt);
+
+	IMPORT_C void Reset();
+	IMPORT_C TInt BytesUnparsed();
+	
+	IMPORT_C TPfkeyRecvMsg();
+	IMPORT_C TPfkeyRecvMsg(const TDesC8& aOther);
+
+private:
+	TInt iReadOffset;
+	TInt iRemaining;
+	};
+
+/**
+ *  A handle to the stack side Ipsec SADB. All communication to the SADB
+ *  takes place through this socket. As this happens using a well defined
+ *  interface, PfkeyV2, the client is supposed to be aware of the semantics
+ *  of using pfkey.
+ *  
+ *  This class has to be a singleton in a thread
+ *	The implementation of this class is not thread safe.
+ */
+class RSADB 
+	{
+public:
+
+	IMPORT_C TInt Open(RSocketServ& aServer);
+	
+	IMPORT_C void Close();
+	
+	IMPORT_C void SendRequest(const TDesC8& aMsg, TRequestStatus& aStatus);
+	
+	IMPORT_C void CancelSend();
+
+	IMPORT_C void ReadRequest(TDes8& aMsg, TRequestStatus& aStatus);
+	
+	IMPORT_C void CancelRecv();
+
+	IMPORT_C void FinalizeAndSend(TPfkeySendMsgBase& aMessage, TRequestStatus& aStatus);
+
+	IMPORT_C void SetOpt(TUint aLevel,TUint aName,const TDesC8 &aOption);
+
+	IMPORT_C ~RSADB();
+	
+	IMPORT_C RSADB();
+	
+private:
+	RSADB(const RSADB&);
+	RSocket iPfkeySocket;
+
+private:
+	TBool iRegistered;
+	};
+
+#include "lib_pfkey.inl"
+
+#endif //__LIB_PFKEY_H__