/** @file | |
Definition for IP6 pesudo interface structure. | |
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> | |
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. | |
**/ | |
#ifndef __EFI_IP6_IF_H__ | |
#define __EFI_IP6_IF_H__ | |
#define IP6_LINK_RX_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'R') | |
#define IP6_LINK_TX_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'T') | |
#define IP6_INTERFACE_SIGNATURE SIGNATURE_32 ('I', 'P', '6', 'I') | |
#define IP6_ADDR_INFO_SIGNATURE SIGNATURE_32 ('I', 'P', 'A', 'I') | |
// | |
// This prototype is used by both receive and transmission. | |
// When receiving Netbuf is allocated by IP6_INTERFACE, and | |
// released by IP6. Flag shows whether the frame is received | |
// as unicast/multicast/anycast... | |
// | |
// When transmitting, the Netbuf is from IP6, and provided | |
// to the callback as a reference. Flag isn't used. | |
// | |
// IpInstance can be NULL which means that it is the IP6 driver | |
// itself sending the packets. IP6 driver may send packets that | |
// don't belong to any instance, such as ICMP errors, ICMP | |
// informational packets. IpInstance is used as a tag in | |
// this module. | |
// | |
typedef | |
VOID | |
(*IP6_FRAME_CALLBACK) ( | |
NET_BUF *Packet, | |
EFI_STATUS IoStatus, | |
UINT32 LinkFlag, | |
VOID *Context | |
); | |
// | |
// Each receive request is wrapped in an IP6_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; | |
IP6_FRAME_CALLBACK CallBack; | |
VOID *Context; | |
EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken; | |
} IP6_LINK_RX_TOKEN; | |
// | |
// Each transmit request is wrapped in an IP6_LINK_TX_TOKEN. | |
// Upon completion, the Callback will be called. | |
// | |
typedef struct { | |
UINT32 Signature; | |
LIST_ENTRY Link; | |
IP6_PROTOCOL *IpInstance; | |
IP6_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; | |
} IP6_LINK_TX_TOKEN; | |
struct _IP6_ADDRESS_INFO { | |
UINT32 Signature; | |
LIST_ENTRY Link; | |
EFI_IPv6_ADDRESS Address; | |
BOOLEAN IsAnycast; | |
UINT8 PrefixLength; | |
UINT32 ValidLifetime; | |
UINT32 PreferredLifetime; | |
}; | |
// | |
// Callback to select which frame to cancel. Caller can cancel a | |
// single frame, or all the frame from an IP instance. | |
// | |
typedef | |
BOOLEAN | |
(*IP6_FRAME_TO_CANCEL) ( | |
IP6_LINK_TX_TOKEN *Frame, | |
VOID *Context | |
); | |
struct _IP6_INTERFACE { | |
UINT32 Signature; | |
LIST_ENTRY Link; | |
INTN RefCnt; | |
// | |
// IP address and prefix length of the interface. The fileds | |
// are invalid if (Configured == FALSE) | |
// | |
LIST_ENTRY AddressList; | |
UINT32 AddressCount; | |
BOOLEAN Configured; | |
IP6_SERVICE *Service; | |
EFI_HANDLE Controller; | |
EFI_HANDLE Image; | |
// | |
// Queues to keep the frames sent and waiting ARP request. | |
// | |
LIST_ENTRY ArpQues; | |
LIST_ENTRY SentFrames; | |
// | |
// The interface's configuration variables | |
// | |
UINT32 DupAddrDetect; | |
LIST_ENTRY DupAddrDetectList; | |
LIST_ENTRY DelayJoinList; | |
// | |
// 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 IP6_INTERFACE. | |
@param[in] IpSb The IP6 service binding instance. | |
@param[in] LinkLocal If TRUE, the instance is created for link-local address. | |
Otherwise, it is not for a link-local address. | |
@return Point to the created IP6_INTERFACE, otherwise NULL. | |
**/ | |
IP6_INTERFACE * | |
Ip6CreateInterface ( | |
IN IP6_SERVICE *IpSb, | |
IN BOOLEAN LinkLocal | |
); | |
/** | |
Free the interface used by IpInstance. All the IP instance with | |
the same Ip/prefix pair share the same interface. It is reference | |
counted. All the frames that haven't been sent will be cancelled. | |
Because the IpInstance is optional, the caller must remove | |
IpInstance from the interface's instance list. | |
@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. | |
**/ | |
VOID | |
Ip6CleanInterface ( | |
IN IP6_INTERFACE *Interface, | |
IN IP6_PROTOCOL *IpInstance OPTIONAL | |
); | |
/** | |
Free the link layer transmit token. It will close the event | |
then free the memory used. | |
@param[in] Token Token to free. | |
**/ | |
VOID | |
Ip6FreeLinkTxToken ( | |
IN IP6_LINK_TX_TOKEN *Token | |
); | |
/** | |
Request Ip6OnFrameReceivedDpc as a DPC at TPL_CALLBACK | |
@param Event The receive event delivered to MNP for receive. | |
@param Context Context for the callback. | |
**/ | |
VOID | |
EFIAPI | |
Ip6OnFrameReceived ( | |
IN EFI_EVENT Event, | |
IN VOID *Context | |
); | |
/** | |
Request to receive the packet from the interface. | |
@param[in] CallBack Function to call when the receive finished. | |
@param[in] IpSb Points to the IP6 service binding instance. | |
@retval EFI_ALREADY_STARTED There is already a pending receive request. | |
@retval EFI_OUT_OF_RESOURCES Failed to allocate resources to receive. | |
@retval EFI_SUCCESS The recieve request has been started. | |
**/ | |
EFI_STATUS | |
Ip6ReceiveFrame ( | |
IN IP6_FRAME_CALLBACK CallBack, | |
IN IP6_SERVICE *IpSb | |
); | |
/** | |
Send a frame from the interface. If the next hop is multicast address, | |
it is transmitted immediately. If the next hop is a unicast, | |
and the NextHop's MAC is not known, it will perform address resolution. | |
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 IP6 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. | |
@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 successfully transmitted. | |
**/ | |
EFI_STATUS | |
Ip6SendFrame ( | |
IN IP6_INTERFACE *Interface, | |
IN IP6_PROTOCOL *IpInstance OPTIONAL, | |
IN NET_BUF *Packet, | |
IN EFI_IPv6_ADDRESS *NextHop, | |
IN IP6_FRAME_CALLBACK CallBack, | |
IN VOID *Context | |
); | |
/** | |
The heartbeat timer of IP6 service instance. It times out | |
all of its IP6 children's received-but-not-delivered and | |
transmitted-but-not-recycle packets. | |
@param[in] Event The IP6 service instance's heart beat timer. | |
@param[in] Context The IP6 service instance. | |
**/ | |
VOID | |
EFIAPI | |
Ip6TimerTicking ( | |
IN EFI_EVENT Event, | |
IN VOID *Context | |
); | |
#endif |