| /** @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 |