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@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.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: // arp_hdr.h - ARP header structure williamr@2: // ARP header structure. williamr@2: // williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @file arp_hdr.h williamr@2: @ingroup ip_packet_formats williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: williamr@2: #ifndef __ARP_HDR_H__ williamr@2: #define __ARP_HDR_H__ williamr@2: williamr@2: #include "in_hdr.h" williamr@2: williamr@2: /** williamr@2: * @addtogroup ip_packet_formats williamr@2: * @{ williamr@2: */ williamr@2: williamr@2: /** williamr@2: * "Fake" protocol number for ARP. williamr@2: * williamr@2: * This protocol value is only used to recognize the ARP packets williamr@2: * coming from the interface. There is no "real" ARP.PRT. williamr@2: */ williamr@2: const TUint KProtocolArp = 0xFAD; // (get some better value) williamr@2: williamr@2: const TUint16 KArpProtocolType_IP = 0x0800; // Protocol Type value for IPv4 williamr@2: // williamr@2: // Hardware types listed only as example, it is assumed that the williamr@2: // driver knows its own type... williamr@2: // williamr@2: const TUint16 KArpHarwareType_ETHERNET = 1; williamr@2: const TUint16 KArpHarwareType_IEEE_802 = 6; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: enum TArpOperation // from RFC-1700 williamr@2: { williamr@2: EArpOperation_REQUEST = 1, // RFC-826 williamr@2: EArpOperation_REPLY = 2, // RFC-826 williamr@2: EArpOperation_REQUEST_REVERSE = 3, // RFC-903 williamr@2: EArpOperation_REPLY_REVERSE = 4, // RFC-903 williamr@2: EArpOperation_DRARP_REQUEST = 5, // williamr@2: EArpOperation_DRARP_REPLY = 6, williamr@2: EArpOperation_DRARP_ERROR = 7, williamr@2: EArpOperation_INARP_REQUEST = 8, // RFC-1293 williamr@2: EArpOperation_INARP_REPLY = 9, // RFC-1293 williamr@2: EArpOperation_ARP_NAK = 10 williamr@2: }; williamr@2: williamr@2: williamr@2: class TInet6HeaderArp williamr@2: /** williamr@2: * ARP Header. williamr@2: * williamr@2: @verbatim williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Hardware Type | Protocol Type | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | HwAddrLen | PrAddrLen | ARP Operation | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: | Sender's physical hardware address | williamr@2: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - williamr@2: | Sender's protocol address | williamr@2: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - williamr@2: | Target's physical hardware address | williamr@2: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - williamr@2: | Target's protocol address | williamr@2: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ williamr@2: @endverbatim williamr@2: * @note williamr@2: * This definition covers only the fixed portion of the williamr@2: * message. DO NOT DECLARE A VARIABLE WITH THIS CLASS! 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 128; } williamr@2: williamr@2: inline TUint8* EndPtr() { return i + HeaderLength(); } williamr@2: inline TInt HeaderLength() const { return 8 + 2 * HwAddrLen() + 2 * PrAddrLen(); } // Return true byte length williamr@2: williamr@2: // Access methods williamr@2: williamr@2: inline TInt HardwareType() const // Return hardware type value in host order williamr@2: { williamr@2: return i[0] << 8 | i[1]; williamr@2: } williamr@2: williamr@2: inline TInt ProtocolType() const // Return protocol type value in host order williamr@2: { williamr@2: return i[2] << 8 | i[3]; williamr@2: } williamr@2: williamr@2: inline TInt HwAddrLen() const // Return hardware address length (in bytes) williamr@2: { williamr@2: return i[4]; williamr@2: } williamr@2: williamr@2: inline TInt PrAddrLen() const // Return protocol address length (in bytes) williamr@2: { williamr@2: return i[5]; williamr@2: } williamr@2: williamr@2: inline TInt Operation() const williamr@2: { williamr@2: return i[6] << 8 | i[7]; williamr@2: } williamr@2: williamr@2: // Access/Modify williamr@2: williamr@2: inline TPtr8 SenderHwAddr() williamr@2: { williamr@2: return TPtr8(&i[8], HwAddrLen(), HwAddrLen()); williamr@2: } williamr@2: inline TPtr8 SenderPrAddr() williamr@2: { williamr@2: return TPtr8(&i[8] + HwAddrLen(), PrAddrLen(), PrAddrLen()); williamr@2: } williamr@2: inline TPtr8 TargetHwAddr() williamr@2: { williamr@2: return TPtr8(&i[8] + HwAddrLen() + PrAddrLen(), HwAddrLen(), HwAddrLen()); williamr@2: } williamr@2: inline TPtr8 TargetPrAddr() williamr@2: { williamr@2: return TPtr8(&i[8] + 2*HwAddrLen() + PrAddrLen(), PrAddrLen(), PrAddrLen()); williamr@2: } williamr@2: williamr@2: // Modify williamr@2: williamr@2: inline void SetHardwareType(TInt aType) // Set hardware type value williamr@2: { williamr@2: i[1] = (TUint8)aType; williamr@2: i[0] = (TUint8)(aType >> 8); williamr@2: } williamr@2: williamr@2: inline void SetProtocolType(TInt aType) // Set protocol type value williamr@2: { williamr@2: i[3] = (TUint8)aType; williamr@2: i[2] = (TUint8)(aType >> 8); williamr@2: } williamr@2: williamr@2: inline void SetHwAddrLen(TInt aLength) // Set hardware address length (in bytes) williamr@2: { williamr@2: i[4] = (TUint8)aLength; williamr@2: } williamr@2: williamr@2: inline void SetPrAddrLen(TInt aLength) // Set protocol address length (in bytes) williamr@2: { williamr@2: i[5] = (TUint8)aLength; williamr@2: } williamr@2: williamr@2: inline void SetOperation(TInt aOperation) williamr@2: { williamr@2: i[7] = (TUint8)aOperation; williamr@2: i[6] = (TUint8)(aOperation >> 8); williamr@2: } 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: #endif