diff options
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip4Dxe/Ip4If.h')
-rw-r--r-- | src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip4Dxe/Ip4If.h | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip4Dxe/Ip4If.h b/src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip4Dxe/Ip4If.h new file mode 100644 index 00000000..77239416 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip4Dxe/Ip4If.h @@ -0,0 +1,340 @@ +/** @file + Definition for IP4 pseudo interface structure. + +Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __EFI_IP4_IF_H__ +#define __EFI_IP4_IF_H__ + +#define IP4_FRAME_RX_SIGNATURE SIGNATURE_32 ('I', 'P', 'F', 'R') +#define IP4_FRAME_TX_SIGNATURE SIGNATURE_32 ('I', 'P', 'F', 'T') +#define IP4_FRAME_ARP_SIGNATURE SIGNATURE_32 ('I', 'P', 'F', 'A') +#define IP4_INTERFACE_SIGNATURE SIGNATURE_32 ('I', 'P', 'I', 'F') + +/** + This prototype is used by both receive and transmission. + When receiving Netbuf is allocated by IP4_INTERFACE, and + released by IP4. Flag shows whether the frame is received + as link broadcast/multicast... + + When transmitting, the Netbuf is from IP4, and provided + to the callback as a reference. Flag isn't used. + + @param[in] IpInstance The instance that sent or received the packet. + IpInstance can be NULL which means that it is the IP4 driver + itself sending the packets. IP4 driver may send packets that + don't belong to any instance, such as ICMP errors, ICMP echo + responses, or IGMP packets. IpInstance is used as a tag in + this module. + @param[in] Packet The sent or received packet. + @param[in] IoStatus Status of sending or receiving. + @param[in] LinkFlag Indicate if the frame is received as link broadcast/multicast. + When transmitting, it is not used. + @param[in] Context Additional data for callback. + + @retval None. +**/ +typedef +VOID +(*IP4_FRAME_CALLBACK)( + IN IP4_PROTOCOL *IpInstance OPTIONAL, + IN NET_BUF *Packet, + IN EFI_STATUS IoStatus, + IN UINT32 LinkFlag, + IN VOID *Context + ); + +/// +/// Each receive request is wrapped in an IP4_LINK_RX_TOKEN. +/// Upon completion, the Callback will be called. Only one +/// receive request is send to MNP. IpInstance is always NULL. +/// Reference MNP's spec for information. +/// +typedef struct { + UINT32 Signature; + IP4_INTERFACE *Interface; + + IP4_PROTOCOL *IpInstance; + IP4_FRAME_CALLBACK CallBack; + VOID *Context; + + EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken; +} IP4_LINK_RX_TOKEN; + +/// +/// Each transmit request is wrapped in an IP4_LINK_TX_TOKEN. +/// Upon completion, the Callback will be called. +/// +typedef struct { + UINT32 Signature; + LIST_ENTRY Link; + + IP4_INTERFACE *Interface; + IP4_SERVICE *IpSb; + + IP4_PROTOCOL *IpInstance; + IP4_FRAME_CALLBACK CallBack; + NET_BUF *Packet; + VOID *Context; + + EFI_MAC_ADDRESS DstMac; + EFI_MAC_ADDRESS SrcMac; + + EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken; + EFI_MANAGED_NETWORK_TRANSMIT_DATA MnpTxData; +} IP4_LINK_TX_TOKEN; + +/// +/// Only one ARP request is requested for all the frames in +/// a time. It is started for the first frames to the Ip. Any +/// subsequent transmission frame will be linked to Frames, and +/// be sent all at once the ARP requests succeed. +/// +typedef struct { + UINT32 Signature; + LIST_ENTRY Link; + + LIST_ENTRY Frames; + IP4_INTERFACE *Interface; + + // + // ARP requesting staffs + // + EFI_EVENT OnResolved; + IP4_ADDR Ip; + EFI_MAC_ADDRESS Mac; +} IP4_ARP_QUE; + +/** + Callback to select which frame to cancel. Caller can cancel a + single frame, or all the frame from an IP instance. + + @param Frame The sending frame to check for cancellation. + @param Context Additional data for callback. + + @retval TRUE The sending of the frame should be cancelled. + @retval FALSE Do not cancel the frame sending. +**/ +typedef +BOOLEAN +(*IP4_FRAME_TO_CANCEL)( + IP4_LINK_TX_TOKEN *Frame, + VOID *Context + ); + +// +// Each IP4 instance has its own station address. All the instances +// with the same station address share a single interface structure. +// Each interface has its own ARP child, and shares one MNP child. +// Notice the special cases that DHCP can configure the interface +// with 0.0.0.0/0.0.0.0. +// +struct _IP4_INTERFACE { + UINT32 Signature; + LIST_ENTRY Link; + INTN RefCnt; + + // + // IP address and subnet mask of the interface. It also contains + // the subnet/net broadcast address for quick access. The fields + // are invalid if (Configured == FALSE) + // + IP4_ADDR Ip; + IP4_ADDR SubnetMask; + IP4_ADDR SubnetBrdcast; + IP4_ADDR NetBrdcast; + BOOLEAN Configured; + + // + // Handle used to create/destroy ARP child. All the IP children + // share one MNP which is owned by IP service binding. + // + EFI_HANDLE Controller; + EFI_HANDLE Image; + + EFI_MANAGED_NETWORK_PROTOCOL *Mnp; + EFI_ARP_PROTOCOL *Arp; + EFI_HANDLE ArpHandle; + + // + // Queues to keep the frames sent and waiting ARP request. + // + LIST_ENTRY ArpQues; + LIST_ENTRY SentFrames; + IP4_LINK_RX_TOKEN *RecvRequest; + + // + // The interface's MAC and broadcast MAC address. + // + EFI_MAC_ADDRESS Mac; + EFI_MAC_ADDRESS BroadcastMac; + UINT32 HwaddrLen; + + // + // All the IP instances that have the same IP/SubnetMask are linked + // together through IpInstances. If any of the instance enables + // promiscuous receive, PromiscRecv is true. + // + LIST_ENTRY IpInstances; + BOOLEAN PromiscRecv; +}; + +/** + Create an IP4_INTERFACE. Delay the creation of ARP instance until + the interface is configured. + + @param[in] Mnp The shared MNP child of this IP4 service binding + instance. + @param[in] Controller The controller this IP4 service binding instance + is installed. Most like the UNDI handle. + @param[in] ImageHandle This driver's image handle. + + @return Point to the created IP4_INTERFACE, otherwise NULL. + +**/ +IP4_INTERFACE * +Ip4CreateInterface ( + IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp, + IN EFI_HANDLE Controller, + IN EFI_HANDLE ImageHandle + ); + +/** + Set the interface's address, create and configure + the ARP child if necessary. + + @param Interface The interface to set the address. + @param IpAddr The interface's IP address. + @param SubnetMask The interface's netmask. + + @retval EFI_SUCCESS The interface is configured with Ip/netmask pair, + and a ARP is created for it. + @retval Others Failed to set the interface's address. + +**/ +EFI_STATUS +Ip4SetAddress ( + IN OUT IP4_INTERFACE *Interface, + IN IP4_ADDR IpAddr, + IN IP4_ADDR SubnetMask + ); + +/** + Free the interface used by IpInstance. All the IP instance with + the same Ip/Netmask pair share the same interface. It is reference + counted. All the frames haven't been sent will be cancelled. + Because the IpInstance is optional, the caller must remove + IpInstance from the interface's instance list itself. + + @param[in] Interface The interface used by the IpInstance. + @param[in] IpInstance The Ip instance that free the interface. NULL if + the Ip driver is releasing the default interface. + + @retval EFI_SUCCESS The interface use IpInstance is freed. + +**/ +EFI_STATUS +Ip4FreeInterface ( + IN IP4_INTERFACE *Interface, + IN IP4_PROTOCOL *IpInstance OPTIONAL + ); + +/** + Send a frame from the interface. If the next hop is broadcast or + multicast address, it is transmitted immediately. If the next hop + is a unicast, it will consult ARP to resolve the NextHop's MAC. + If some error happened, the CallBack won't be called. So, the caller + must test the return value, and take action when there is an error. + + @param[in] Interface The interface to send the frame from + @param[in] IpInstance The IP child that request the transmission. NULL + if it is the IP4 driver itself. + @param[in] Packet The packet to transmit. + @param[in] NextHop The immediate destination to transmit the packet + to. + @param[in] CallBack Function to call back when transmit finished. + @param[in] Context Opaque parameter to the call back. + @param[in] IpSb The pointer to the IP4 service binding instance. + + @retval EFI_OUT_OF_RESOURCES Failed to allocate resource to send the frame + @retval EFI_NO_MAPPING Can't resolve the MAC for the nexthop + @retval EFI_SUCCESS The packet is successfully transmitted. + @retval other Other error occurs. + +**/ +EFI_STATUS +Ip4SendFrame ( + IN IP4_INTERFACE *Interface, + IN IP4_PROTOCOL *IpInstance OPTIONAL, + IN NET_BUF *Packet, + IN IP4_ADDR NextHop, + IN IP4_FRAME_CALLBACK CallBack, + IN VOID *Context, + IN IP4_SERVICE *IpSb + ); + +/** + Remove all the frames on the interface that pass the FrameToCancel, + either queued on ARP queues or that have already been delivered to + MNP and not yet recycled. + + @param[in] Interface Interface to remove the frames from. + @param[in] IoStatus The transmit status returned to the frames' + callback. + @param[in] FrameToCancel Function to select the frame to cancel, NULL to + select all. + @param[in] Context Opaque parameters passed to FrameToCancel. + +**/ +VOID +Ip4CancelFrames ( + IN IP4_INTERFACE *Interface, + IN EFI_STATUS IoStatus, + IN IP4_FRAME_TO_CANCEL FrameToCancel OPTIONAL, + IN VOID *Context + ); + +/** + If there is a pending receive request, cancel it. Don't call + the receive request's callback because this function can be only + called if the instance or driver is tearing itself down. It + doesn't make sense to call it back. But it is necessary to call + the transmit token's callback to give it a chance to free the + packet and update the upper layer's transmit request status, say + that from the UDP. + + @param[in] Interface The interface used by the IpInstance + +**/ +VOID +Ip4CancelReceive ( + IN IP4_INTERFACE *Interface + ); + +/** + Request to receive the packet from the interface. + + @param[in] Interface The interface to receive the frames from. + @param[in] IpInstance The instance that requests the receive. NULL for + the driver itself. + @param[in] CallBack Function to call when receive finished. + @param[in] Context Opaque parameter to the callback. + + @retval EFI_ALREADY_STARTED There is already a pending receive request. + @retval EFI_OUT_OF_RESOURCES Failed to allocate resource to receive. + @retval EFI_SUCCESS The receive request has been started. + @retval other Other error occurs. + +**/ +EFI_STATUS +Ip4ReceiveFrame ( + IN IP4_INTERFACE *Interface, + IN IP4_PROTOCOL *IpInstance OPTIONAL, + IN IP4_FRAME_CALLBACK CallBack, + IN VOID *Context + ); + +#endif |