]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c
BaseTools:Change the path of the file that Binary Cache
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Udp4Dxe / Udp4Driver.c
index 7b47ef44a92a8bf84c6b8daa530114c0c62e30f7..63b103b8efcc57c5ac8b8333fac6a42a3c56718f 100644 (file)
@@ -1,20 +1,7 @@
 /** @file\r
 \r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-\r
-  Udp4Driver.c\r
-\r
-Abstract:\r
-\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -35,17 +22,61 @@ EFI_SERVICE_BINDING_PROTOCOL mUdp4ServiceBinding = {
   Udp4ServiceBindingDestroyChild\r
 };\r
 \r
-\r
 /**\r
-  Test to see if this driver supports ControllerHandle.\r
+  Callback function which provided by user to remove one node in NetDestroyLinkList process.\r
+\r
+  @param[in]    Entry           The entry to be removed.\r
+  @param[in]    Context         Pointer to the callback context corresponds to the Context in NetDestroyLinkList.\r
+\r
+  @retval EFI_SUCCESS           The entry has been removed successfully.\r
+  @retval Others                Fail to remove the entry.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+Udp4DestroyChildEntryInHandleBuffer (\r
+  IN LIST_ENTRY         *Entry,\r
+  IN VOID               *Context\r
+  )\r
+{\r
+  UDP4_INSTANCE_DATA            *Instance;\r
+  EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;\r
+  UINTN                         NumberOfChildren;\r
+  EFI_HANDLE                    *ChildHandleBuffer;\r
 \r
-  @param  This                   Protocol instance pointer.\r
-  @param  ControllerHandle       Handle of device to test.\r
-  @param  RemainingDevicePath    Optional parameter use to pick a specific child\r
-                                 device to start.\r
+  if (Entry == NULL || Context == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Instance = NET_LIST_USER_STRUCT_S (Entry, UDP4_INSTANCE_DATA, Link, UDP4_INSTANCE_DATA_SIGNATURE);\r
+  ServiceBinding    = ((UDP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding;\r
+  NumberOfChildren  = ((UDP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren;\r
+  ChildHandleBuffer = ((UDP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer;\r
 \r
-  @retval EFI_SUCCES             This driver supports this device.\r
-  @retval EFI_ALREADY_STARTED    This driver is already running on this device.\r
+  if (!NetIsInHandleBuffer (Instance->ChildHandle, NumberOfChildren, ChildHandleBuffer)) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  return ServiceBinding->DestroyChild (ServiceBinding, Instance->ChildHandle);\r
+}\r
+\r
+\r
+/**\r
+  Test to see if this driver supports ControllerHandle. This service\r
+  is called by the EFI boot service ConnectController(). In\r
+  order to make drivers as small as possible, there are a few calling\r
+  restrictions for this service. ConnectController() must\r
+  follow these calling restrictions. If any other agent wishes to call\r
+  Supported() it must also follow these calling restrictions.\r
+\r
+  @param[in]  This                Protocol instance pointer.\r
+  @param[in]  ControllerHandle    Handle of device to test\r
+  @param[in]  RemainingDevicePath Optional parameter use to pick a specific child\r
+                                  device to start.\r
+\r
+  @retval EFI_SUCCESS         This driver supports this device\r
+  @retval EFI_ALREADY_STARTED This driver is already running on this device\r
+  @retval other               This driver does not support this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -90,16 +121,21 @@ Udp4DriverBindingSupported (
 \r
 \r
 /**\r
-  Start this driver on ControllerHandle.\r
-\r
-  @param  This                   Protocol instance pointer.\r
-  @param  ControllerHandle       Handle of device to bind driver to\r
-  @param  RemainingDevicePath    Optional parameter use to pick a specific child\r
-                                 device to start.\r
-\r
-  @retval EFI_SUCCES             This driver is added to ControllerHandle\r
-  @retval EFI_ALREADY_STARTED    This driver is already running on ControllerHandle\r
-  @retval other                  This driver does not support this device\r
+  Start this driver on ControllerHandle. This service is called by the\r
+  EFI boot service ConnectController(). In order to make\r
+  drivers as small as possible, there are a few calling restrictions for\r
+  this service. ConnectController() must follow these\r
+  calling restrictions. If any other agent wishes to call Start() it\r
+  must also follow these calling restrictions.\r
+\r
+  @param[in]  This                 Protocol instance pointer.\r
+  @param[in]  ControllerHandle     Handle of device to bind driver to\r
+  @param[in]  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                                   device to start.\r
+\r
+  @retval EFI_SUCCESS          This driver is added to ControllerHandle\r
+  @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle\r
+  @retval other                This driver does not support this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -116,14 +152,15 @@ Udp4DriverBindingStart (
   //\r
   // Allocate Private Context Data Structure.\r
   //\r
-  Udp4Service = NetAllocatePool (sizeof (UDP4_SERVICE_DATA));\r
+  Udp4Service = AllocatePool (sizeof (UDP4_SERVICE_DATA));\r
   if (Udp4Service == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   Status = Udp4CreateService (Udp4Service, This->DriverBindingHandle, ControllerHandle);\r
   if (EFI_ERROR (Status)) {\r
-    goto FREE_SERVICE;\r
+    FreePool (Udp4Service);\r
+    return Status;\r
   }\r
 \r
   //\r
@@ -136,36 +173,30 @@ Udp4DriverBindingStart (
                   NULL\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    goto CLEAN_SERVICE;\r
+    Udp4CleanService (Udp4Service);\r
+    FreePool (Udp4Service);\r
   }\r
 \r
-  Udp4SetVariableData (Udp4Service);\r
-\r
-  return Status;\r
-\r
-CLEAN_SERVICE:\r
-\r
-  Udp4CleanService (Udp4Service);\r
-\r
-FREE_SERVICE:\r
-\r
-  NetFreePool (Udp4Service);\r
-\r
   return Status;\r
 }\r
 \r
 \r
 /**\r
-  Stop this driver on ControllerHandle.\r
-\r
-  @param  This                   Protocol instance pointer.\r
-  @param  ControllerHandle       Handle of device to stop driver on\r
-  @param  NumberOfChildren       Number of Handles in ChildHandleBuffer. If number\r
-                                 of  children is zero stop the entire bus driver.\r
-  @param  ChildHandleBuffer      List of Child Handles to Stop.\r
-\r
-  @retval EFI_SUCCES             This driver is removed ControllerHandle.\r
-  @retval other                  This driver was not removed from this device.\r
+  Stop this driver on ControllerHandle. This service is called by the\r
+  EFI boot service DisconnectController(). In order to\r
+  make drivers as small as possible, there are a few calling\r
+  restrictions for this service. DisconnectController()\r
+  must follow these calling restrictions. If any other agent wishes\r
+  to call Stop() it must also follow these calling restrictions.\r
+\r
+  @param[in]  This              Protocol instance pointer.\r
+  @param[in]  ControllerHandle  Handle of device to stop driver on\r
+  @param[in]  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                                children is zero stop the entire bus driver.\r
+  @param[in]  ChildHandleBuffer List of Child Handles to Stop.\r
+\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -177,11 +208,12 @@ Udp4DriverBindingStop (
   IN  EFI_HANDLE                   *ChildHandleBuffer\r
   )\r
 {\r
-  EFI_STATUS                    Status;\r
-  EFI_HANDLE                    NicHandle;\r
-  EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;\r
-  UDP4_SERVICE_DATA             *Udp4Service;\r
-  UDP4_INSTANCE_DATA            *Instance;\r
+  EFI_STATUS                                Status;\r
+  EFI_HANDLE                                NicHandle;\r
+  EFI_SERVICE_BINDING_PROTOCOL              *ServiceBinding;\r
+  UDP4_SERVICE_DATA                         *Udp4Service;\r
+  UDP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT  Context;\r
+  LIST_ENTRY                                *List;\r
 \r
   //\r
   // Find the NicHandle where UDP4 ServiceBinding Protocol is installed.\r
@@ -207,52 +239,58 @@ Udp4DriverBindingStop (
   }\r
 \r
   Udp4Service = UDP4_SERVICE_DATA_FROM_THIS (ServiceBinding);\r
-\r
-  //\r
-  // Uninstall the UDP4 ServiceBinding Protocol.\r
-  //\r
-  Status = gBS->UninstallMultipleProtocolInterfaces (\r
-                  NicHandle,\r
-                  &gEfiUdp4ServiceBindingProtocolGuid,\r
-                  &Udp4Service->ServiceBinding,\r
-                  NULL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  while (!NetListIsEmpty (&Udp4Service->ChildrenList)) {\r
+  if (NumberOfChildren != 0) {\r
     //\r
-    // Destroy all instances.\r
+    // NumberOfChildren is not zero, destroy the children instances in ChildHandleBuffer.\r
     //\r
-    Instance = NET_LIST_HEAD (&Udp4Service->ChildrenList, UDP4_INSTANCE_DATA, Link);\r
-\r
-    ServiceBinding->DestroyChild (ServiceBinding, Instance->ChildHandle);\r
+    List = &Udp4Service->ChildrenList;\r
+    Context.ServiceBinding    = ServiceBinding;\r
+    Context.NumberOfChildren  = NumberOfChildren;\r
+    Context.ChildHandleBuffer = ChildHandleBuffer;\r
+    Status = NetDestroyLinkList (\r
+               List,\r
+               Udp4DestroyChildEntryInHandleBuffer,\r
+               &Context,\r
+               NULL\r
+               );\r
+  } else {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           NicHandle,\r
+           &gEfiUdp4ServiceBindingProtocolGuid,\r
+           &Udp4Service->ServiceBinding,\r
+           NULL\r
+           );\r
+\r
+    Udp4CleanService (Udp4Service);\r
+\r
+    if (gUdpControllerNameTable != NULL) {\r
+      FreeUnicodeStringTable (gUdpControllerNameTable);\r
+      gUdpControllerNameTable = NULL;\r
+    }\r
+    FreePool (Udp4Service);\r
   }\r
 \r
-  Udp4ClearVariableData (Udp4Service);\r
-\r
-  Udp4CleanService (Udp4Service);\r
-\r
-  NetFreePool (Udp4Service);\r
-\r
-  return EFI_SUCCESS;\r
+  return Status;\r
 }\r
 \r
 \r
 /**\r
-  Creates a child handle with a set of I/O services.\r
+  Creates a child handle and installs a protocol.\r
 \r
-  @param  This                   Protocol instance pointer.\r
-  @param  ChildHandle            Pointer to the handle of the child to create.   If\r
-                                 it is NULL, then a new handle is created.   If it\r
-                                 is not NULL, then the I/O services are  added to\r
-                                 the existing child handle.\r
+  The CreateChild() function installs a protocol on ChildHandle.\r
+  If ChildHandle is a pointer to NULL, then a new handle is created and returned in ChildHandle.\r
+  If ChildHandle is not a pointer to NULL, then the protocol installs on the existing ChildHandle.\r
 \r
-  @retval EFI_SUCCES             The child handle was created with the I/O services\r
-  @retval EFI_OUT_OF_RESOURCES   There are not enough resources availabe to create\r
-                                 the child\r
-  @retval other                  The child handle was not created\r
+  @param[in] This        Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.\r
+  @param[in] ChildHandle Pointer to the handle of the child to create. If it is NULL,\r
+                         then a new handle is created. If it is a pointer to an existing UEFI handle,\r
+                         then the protocol is added to the existing UEFI handle.\r
+\r
+  @retval EFI_SUCCES            The protocol was added to ChildHandle.\r
+  @retval EFI_INVALID_PARAMETER ChildHandle is NULL.\r
+  @retval EFI_OUT_OF_RESOURCES  There are not enough resources available to create\r
+                                the child\r
+  @retval other                 The child handle was not created\r
 \r
 **/\r
 EFI_STATUS\r
@@ -277,7 +315,7 @@ Udp4ServiceBindingCreateChild (
   //\r
   // Allocate the instance private data structure.\r
   //\r
-  Instance = NetAllocatePool (sizeof (UDP4_INSTANCE_DATA));\r
+  Instance = AllocateZeroPool (sizeof (UDP4_INSTANCE_DATA));\r
   if (Instance == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -290,7 +328,7 @@ Udp4ServiceBindingCreateChild (
   Instance->IpInfo = IpIoAddIp (Udp4Service->IpIo);\r
   if (Instance->IpInfo == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto FREE_INSTANCE;\r
+    goto ON_ERROR;\r
   }\r
 \r
   //\r
@@ -303,7 +341,7 @@ Udp4ServiceBindingCreateChild (
                   NULL\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    goto REMOVE_IPINFO;\r
+    goto ON_ERROR;\r
   }\r
 \r
   Instance->ChildHandle = *ChildHandle;\r
@@ -320,58 +358,75 @@ Udp4ServiceBindingCreateChild (
                   EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    goto UNINSTALL_PROTOCOL;\r
+    goto ON_ERROR;\r
+  }\r
+\r
+  //\r
+  // Open this instance's Ip4 protocol in the IpInfo BY_CHILD.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Instance->IpInfo->ChildHandle,\r
+                  &gEfiIp4ProtocolGuid,\r
+                  (VOID **) &Ip4,\r
+                  gUdp4DriverBinding.DriverBindingHandle,\r
+                  Instance->ChildHandle,\r
+                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ON_ERROR;\r
   }\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
   //\r
   // Link this instance into the service context data and increase the ChildrenNumber.\r
   //\r
-  NetListInsertTail (&Udp4Service->ChildrenList, &Instance->Link);\r
+  InsertTailList (&Udp4Service->ChildrenList, &Instance->Link);\r
   Udp4Service->ChildrenNumber++;\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
-  return Status;\r
-\r
-UNINSTALL_PROTOCOL:\r
-\r
-  gBS->UninstallMultipleProtocolInterfaces (\r
-         Instance->ChildHandle,\r
-         &gEfiUdp4ProtocolGuid,\r
-         &Instance->Udp4Proto,\r
-         NULL\r
-         );\r
+  return EFI_SUCCESS;\r
 \r
-REMOVE_IPINFO:\r
+ON_ERROR:\r
 \r
-  IpIoRemoveIp (Udp4Service->IpIo, Instance->IpInfo);\r
+  if (Instance->ChildHandle != NULL) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           Instance->ChildHandle,\r
+           &gEfiUdp4ProtocolGuid,\r
+           &Instance->Udp4Proto,\r
+           NULL\r
+           );\r
+  }\r
 \r
-FREE_INSTANCE:\r
+  if (Instance->IpInfo != NULL) {\r
+    IpIoRemoveIp (Udp4Service->IpIo, Instance->IpInfo);\r
+  }\r
 \r
   Udp4CleanInstance (Instance);\r
 \r
-  NetFreePool (Instance);\r
+  FreePool (Instance);\r
 \r
   return Status;\r
 }\r
 \r
 \r
 /**\r
-  Destroys a child handle with a set of I/O services.\r
+  Destroys a child handle with a protocol installed on it.\r
 \r
-  @param  This                   Protocol instance pointer.\r
-  @param  ChildHandle            Handle of the child to destroy\r
+  The DestroyChild() function does the opposite of CreateChild(). It removes a protocol\r
+  that was installed by CreateChild() from ChildHandle. If the removed protocol is the\r
+  last protocol on ChildHandle, then ChildHandle is destroyed.\r
 \r
-  @retval EFI_SUCCES             The I/O services were removed from the child\r
-                                 handle\r
-  @retval EFI_UNSUPPORTED        The child handle does not support the I/O services\r
-                                  that are being removed\r
-  @retval EFI_INVALID_PARAMETER  Child handle is not a valid EFI Handle.\r
-  @retval EFI_ACCESS_DENIED      The child handle could not be destroyed because\r
-                                 its  I/O services are being used.\r
-  @retval other                  The child handle was not destroyed\r
+  @param[in] This        Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.\r
+  @param[in] ChildHandle Handle of the child to destroy\r
+\r
+  @retval EFI_SUCCES            The protocol was removed from ChildHandle.\r
+  @retval EFI_UNSUPPORTED       ChildHandle does not support the protocol that is being removed.\r
+  @retval EFI_INVALID_PARAMETER Child handle is NULL.\r
+  @retval EFI_ACCESS_DENIED     The protocol could not be removed from the ChildHandle\r
+                                because its services are being used.\r
+  @retval other                 The child handle was not destroyed\r
 \r
 **/\r
 EFI_STATUS\r
@@ -410,14 +465,14 @@ Udp4ServiceBindingDestroyChild (
 \r
   Instance = UDP4_INSTANCE_DATA_FROM_THIS (Udp4Proto);\r
 \r
-  if (Instance->Destroyed) {\r
+  if (Instance->InDestroy) {\r
     return EFI_SUCCESS;\r
   }\r
 \r
   //\r
   // Use the Destroyed flag to avoid the re-entering of the following code.\r
   //\r
-  Instance->Destroyed = TRUE;\r
+  Instance->InDestroy = TRUE;\r
 \r
   //\r
   // Close the Ip4 protocol.\r
@@ -428,6 +483,15 @@ Udp4ServiceBindingDestroyChild (
          gUdp4DriverBinding.DriverBindingHandle,\r
          Instance->ChildHandle\r
          );\r
+  //\r
+  // Close the Ip4 protocol on this instance's IpInfo.\r
+  //\r
+  gBS->CloseProtocol (\r
+         Instance->IpInfo->ChildHandle,\r
+         &gEfiIp4ProtocolGuid,\r
+         gUdp4DriverBinding.DriverBindingHandle,\r
+         Instance->ChildHandle\r
+         );\r
 \r
   //\r
   // Uninstall the Udp4Protocol previously installed on the ChildHandle.\r
@@ -439,7 +503,7 @@ Udp4ServiceBindingDestroyChild (
                   NULL\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    Instance->Destroyed = FALSE;\r
+    Instance->InDestroy = FALSE;\r
     return Status;\r
   }\r
 \r
@@ -453,12 +517,12 @@ Udp4ServiceBindingDestroyChild (
   //\r
   IpIoRemoveIp (Udp4Service->IpIo, Instance->IpInfo);\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
   //\r
   // Remove this instance from the service context data's ChildrenList.\r
   //\r
-  NetListRemoveEntry (&Instance->Link);\r
+  RemoveEntryList (&Instance->Link);\r
   Udp4Service->ChildrenNumber--;\r
 \r
   //\r
@@ -466,59 +530,53 @@ Udp4ServiceBindingDestroyChild (
   //\r
   Udp4CleanInstance (Instance);\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
-  NetFreePool (Instance);\r
+  FreePool (Instance);\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-//@MT: EFI_DRIVER_ENTRY_POINT (Udp4DriverEntryPoint)\r
+/**\r
+  This is the declaration of an EFI image entry point. This entry point is\r
+  the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including\r
+  both device drivers and bus drivers.\r
+\r
+  The entry point for Udp4 driver which installs the driver binding\r
+  and component name protocol on its ImageHandle.\r
+\r
+  @param[in] ImageHandle           The firmware allocated handle for the UEFI image.\r
+  @param[in] SystemTable           A pointer to the EFI System Table.\r
 \r
+  @retval EFI_SUCCESS           The operation completed successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 Udp4DriverEntryPoint (\r
   IN EFI_HANDLE        ImageHandle,\r
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  The entry point for Udp4 driver which installs the driver binding\r
-  and component name protocol on its ImageHandle.\r
-\r
-Arguments:\r
-\r
-  ImageHandle - The image handle of the driver.\r
-  SystemTable - The system table.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS - if the driver binding and component name protocols are\r
-                successfully installed, otherwise if failed.\r
-\r
---*/\r
 {\r
   EFI_STATUS  Status;\r
 \r
   //\r
   // Install the Udp4DriverBinding and Udp4ComponentName protocols.\r
   //\r
-  Status = NetLibInstallAllDriverProtocols (\r
+  Status = EfiLibInstallDriverBindingComponentName2 (\r
              ImageHandle,\r
              SystemTable,\r
              &gUdp4DriverBinding,\r
              ImageHandle,\r
              &gUdp4ComponentName,\r
-             NULL,\r
-             NULL\r
+             &gUdp4ComponentName2\r
              );\r
   if (!EFI_ERROR (Status)) {\r
     //\r
     // Initialize the UDP random port.\r
     //\r
-    mUdp4RandomPort = ((UINT16) NetRandomInitSeed ()) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN;\r
+    mUdp4RandomPort = (UINT16) (((UINT16) NetRandomInitSeed ()) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN);\r
   }\r
 \r
   return Status;\r