voipplugins/dhcppositionprovider/src/dhcpdatalocationrequest.cpp
branchRCL_3
changeset 22 d38647835c2e
parent 0 a4daefaec16c
equal deleted inserted replaced
21:f742655b05bf 22:d38647835c2e
       
     1 /*
       
     2 * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Builds the dhcp location information request buffer
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <e32math.h>
       
    20 #include "dhcppsylogging.h"             // For logging
       
    21 #include "dhcpconstants.h"
       
    22 #include "dhcpdatalocationrequest.h"
       
    23 
       
    24 const TInt KDhcpFileBufferLength = 0x80;        // 128dec
       
    25 const TInt KDhcpSnameLength = 0x40;
       
    26 
       
    27 const TInt KDhcpChAddressLength = 0x10;   // 16dec
       
    28 
       
    29 // Data positions constants.
       
    30 const TInt KDhcpMessageOpCodePos = 0x00;
       
    31 const TInt KDhcpHardwareAddressTypePos = 0x01;
       
    32 const TInt KDhcpHardwareAddressLengthPos = 0x02;
       
    33 const TInt KDhcpHopsRelayPos = 0x03;
       
    34 const TInt KDhcpTransActionIdPos = 0x04;     // 4 byte
       
    35 
       
    36 const TInt KDhcpSecsPos = 0x08;
       
    37 const TInt KDhcpFlagsPos = 0x0A;
       
    38 const TInt KDhcpCiAddrPos = 0x0C;
       
    39 const TInt KDhcpYiAddrPos = 0x10;
       
    40 const TInt KDhcpSiAddrPos = 0x14;
       
    41 const TInt KDhcpGiAddrPos = 0x18;
       
    42 
       
    43 // Operation code constans.
       
    44 const TUint8    KDhcpMessageOperationCode = 0x01;       // 1 = BOOTREQUEST
       
    45 const TUint8    KDhcpHardwareAddressType = 0x01;        // HType 1 = 10 mb ethernet
       
    46 const TUint8    KDhcpHardwareAddressLength = 0x06;      // Hardware address length,
       
    47                                                         // 6 bytes 10 mb ethernet
       
    48 const TUint8    KDhcpHopsRelayInform = 0x00;            // Hops 0 in DHCPINFORM
       
    49 
       
    50 
       
    51 // ======== MEMBER FUNCTIONS ========
       
    52 
       
    53 // ---------------------------------------------------------------------------
       
    54 // TDhcpLocationRequestPacket
       
    55 // ---------------------------------------------------------------------------
       
    56 //
       
    57 TDhcpLocationRequestPacket::TDhcpLocationRequestPacket()
       
    58     {
       
    59     iXid = 0;
       
    60     }
       
    61 
       
    62 // ---------------------------------------------------------------------------
       
    63 // Return used transaction id.
       
    64 // ---------------------------------------------------------------------------
       
    65 //
       
    66 TUint32 TDhcpLocationRequestPacket::TransactionId ()
       
    67     {
       
    68     return iXid;
       
    69     }
       
    70 
       
    71 // ---------------------------------------------------------------------------
       
    72 // Constructs a DHCP Inform message
       
    73 // ---------------------------------------------------------------------------
       
    74 //
       
    75 void TDhcpLocationRequestPacket::MakeDhcpInformMsg ( TUint32 aLocalIp,
       
    76     const TDesC8& aMacAddr )
       
    77     {
       
    78     TRACESTRING( "TDhcpLocationRequestPacket::MakeDhcpInform" );
       
    79     RandomiseXid ();
       
    80 
       
    81     // Inital part, we do byte work at here.
       
    82     SetLength (0x1C);
       
    83     FillZ();
       
    84 
       
    85     iBuffer[KDhcpMessageOpCodePos] = KDhcpMessageOperationCode;
       
    86     iBuffer[KDhcpHardwareAddressTypePos] = KDhcpHardwareAddressType;
       
    87     // We could also get value in here from actual length of
       
    88     // mac address buffer.
       
    89     iBuffer[KDhcpHardwareAddressLengthPos] = KDhcpHardwareAddressLength;
       
    90     iBuffer[KDhcpHopsRelayPos] = KDhcpHopsRelayInform;
       
    91 
       
    92     BigEndian::Put32(&(iBuffer[KDhcpTransActionIdPos]), TUint32 (iXid));
       
    93 
       
    94     // Set secs and flags fields to the buffer.
       
    95     TUint16 secsAndFlagsValue = 0;      // 0 in flags = no broadcast
       
    96     BigEndian::Put16(&(iBuffer[KDhcpSecsPos]), TUint16 (secsAndFlagsValue));
       
    97     BigEndian::Put16(&(iBuffer[KDhcpFlagsPos]), TUint16 (secsAndFlagsValue));
       
    98 
       
    99     // Local ip address
       
   100     BigEndian::Put32(&(iBuffer[KDhcpCiAddrPos]), TUint32 (aLocalIp));
       
   101     TUint32 xiAddrValue = 0x00;
       
   102     BigEndian::Put32(&(iBuffer[KDhcpYiAddrPos]), TUint32 (xiAddrValue));
       
   103     BigEndian::Put32(&(iBuffer[KDhcpSiAddrPos]), TUint32 (xiAddrValue));
       
   104     BigEndian::Put32(&(iBuffer[KDhcpGiAddrPos]), TUint32 (xiAddrValue));
       
   105 
       
   106     // wlan mac address
       
   107     TBuf8<KDhcpChAddressLength>  chAddress (KNullDesC8);
       
   108     chAddress.Copy (aMacAddr.Left(KDhcpChAddressLength));
       
   109     if (chAddress.Length()<KDhcpChAddressLength)
       
   110         {
       
   111         // If given mac address is less max of field,
       
   112         // we have make sure that rest of bytes
       
   113         // are filled as zero-byte.
       
   114         TInt oldLength = chAddress.Length();
       
   115         chAddress.SetLength(KDhcpChAddressLength);
       
   116         for (TInt ii = oldLength; ii<KDhcpChAddressLength;ii++)
       
   117             {
       
   118             chAddress[ii] = 0x00;
       
   119             }
       
   120         }
       
   121 
       
   122     Append(chAddress);
       
   123 
       
   124     TBuf8<KDhcpFileBufferLength> fileBuffer(KNullDesC8);
       
   125     // sname
       
   126     fileBuffer.SetLength(KDhcpSnameLength);
       
   127     fileBuffer.FillZ();
       
   128     Append(fileBuffer);
       
   129 
       
   130     // file
       
   131     fileBuffer.SetLength(KDhcpFileBufferLength);
       
   132     fileBuffer.FillZ();
       
   133     Append(fileBuffer);
       
   134 
       
   135     // magic cookie
       
   136     TPtrC8 ptr (KDhcpMagicCookie, sizeof(KDhcpMagicCookie));
       
   137     Append(ptr);
       
   138 
       
   139     // And add all rest parts to the request message
       
   140     TPtrC8 ptrInform (KDhcpDhcpMsgInform, sizeof(KDhcpDhcpMsgInform));
       
   141     Append(ptrInform);
       
   142 
       
   143     TPtrC8 ptrRequestList (KDhcpDhcpParameterRequestList, sizeof(KDhcpDhcpParameterRequestList));
       
   144     Append(ptrRequestList);
       
   145 
       
   146     TPtrC8 ptrGeoOptionParams (KDhcpGeoOptionParams, sizeof(KDhcpGeoOptionParams));
       
   147     Append(ptrGeoOptionParams);
       
   148 
       
   149     TPtrC8 ptrMessageSize (KDhcpMessageSize, sizeof(KDhcpMessageSize));
       
   150     Append(ptrMessageSize);
       
   151 
       
   152     TPtrC8 ptrMsgSize (KDhcpEndOfMessage, sizeof(KDhcpEndOfMessage));
       
   153     Append(ptrMsgSize);
       
   154 
       
   155     TInt length = Length();
       
   156     SetLength(KDhcpPacketLength);
       
   157 
       
   158     // Ok, rest of bytes shall be zero.
       
   159     TPtr8 ptrMakeZeroBytes(&iBuffer[length],KDhcpPacketLength - length);
       
   160     ptrMakeZeroBytes.FillZ();
       
   161     }
       
   162 
       
   163 // ---------------------------------------------------------------------------
       
   164 // Generate a random transaction id
       
   165 // ---------------------------------------------------------------------------
       
   166 //
       
   167 void TDhcpLocationRequestPacket::RandomiseXid ()
       
   168     {
       
   169     TRACESTRING( "TDhcpLocationRequestPacket::RandomiseXid" );
       
   170     TTime time;
       
   171     time.HomeTime();
       
   172     TInt64 seed = time.Int64();
       
   173     TUint random = Math::Rand( seed );
       
   174     iXid = random % KMaxTUint;
       
   175     TRACESTRING2( "TDhcpLocationRequestPacket::RandomiseXid, iXid %u" ,iXid );
       
   176     }