1/** @file
2  Support routines for PxeBc.
3
4Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
5This program and the accompanying materials
6are licensed and made available under the terms and conditions of the BSD License
7which accompanies this distribution.  The full text of the license may be found at
8http://opensource.org/licenses/bsd-license.php
9
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11WITHOUT 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**/
26VOID
27EFIAPI
28PxeBcCommonNotify (
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**/
62EFI_STATUS
63PxeBcConfigureUdpWriteInstance (
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**/
122VOID
123CvtNum (
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**/
150UINTN
151UtoA10 (
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**/
183UINT64
184AtoU64 (
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