+/**\r
+ Assigns an IPv4 address and subnet mask to this EFI IPv4 Protocol driver instance.\r
+\r
+ The Configure() function is used to set, change, or reset the operational\r
+ parameters and filter settings for this EFI IPv4 Protocol instance. Until these\r
+ parameters have been set, no network traffic can be sent or received by this\r
+ instance. Once the parameters have been reset (by calling this function with\r
+ IpConfigData set to NULL), no more traffic can be sent or received until these\r
+ parameters have been set again. Each EFI IPv4 Protocol instance can be started\r
+ and stopped independently of each other by enabling or disabling their receive\r
+ filter settings with the Configure() function.\r
+\r
+ When IpConfigData.UseDefaultAddress is set to FALSE, the new station address will\r
+ be appended as an alias address into the addresses list in the EFI IPv4 Protocol\r
+ driver. While set to TRUE, Configure() will trigger the EFI_IP4_CONFIG_PROTOCOL\r
+ to retrieve the default IPv4 address if it is not available yet. Clients could\r
+ frequently call GetModeData() to check the status to ensure that the default IPv4\r
+ address is ready.\r
+\r
+ If operational parameters are reset or changed, any pending transmit and receive\r
+ requests will be cancelled. Their completion token status will be set to EFI_ABORTED\r
+ and their events will be signaled.\r
+\r
+ @param[in] This Pointer to the EFI_IP4_PROTOCOL instance.\r
+ @param[in] IpConfigData Pointer to the EFI IPv4 Protocol configuration data structure.\r
+\r
+ @retval EFI_SUCCESS The driver instance was successfully opened.\r
+ @retval EFI_NO_MAPPING When using the default address, configuration (DHCP, BOOTP,\r
+ RARP, etc.) is not finished yet.\r
+ @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
+ @retval EFI_UNSUPPORTED One or more of the following conditions is TRUE:\r
+ A configuration protocol (DHCP, BOOTP, RARP, etc.) could\r
+ not be located when clients choose to use the default IPv4\r
+ address. This EFI IPv4 Protocol implementation does not\r
+ support this requested filter or timeout setting.\r
+ @retval EFI_OUT_OF_RESOURCES The EFI IPv4 Protocol driver instance data could not be allocated.\r
+ @retval EFI_ALREADY_STARTED The interface is already open and must be stopped before the\r
+ IPv4 address or subnet mask can be changed. The interface must\r
+ also be stopped when switching to/from raw packet mode.\r
+ @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. The EFI IPv4\r
+ Protocol driver instance is not opened.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiIp4Configure (\r
+ IN EFI_IP4_PROTOCOL *This,\r
+ IN EFI_IP4_CONFIG_DATA *IpConfigData OPTIONAL\r
+ );\r
+\r
+/**\r
+ Joins and leaves multicast groups.\r
+\r
+ The Groups() function is used to join and leave multicast group sessions. Joining\r
+ a group will enable reception of matching multicast packets. Leaving a group will\r
+ disable the multicast packet reception.\r
+\r
+ If JoinFlag is FALSE and GroupAddress is NULL, all joined groups will be left.\r
+\r
+ @param[in] This Pointer to the EFI_IP4_PROTOCOL instance.\r
+ @param[in] JoinFlag Set to TRUE to join the multicast group session and FALSE to leave.\r
+ @param[in] GroupAddress Pointer to the IPv4 multicast address.\r
+\r
+ @retval EFI_SUCCESS The operation completed successfully.\r
+ @retval EFI_INVALID_PARAMETER One or more of the following is TRUE:\r
+ - This is NULL.\r
+ - JoinFlag is TRUE and GroupAddress is NULL.\r
+ - GroupAddress is not NULL and *GroupAddress is\r
+ not a multicast IPv4 address.\r
+ @retval EFI_NOT_STARTED This instance has not been started.\r
+ @retval EFI_NO_MAPPING When using the default address, configuration (DHCP, BOOTP,\r
+ RARP, etc.) is not finished yet.\r
+ @retval EFI_OUT_OF_RESOURCES System resources could not be allocated.\r
+ @retval EFI_UNSUPPORTED This EFI IPv4 Protocol implementation does not support multicast groups.\r
+ @retval EFI_ALREADY_STARTED The group address is already in the group table (when\r
+ JoinFlag is TRUE).\r
+ @retval EFI_NOT_FOUND The group address is not in the group table (when JoinFlag is FALSE).\r
+ @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiIp4Groups (\r
+ IN EFI_IP4_PROTOCOL *This,\r
+ IN BOOLEAN JoinFlag,\r
+ IN EFI_IPv4_ADDRESS *GroupAddress OPTIONAL\r
+ );\r
+\r
+/**\r
+ Adds and deletes routing table entries.\r
+\r
+ The Routes() function adds a route to or deletes a route from the routing table.\r
+\r
+ Routes are determined by comparing the SubnetAddress with the destination IPv4\r
+ address arithmetically AND-ed with the SubnetMask. The gateway address must be\r
+ on the same subnet as the configured station address.\r
+\r
+ The default route is added with SubnetAddress and SubnetMask both set to 0.0.0.0.\r
+ The default route matches all destination IPv4 addresses that do not match any\r
+ other routes.\r
+\r
+ A GatewayAddress that is zero is a nonroute. Packets are sent to the destination\r
+ IP address if it can be found in the ARP cache or on the local subnet. One automatic\r
+ nonroute entry will be inserted into the routing table for outgoing packets that\r
+ are addressed to a local subnet (gateway address of 0.0.0.0).\r
+\r
+ Each EFI IPv4 Protocol instance has its own independent routing table. Those EFI\r
+ IPv4 Protocol instances that use the default IPv4 address will also have copies\r
+ of the routing table that was provided by the EFI_IP4_CONFIG_PROTOCOL, and these\r
+ copies will be updated whenever the EIF IPv4 Protocol driver reconfigures its\r
+ instances. As a result, client modification to the routing table will be lost.\r
+\r
+ @param[in] This Pointer to the EFI_IP4_PROTOCOL instance.\r
+ @param[in] DeleteRoute Set to TRUE to delete this route from the routing table. Set to\r
+ FALSE to add this route to the routing table. SubnetAddress\r
+ and SubnetMask are used as the key to each route entry.\r
+ @param[in] SubnetAddress The address of the subnet that needs to be routed.\r
+ @param[in] SubnetMask The subnet mask of SubnetAddress.\r
+ @param[in] GatewayAddress The unicast gateway IPv4 address for this route.\r
+\r
+ @retval EFI_SUCCESS The operation completed successfully.\r
+ @retval EFI_NOT_STARTED The driver instance has not been started.\r
+ @retval EFI_NO_MAPPING When using the default address, configuration (DHCP, BOOTP,\r
+ RARP, etc.) is not finished yet.\r
+ @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
+ - This is NULL.\r
+ - SubnetAddress is NULL.\r
+ - SubnetMask is NULL.\r
+ - GatewayAddress is NULL.\r
+ - *SubnetAddress is not a valid subnet address.\r
+ - *SubnetMask is not a valid subnet mask.\r
+ - *GatewayAddress is not a valid unicast IPv4 address.\r
+ @retval EFI_OUT_OF_RESOURCES Could not add the entry to the routing table.\r
+ @retval EFI_NOT_FOUND This route is not in the routing table (when DeleteRoute is TRUE).\r
+ @retval EFI_ACCESS_DENIED The route is already defined in the routing table (when\r
+ DeleteRoute is FALSE).\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiIp4Routes (\r
+ IN EFI_IP4_PROTOCOL *This,\r
+ IN BOOLEAN DeleteRoute,\r
+ IN EFI_IPv4_ADDRESS *SubnetAddress,\r
+ IN EFI_IPv4_ADDRESS *SubnetMask,\r
+ IN EFI_IPv4_ADDRESS *GatewayAddress\r
+ );\r
+\r
+/**\r
+ Places outgoing data packets into the transmit queue.\r
+\r
+ The Transmit() function places a sending request in the transmit queue of this\r
+ EFI IPv4 Protocol instance. Whenever the packet in the token is sent out or some\r
+ errors occur, the event in the token will be signaled and the status is updated.\r
+\r
+ @param[in] This Pointer to the EFI_IP4_PROTOCOL instance.\r
+ @param[in] Token Pointer to the transmit token.\r
+\r
+ @retval EFI_SUCCESS The data has been queued for transmission.\r
+ @retval EFI_NOT_STARTED This instance has not been started.\r
+ @retval EFI_NO_MAPPING When using the default address, configuration (DHCP, BOOTP,\r
+ RARP, etc.) is not finished yet.\r
+ @retval EFI_INVALID_PARAMETER One or more pameters are invalid.\r
+ @retval EFI_ACCESS_DENIED The transmit completion token with the same Token.Event\r
+ was already in the transmit queue.\r
+ @retval EFI_NOT_READY The completion token could not be queued because the transmit\r
+ queue is full.\r
+ @retval EFI_NOT_FOUND Not route is found to destination address.\r
+ @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data.\r
+ @retval EFI_BUFFER_TOO_SMALL Token.Packet.TxData.TotalDataLength is too\r
+ short to transmit.\r
+ @retval EFI_BAD_BUFFER_SIZE The length of the IPv4 header + option length + total data length is\r
+ greater than MTU (or greater than the maximum packet size if\r
+ Token.Packet.TxData.OverrideData.\r
+ DoNotFragment is TRUE.)\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiIp4Transmit (\r
+ IN EFI_IP4_PROTOCOL *This,\r
+ IN EFI_IP4_COMPLETION_TOKEN *Token\r
+ );\r
+\r
+/**\r
+ Places a receiving request into the receiving queue.\r
+\r
+ The Receive() function places a completion token into the receive packet queue.\r
+ This function is always asynchronous.\r
+\r
+ The Token.Event field in the completion token must be filled in by the caller\r
+ and cannot be NULL. When the receive operation completes, the EFI IPv4 Protocol\r
+ driver updates the Token.Status and Token.Packet.RxData fields and the Token.Event\r
+ is signaled.\r
+\r
+ @param[in] This Pointer to the EFI_IP4_PROTOCOL instance.\r
+ @param[in] Token Pointer to a token that is associated with the receive data descriptor.\r
+\r
+ @retval EFI_SUCCESS The receive completion token was cached.\r
+ @retval EFI_NOT_STARTED This EFI IPv4 Protocol instance has not been started.\r
+ @retval EFI_NO_MAPPING When using the default address, configuration (DHCP, BOOTP, RARP, etc.)\r
+ is not finished yet.\r
+ @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
+ - This is NULL.\r
+ - Token is NULL.\r
+ - Token.Event is NULL.\r
+ @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued due to a lack of system\r
+ resources (usually memory).\r
+ @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
+ The EFI IPv4 Protocol instance has been reset to startup defaults.\r
+ EFI_ACCESS_DENIED The receive completion token with the same Token.Event was already\r
+ in the receive queue.\r
+ @retval EFI_NOT_READY The receive request could not be queued because the receive queue is full.\r
+ @retval EFI_ICMP_ERROR An ICMP error packet was received.\r