tcpiputils/dhcp/include/DHCPIP4Msg.h
changeset 0 af10295192d8
child 53 7e41d162e158
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tcpiputils/dhcp/include/DHCPIP4Msg.h	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,636 @@
+// 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:
+// DHCPv4 Message wrapper header file
+// 
+//
+
+/**
+ @file DHCPMsg.h
+*/
+
+#ifndef __DHCPIP4MSG_H__
+#define __DHCPIP4MSG_H__
+
+#include <babitflags.h>
+#include "DHCPMsg.h"
+#include "DomainNameDecoder.h"
+
+class TInetAddr;
+class RSocket;
+class TSockAddr;
+
+
+namespace DHCPv4
+{
+
+const TUint8	KHwAddrTypeOffset = 1;
+const TUint8	KHwAddrLengthOffset = 2;
+const TUint8	KHopOffset = 3;
+const TUint8    KLengthUptoSecs = 8;
+const TUint8    KSecsElapsedLength = 2;
+
+const TUint8 KDhcpSipEncodingOffset = 2;
+const TUint8 KDhcpSipLengthOffset = 1;
+const TUint8 KDhcpSipEncodingDomains = 0;
+const TUint8 KDhcpSipEncodingAddresses = 1;
+
+enum TDHCPv4MessageOpCode
+/**
+  * TDHCPv4MessageOpCode
+  *
+  * The message op code constants for
+  * DHCPv4 messages. A message is either
+  * a request of reply. DHCP clients always
+  * send requests to DHCP servers that always
+  * send replies.
+  *
+  * @internalTechnology
+  */
+	{
+	EDHCPBootRequest = 1,
+	EDHCPBootReply
+	};
+
+enum TDHCPv4MessageType
+/**
+  * TDHCPv4MessageType
+  *
+  * The message type constants for the DHCPv4
+  * message type option for inclusion in DHCPv4
+  * messages.
+  *
+  * @internalTechnology
+  */
+	{
+	EDHCPDiscover = 0x01,		// request
+	EDHCPOffer,					// reply
+	EDHCPRequest,				// request
+	EDHCPDecline,				// request
+	EDHCPAck,					// reply
+	EDHCPNak,					// reply
+	EDHCPReleaseMsg,			// request
+	EDHCPInform					// request
+	};
+
+enum TDHCPOptionCodes
+/**
+  * TDHCPOptionCodes
+  *
+  * The constant values for each supported
+  * option type.
+  *
+  * @internalTechnology
+  */
+	{
+	EDHCPPad = 0,
+	EDHCPSubnetMask = 1,
+	EDHCPRouter = 3,
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER
+	EDHCPNameServer = 5,
+#endif // SYMBIAN_NETWORKING_DHCPSERVER	
+	EDHCPDomainNameServer = 6,
+	EDHCPHostName = 12,
+	EDHCPDomainName = 15,
+	EDHCPBroadcastAddr = 28,
+	EDHCPRequestedIPAddr = 50,
+	EDHCPLeaseTime = 51,
+	EDHCPMessageType = 53,
+	EDHCPServerID = 54,
+	EDHCPParameterReqList = 55,
+	EDHCPMaxMsgSize = 57,
+	EDHCPRenewalT1 = 58,
+	EDHCPRebindT2 = 59,
+	EDHCPClientID = 61,
+   	EDHCPDNSUpdate = 81,
+   	EDHCPAuthentication = 90,
+	EDHCPSIPServers = 120,
+#ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+	EDHCPOptionOverload = 52,
+	EDHCPTftpServerName = 66,			
+	EDHCPTftpServers = 150,	
+#endif//SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+	EDHCPEnd = 255
+	};
+#ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+enum TDHCPOverloadOptions
+	{
+	EDHCPFile = 1,
+	EDHCPSname = 2,
+	EDHCPBoth = 3
+	};
+#endif//SYMBIAN_NETWORKING_DHCP_MSG_HEADERS	
+
+template <typename LAYOUT>
+class TOptionHeader : public TValue< LAYOUT >
+	{
+public:
+	TOptionHeader(TInt aValueLength) :
+		TValue<LAYOUT>(aValueLength)
+		{
+		};
+
+	TInt GetValue(const TUint8* aPtr8) const;
+	void SetValue(TUint8* aPtr8, TInt aValue) const;
+	};
+
+template <typename LAYOUT>
+TInt TOptionHeader<LAYOUT>::GetValue(const TUint8* aPtr8) const
+	{
+	ASSERT(this->iValueLength <= 2);
+	return this->iValueLength == 2 ? LAYOUT::GetValue(aPtr8 + 1, this->iValueLength - 1) : 0;
+	}
+
+template <typename LAYOUT>
+void TOptionHeader<LAYOUT>::SetValue(TUint8* aPtr8, TInt aValue) const
+	{
+	ASSERT(this->iValueLength <= 2);
+	if (this->iValueLength == 2)
+		{
+		LAYOUT::SetValue(aPtr8 + 1, this->iValueLength - 1, aValue);
+		}
+	}
+
+class COption : public CItem<TOptionHeader<TLittleEndian> >
+	{
+public:
+	COption(CItemBase* aNext, TInt aValue) :
+		CItem<TOptionHeader<TLittleEndian> >(aNext, aValue)
+		{
+		}
+
+	};
+
+// lengths of headers for different option codes
+const TInt KEDHCPPadLength = 1;
+const TInt KOptionHeaderLength = 2;
+
+//we may want to have an derived class for options needing special attention 
+//(permitted value cheking)
+class COptionNode : public COption
+/**
+  * we may want to have a derived class for options needing special attention 
+  * (permitted value cheking)
+  *
+  * @internalTechnology
+  */
+	{
+	friend class COptionList;
+
+public:
+	TUint8 OpCode() const
+		{
+		return iPtr8[0];
+		}
+	void SetOpCode(TUint8 aOpCode)
+		{
+		iPtr8[0] = aOpCode; //should panic if not long enough
+		}
+#ifdef __FLOG_ACTIVE
+	virtual void Dump(const TDesC& aTag, const TDesC& aFile);
+#endif
+
+protected:
+	COptionNode(TInt aHeaderLength);
+	virtual ~COptionNode();
+	};
+
+inline COptionNode::COptionNode(TInt aHeaderLength) :
+	COption(NULL, aHeaderLength)
+	{
+	}
+
+/******DHCP extension template []->optional - the code dependent******
+   Code   [Len]  [Octets]
+   +-----+-----+-----+-----+-----+---
+   |Code |  n  |  o0 |  o1 |  o2 | ...
+   +-----+-----+-----+-----+-----+---
+*********************************************************************/
+class COptionList : public CListItem
+	{
+public:
+	COptionList(CItemBase* aNext);
+   
+	COptionNode* AddNodeL(TInt aInitialLength, TInt aHeaderLength);
+	COptionNode* FindOption(TUint8 aOpCode) const;
+
+	virtual void ParseL(TPtr8& aDes8);
+
+	TInt NumberOfItemsInAddressListOption(TUint8 aOpCode) const;
+	TUint32 GetAddressFromAddressListOption(TUint8 aOpCode,TInt aPos) const;
+	
+	TUint32 GetSubnetMask() const;
+	TUint32 GetRouterAddress() const;
+	TInt NumberOfDomainServers() const;
+	TUint32 GetDomainNameServer(TInt aPos) const;
+	TUint32 GetBroadcastAddress() const;
+	TUint32 GetLeaseTime() const;
+	TUint8 GetMessageType() const;
+	TUint32 GetServerId() const;
+	TUint32 GetRenewalTime() const;
+	TUint32 GetRebindTime() const;
+	TInt CopyHostNameL(HBufC8*& aBuf8) const;
+	TInt CopyDomainNameL(HBufC8*& aBuf8) const;
+
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER	
+	TUint32 GetRequestedIPAddress() const;
+#endif // SYMBIAN_NETWORKING_DHCPSERVER	
+
+#ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+	TUint8 GetOptionOverload() const;
+#endif // SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+protected:
+	TUint32 GetValueBigEndian(TUint8 aOpCode) const;
+	};
+
+inline COptionList::COptionList(CItemBase* aNext) : CListItem(aNext, 0)
+	{
+	}
+
+inline TUint32 COptionList::GetSubnetMask() const
+	{
+	return GetValueBigEndian(EDHCPSubnetMask);
+	}
+	
+inline TUint32 COptionList::GetRouterAddress() const
+	{
+	// Only look at the first item, because tcpip6 only supports 1 router
+	//  Subsequent addresses shall be ignored.
+	return GetAddressFromAddressListOption(EDHCPRouter,0);
+	}
+
+inline TUint32 COptionList::GetBroadcastAddress() const
+	{
+	return GetValueBigEndian(EDHCPBroadcastAddr);
+	}
+
+inline TUint32 COptionList::GetLeaseTime() const
+	{
+	return GetValueBigEndian(EDHCPLeaseTime);
+	}
+
+inline TUint8 COptionList::GetMessageType() const
+	{
+	return (TUint8)GetValueBigEndian(EDHCPMessageType);
+	}
+
+inline TUint32 COptionList::GetServerId() const
+	{
+	return GetValueBigEndian(EDHCPServerID);
+	}
+
+inline TUint32 COptionList::GetRenewalTime() const
+	{
+	return GetValueBigEndian(EDHCPRenewalT1);
+	}
+
+inline TUint32 COptionList::GetRebindTime() const
+	{
+	return GetValueBigEndian(EDHCPRebindT2);
+	}
+
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER	
+inline TUint32 COptionList::GetRequestedIPAddress() const
+	{
+	return GetValueBigEndian(EDHCPRequestedIPAddr);
+	}	
+#endif // SYMBIAN_NETWORKING_DHCPSERVER			
+
+#ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+inline TUint8 COptionList::GetOptionOverload() const
+ 	{
+ 	return (TUint8)GetValueBigEndian(EDHCPOptionOverload);
+ 	}
+#endif //SYMBIAN_NETWORKING_DHCP_MSG_HEADERS		
+/**********************DHCP message header****************************
+   0                   1                   2                   3
+   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   |     op (1)    |   htype (1)   |   hlen (1)    |   hops (1)    |
+   +---------------+---------------+---------------+---------------+
+   |                            xid (4)                            |
+   +-------------------------------+-------------------------------+
+   |           secs (2)            |           flags (2)           |
+   +-------------------------------+-------------------------------+
+   |                          ciaddr  (4)                          |
+   +---------------------------------------------------------------+
+   |                          yiaddr  (4)                          |
+   +---------------------------------------------------------------+
+   |                          siaddr  (4)                          |
+   +---------------------------------------------------------------+
+   |                          giaddr  (4)                          |
+   +---------------------------------------------------------------+
+   |                                                               |
+   |                          chaddr  (16)                         |
+   |                                                               |
+   |                                                               |
+   +---------------------------------------------------------------+
+   |                                                               |
+   |                          sname   (64)                         |
+   +---------------------------------------------------------------+
+   |                                                               |
+   |                          file    (128)                        |
+   +---------------------------------------------------------------+
+   |                          cookie  (4)                          |
+   +---------------------------------------------------------------+
+   |                                                               |
+   |                          options (variable)                   |
+   +---------------------------------------------------------------+
+**********************************************************************/
+
+class CDHCPMessageHeaderIP4 : public CDHCPMessageHeader
+/**
+  * This class implements the specifics for the DHCPv4 messages
+  */
+	{
+public:
+	CDHCPMessageHeaderIP4(HBufC8*& aMsg);
+	~CDHCPMessageHeaderIP4();
+
+public:
+#ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+	TUint32 GetSIAddr() const;//IP Address of the Next Server	
+	TPtr8 GetSName() const;	//Hostname of next available server
+	void FinishL(TDesC8& aClientId, const TDesC8* aOptionsPtr=NULL);
+#else  // SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+	void FinishL(TDesC8& aClientId);
+#endif
+	void ParseL();
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER 	
+	void ParseClientMsgL();
+	void SetYIAddr(TUint32 aYiaddr); 				// Offered Client address
+	void GetCHAddr(TSockAddr& aSockAddr);
+#ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION
+	void GetClientHwAddr(TSockAddr& aSockAddr);
+#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
+	TUint16 GetFlags();
+#endif 	// SYMBIAN_NETWORKING_DHCPSERVER
+	
+	COptionNode* AddOptionL(TDHCPOptionCodes aOpCode, TInt nLength);
+	virtual void RemoveAllOptions();
+
+	void SetHeader(TUint8 aOpCode, TUint8 aType, TUint8 aLength, TUint8 aHops);
+	void SetXid(TUint32 aXid); 				// Transaction ID
+	void SetSecs(TUint16 aSecs);			// Seconds elapsed since clien began address aquisition
+	void SetFlags(TUint16 aFlag);
+	void SetCIAddr(TUint32 aAddr);			// If IP Address
+	void SetCHAddr(TSockAddr& aAddr); 			// If Hardware Address
+	TUint8 GetOpCode() const;
+	TUint32 GetXid() const; 				// Transaction ID
+	TUint32 GetCIAddr() const;				// If IP Address
+	TUint32 GetYIAddr() const;				// "your" (If) IP address
+
+	void Close() //so as it could be put on the stack and on the cleanup stack
+		{
+		iOptions.RemoveAllNodes();
+		}
+
+public:
+	CConstItem  iXid;
+	CConstItem  iSecs;
+	CConstItem  iFlags;
+	CConstItem  iCiaddr;
+	CConstItem  iYiaddr;
+	CConstItem  iSiaddr;
+	CConstItem  iGiaddr;
+	CConstItem  iChaddr;
+	CConstItem  iSname;
+	CConstItem  iFile;
+	CConstItem  iCookie;
+	COptionList iOptions;
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER
+	TBool iDHCPServerImpl;
+#endif 	// SYMBIAN_NETWORKING_DHCPSERVER
+	};
+
+inline void CDHCPMessageHeaderIP4::RemoveAllOptions()
+	{
+	iOptions.RemoveAllNodes();
+	}
+
+inline TUint8 CDHCPMessageHeaderIP4::GetOpCode() const
+/**
+  * Retrieve Op code from message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	return GetBodyPtr()[0];
+	}
+
+inline void CDHCPMessageHeaderIP4::SetCIAddr(TUint32 aAddr)
+/**
+  * Set If IP Address in message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	iCiaddr.SetBigEndian(aAddr);
+	}
+
+inline void CDHCPMessageHeaderIP4::SetXid(TUint32 aXid)
+/**
+  * Set Transaction ID in message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	iXid.SetLittleEndian(aXid);
+	}
+	
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER 	
+inline void CDHCPMessageHeaderIP4::SetYIAddr(TUint32 aYiaddr)
+/**
+  * Set Transaction ID in message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	iYiaddr.SetBigEndian(aYiaddr);
+	}
+	
+inline TUint32 CDHCPMessageHeaderIP4::GetCIAddr() const
+/**
+  * Retrieve Client IP Address from message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	return iCiaddr.GetBigEndian();
+	}
+
+inline TUint16 CDHCPMessageHeaderIP4::GetFlags()
+/**
+  * Set flags in message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	return iFlags.GetBigEndian();
+	}
+	
+#endif // SYMBIAN_NETWORKING_DHCPSERVER
+
+inline void CDHCPMessageHeaderIP4::SetSecs(TUint16 aSecs)
+/**
+  * SSet Number of seconds since commencement of configuration process in message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	iSecs.SetBigEndian(aSecs);
+	}
+
+inline void CDHCPMessageHeaderIP4::SetFlags(TUint16 aFlag)
+/**
+  * Set flags in message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	iFlags.SetBigEndian(aFlag);
+	}
+
+inline TUint32 CDHCPMessageHeaderIP4::GetXid() const
+/**
+  * Retrieve Transaction ID from message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	return iXid.GetLittleEndian();
+	}
+
+inline TUint32 CDHCPMessageHeaderIP4::GetYIAddr() const
+/**
+  * Retrieve Your IP Address from message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	return iYiaddr.GetBigEndian();
+	}
+
+#ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+
+inline TUint32 CDHCPMessageHeaderIP4::GetSIAddr() const
+/**
+  * Get next server IP Address in message
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	return iSiaddr.GetBigEndian();
+	}
+	
+inline TPtr8 CDHCPMessageHeaderIP4::GetSName() const
+/**
+  * Get next server hostname in message
+  *
+  * @internalTechnology
+  *
+  */
+  {
+  return iSname.GetBodyDes();
+  }	
+ 
+#endif //SYMBIAN_NETWORKING_DHCP_MSG_HEADERS	
+const TUint8 KDnsUpdateRCode1Offset = 0x01;
+const TUint8 KDnsUpdateRCode2Offset = 0x02;
+
+class CDnsUpdateOption : public COptionNode
+	{
+public:
+	enum TDnsUpdateFlag
+		{
+		EDnsUpdateFlagN = 0x03,
+		EDnsUpdateFlagE = 0x02,
+		EDnsUpdateFlagO = 0x01,
+		EDnsUpdateFlagS = 0x00
+		};
+	
+public:
+	CDnsUpdateOption() : COptionNode(KOptionHeaderLength)
+		{
+		};
+		
+	virtual ~CDnsUpdateOption()
+		{
+		};
+	
+	TBool GetFlag(const TDnsUpdateFlag aFlag) const;
+	void SetFlag(const TDnsUpdateFlag aFlag);	
+	void ClearFlag(const TDnsUpdateFlag aFlag);
+	TUint8 GetRCode1();
+	TUint8 GetRCode2();
+	const TDomainName& GetDomainName() const;
+	void SetDomainName(const TDomainName& aDomainName);
+	void ToStringL(RBuf8& aString) const;
+	
+private:
+	TBitFlags8 iFlags;
+	TInt8 iRCode1;
+	TInt8 iRCode2;
+	TDomainName iDomainName;
+	};
+
+inline TBool CDnsUpdateOption::GetFlag(const TDnsUpdateFlag aFlag) const
+	{
+	return iFlags.IsSet(aFlag);
+	}
+
+inline void CDnsUpdateOption::SetFlag(const TDnsUpdateFlag aFlag)
+	{
+	iFlags.Set(aFlag);
+	}
+
+inline void CDnsUpdateOption::ClearFlag(const TDnsUpdateFlag aFlag)
+	{
+	iFlags.Clear(aFlag);
+	}
+
+inline TUint8 CDnsUpdateOption::GetRCode1() 
+	{
+	return iRCode1;
+	}
+
+inline TUint8 CDnsUpdateOption::GetRCode2() 
+	{
+	return iRCode2;
+	}
+	
+inline const TDomainName& CDnsUpdateOption::GetDomainName() const
+	{
+	return iDomainName;
+	}
+	
+inline void CDnsUpdateOption::SetDomainName(const TDomainName& aDomainName)
+	{
+	iDomainName.Copy(aDomainName);
+	}
+	
+}//namespace DHCPv4
+#endif
+
+