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