NULL\r
);\r
} else if (IsListEmpty (&Udp6Service->ChildrenList)) {\r
- gBS->UninstallMultipleProtocolInterfaces (\r
- NicHandle,\r
- &gEfiUdp6ServiceBindingProtocolGuid,\r
- &Udp6Service->ServiceBinding,\r
- NULL\r
- );\r
+ Status = gBS->UninstallMultipleProtocolInterfaces (\r
+ NicHandle,\r
+ &gEfiUdp6ServiceBindingProtocolGuid,\r
+ &Udp6Service->ServiceBinding,\r
+ NULL\r
+ );\r
\r
Udp6CleanService (Udp6Service);\r
-\r
FreePool (Udp6Service);\r
-\r
- Status = EFI_SUCCESS;\r
}\r
\r
return Status;\r
//\r
// Close the Ip6 protocol on the default IpIo.\r
//\r
- gBS->CloseProtocol (\r
- Udp6Service->IpIo->ChildHandle,\r
- &gEfiIp6ProtocolGuid,\r
- gUdp6DriverBinding.DriverBindingHandle,\r
- Instance->ChildHandle\r
- );\r
+ Status = gBS->CloseProtocol (\r
+ Udp6Service->IpIo->ChildHandle,\r
+ &gEfiIp6ProtocolGuid,\r
+ gUdp6DriverBinding.DriverBindingHandle,\r
+ Instance->ChildHandle\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Instance->InDestroy = FALSE;\r
+ return Status;\r
+ }\r
+\r
//\r
// Close the Ip6 protocol on this instance's IpInfo.\r
//\r
- gBS->CloseProtocol (\r
- Instance->IpInfo->ChildHandle,\r
- &gEfiIp6ProtocolGuid,\r
- gUdp6DriverBinding.DriverBindingHandle,\r
- Instance->ChildHandle\r
- );\r
+ Status = gBS->CloseProtocol (\r
+ Instance->IpInfo->ChildHandle,\r
+ &gEfiIp6ProtocolGuid,\r
+ gUdp6DriverBinding.DriverBindingHandle,\r
+ Instance->ChildHandle\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Instance->InDestroy = FALSE;\r
+ return Status;\r
+ }\r
\r
//\r
// Uninstall the Udp6Protocol previously installed on the ChildHandle.\r
interface. It's called to signal the udp TxToken when the IpIo layer completes\r
transmitting of the udp datagram.\r
\r
+ If Context is NULL, then ASSERT().\r
+ If NotifyData is NULL, then ASSERT().\r
+\r
@param[in] Status The completion status of the output udp datagram.\r
@param[in] Context Pointer to the context data.\r
@param[in] Sender Specify a EFI_IP6_PROTOCOL for sending.\r
/**\r
This function processes the received datagram passed up by the IpIo layer.\r
\r
+ If NetSession is NULL, then ASSERT().\r
+ If Packet is NULL, then ASSERT().\r
+ If Context is NULL, then ASSERT().\r
+\r
@param[in] Status The status of this udp datagram.\r
@param[in] IcmpError The IcmpError code, only available when Status is\r
EFI_ICMP_ERROR.\r
interface. It's called to signal the udp TxToken when IpIo layer completes the\r
transmitting of the udp datagram.\r
\r
+ If Context is NULL, then ASSERT().\r
+ If NotifyData is NULL, then ASSERT().\r
+\r
@param[in] Status The completion status of the output udp datagram.\r
@param[in] Context Pointer to the context data.\r
@param[in] Sender Specify a EFI_IP6_PROTOCOL for sending.\r
UDP6_INSTANCE_DATA *Instance;\r
EFI_UDP6_COMPLETION_TOKEN *Token;\r
\r
+ ASSERT (Context != NULL && NotifyData != NULL);\r
+\r
Instance = (UDP6_INSTANCE_DATA *) Context;\r
Token = (EFI_UDP6_COMPLETION_TOKEN *) NotifyData;\r
\r
/**\r
This function processes the received datagram passed up by the IpIo layer.\r
\r
+ If NetSession is NULL, then ASSERT().\r
+ If Packet is NULL, then ASSERT().\r
+ If Context is NULL, then ASSERT().\r
+\r
@param[in] Status The status of this udp datagram.\r
@param[in] IcmpError The IcmpError code, only available when Status is\r
EFI_ICMP_ERROR.\r
IN VOID *Context\r
)\r
{\r
+ ASSERT (NetSession != NULL && Packet != NULL && Context != NULL);\r
NET_CHECK_SIGNATURE (Packet, NET_BUF_SIGNATURE);\r
\r
//\r
Status = NetMapInsertTail (&Instance->McastIps, (VOID *) McastIp, NULL);\r
} else {\r
\r
- NetMapIterate (&Instance->McastIps, Udp6LeaveGroup, MulticastAddress);\r
+ Status = NetMapIterate (&Instance->McastIps, Udp6LeaveGroup, MulticastAddress);\r
}\r
\r
ON_EXIT:\r