mirror of https://github.com/acidanthera/audk.git
262 lines
8.2 KiB
C
262 lines
8.2 KiB
C
/** @file
|
|
Definition for IP6 pseudo interface structure.
|
|
|
|
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#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 receive 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
|