voipplugins/dhcppositionprovider/src/dhcpdatalocationrequest.cpp
changeset 0 a4daefaec16c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/dhcppositionprovider/src/dhcpdatalocationrequest.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,176 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Builds the dhcp location information request buffer
+*
+*/
+
+
+#include <e32math.h>
+#include "dhcppsylogging.h"             // For logging
+#include "dhcpconstants.h"
+#include "dhcpdatalocationrequest.h"
+
+const TInt KDhcpFileBufferLength = 0x80;        // 128dec
+const TInt KDhcpSnameLength = 0x40;
+
+const TInt KDhcpChAddressLength = 0x10;   // 16dec
+
+// Data positions constants.
+const TInt KDhcpMessageOpCodePos = 0x00;
+const TInt KDhcpHardwareAddressTypePos = 0x01;
+const TInt KDhcpHardwareAddressLengthPos = 0x02;
+const TInt KDhcpHopsRelayPos = 0x03;
+const TInt KDhcpTransActionIdPos = 0x04;     // 4 byte
+
+const TInt KDhcpSecsPos = 0x08;
+const TInt KDhcpFlagsPos = 0x0A;
+const TInt KDhcpCiAddrPos = 0x0C;
+const TInt KDhcpYiAddrPos = 0x10;
+const TInt KDhcpSiAddrPos = 0x14;
+const TInt KDhcpGiAddrPos = 0x18;
+
+// Operation code constans.
+const TUint8    KDhcpMessageOperationCode = 0x01;       // 1 = BOOTREQUEST
+const TUint8    KDhcpHardwareAddressType = 0x01;        // HType 1 = 10 mb ethernet
+const TUint8    KDhcpHardwareAddressLength = 0x06;      // Hardware address length,
+                                                        // 6 bytes 10 mb ethernet
+const TUint8    KDhcpHopsRelayInform = 0x00;            // Hops 0 in DHCPINFORM
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// TDhcpLocationRequestPacket
+// ---------------------------------------------------------------------------
+//
+TDhcpLocationRequestPacket::TDhcpLocationRequestPacket()
+    {
+    iXid = 0;
+    }
+
+// ---------------------------------------------------------------------------
+// Return used transaction id.
+// ---------------------------------------------------------------------------
+//
+TUint32 TDhcpLocationRequestPacket::TransactionId ()
+    {
+    return iXid;
+    }
+
+// ---------------------------------------------------------------------------
+// Constructs a DHCP Inform message
+// ---------------------------------------------------------------------------
+//
+void TDhcpLocationRequestPacket::MakeDhcpInformMsg ( TUint32 aLocalIp,
+    const TDesC8& aMacAddr )
+    {
+    TRACESTRING( "TDhcpLocationRequestPacket::MakeDhcpInform" );
+    RandomiseXid ();
+
+    // Inital part, we do byte work at here.
+    SetLength (0x1C);
+    FillZ();
+
+    iBuffer[KDhcpMessageOpCodePos] = KDhcpMessageOperationCode;
+    iBuffer[KDhcpHardwareAddressTypePos] = KDhcpHardwareAddressType;
+    // We could also get value in here from actual length of
+    // mac address buffer.
+    iBuffer[KDhcpHardwareAddressLengthPos] = KDhcpHardwareAddressLength;
+    iBuffer[KDhcpHopsRelayPos] = KDhcpHopsRelayInform;
+
+    BigEndian::Put32(&(iBuffer[KDhcpTransActionIdPos]), TUint32 (iXid));
+
+    // Set secs and flags fields to the buffer.
+    TUint16 secsAndFlagsValue = 0;      // 0 in flags = no broadcast
+    BigEndian::Put16(&(iBuffer[KDhcpSecsPos]), TUint16 (secsAndFlagsValue));
+    BigEndian::Put16(&(iBuffer[KDhcpFlagsPos]), TUint16 (secsAndFlagsValue));
+
+    // Local ip address
+    BigEndian::Put32(&(iBuffer[KDhcpCiAddrPos]), TUint32 (aLocalIp));
+    TUint32 xiAddrValue = 0x00;
+    BigEndian::Put32(&(iBuffer[KDhcpYiAddrPos]), TUint32 (xiAddrValue));
+    BigEndian::Put32(&(iBuffer[KDhcpSiAddrPos]), TUint32 (xiAddrValue));
+    BigEndian::Put32(&(iBuffer[KDhcpGiAddrPos]), TUint32 (xiAddrValue));
+
+    // wlan mac address
+    TBuf8<KDhcpChAddressLength>  chAddress (KNullDesC8);
+    chAddress.Copy (aMacAddr.Left(KDhcpChAddressLength));
+    if (chAddress.Length()<KDhcpChAddressLength)
+        {
+        // If given mac address is less max of field,
+        // we have make sure that rest of bytes
+        // are filled as zero-byte.
+        TInt oldLength = chAddress.Length();
+        chAddress.SetLength(KDhcpChAddressLength);
+        for (TInt ii = oldLength; ii<KDhcpChAddressLength;ii++)
+            {
+            chAddress[ii] = 0x00;
+            }
+        }
+
+    Append(chAddress);
+
+    TBuf8<KDhcpFileBufferLength> fileBuffer(KNullDesC8);
+    // sname
+    fileBuffer.SetLength(KDhcpSnameLength);
+    fileBuffer.FillZ();
+    Append(fileBuffer);
+
+    // file
+    fileBuffer.SetLength(KDhcpFileBufferLength);
+    fileBuffer.FillZ();
+    Append(fileBuffer);
+
+    // magic cookie
+    TPtrC8 ptr (KDhcpMagicCookie, sizeof(KDhcpMagicCookie));
+    Append(ptr);
+
+    // And add all rest parts to the request message
+    TPtrC8 ptrInform (KDhcpDhcpMsgInform, sizeof(KDhcpDhcpMsgInform));
+    Append(ptrInform);
+
+    TPtrC8 ptrRequestList (KDhcpDhcpParameterRequestList, sizeof(KDhcpDhcpParameterRequestList));
+    Append(ptrRequestList);
+
+    TPtrC8 ptrGeoOptionParams (KDhcpGeoOptionParams, sizeof(KDhcpGeoOptionParams));
+    Append(ptrGeoOptionParams);
+
+    TPtrC8 ptrMessageSize (KDhcpMessageSize, sizeof(KDhcpMessageSize));
+    Append(ptrMessageSize);
+
+    TPtrC8 ptrMsgSize (KDhcpEndOfMessage, sizeof(KDhcpEndOfMessage));
+    Append(ptrMsgSize);
+
+    TInt length = Length();
+    SetLength(KDhcpPacketLength);
+
+    // Ok, rest of bytes shall be zero.
+    TPtr8 ptrMakeZeroBytes(&iBuffer[length],KDhcpPacketLength - length);
+    ptrMakeZeroBytes.FillZ();
+    }
+
+// ---------------------------------------------------------------------------
+// Generate a random transaction id
+// ---------------------------------------------------------------------------
+//
+void TDhcpLocationRequestPacket::RandomiseXid ()
+    {
+    TRACESTRING( "TDhcpLocationRequestPacket::RandomiseXid" );
+    TTime time;
+    time.HomeTime();
+    TInt64 seed = time.Int64();
+    TUint random = Math::Rand( seed );
+    iXid = random % KMaxTUint;
+    TRACESTRING2( "TDhcpLocationRequestPacket::RandomiseXid, iXid %u" ,iXid );
+    }