git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10986 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			268 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			268 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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
 |