williamr@2: // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // icmp6_hdr.h - ICMPv6 header structure williamr@2: // This module defines the basic classes for accessing the header williamr@2: // structures within ICMPv6 packets. williamr@2: // williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @file icmp6_hdr.h williamr@2: @ingroup ip_packet_formats williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: williamr@2: #ifndef __ICMP6_HDR_H__ williamr@2: #define __ICMP6_HDR_H__ williamr@2: williamr@2: #include williamr@2: #include "in_hdr.h" williamr@2: #include // IPv6 enhanced in_sock.h williamr@2: williamr@4: #ifdef SYMBIAN_TCPIPDHCP_UPDATE williamr@4: //RFC 5006 definitions williamr@4: #define RDNSSADDRSIZE 16 williamr@4: #define RDNSSOPTION_HDRLENGTH 8 williamr@4: #define RDNSS_MAX_ADDRESS 4 //4 DNS address shall be processed from RDNSS Option available in RA williamr@4: #endif //SYMBIAN_TCPIPDHCP_UPDATE williamr@4: williamr@2: /** williamr@2: * @addtogroup ip_packet_formats williamr@2: */ williamr@2: //@{ williamr@2: williamr@2: // TInet6HeaderICMP williamr@2: class TInet6HeaderICMP williamr@2: /** williamr@2: * ICMPv6 header common part layout. williamr@2: * williamr@2: * The basic ICMP header format only covers the common part (4 bytes) williamr@2: * and 4 bytes of the Message Body (can be accesses as "Parameter") williamr@2: @verbatim williamr@2: Extract from RFC-2462: General format of ICMP message williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Code | Checksum | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | | williamr@2: + Message Body + williamr@2: | | williamr@2: @endverbatim williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline TInt HeaderLength() const williamr@2: /** williamr@2: * Gets the header length. williamr@2: * williamr@2: * @note williamr@2: * This length is not the true length of the williamr@2: * ICMP header. This only covers the fixed part. williamr@2: * williamr@2: * @return Header length. williamr@2: */ williamr@2: {return 4;} williamr@2: inline static TInt MinHeaderLength() williamr@2: /** williamr@2: * Gets the minimum header length. williamr@2: * williamr@2: * @return Minimum header length williamr@2: */ williamr@2: {return 4; } williamr@2: inline static TInt MaxHeaderLength() williamr@2: /** williamr@2: * Gets the maximum header length. williamr@2: * williamr@2: * @note williamr@2: * This length is not the true length of the williamr@2: * ICMP header. This only covers the fixed part. williamr@2: * williamr@2: * @return Maximum header length williamr@2: */ williamr@2: {return 4; } williamr@2: inline TUint8 *EndPtr() const williamr@2: /** williamr@2: * Gets a pointer to the byte following the header. williamr@2: * williamr@2: * @return williamr@2: * Pointer to the byte following the minimum williamr@2: * fixed header williamr@2: */ williamr@2: {return (TUint8 *)i + HeaderLength();} williamr@2: // williamr@2: // Access, get ICMP header field values from the packet williamr@2: // williamr@2: inline TUint8 Type() const williamr@2: /** williamr@2: * Gets the ICMPv6 type from the header. williamr@2: * @return ICMPv6 type [0..255] williamr@2: */ williamr@2: { williamr@2: return i[0]; williamr@2: } williamr@2: inline TUint8 Code() const williamr@2: /** williamr@2: * Gets the ICMPv6 code from the header. williamr@2: * @return ICMPv6 code [0..255] williamr@2: */ williamr@2: { williamr@2: return i[1]; williamr@2: } williamr@2: inline TInt Checksum() const williamr@2: /** williamr@2: * Gets the Checksum from the header. williamr@2: * @return Header Checksum (TUint16 in NETWORK byte order) williamr@2: */ williamr@2: { williamr@2: // Checksum is used in network byte order williamr@2: return *((TUint16 *)&i[2]); williamr@2: } williamr@2: inline TUint32 Parameter() const williamr@2: /** williamr@2: * Gets the ICMPv6 Parameter. williamr@2: * williamr@2: * Accesses the first 4 bytes of ICMP message body, and assumes williamr@2: * they form a 32 bit integer in network byte order. Returns williamr@2: * this integer in host order. williamr@2: * williamr@2: * @return ICMPv6 Parameter (as an integer) williamr@2: */ williamr@2: { williamr@2: return (i[4] << 24) | (i[5] << 16) | (i[6] << 8) | i[7]; williamr@2: } williamr@2: // williamr@2: // Build, set IP header field values into the packet williamr@2: // williamr@2: inline void SetType(TUint8 aType) williamr@2: /** williamr@2: * Sets the ICMPv6 type. williamr@2: * @param aType ICMPv6 type [0..255] williamr@2: */ williamr@2: { williamr@2: i[0] = aType; williamr@2: } williamr@2: inline void SetCode(TUint8 aCode) williamr@2: /** williamr@2: * Sets the ICMPv6 code. williamr@2: * @param aCode ICMPv6 code [0..255] williamr@2: */ williamr@2: { williamr@2: i[1] = aCode; williamr@2: } williamr@2: inline void SetChecksum(TInt aSum) williamr@2: /** williamr@2: * Sets the Checksum. williamr@2: * williamr@2: * @param aSum williamr@2: * The Checksum [0..65535] (16 least significant bits williamr@2: * stored as is (assumed to be in NETWORK byte order). williamr@2: */ williamr@2: { williamr@2: *((TUint16 *)&i[2]) = (TUint16)aSum; williamr@2: } williamr@2: inline void SetParameter(TUint32 aValue) williamr@2: /** williamr@2: * Sets the ICMPv6 Parameter. williamr@2: * williamr@2: * The value is converted into network byte order and williamr@2: * stored as the first 4 bytes of the ICMP message body. williamr@2: * williamr@2: * @param aValue williamr@2: * The parameter. williamr@2: */ williamr@2: { williamr@2: i[7] = (TUint8)aValue; williamr@2: i[6] = (TUint8)(aValue >> 8); williamr@2: i[5] = (TUint8)(aValue >> 16); williamr@2: i[4] = (TUint8)(aValue >> 24); williamr@2: } williamr@2: williamr@2: protected: williamr@2: union williamr@2: { williamr@2: TUint8 i[8]; williamr@2: TUint32 iAlign; // A dummy member to force the 4 byte alignment williamr@2: }; williamr@2: }; williamr@2: williamr@2: williamr@2: // williamr@2: // TInet6HeaderICMP_Echo williamr@2: // williamr@2: class TInet6HeaderICMP_Echo : public TInet6HeaderICMP williamr@2: /** williamr@2: * ICMPv6 Echo Request and Echo Reply layout. williamr@2: * williamr@2: * Describes the ICMP Echo Request and Replay layout. The space for williamr@2: * Identifier and Sequence is already covered by the base class. williamr@2: * williamr@2: @verbatim williamr@2: RFC-2463: williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Code | Checksum | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Identifier | Sequence Number | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Data ... williamr@2: +-+-+-+-+- williamr@2: @endverbatim williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: // williamr@2: // General williamr@2: // williamr@2: inline TInt HeaderLength() const williamr@2: /** williamr@2: * Gets the header length. williamr@2: * @return The length williamr@2: */ williamr@2: {return 8;} williamr@2: inline static TInt MinHeaderLength() williamr@2: /** williamr@2: * Gets the minimum header length. williamr@2: * @return The length williamr@2: */ williamr@2: {return 8; } williamr@2: inline static TInt MaxHeaderLength() williamr@2: /** williamr@2: * Gets the maximum header length. williamr@2: * @return The length williamr@2: */ williamr@2: {return 8; } williamr@2: williamr@2: // williamr@2: // Access, get ICMP header field values from the packet williamr@2: // williamr@2: inline TInt Identifier() const williamr@2: /** williamr@2: * Gets the Idenfifier williamr@2: * @return The Identifier williamr@2: */ williamr@2: { williamr@2: return (i[4] << 8) + i[5]; williamr@2: } williamr@2: inline TInt Sequence() const williamr@2: /** williamr@2: * Gets the Sequence Number williamr@2: * @return The number williamr@2: */ williamr@2: { williamr@2: return (i[6] << 8) + i[7]; williamr@2: } williamr@2: // williamr@2: // Build, set IP header field values into the packet williamr@2: // williamr@2: inline void SetIdentifier(TUint16 aIdentifier) williamr@2: /** williamr@2: * Sets the Idenfifier williamr@2: * @param aIdentifier The Identifier williamr@2: */ williamr@2: { williamr@2: i[4] = (TUint8)(aIdentifier >> 8); williamr@2: i[5] = (TUint8)aIdentifier; williamr@2: } williamr@2: inline void SetSequence(TUint16 aSequence) williamr@2: /** williamr@2: * Sets the Sequence Number williamr@2: * @param aSequence The number williamr@2: */ williamr@2: { williamr@2: i[6] = (TUint8)(aSequence >> 8); williamr@2: i[7] = (TUint8)aSequence; williamr@2: } williamr@2: private: williamr@2: }; williamr@2: williamr@2: williamr@2: class TInet6HeaderICMP_RouterSol: public TInet6HeaderICMP williamr@2: /** williamr@2: * ICMPv6 Router Solicitation layout. williamr@2: * williamr@2: @verbatim williamr@2: Router Solicitation Message Format (from RFC-2461) williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Code | Checksum | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Reserved | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Options ... williamr@2: +-+-+-+-+-+-+-+-+-+-+-+- williamr@2: @endverbatim williamr@2: * Aside from the fields provided by the base class, there is nothing williamr@2: * else here. williamr@2: * williamr@2: * Valid options: williamr@2: * williamr@2: * - #KInet6OptionICMP_SourceLink williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline static TInt MinHeaderLength() {return 8; } williamr@2: inline static TInt MaxHeaderLength() {return 8; } williamr@2: inline TInt HeaderLength() const {return 8;} williamr@2: }; williamr@2: williamr@2: // Router Advertisement Message Format from RFC-2461 williamr@2: class TInet6HeaderICMP_RouterAdv : public TInet6HeaderICMP williamr@2: /** williamr@2: * ICMPv6 Router Advertisement layout. williamr@2: * williamr@2: * (Neighbour Discovery for IP version 6) williamr@2: * (+ Home Agent flag from draft-ietf-mobileip-ipv6-08) williamr@2: @verbatim williamr@2: Type=134, Code=0 williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Code | Checksum | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Cur Hop Limit |M|O|H|Prf|Rsrvd| Router Lifetime | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Reachable Time | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Retrans Timer | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Options ... williamr@2: +-+-+-+-+-+-+-+-+-+-+-+- williamr@2: @endverbatim williamr@2: * williamr@2: * @note williamr@2: * Above is longer thant what is declared in the base class williamr@2: * i-member. The user must verify the sufficient length of williamr@2: * the packet, when using this. williamr@2: * williamr@2: * Valid options: williamr@2: * williamr@2: * - #KInet6OptionICMP_SourceLink williamr@2: * - #KInet6OptionICMP_Mtu williamr@2: * - #KInet6OptionICMP_Prefix williamr@2: * - #KInet6OptionICMP_RouteInformation (draft) williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: // williamr@2: // General williamr@2: // williamr@2: inline static TInt MinHeaderLength() {return 16; } williamr@2: inline static TInt MaxHeaderLength() {return 16; } williamr@2: inline TInt HeaderLength() const {return 16;} williamr@2: // williamr@2: // Access, get ICMP header field values from the packet williamr@2: // williamr@2: inline TInt CurHopLimit() const williamr@2: /** williamr@2: * Gets Cur Hop Limit. williamr@2: * @return Hop Limit williamr@2: */ williamr@2: { williamr@2: return i[4]; williamr@2: } williamr@2: inline TInt Flags() const williamr@2: /** williamr@2: * Gets flags byte williamr@2: * @return Flags (M, O, H, Prf and Rsrvd) williamr@2: */ williamr@2: { williamr@2: return i[5]; // M + O + Reserved as one unit williamr@2: } williamr@2: inline TInt M() const williamr@2: /** Gets Managed Address Configuration (M) flag */ williamr@2: { williamr@2: return i[5] & 0x80; williamr@2: } williamr@2: inline TInt O() const williamr@2: /** Gets Other Address Configuartion (O) flag */ williamr@2: { williamr@2: return i[5] & 0x40; williamr@2: } williamr@2: inline TInt H() const williamr@2: /** Gets Home Agent Configuration (H) flag */ williamr@2: { williamr@2: return i[5] & 0x20; williamr@2: } williamr@2: #if 1 williamr@2: inline TInt Prf() const williamr@2: /** williamr@2: * Gets default route preference. williamr@2: * williamr@2: * Experimental: draft-draves-ipngwg-router-selection-01.txt williamr@2: * Default Router Preferences and More-Specific Routes williamr@2: */ williamr@2: { williamr@2: return (i[5] >> 3) & 0x3; // should be treated as 2bit signed int williamr@2: } williamr@2: #endif williamr@2: inline TInt RouterLifetime() const williamr@2: /** williamr@2: * Gets the lifetime of the defaul route. williamr@2: * williamr@2: * If non-zero, specifies how long (in seconds) this williamr@2: * router is willing to act as a default router. williamr@2: * williamr@2: * @return The life time of the default route. williamr@2: * williamr@2: * @note williamr@2: * This is badly named. The parameter controls williamr@2: * only the default route processing. The value williamr@2: * ZERO does not mean that the sender is not a williamr@2: * router. williamr@2: */ williamr@2: { williamr@2: return (i[6] << 8) + i[7]; williamr@2: } williamr@2: inline TUint32 ReachableTime() const williamr@2: /** williamr@2: * Gets the value of reachable timer. williamr@2: */ williamr@2: { williamr@4: // coverity[overrun-local] williamr@2: return (i[8] << 24) | (i[9] << 16) | (i[10] << 8) | i[11]; williamr@2: } williamr@2: inline TUint32 RetransTimer() const williamr@2: /** williamr@2: * Gets the value of retransmit timer. williamr@2: */ williamr@2: { williamr@4: // coverity[overrun-local] williamr@2: return (i[12] << 24) | (i[13] << 16) | (i[14] << 8) | i[15]; williamr@2: } williamr@2: // williamr@2: // Build, set IP header field values into the packet williamr@2: // williamr@2: inline void SetCurHopLimit(TInt aLimit) williamr@2: /** williamr@2: * Sets the Cur Hoplimit. williamr@2: * @param aLimit The Hoplimit [0..255] williamr@2: */ williamr@2: { williamr@2: i[4] = (TUint8)aLimit; williamr@2: } williamr@2: inline void SetFlags(TInt aFlags) williamr@2: /** williamr@2: * Sets the flags. williamr@2: * @param aFlags The flags bits [0..255]. williamr@2: */ williamr@2: { williamr@2: i[5] = (TUint8)aFlags; williamr@2: } williamr@2: inline void SetRouterLifetime(TInt aTime) williamr@2: /** williamr@2: * Sets the lifetime of the default route. williamr@2: * @param aTime The lifetime. williamr@2: */ williamr@2: { williamr@2: i[7] = (TUint8)aTime; williamr@2: i[6] = (TUint8)(aTime >> 8); williamr@2: } williamr@2: inline void SetReachableTime(TUint32 aTime) williamr@2: /** williamr@2: * Sets the value of reachable timer williamr@2: * @param aTime The timer value williamr@2: */ williamr@2: { williamr@4: // coverity[overrun-local] williamr@2: i[11] = (TUint8)aTime; williamr@4: // coverity[overrun-local] williamr@2: i[10] = (TUint8)(aTime >> 8); williamr@4: // coverity[overrun-local] williamr@2: i[9] = (TUint8)(aTime >> 16); williamr@4: // coverity[overrun-local] williamr@2: i[8] = (TUint8)(aTime >> 24); williamr@2: } williamr@2: inline void SetRetransTimer(TUint32 aTimer) williamr@2: /** williamr@2: * Sets the value of the retransmit timer williamr@2: * @param aTimer The timer value williamr@2: */ williamr@2: { williamr@4: // coverity[overrun-local] williamr@2: i[15] = (TUint8)aTimer; williamr@4: // coverity[overrun-local] williamr@2: i[14] = (TUint8)(aTimer >> 8); williamr@4: // coverity[overrun-local] williamr@2: i[13] = (TUint8)(aTimer >> 16); williamr@4: // coverity[overrun-local] williamr@2: i[12] = (TUint8)(aTimer >> 24); williamr@2: } williamr@2: williamr@2: private: williamr@2: }; williamr@2: williamr@2: class TInet6HeaderICMP_NeighborSol : public TInet6HeaderICMP williamr@2: /** williamr@2: * ICMPv6 Neighbour Solicitation layout. williamr@2: @verbatim williamr@2: Neigbour Solicitation Message Format from RFC-2461 williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Code | Checksum | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Reserved | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: + Target Address + williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Options ... williamr@2: +-+-+-+-+-+-+-+-+-+-+-+- williamr@2: @endverbatim williamr@2: * williamr@2: * @note williamr@2: * Above is longer thant what is declared in the base class williamr@2: * i-member. The user must verify the sufficient length of williamr@2: * the packet, when using this. williamr@2: * williamr@2: * Valid options: williamr@2: * williamr@2: * - #KInet6OptionICMP_SourceLink williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: // williamr@2: // General williamr@2: // williamr@2: inline static TInt MinHeaderLength() {return 24; } williamr@2: inline static TInt MaxHeaderLength() {return 24; } williamr@2: inline TInt HeaderLength() const {return 24;} williamr@2: inline TIp6Addr &Target() const williamr@2: /** williamr@2: * Gets the Target Address. williamr@2: * williamr@2: * @return The target address (reference). williamr@2: */ williamr@2: { williamr@2: return (TIp6Addr &)i[8]; williamr@2: } williamr@2: private: williamr@2: }; williamr@2: williamr@2: williamr@2: class TInet6HeaderICMP_NeighborAdv : public TInet6HeaderICMP williamr@2: /** williamr@2: * ICMPv6 Neighbour Advertisement layout. williamr@2: @verbatim williamr@2: Neighbor Advertisement Message Format (from RFC-2461) williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Code | Checksum | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: |R|S|O| Reserved | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: + Target Address + williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Options ... williamr@2: +-+-+-+-+-+-+-+-+-+-+-+- williamr@2: @endverbatim williamr@2: * @note williamr@2: * Above is longer thant what is declared in the base class williamr@2: * i-member. The user must verify the sufficient length of williamr@2: * the packet, when using this. williamr@2: * williamr@2: * Valid options: williamr@2: * williamr@2: * - #KInet6OptionICMP_TargetLink williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: // williamr@2: // General williamr@2: // williamr@2: inline static TInt MinHeaderLength() {return 24; } williamr@2: inline static TInt MaxHeaderLength() {return 24; } williamr@2: inline TInt HeaderLength() const {return 24;} williamr@2: williamr@2: // williamr@2: // Set and Access the Target Address williamr@2: // williamr@2: inline TIp6Addr &Target() const williamr@2: /** williamr@2: * Gets the Target Address. williamr@2: * williamr@2: * @return The target address (reference). williamr@2: */ williamr@2: { williamr@2: return (TIp6Addr &)i[8]; williamr@2: } williamr@2: williamr@2: inline TInt R() williamr@2: { williamr@2: return 0x80 & i[4]; williamr@2: } williamr@2: inline TInt S() williamr@2: { williamr@2: return 0x40 & i[4]; williamr@2: } williamr@2: inline TInt O() williamr@2: { williamr@2: return 0x20 & i[4]; williamr@2: } williamr@2: inline void SetR(TInt aValue) williamr@2: { williamr@2: if (aValue) i[4] |= 0x80; else i[4] &= ~0x80; williamr@2: } williamr@2: inline void SetS(TInt aValue) williamr@2: { williamr@2: if (aValue) i[4] |= 0x40; else i[4] &= ~0x40; williamr@2: } williamr@2: inline void SetO(TInt aValue) williamr@2: { williamr@2: if (aValue) i[4] |= 0x20; else i[4] &= ~0x20; williamr@2: } williamr@2: williamr@2: }; williamr@2: williamr@2: williamr@2: class TInet6HeaderICMP_Redirect : public TInet6HeaderICMP williamr@2: /** williamr@2: * ICMPv6 Redirect layout. williamr@2: @verbatim williamr@2: Redirect Message Format (RFC-2461) williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Code | Checksum | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Reserved | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: + Target Address + williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: + Destination Address + williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Options ... williamr@2: +-+-+-+-+-+-+-+-+-+-+-+- williamr@2: williamr@2: @endverbatim williamr@2: * @note williamr@2: * Above is longer thant what is declared in the base class williamr@2: * i-member. The user must verify the sufficient length of williamr@2: * the packet, when using this. williamr@2: * williamr@2: * Valid options: williamr@2: * williamr@2: * - #KInet6OptionICMP_TargetLink williamr@2: * - #KInet6OptionICMP_Redirect williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: // williamr@2: // General williamr@2: // williamr@2: inline static TInt MinHeaderLength() {return 40; } williamr@2: inline static TInt MaxHeaderLength() {return 40; } williamr@2: inline TInt HeaderLength() const {return 40;} williamr@2: williamr@2: inline TIp6Addr &Target() const williamr@2: /** williamr@2: * Gets the Target Address. williamr@2: * williamr@2: * @return The target address (reference). williamr@2: */ williamr@2: { williamr@2: return (TIp6Addr &)i[8]; williamr@2: } williamr@2: inline TIp6Addr &Destination() const williamr@2: /** williamr@2: * Gets the Destination Address. williamr@2: * williamr@2: * @return The destination address (reference). williamr@2: */ williamr@2: { williamr@2: return (TIp6Addr &)i[24]; williamr@2: } williamr@2: }; williamr@2: williamr@2: williamr@2: class TInet6OptionICMP_LinkLayer williamr@2: /** williamr@2: * ICMPv6 Link-layer Address layout. williamr@2: @verbatim williamr@2: Source/Target Link-layer Address Option (RFC-2461) williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Length | Link-Layer Address ... williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: @endverbatim williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline static TInt MinHeaderLength() {return 8; } williamr@2: inline static TInt MaxHeaderLength() {return 8; } // Not very useful williamr@2: inline TInt HeaderLength() const {return Length() * 8; } williamr@2: // williamr@2: // Access williamr@2: // williamr@2: inline TInt Type() const williamr@2: { williamr@2: return i[0]; williamr@2: } williamr@2: inline TInt Length() const williamr@2: { williamr@2: return i[1]; williamr@2: } williamr@2: // williamr@2: // Access and Set williamr@2: // williamr@2: inline TPtr8 Address() const williamr@2: { williamr@2: return TPtr8((TUint8 *)&i[2], i[1] * 8 - 2, i[1] * 8 - 2); williamr@2: } williamr@2: // williamr@2: // Construct methods williamr@2: // williamr@2: inline void SetType(TInt aType) williamr@2: { williamr@2: i[0] = (TUint8)aType; williamr@2: } williamr@2: inline void SetLength(TInt aLength) williamr@2: { williamr@2: i[1] = (TUint8)aLength; williamr@2: } williamr@2: private: williamr@2: union williamr@2: { williamr@2: TUint8 i[8]; williamr@2: TUint32 iAlign; // A dummy member to force the 4 byte alignment williamr@2: }; williamr@2: }; williamr@2: williamr@2: williamr@2: class TInet6OptionICMP_Prefix williamr@2: /** williamr@2: * ICMPv6 Prefix Infotmation Option. williamr@2: @verbatim williamr@2: Prefix Information Option (RFC-2461) williamr@2: (+ Router Address flag from draft-ietf-mobileip-ipv6-08) williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Length | Prefix Length |L|A|R| Rsrvd1 | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Valid Lifetime | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Preferred Lifetime | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Reserved2 | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: + Prefix + williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: williamr@2: @endverbatim williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline static TInt MinHeaderLength() {return 4*8; } williamr@2: inline static TInt MaxHeaderLength() {return 4*8; } // Not very useful williamr@2: inline TInt HeaderLength() const {return 4*8; } williamr@2: williamr@2: inline TInt Type() const williamr@2: { williamr@2: return i[0]; williamr@2: } williamr@2: inline TInt Length() const williamr@2: { williamr@2: return i[1]; williamr@2: } williamr@2: inline TInt PrefixLength() const williamr@2: { williamr@2: return i[2]; // 0..128 williamr@2: } williamr@2: inline TInt LFlag() const williamr@2: { williamr@2: return i[3] & 0x80; williamr@2: } williamr@2: inline TInt AFlag() const williamr@2: { williamr@2: return i[3] & 0x40; williamr@2: } williamr@2: inline TInt RFlag() const williamr@2: { williamr@2: return i[3] & 0x20; williamr@2: } williamr@2: inline TUint32 ValidLifetime() const williamr@2: { williamr@2: return (i[4] << 24) | (i[5] << 16) | (i[6] << 8) | i[7]; williamr@2: } williamr@2: inline TUint32 PreferredLifetime() const williamr@2: { williamr@2: return (i[8] << 24) | (i[9] << 16) | (i[10] << 8) | i[11]; williamr@2: } williamr@2: // williamr@2: // williamr@2: inline TIp6Addr &Prefix() const williamr@2: { williamr@2: return (TIp6Addr &)i[16]; williamr@2: } williamr@2: // williamr@2: // Construct methods williamr@2: // williamr@2: inline void SetType(TInt aType) williamr@2: { williamr@2: i[0] = (TUint8)aType; williamr@2: } williamr@2: inline void SetLength(TInt aLength) williamr@2: { williamr@2: i[1] = (TUint8)aLength; williamr@2: } williamr@2: inline void SetPrefixLength(TInt aLength) williamr@2: { williamr@2: i[2] = (TUint8)aLength; williamr@2: } williamr@2: inline void SetFlags(TInt aFlags) williamr@2: { williamr@2: i[3] = (TUint8)aFlags; williamr@2: } williamr@2: inline void SetValidLifetime(TUint32 aTime) williamr@2: { williamr@2: i[7] = (TUint8)aTime; williamr@2: i[6] = (TUint8)(aTime >> 8); williamr@2: i[5] = (TUint8)(aTime >> 16); williamr@2: i[4] = (TUint8)(aTime >> 24); williamr@2: } williamr@2: inline void SetPreferredLifetime(TUint32 aTime) williamr@2: { williamr@2: i[11] = (TUint8)aTime; williamr@2: i[10] = (TUint8)(aTime >> 8); williamr@2: i[9] = (TUint8)(aTime >> 16); williamr@2: i[8] = (TUint8)(aTime >> 24); williamr@2: } williamr@2: inline void SetReserved2(TUint32 aFiller) williamr@2: { williamr@2: i[15] = (TUint8)aFiller; williamr@2: i[14] = (TUint8)(aFiller >> 8); williamr@2: i[13] = (TUint8)(aFiller >> 16); williamr@2: i[12] = (TUint8)(aFiller >> 24); williamr@2: } williamr@2: williamr@2: williamr@2: private: williamr@2: union williamr@2: { williamr@2: TUint8 i[4*8]; williamr@2: TUint32 iAlign; // A dummy member to force the 4 byte alignment williamr@2: }; williamr@2: }; williamr@2: williamr@2: williamr@2: class TInet6OptionICMP_Mtu williamr@2: /** williamr@2: * ICMPv6 MTU Option. williamr@2: @verbatim williamr@2: MTU Option (RFC-2461) williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Length | Reserved | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | MTU | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: @endverbatim williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline static TInt MinHeaderLength() {return 8; } williamr@2: inline static TInt MaxHeaderLength() {return 8; } // Not very useful williamr@2: inline TInt HeaderLength() const {return 8; } williamr@2: williamr@2: inline TInt Type() const williamr@2: { williamr@2: return i[0]; williamr@2: } williamr@2: inline TInt Length() const williamr@2: { williamr@2: return i[1]; williamr@2: } williamr@2: inline TInt Mtu() const williamr@2: { williamr@2: return (i[4] << 24) | (i[5] << 16) | (i[6] << 8) | i[7]; williamr@2: } williamr@2: // williamr@2: // Construct methods williamr@2: // williamr@2: inline void SetType(TInt aType) williamr@2: { williamr@2: i[0] = (TUint8)aType; williamr@2: } williamr@2: inline void SetLength(TInt aLength) williamr@2: { williamr@2: i[1] = (TUint8)aLength; williamr@2: // Silently ZERO the reserved bits... not too nice --- msa williamr@2: i[2] = 0; williamr@2: i[3] = 0; williamr@2: } williamr@2: inline void SetMtu(TUint32 aMtu) williamr@2: { williamr@2: i[7] = (TUint8)aMtu; williamr@2: i[6] = (TUint8)(aMtu >> 8); williamr@2: i[5] = (TUint8)(aMtu >> 16); williamr@2: i[4] = (TUint8)(aMtu >> 24); williamr@2: } williamr@2: private: williamr@2: TUint8 i[8]; williamr@2: }; williamr@2: williamr@2: williamr@2: #if 1 williamr@2: class TInet6OptionICMP_RouteInformation williamr@2: // Route Information Option williamr@2: // Experimental: draft-draves-ipngwg-router-selection-01.txt williamr@2: /** williamr@2: * ICMPv6 Route Information Option. williamr@2: @verbatim williamr@2: Default Router Preferences and More-Specific Routes williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Length | Prefix Length |Resvd|Prf|Resvd| williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Route Lifetime | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: + Prefix + williamr@2: | | williamr@2: + + williamr@2: | | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: @endverbatim williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline static TInt MinHeaderLength() {return 8; } williamr@2: inline static TInt MaxHeaderLength() {return 3*8; } williamr@2: inline TInt HeaderLength() const {return Length()*8; } williamr@2: williamr@2: inline TInt Type() const williamr@2: { williamr@2: return i[0]; williamr@2: } williamr@2: inline TInt Length() const williamr@2: { williamr@2: return i[1]; williamr@2: } williamr@2: inline TInt PrefixLength() const williamr@2: { williamr@2: return i[2]; // 0..128 williamr@2: } williamr@2: inline TInt Prf() const williamr@2: { williamr@2: return (i[3] >> 3) & 0x3; // should be treated as 2bit signed int williamr@2: } williamr@2: inline TUint32 RouteLifetime() const williamr@2: { williamr@2: return (i[4] << 24) | (i[5] << 16) | (i[6] << 8) | i[7]; williamr@2: } williamr@2: // williamr@2: // *WARNING* The "Prefix" returns a raw reference to the beginning williamr@2: // of the prefix field in the option structure. HOWEVER, the option williamr@2: // field can be shorter than 128 bits! If used to allocate space, williamr@2: // the maximum is allocated and the method is safe, but that is not williamr@2: // true if header is mapped directly to the received packet! -- msa williamr@2: inline TIp6Addr &Prefix() const williamr@2: { williamr@2: return (TIp6Addr &)i[8]; williamr@2: } williamr@2: // williamr@2: // Construct methods williamr@2: // williamr@2: inline void SetType(TInt aType) williamr@2: { williamr@2: i[0] = (TUint8)aType; williamr@2: } williamr@2: inline void SetLength(TInt aLength) williamr@2: { williamr@2: i[1] = (TUint8)aLength; williamr@2: } williamr@2: inline void SetPrefixLength(TInt aLength) williamr@2: { williamr@2: i[2] = (TUint8)aLength; williamr@2: } williamr@2: inline void SetPrefixLifetime(TUint32 aTime) williamr@2: { williamr@2: i[7] = (TUint8)aTime; williamr@2: i[6] = (TUint8)(aTime >> 8); williamr@2: i[5] = (TUint8)(aTime >> 16); williamr@2: i[4] = (TUint8)(aTime >> 24); williamr@2: } williamr@2: williamr@2: private: williamr@2: union williamr@2: { williamr@2: TUint8 i[3*8]; // The space allocated for MAX LENGTH williamr@2: TUint32 iAlign; // A dummy member to force the 4 byte alignment williamr@2: }; williamr@2: }; williamr@2: williamr@2: class TInet6OptionICMP_DnsInformation williamr@2: /** williamr@2: * ICMPv6 Recursive DNS Server Option. williamr@2: * IPv6 DNS Configuration based on Router Advertisement williamr@2: * williamr@2: * Experimental: draft-jeong-dnsop-ipv6-discovery-03.txt williamr@2: @verbatim williamr@2: Recursive DNS Server Option williamr@2: williamr@2: 0 1 2 3 williamr@2: 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 williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Type | Length | Pref | Reserved | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Lifetime | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | | williamr@2: : IPv6 Address of RDNSS : williamr@2: | | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: williamr@2: @endverbatim williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline static TInt MinHeaderLength() {return 24; } williamr@2: inline static TInt MaxHeaderLength() {return 24; } williamr@2: inline TInt HeaderLength() const {return Length()*8; } williamr@2: williamr@2: inline TInt Type() const williamr@2: { williamr@2: return i[0]; williamr@2: } williamr@2: inline TInt Length() const williamr@2: { williamr@2: return i[1]; williamr@2: } williamr@2: inline TInt Pref() const williamr@2: { williamr@2: return (i[3] >> 4) & 0xF; williamr@2: } williamr@2: inline TUint32 Lifetime() const williamr@2: { williamr@2: return (i[4] << 24) | (i[5] << 16) | (i[6] << 8) | i[7]; williamr@2: } williamr@2: inline TIp6Addr &Address() const williamr@2: { williamr@2: return (TIp6Addr &)i[8]; williamr@2: } williamr@2: // williamr@2: // Construct methods williamr@2: // williamr@2: inline void SetType(TInt aType) williamr@2: { williamr@2: i[0] = (TUint8)aType; williamr@2: } williamr@2: inline void SetLength(TInt aLength) williamr@2: { williamr@2: i[1] = (TUint8)aLength; williamr@2: } williamr@2: inline void SetPref(TInt aPref) williamr@2: { williamr@2: i[2] = (TUint8)(((aPref << 4) & 0xF0) | (i[2] & 0xF)); williamr@2: } williamr@2: inline void SetLifetime(TUint32 aTime) williamr@2: { williamr@2: i[7] = (TUint8)aTime; williamr@2: i[6] = (TUint8)(aTime >> 8); williamr@2: i[5] = (TUint8)(aTime >> 16); williamr@2: i[4] = (TUint8)(aTime >> 24); williamr@2: } williamr@2: williamr@2: private: williamr@2: union williamr@2: { williamr@2: TUint8 i[24]; // The space allocated for MAX LENGTH williamr@2: TUint32 iAlign; // A dummy member to force the 4 byte alignment williamr@2: }; williamr@2: }; williamr@2: williamr@4: #ifdef SYMBIAN_TCPIPDHCP_UPDATE williamr@4: class TInet6OptionICMP_DnsInformationV1 williamr@4: /** williamr@4: * ICMPv6 Recursive DNS Server Option(RFC-5006) williamr@4: * IPv6 DNS Configuration based on Router Advertisement williamr@4: * williamr@4: * williamr@4: @verbatim williamr@4: Recursive DNS Server Option williamr@4: williamr@4: 0 1 2 3 williamr@4: 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 williamr@4: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@4: | Type | Length | Reserved | williamr@4: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@4: | Lifetime | williamr@4: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@4: | | williamr@4: : IPv6 Address of RDNSS : williamr@4: | | williamr@4: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@4: williamr@4: @endverbatim williamr@4: * @publishedAll williamr@4: * @released williamr@4: */ williamr@4: { williamr@4: public: williamr@4: inline static TInt MinRdnssOptionLength() {return RDNSSOPTION_HDRLENGTH + RDNSSADDRSIZE;}//24 williamr@4: williamr@4: inline static TInt MaxRdnssOptionLength() {return RDNSSOPTION_HDRLENGTH + (RDNSSADDRSIZE*RDNSS_MAX_ADDRESS); }//72 williamr@4: williamr@4: inline TInt HeaderLength() const {return RDNSSOPTION_HDRLENGTH;}//8 williamr@4: williamr@4: inline TInt Type() const williamr@4: { williamr@4: return i[0]; williamr@4: } williamr@4: inline TInt Length() const williamr@4: { williamr@4: return i[1]; williamr@4: } williamr@4: inline TUint32 Lifetime() const williamr@4: { williamr@4: return (i[4] << 24) | (i[5] << 16) | (i[6] << 8) | i[7]; williamr@4: } williamr@4: inline TIp6Addr &Address() const williamr@4: { williamr@4: return (TIp6Addr &)i[8]; williamr@4: } williamr@4: inline TIp6Addr &GetNextAddress(TInt aOffset) const williamr@4: { williamr@4: return (TIp6Addr &)i[aOffset]; williamr@4: } williamr@4: private: williamr@4: union williamr@4: { williamr@4: TUint8 i[RDNSSOPTION_HDRLENGTH + (RDNSSADDRSIZE * RDNSS_MAX_ADDRESS)]; // The space allocated for MAX LENGTH of 4 DNS address williamr@4: TUint32 iAlign; // A dummy member to force the 4 byte alignment williamr@4: }; williamr@4: }; williamr@4: #endif //SYMBIAN_TCPIPDHCP_UPDATE williamr@2: #endif williamr@2: williamr@2: /** williamr@2: * @name ICMPv6 Error Message Types (0-127) williamr@2: */ williamr@2: //@{ williamr@2: const TUint8 KInet6ICMP_Unreachable = 1; williamr@2: const TUint8 KInet6ICMP_PacketTooBig = 2; williamr@2: const TUint8 KInet6ICMP_TimeExceeded = 3; williamr@2: const TUint8 KInet6ICMP_ParameterProblem= 4; williamr@2: //@} williamr@2: /** williamr@2: * @name ICMPv6 Informational Message Types (128-255) williamr@2: */ williamr@2: //@{ williamr@2: /** Echo Request. See TInet6HeaderICMP_Echo. */ williamr@2: const TUint8 KInet6ICMP_EchoRequest = 128; williamr@2: /** Echo Reply. See TInet6HeaderICMP_Echo. */ williamr@2: const TUint8 KInet6ICMP_EchoReply = 129; williamr@2: /** Not implemented. */ williamr@2: const TUint8 KInet6ICMP_GroupQuery = 130; williamr@2: /** Not implemented. */ williamr@2: const TUint8 KInet6ICMP_GroupReport = 131; williamr@2: /** Not implemented. */ williamr@2: const TUint8 KInet6ICMP_GroupDone = 132; williamr@2: /** Router Solicitation. See TInet6HeaderICMP_RouterSol. */ williamr@2: const TUint8 KInet6ICMP_RouterSol = 133; williamr@2: /** Router Advertisement. See TInet6HeaderICMP_RouterAdv. */ williamr@2: const TUint8 KInet6ICMP_RouterAdv = 134; williamr@2: /** Neighbor Solicitation. See TInet6HeaderICMP_NeighborSol. */ williamr@2: const TUint8 KInet6ICMP_NeighborSol = 135; williamr@2: /** Neighbor Advertisement. See TInet6HeaderICMP_NeighborAdv. */ williamr@2: const TUint8 KInet6ICMP_NeighborAdv = 136; williamr@2: /** Redirect. See TInet6HeaderICMP_Redirect. */ williamr@2: const TUint8 KInet6ICMP_Redirect = 137; williamr@2: //@} williamr@2: williamr@2: /** williamr@2: * @name ICMPv6 Option types. williamr@2: * The default derivation of the symbol williamr@2: * is from the name of the header class by replacing 'T' with 'K' (or williamr@2: * vice versa). williamr@2: * williamr@2: */ williamr@2: //@{ williamr@2: /** Source Link-Layer Address. See TInet6OptionICMP_LinkLayer. */ williamr@2: const TInt KInet6OptionICMP_SourceLink = 1; williamr@2: /** Target Link-Layer Address. See TInet6OptionICMP_LinkLayer. */ williamr@2: const TInt KInet6OptionICMP_TargetLink = 2; williamr@2: /** Prefix Information. See TInet6OptionICMP_Prefix. */ williamr@2: const TInt KInet6OptionICMP_Prefix = 3; williamr@2: /** Redirect Header. (not implemented). */ williamr@2: const TInt KInet6OptionICMP_Redirect = 4; williamr@2: /** MTU. See TInet6OptionICMP_Mtu. */ williamr@2: const TInt KInet6OptionICMP_Mtu = 5; williamr@4: #ifdef SYMBIAN_TCPIPDHCP_UPDATE williamr@4: /** RFC 5006: Recursive DNS Server Option. See TInet6OptionICMP_DnsInformationV1*/ williamr@4: const TInt KInet6OptionICMP_RDNSS = 25; williamr@4: #endif //SYMBIAN_TCPIPDHCP_UPDATE williamr@2: #if 1 williamr@2: // Experimental: draft-draves-ipngwg-router-selection-01.txt williamr@2: // Default Router Preferences and More-Specific Routes williamr@2: // *UNOFFICIAL NUMBER ASSIGNMENT (SAME AS MSR STACK)--REAL VALUE TBD* williamr@2: /** Route Information. See TInet6OptionICMP_RouteInformation. */ williamr@2: const TInt KInet6OptionICMP_RouteInformation = 9; williamr@2: #endif williamr@2: //@} williamr@2: williamr@2: //@} williamr@2: #endif