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