Home | History | Annotate | Download | only in UefiPxeBcDxe
      1 /** @file
      2   Support routines for PxeBc.
      3 
      4 Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 
     16 #include "PxeBcImpl.h"
     17 
     18 
     19 /**
     20   The common notify function associated with various PxeBc events.
     21 
     22   @param  Event     The event signaled.
     23   @param  Context   The context.
     24 
     25 **/
     26 VOID
     27 EFIAPI
     28 PxeBcCommonNotify (
     29   IN EFI_EVENT           Event,
     30   IN VOID                *Context
     31   )
     32 {
     33   *((BOOLEAN *) Context) = TRUE;
     34 }
     35 
     36 
     37 /**
     38   This function initialize(or configure) the Udp4Write instance.
     39 
     40   @param  Udp4       Pointer to the EFI_UDP4_PROTOCOL instance.
     41   @param  StationIp  Pointer to the station ip address.
     42   @param  SubnetMask Pointer to the subnetmask of the station ip address.
     43   @param  Gateway    Pointer to the gateway ip address.
     44   @param  SrcPort    Pointer to the srouce port of the station.
     45 
     46   @retval EFI_SUCCESS           The configuration settings were set, changed, or reset successfully.
     47   @retval EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP,
     48                                 RARP, etc.) is not finished yet.
     49   @retval EFI_INVALID_PARAMETER One or more following conditions are TRUE:
     50   @retval EFI_ALREADY_STARTED   The EFI UDPv4 Protocol instance is already started/configured
     51                                 and must be stopped/reset before it can be reconfigured.
     52   @retval EFI_ACCESS_DENIED     UdpConfigData. AllowDuplicatePort is FALSE
     53                                 and UdpConfigData.StationPort is already used by
     54                                 other instance.
     55   @retval EFI_OUT_OF_RESOURCES  The EFI UDPv4 Protocol driver cannot allocate memory for this
     56                                 EFI UDPv4 Protocol instance.
     57   @retval EFI_DEVICE_ERROR      An unexpected network or system error occurred and this instance
     58                                 was not opened.
     59   @retval Others                Please examine the function Udp4->Routes(Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns.
     60 
     61 **/
     62 EFI_STATUS
     63 PxeBcConfigureUdpWriteInstance (
     64   IN EFI_UDP4_PROTOCOL  *Udp4,
     65   IN EFI_IPv4_ADDRESS   *StationIp,
     66   IN EFI_IPv4_ADDRESS   *SubnetMask,
     67   IN EFI_IPv4_ADDRESS   *Gateway,
     68   IN OUT UINT16         *SrcPort
     69   )
     70 {
     71   EFI_UDP4_CONFIG_DATA  Udp4CfgData;
     72   EFI_STATUS            Status;
     73 
     74   ZeroMem (&Udp4CfgData, sizeof (Udp4CfgData));
     75 
     76   Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;
     77   Udp4CfgData.TypeOfService  = DEFAULT_ToS;
     78   Udp4CfgData.TimeToLive     = DEFAULT_TTL;
     79   Udp4CfgData.AllowDuplicatePort = TRUE;
     80 
     81   CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp));
     82   CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof (*SubnetMask));
     83 
     84   Udp4CfgData.StationPort    = *SrcPort;
     85 
     86   //
     87   // Reset the instance.
     88   //
     89   Udp4->Configure (Udp4, NULL);
     90 
     91   Status = Udp4->Configure (Udp4, &Udp4CfgData);
     92   if (!EFI_ERROR (Status) && (Gateway->Addr[0] != 0)) {
     93     //
     94     // basic configuration OK, need to add the default route entry
     95     //
     96     Status = Udp4->Routes (Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway);
     97     if (EFI_ERROR (Status)) {
     98       //
     99       // roll back
    100       //
    101       Udp4->Configure (Udp4, NULL);
    102     }
    103   }
    104 
    105   if (!EFI_ERROR (Status) && (*SrcPort == 0)) {
    106     Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL);
    107     *SrcPort = Udp4CfgData.StationPort;
    108   }
    109 
    110   return Status;
    111 }
    112 
    113 
    114 /**
    115   Convert number to ASCII value.
    116 
    117   @param  Number              Numeric value to convert to decimal ASCII value.
    118   @param  Buffer              Buffer to place ASCII version of the Number.
    119   @param  Length              Length of Buffer.
    120 
    121 **/
    122 VOID
    123 CvtNum (
    124   IN UINTN  Number,
    125   IN UINT8  *Buffer,
    126   IN UINTN   Length
    127   )
    128 {
    129   UINTN Remainder;
    130 
    131   while (Length > 0) {
    132     Remainder = Number % 10;
    133     Number /= 10;
    134     Length--;
    135     Buffer[Length] = (UINT8) ('0' + Remainder);
    136   }
    137 }
    138 
    139 
    140 /**
    141   Convert unsigned int number to decimal number.
    142 
    143   @param      Number         The unsigned int number will be converted.
    144   @param      Buffer         Pointer to the buffer to store the decimal number after transform.
    145   @param[in]  BufferSize     The maxsize of the buffer.
    146 
    147   @return the length of the number after transform.
    148 
    149 **/
    150 UINTN
    151 UtoA10 (
    152   IN UINTN Number,
    153   IN CHAR8 *Buffer,
    154   IN UINTN BufferSize
    155   )
    156 {
    157   UINTN Index;
    158   CHAR8 TempStr[64];
    159 
    160   Index           = 63;
    161   TempStr[Index]  = 0;
    162 
    163   do {
    164     Index--;
    165     TempStr[Index]  = (CHAR8) ('0' + (Number % 10));
    166     Number          = Number / 10;
    167   } while (Number != 0);
    168 
    169   AsciiStrCpyS (Buffer, BufferSize, &TempStr[Index]);
    170 
    171   return AsciiStrLen (Buffer);
    172 }
    173 
    174 
    175 /**
    176   Convert ASCII numeric string to a UINTN value.
    177 
    178   @param  Buffer  Pointer to the 8-byte unsigned int value.
    179 
    180   @return UINTN value of the ASCII string.
    181 
    182 **/
    183 UINT64
    184 AtoU64 (
    185   IN UINT8 *Buffer
    186   )
    187 {
    188   UINT64  Value;
    189   UINT8   Character;
    190 
    191   Value = 0;
    192   while ((Character = *Buffer++) != '\0') {
    193     Value = MultU64x32 (Value, 10) + (Character - '0');
    194   }
    195 
    196   return Value;
    197 }
    198 
    199