|
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 |