tcpiputils/dhcp/include/DHCPIP4Msg.h
changeset 0 af10295192d8
child 20 7e41d162e158
equal deleted inserted replaced
-1:000000000000 0:af10295192d8
       
     1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // DHCPv4 Message wrapper header file
       
    15 // 
       
    16 //
       
    17 
       
    18 /**
       
    19  @file DHCPMsg.h
       
    20 */
       
    21 
       
    22 #ifndef __DHCPIP4MSG_H__
       
    23 #define __DHCPIP4MSG_H__
       
    24 
       
    25 #include <babitflags.h>
       
    26 #include "DHCPMsg.h"
       
    27 #include "DomainNameDecoder.h"
       
    28 
       
    29 class TInetAddr;
       
    30 class RSocket;
       
    31 class TSockAddr;
       
    32 
       
    33 
       
    34 namespace DHCPv4
       
    35 {
       
    36 
       
    37 const TUint8	KHwAddrTypeOffset = 1;
       
    38 const TUint8	KHwAddrLengthOffset = 2;
       
    39 const TUint8	KHopOffset = 3;
       
    40 const TUint8    KLengthUptoSecs = 8;
       
    41 const TUint8    KSecsElapsedLength = 2;
       
    42 
       
    43 const TUint8 KDhcpSipEncodingOffset = 2;
       
    44 const TUint8 KDhcpSipLengthOffset = 1;
       
    45 const TUint8 KDhcpSipEncodingDomains = 0;
       
    46 const TUint8 KDhcpSipEncodingAddresses = 1;
       
    47 
       
    48 enum TDHCPv4MessageOpCode
       
    49 /**
       
    50   * TDHCPv4MessageOpCode
       
    51   *
       
    52   * The message op code constants for
       
    53   * DHCPv4 messages. A message is either
       
    54   * a request of reply. DHCP clients always
       
    55   * send requests to DHCP servers that always
       
    56   * send replies.
       
    57   *
       
    58   * @internalTechnology
       
    59   */
       
    60 	{
       
    61 	EDHCPBootRequest = 1,
       
    62 	EDHCPBootReply
       
    63 	};
       
    64 
       
    65 enum TDHCPv4MessageType
       
    66 /**
       
    67   * TDHCPv4MessageType
       
    68   *
       
    69   * The message type constants for the DHCPv4
       
    70   * message type option for inclusion in DHCPv4
       
    71   * messages.
       
    72   *
       
    73   * @internalTechnology
       
    74   */
       
    75 	{
       
    76 	EDHCPDiscover = 0x01,		// request
       
    77 	EDHCPOffer,					// reply
       
    78 	EDHCPRequest,				// request
       
    79 	EDHCPDecline,				// request
       
    80 	EDHCPAck,					// reply
       
    81 	EDHCPNak,					// reply
       
    82 	EDHCPReleaseMsg,			// request
       
    83 	EDHCPInform					// request
       
    84 	};
       
    85 
       
    86 enum TDHCPOptionCodes
       
    87 /**
       
    88   * TDHCPOptionCodes
       
    89   *
       
    90   * The constant values for each supported
       
    91   * option type.
       
    92   *
       
    93   * @internalTechnology
       
    94   */
       
    95 	{
       
    96 	EDHCPPad = 0,
       
    97 	EDHCPSubnetMask = 1,
       
    98 	EDHCPRouter = 3,
       
    99 #ifdef SYMBIAN_NETWORKING_DHCPSERVER
       
   100 	EDHCPNameServer = 5,
       
   101 #endif // SYMBIAN_NETWORKING_DHCPSERVER	
       
   102 	EDHCPDomainNameServer = 6,
       
   103 	EDHCPHostName = 12,
       
   104 	EDHCPDomainName = 15,
       
   105 	EDHCPBroadcastAddr = 28,
       
   106 	EDHCPRequestedIPAddr = 50,
       
   107 	EDHCPLeaseTime = 51,
       
   108 	EDHCPMessageType = 53,
       
   109 	EDHCPServerID = 54,
       
   110 	EDHCPParameterReqList = 55,
       
   111 	EDHCPMaxMsgSize = 57,
       
   112 	EDHCPRenewalT1 = 58,
       
   113 	EDHCPRebindT2 = 59,
       
   114 	EDHCPClientID = 61,
       
   115    	EDHCPDNSUpdate = 81,
       
   116    	EDHCPAuthentication = 90,
       
   117 	EDHCPSIPServers = 120,
       
   118 #ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
   119 	EDHCPOptionOverload = 52,
       
   120 	EDHCPTftpServerName = 66,			
       
   121 	EDHCPTftpServers = 150,	
       
   122 #endif//SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
   123 	EDHCPEnd = 255
       
   124 	};
       
   125 #ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
   126 enum TDHCPOverloadOptions
       
   127 	{
       
   128 	EDHCPFile = 1,
       
   129 	EDHCPSname = 2,
       
   130 	EDHCPBoth = 3
       
   131 	};
       
   132 #endif//SYMBIAN_NETWORKING_DHCP_MSG_HEADERS	
       
   133 
       
   134 template <typename LAYOUT>
       
   135 class TOptionHeader : public TValue< LAYOUT >
       
   136 	{
       
   137 public:
       
   138 	TOptionHeader(TInt aValueLength) :
       
   139 		TValue<LAYOUT>(aValueLength)
       
   140 		{
       
   141 		};
       
   142 
       
   143 	TInt GetValue(const TUint8* aPtr8) const;
       
   144 	void SetValue(TUint8* aPtr8, TInt aValue) const;
       
   145 	};
       
   146 
       
   147 template <typename LAYOUT>
       
   148 TInt TOptionHeader<LAYOUT>::GetValue(const TUint8* aPtr8) const
       
   149 	{
       
   150 	ASSERT(this->iValueLength <= 2);
       
   151 	return this->iValueLength == 2 ? LAYOUT::GetValue(aPtr8 + 1, this->iValueLength - 1) : 0;
       
   152 	}
       
   153 
       
   154 template <typename LAYOUT>
       
   155 void TOptionHeader<LAYOUT>::SetValue(TUint8* aPtr8, TInt aValue) const
       
   156 	{
       
   157 	ASSERT(this->iValueLength <= 2);
       
   158 	if (this->iValueLength == 2)
       
   159 		{
       
   160 		LAYOUT::SetValue(aPtr8 + 1, this->iValueLength - 1, aValue);
       
   161 		}
       
   162 	}
       
   163 
       
   164 class COption : public CItem<TOptionHeader<TLittleEndian> >
       
   165 	{
       
   166 public:
       
   167 	COption(CItemBase* aNext, TInt aValue) :
       
   168 		CItem<TOptionHeader<TLittleEndian> >(aNext, aValue)
       
   169 		{
       
   170 		}
       
   171 
       
   172 	};
       
   173 
       
   174 // lengths of headers for different option codes
       
   175 const TInt KEDHCPPadLength = 1;
       
   176 const TInt KOptionHeaderLength = 2;
       
   177 
       
   178 //we may want to have an derived class for options needing special attention 
       
   179 //(permitted value cheking)
       
   180 class COptionNode : public COption
       
   181 /**
       
   182   * we may want to have a derived class for options needing special attention 
       
   183   * (permitted value cheking)
       
   184   *
       
   185   * @internalTechnology
       
   186   */
       
   187 	{
       
   188 	friend class COptionList;
       
   189 
       
   190 public:
       
   191 	TUint8 OpCode() const
       
   192 		{
       
   193 		return iPtr8[0];
       
   194 		}
       
   195 	void SetOpCode(TUint8 aOpCode)
       
   196 		{
       
   197 		iPtr8[0] = aOpCode; //should panic if not long enough
       
   198 		}
       
   199 #ifdef __FLOG_ACTIVE
       
   200 	virtual void Dump(const TDesC& aTag, const TDesC& aFile);
       
   201 #endif
       
   202 
       
   203 protected:
       
   204 	COptionNode(TInt aHeaderLength);
       
   205 	virtual ~COptionNode();
       
   206 	};
       
   207 
       
   208 inline COptionNode::COptionNode(TInt aHeaderLength) :
       
   209 	COption(NULL, aHeaderLength)
       
   210 	{
       
   211 	}
       
   212 
       
   213 /******DHCP extension template []->optional - the code dependent******
       
   214    Code   [Len]  [Octets]
       
   215    +-----+-----+-----+-----+-----+---
       
   216    |Code |  n  |  o0 |  o1 |  o2 | ...
       
   217    +-----+-----+-----+-----+-----+---
       
   218 *********************************************************************/
       
   219 class COptionList : public CListItem
       
   220 	{
       
   221 public:
       
   222 	COptionList(CItemBase* aNext);
       
   223    
       
   224 	COptionNode* AddNodeL(TInt aInitialLength, TInt aHeaderLength);
       
   225 	COptionNode* FindOption(TUint8 aOpCode) const;
       
   226 
       
   227 	virtual void ParseL(TPtr8& aDes8);
       
   228 
       
   229 	TInt NumberOfItemsInAddressListOption(TUint8 aOpCode) const;
       
   230 	TUint32 GetAddressFromAddressListOption(TUint8 aOpCode,TInt aPos) const;
       
   231 	
       
   232 	TUint32 GetSubnetMask() const;
       
   233 	TUint32 GetRouterAddress() const;
       
   234 	TInt NumberOfDomainServers() const;
       
   235 	TUint32 GetDomainNameServer(TInt aPos) const;
       
   236 	TUint32 GetBroadcastAddress() const;
       
   237 	TUint32 GetLeaseTime() const;
       
   238 	TUint8 GetMessageType() const;
       
   239 	TUint32 GetServerId() const;
       
   240 	TUint32 GetRenewalTime() const;
       
   241 	TUint32 GetRebindTime() const;
       
   242 	TInt CopyHostNameL(HBufC8*& aBuf8) const;
       
   243 	TInt CopyDomainNameL(HBufC8*& aBuf8) const;
       
   244 
       
   245 #ifdef SYMBIAN_NETWORKING_DHCPSERVER	
       
   246 	TUint32 GetRequestedIPAddress() const;
       
   247 #endif // SYMBIAN_NETWORKING_DHCPSERVER	
       
   248 
       
   249 #ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
   250 	TUint8 GetOptionOverload() const;
       
   251 #endif // SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
   252 protected:
       
   253 	TUint32 GetValueBigEndian(TUint8 aOpCode) const;
       
   254 	};
       
   255 
       
   256 inline COptionList::COptionList(CItemBase* aNext) : CListItem(aNext, 0)
       
   257 	{
       
   258 	}
       
   259 
       
   260 inline TUint32 COptionList::GetSubnetMask() const
       
   261 	{
       
   262 	return GetValueBigEndian(EDHCPSubnetMask);
       
   263 	}
       
   264 	
       
   265 inline TUint32 COptionList::GetRouterAddress() const
       
   266 	{
       
   267 	// Only look at the first item, because tcpip6 only supports 1 router
       
   268 	//  Subsequent addresses shall be ignored.
       
   269 	return GetAddressFromAddressListOption(EDHCPRouter,0);
       
   270 	}
       
   271 
       
   272 inline TUint32 COptionList::GetBroadcastAddress() const
       
   273 	{
       
   274 	return GetValueBigEndian(EDHCPBroadcastAddr);
       
   275 	}
       
   276 
       
   277 inline TUint32 COptionList::GetLeaseTime() const
       
   278 	{
       
   279 	return GetValueBigEndian(EDHCPLeaseTime);
       
   280 	}
       
   281 
       
   282 inline TUint8 COptionList::GetMessageType() const
       
   283 	{
       
   284 	return (TUint8)GetValueBigEndian(EDHCPMessageType);
       
   285 	}
       
   286 
       
   287 inline TUint32 COptionList::GetServerId() const
       
   288 	{
       
   289 	return GetValueBigEndian(EDHCPServerID);
       
   290 	}
       
   291 
       
   292 inline TUint32 COptionList::GetRenewalTime() const
       
   293 	{
       
   294 	return GetValueBigEndian(EDHCPRenewalT1);
       
   295 	}
       
   296 
       
   297 inline TUint32 COptionList::GetRebindTime() const
       
   298 	{
       
   299 	return GetValueBigEndian(EDHCPRebindT2);
       
   300 	}
       
   301 
       
   302 #ifdef SYMBIAN_NETWORKING_DHCPSERVER	
       
   303 inline TUint32 COptionList::GetRequestedIPAddress() const
       
   304 	{
       
   305 	return GetValueBigEndian(EDHCPRequestedIPAddr);
       
   306 	}	
       
   307 #endif // SYMBIAN_NETWORKING_DHCPSERVER			
       
   308 
       
   309 #ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
   310 inline TUint8 COptionList::GetOptionOverload() const
       
   311  	{
       
   312  	return (TUint8)GetValueBigEndian(EDHCPOptionOverload);
       
   313  	}
       
   314 #endif //SYMBIAN_NETWORKING_DHCP_MSG_HEADERS		
       
   315 /**********************DHCP message header****************************
       
   316    0                   1                   2                   3
       
   317    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
       
   318    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       
   319    |     op (1)    |   htype (1)   |   hlen (1)    |   hops (1)    |
       
   320    +---------------+---------------+---------------+---------------+
       
   321    |                            xid (4)                            |
       
   322    +-------------------------------+-------------------------------+
       
   323    |           secs (2)            |           flags (2)           |
       
   324    +-------------------------------+-------------------------------+
       
   325    |                          ciaddr  (4)                          |
       
   326    +---------------------------------------------------------------+
       
   327    |                          yiaddr  (4)                          |
       
   328    +---------------------------------------------------------------+
       
   329    |                          siaddr  (4)                          |
       
   330    +---------------------------------------------------------------+
       
   331    |                          giaddr  (4)                          |
       
   332    +---------------------------------------------------------------+
       
   333    |                                                               |
       
   334    |                          chaddr  (16)                         |
       
   335    |                                                               |
       
   336    |                                                               |
       
   337    +---------------------------------------------------------------+
       
   338    |                                                               |
       
   339    |                          sname   (64)                         |
       
   340    +---------------------------------------------------------------+
       
   341    |                                                               |
       
   342    |                          file    (128)                        |
       
   343    +---------------------------------------------------------------+
       
   344    |                          cookie  (4)                          |
       
   345    +---------------------------------------------------------------+
       
   346    |                                                               |
       
   347    |                          options (variable)                   |
       
   348    +---------------------------------------------------------------+
       
   349 **********************************************************************/
       
   350 
       
   351 class CDHCPMessageHeaderIP4 : public CDHCPMessageHeader
       
   352 /**
       
   353   * This class implements the specifics for the DHCPv4 messages
       
   354   */
       
   355 	{
       
   356 public:
       
   357 	CDHCPMessageHeaderIP4(HBufC8*& aMsg);
       
   358 	~CDHCPMessageHeaderIP4();
       
   359 
       
   360 public:
       
   361 #ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
   362 	TUint32 GetSIAddr() const;//IP Address of the Next Server	
       
   363 	TPtr8 GetSName() const;	//Hostname of next available server
       
   364 	void FinishL(TDesC8& aClientId, const TDesC8* aOptionsPtr=NULL);
       
   365 #else  // SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
   366 	void FinishL(TDesC8& aClientId);
       
   367 #endif
       
   368 	void ParseL();
       
   369 #ifdef SYMBIAN_NETWORKING_DHCPSERVER 	
       
   370 	void ParseClientMsgL();
       
   371 	void SetYIAddr(TUint32 aYiaddr); 				// Offered Client address
       
   372 	void GetCHAddr(TSockAddr& aSockAddr);
       
   373 #ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
   374 	void GetClientHwAddr(TSockAddr& aSockAddr);
       
   375 #endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
   376 	TUint16 GetFlags();
       
   377 #endif 	// SYMBIAN_NETWORKING_DHCPSERVER
       
   378 	
       
   379 	COptionNode* AddOptionL(TDHCPOptionCodes aOpCode, TInt nLength);
       
   380 	virtual void RemoveAllOptions();
       
   381 
       
   382 	void SetHeader(TUint8 aOpCode, TUint8 aType, TUint8 aLength, TUint8 aHops);
       
   383 	void SetXid(TUint32 aXid); 				// Transaction ID
       
   384 	void SetSecs(TUint16 aSecs);			// Seconds elapsed since clien began address aquisition
       
   385 	void SetFlags(TUint16 aFlag);
       
   386 	void SetCIAddr(TUint32 aAddr);			// If IP Address
       
   387 	void SetCHAddr(TSockAddr& aAddr); 			// If Hardware Address
       
   388 	TUint8 GetOpCode() const;
       
   389 	TUint32 GetXid() const; 				// Transaction ID
       
   390 	TUint32 GetCIAddr() const;				// If IP Address
       
   391 	TUint32 GetYIAddr() const;				// "your" (If) IP address
       
   392 
       
   393 	void Close() //so as it could be put on the stack and on the cleanup stack
       
   394 		{
       
   395 		iOptions.RemoveAllNodes();
       
   396 		}
       
   397 
       
   398 public:
       
   399 	CConstItem  iXid;
       
   400 	CConstItem  iSecs;
       
   401 	CConstItem  iFlags;
       
   402 	CConstItem  iCiaddr;
       
   403 	CConstItem  iYiaddr;
       
   404 	CConstItem  iSiaddr;
       
   405 	CConstItem  iGiaddr;
       
   406 	CConstItem  iChaddr;
       
   407 	CConstItem  iSname;
       
   408 	CConstItem  iFile;
       
   409 	CConstItem  iCookie;
       
   410 	COptionList iOptions;
       
   411 #ifdef SYMBIAN_NETWORKING_DHCPSERVER
       
   412 	TBool iDHCPServerImpl;
       
   413 #endif 	// SYMBIAN_NETWORKING_DHCPSERVER
       
   414 	};
       
   415 
       
   416 inline void CDHCPMessageHeaderIP4::RemoveAllOptions()
       
   417 	{
       
   418 	iOptions.RemoveAllNodes();
       
   419 	}
       
   420 
       
   421 inline TUint8 CDHCPMessageHeaderIP4::GetOpCode() const
       
   422 /**
       
   423   * Retrieve Op code from message
       
   424   *
       
   425   * @internalTechnology
       
   426   *
       
   427   */
       
   428 	{
       
   429 	return GetBodyPtr()[0];
       
   430 	}
       
   431 
       
   432 inline void CDHCPMessageHeaderIP4::SetCIAddr(TUint32 aAddr)
       
   433 /**
       
   434   * Set If IP Address in message
       
   435   *
       
   436   * @internalTechnology
       
   437   *
       
   438   */
       
   439 	{
       
   440 	iCiaddr.SetBigEndian(aAddr);
       
   441 	}
       
   442 
       
   443 inline void CDHCPMessageHeaderIP4::SetXid(TUint32 aXid)
       
   444 /**
       
   445   * Set Transaction ID in message
       
   446   *
       
   447   * @internalTechnology
       
   448   *
       
   449   */
       
   450 	{
       
   451 	iXid.SetLittleEndian(aXid);
       
   452 	}
       
   453 	
       
   454 #ifdef SYMBIAN_NETWORKING_DHCPSERVER 	
       
   455 inline void CDHCPMessageHeaderIP4::SetYIAddr(TUint32 aYiaddr)
       
   456 /**
       
   457   * Set Transaction ID in message
       
   458   *
       
   459   * @internalTechnology
       
   460   *
       
   461   */
       
   462 	{
       
   463 	iYiaddr.SetBigEndian(aYiaddr);
       
   464 	}
       
   465 	
       
   466 inline TUint32 CDHCPMessageHeaderIP4::GetCIAddr() const
       
   467 /**
       
   468   * Retrieve Client IP Address from message
       
   469   *
       
   470   * @internalTechnology
       
   471   *
       
   472   */
       
   473 	{
       
   474 	return iCiaddr.GetBigEndian();
       
   475 	}
       
   476 
       
   477 inline TUint16 CDHCPMessageHeaderIP4::GetFlags()
       
   478 /**
       
   479   * Set flags in message
       
   480   *
       
   481   * @internalTechnology
       
   482   *
       
   483   */
       
   484 	{
       
   485 	return iFlags.GetBigEndian();
       
   486 	}
       
   487 	
       
   488 #endif // SYMBIAN_NETWORKING_DHCPSERVER
       
   489 
       
   490 inline void CDHCPMessageHeaderIP4::SetSecs(TUint16 aSecs)
       
   491 /**
       
   492   * SSet Number of seconds since commencement of configuration process in message
       
   493   *
       
   494   * @internalTechnology
       
   495   *
       
   496   */
       
   497 	{
       
   498 	iSecs.SetBigEndian(aSecs);
       
   499 	}
       
   500 
       
   501 inline void CDHCPMessageHeaderIP4::SetFlags(TUint16 aFlag)
       
   502 /**
       
   503   * Set flags in message
       
   504   *
       
   505   * @internalTechnology
       
   506   *
       
   507   */
       
   508 	{
       
   509 	iFlags.SetBigEndian(aFlag);
       
   510 	}
       
   511 
       
   512 inline TUint32 CDHCPMessageHeaderIP4::GetXid() const
       
   513 /**
       
   514   * Retrieve Transaction ID from message
       
   515   *
       
   516   * @internalTechnology
       
   517   *
       
   518   */
       
   519 	{
       
   520 	return iXid.GetLittleEndian();
       
   521 	}
       
   522 
       
   523 inline TUint32 CDHCPMessageHeaderIP4::GetYIAddr() const
       
   524 /**
       
   525   * Retrieve Your IP Address from message
       
   526   *
       
   527   * @internalTechnology
       
   528   *
       
   529   */
       
   530 	{
       
   531 	return iYiaddr.GetBigEndian();
       
   532 	}
       
   533 
       
   534 #ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
   535 
       
   536 inline TUint32 CDHCPMessageHeaderIP4::GetSIAddr() const
       
   537 /**
       
   538   * Get next server IP Address in message
       
   539   *
       
   540   * @internalTechnology
       
   541   *
       
   542   */
       
   543 	{
       
   544 	return iSiaddr.GetBigEndian();
       
   545 	}
       
   546 	
       
   547 inline TPtr8 CDHCPMessageHeaderIP4::GetSName() const
       
   548 /**
       
   549   * Get next server hostname in message
       
   550   *
       
   551   * @internalTechnology
       
   552   *
       
   553   */
       
   554   {
       
   555   return iSname.GetBodyDes();
       
   556   }	
       
   557  
       
   558 #endif //SYMBIAN_NETWORKING_DHCP_MSG_HEADERS	
       
   559 const TUint8 KDnsUpdateRCode1Offset = 0x01;
       
   560 const TUint8 KDnsUpdateRCode2Offset = 0x02;
       
   561 
       
   562 class CDnsUpdateOption : public COptionNode
       
   563 	{
       
   564 public:
       
   565 	enum TDnsUpdateFlag
       
   566 		{
       
   567 		EDnsUpdateFlagN = 0x03,
       
   568 		EDnsUpdateFlagE = 0x02,
       
   569 		EDnsUpdateFlagO = 0x01,
       
   570 		EDnsUpdateFlagS = 0x00
       
   571 		};
       
   572 	
       
   573 public:
       
   574 	CDnsUpdateOption() : COptionNode(KOptionHeaderLength)
       
   575 		{
       
   576 		};
       
   577 		
       
   578 	virtual ~CDnsUpdateOption()
       
   579 		{
       
   580 		};
       
   581 	
       
   582 	TBool GetFlag(const TDnsUpdateFlag aFlag) const;
       
   583 	void SetFlag(const TDnsUpdateFlag aFlag);	
       
   584 	void ClearFlag(const TDnsUpdateFlag aFlag);
       
   585 	TUint8 GetRCode1();
       
   586 	TUint8 GetRCode2();
       
   587 	const TDomainName& GetDomainName() const;
       
   588 	void SetDomainName(const TDomainName& aDomainName);
       
   589 	void ToStringL(RBuf8& aString) const;
       
   590 	
       
   591 private:
       
   592 	TBitFlags8 iFlags;
       
   593 	TInt8 iRCode1;
       
   594 	TInt8 iRCode2;
       
   595 	TDomainName iDomainName;
       
   596 	};
       
   597 
       
   598 inline TBool CDnsUpdateOption::GetFlag(const TDnsUpdateFlag aFlag) const
       
   599 	{
       
   600 	return iFlags.IsSet(aFlag);
       
   601 	}
       
   602 
       
   603 inline void CDnsUpdateOption::SetFlag(const TDnsUpdateFlag aFlag)
       
   604 	{
       
   605 	iFlags.Set(aFlag);
       
   606 	}
       
   607 
       
   608 inline void CDnsUpdateOption::ClearFlag(const TDnsUpdateFlag aFlag)
       
   609 	{
       
   610 	iFlags.Clear(aFlag);
       
   611 	}
       
   612 
       
   613 inline TUint8 CDnsUpdateOption::GetRCode1() 
       
   614 	{
       
   615 	return iRCode1;
       
   616 	}
       
   617 
       
   618 inline TUint8 CDnsUpdateOption::GetRCode2() 
       
   619 	{
       
   620 	return iRCode2;
       
   621 	}
       
   622 	
       
   623 inline const TDomainName& CDnsUpdateOption::GetDomainName() const
       
   624 	{
       
   625 	return iDomainName;
       
   626 	}
       
   627 	
       
   628 inline void CDnsUpdateOption::SetDomainName(const TDomainName& aDomainName)
       
   629 	{
       
   630 	iDomainName.Copy(aDomainName);
       
   631 	}
       
   632 	
       
   633 }//namespace DHCPv4
       
   634 #endif
       
   635 
       
   636