git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10986 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			300 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   EFI IP6 route table and route cache table defintions.
 | |
| 
 | |
|   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_ROUTE_H__
 | |
| #define __EFI_IP6_ROUTE_H__
 | |
| 
 | |
| #define IP6_DIRECT_ROUTE          0x00000001
 | |
| #define IP6_PACKET_TOO_BIG        0x00000010
 | |
| 
 | |
| #define IP6_ROUTE_CACHE_HASH_SIZE 31
 | |
| ///
 | |
| /// Max NO. of cache entry per hash bucket
 | |
| ///
 | |
| #define IP6_ROUTE_CACHE_MAX       32
 | |
| 
 | |
| #define IP6_ROUTE_CACHE_HASH(Ip1, Ip2) Ip6RouteCacheHash ((Ip1), (Ip2))
 | |
| 
 | |
| typedef struct {
 | |
|   LIST_ENTRY                Link;
 | |
|   INTN                      RefCnt;
 | |
|   UINT32                    Flag;
 | |
|   UINT8                     PrefixLength;
 | |
|   EFI_IPv6_ADDRESS          Destination;
 | |
|   EFI_IPv6_ADDRESS          NextHop;
 | |
| } IP6_ROUTE_ENTRY;
 | |
| 
 | |
| typedef struct {
 | |
|   LIST_ENTRY                Link;
 | |
|   INTN                      RefCnt;
 | |
|   UINTN                     Tag;
 | |
|   EFI_IPv6_ADDRESS          Destination;
 | |
|   EFI_IPv6_ADDRESS          Source;
 | |
|   EFI_IPv6_ADDRESS          NextHop;
 | |
| } IP6_ROUTE_CACHE_ENTRY;
 | |
| 
 | |
| typedef struct {
 | |
|   LIST_ENTRY                CacheBucket[IP6_ROUTE_CACHE_HASH_SIZE];
 | |
|   UINT8                     CacheNum[IP6_ROUTE_CACHE_HASH_SIZE];
 | |
| } IP6_ROUTE_CACHE;
 | |
| 
 | |
| //
 | |
| // Each IP6 instance has its own route table. Each ServiceBinding
 | |
| // instance has a default route table and default address.
 | |
| //
 | |
| // All the route table entries with the same prefix length are linked
 | |
| // together in one route area. For example, RouteArea[0] contains
 | |
| // the default routes. A route table also contains a route cache.
 | |
| //
 | |
| 
 | |
| typedef struct _IP6_ROUTE_TABLE {
 | |
|   INTN                      RefCnt;
 | |
|   UINT32                    TotalNum;
 | |
|   LIST_ENTRY                RouteArea[IP6_PREFIX_NUM];
 | |
|   IP6_ROUTE_CACHE           Cache;
 | |
| } IP6_ROUTE_TABLE;
 | |
| 
 | |
| /**
 | |
|   This is the worker function for IP6_ROUTE_CACHE_HASH(). It calculates the value
 | |
|   as the index of the route cache bucket according to the prefix of two IPv6 addresses.
 | |
| 
 | |
|   @param[in]  Ip1     The IPv6 address.
 | |
|   @param[in]  Ip2     The IPv6 address.
 | |
| 
 | |
|   @return The hash value of the prefix of two IPv6 addresses.
 | |
| 
 | |
| **/
 | |
| UINT32
 | |
| Ip6RouteCacheHash (
 | |
|   IN EFI_IPv6_ADDRESS       *Ip1,
 | |
|   IN EFI_IPv6_ADDRESS       *Ip2
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Allocate and initialize an IP6 route cache entry.
 | |
| 
 | |
|   @param[in]  Dst           The destination address.
 | |
|   @param[in]  Src           The source address.
 | |
|   @param[in]  GateWay       The next hop address.
 | |
|   @param[in]  Tag           The tag from the caller. This marks all the cache entries
 | |
|                             spawned from one route table entry.
 | |
| 
 | |
|   @return NULL if it failed to allocate memory for the cache. Otherwise, point
 | |
|           to the created route cache entry.
 | |
| 
 | |
| **/
 | |
| IP6_ROUTE_CACHE_ENTRY *
 | |
| Ip6CreateRouteCacheEntry (
 | |
|   IN EFI_IPv6_ADDRESS       *Dst,
 | |
|   IN EFI_IPv6_ADDRESS       *Src,
 | |
|   IN EFI_IPv6_ADDRESS       *GateWay,
 | |
|   IN UINTN                  Tag
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Free the route cache entry. It is reference counted.
 | |
| 
 | |
|   @param[in, out]  RtCacheEntry  The route cache entry to free.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| Ip6FreeRouteCacheEntry (
 | |
|   IN OUT IP6_ROUTE_CACHE_ENTRY  *RtCacheEntry
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Find a route cache with the destination and source address. This is
 | |
|   used by the ICMPv6 redirect messasge process.
 | |
| 
 | |
|   @param[in]  RtTable       The route table to search the cache for.
 | |
|   @param[in]  Dest          The destination address.
 | |
|   @param[in]  Src           The source address.
 | |
| 
 | |
|   @return NULL if no route entry to the (Dest, Src). Otherwise, point
 | |
|           to the correct route cache entry.
 | |
| 
 | |
| **/
 | |
| IP6_ROUTE_CACHE_ENTRY *
 | |
| Ip6FindRouteCache (
 | |
|   IN IP6_ROUTE_TABLE        *RtTable,
 | |
|   IN EFI_IPv6_ADDRESS       *Dest,
 | |
|   IN EFI_IPv6_ADDRESS       *Src
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Build a array of EFI_IP6_ROUTE_TABLE to be returned to the caller. The number
 | |
|   of EFI_IP6_ROUTE_TABLE is also returned.
 | |
| 
 | |
|   @param[in]  RouteTable        The pointer of IP6_ROUTE_TABLE internal used.
 | |
|   @param[out] EfiRouteCount     The number of returned route entries.
 | |
|   @param[out] EfiRouteTable     The pointer to the array of EFI_IP6_ROUTE_TABLE.
 | |
|                                 If NULL, only the route entry count is returned.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The EFI_IP6_ROUTE_TABLE successfully built.
 | |
|   @retval EFI_OUT_OF_RESOURCES  Failed to allocate the memory for the route table.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| Ip6BuildEfiRouteTable (
 | |
|   IN IP6_ROUTE_TABLE        *RouteTable,
 | |
|   OUT UINT32                *EfiRouteCount,
 | |
|   OUT EFI_IP6_ROUTE_TABLE   **EfiRouteTable OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Create an empty route table, includes its internal route cache.
 | |
| 
 | |
|   @return NULL if failed to allocate memory for the route table. Otherwise,
 | |
|           the point to newly created route table.
 | |
| 
 | |
| **/
 | |
| IP6_ROUTE_TABLE *
 | |
| Ip6CreateRouteTable (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Free the route table and its associated route cache. Route
 | |
|   table is reference counted.
 | |
| 
 | |
|   @param[in, out]  RtTable      The route table to free.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| Ip6CleanRouteTable (
 | |
|   IN OUT IP6_ROUTE_TABLE        *RtTable
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Allocate a route entry then initialize it with the Destination/PrefixLength
 | |
|   and Gateway.
 | |
| 
 | |
|   @param[in]  Destination     The IPv6 destination address. This is an optional
 | |
|                               parameter that may be NULL.
 | |
|   @param[in]  PrefixLength    The destination network's prefix length.
 | |
|   @param[in]  GatewayAddress  The next hop address. This is optional parameter
 | |
|                               that may be NULL.
 | |
| 
 | |
|   @return NULL if it failed to allocate memeory. Otherwise, the newly created route entry.
 | |
| 
 | |
| **/
 | |
| IP6_ROUTE_ENTRY *
 | |
| Ip6CreateRouteEntry (
 | |
|   IN EFI_IPv6_ADDRESS       *Destination    OPTIONAL,
 | |
|   IN UINT8                  PrefixLength,
 | |
|   IN EFI_IPv6_ADDRESS       *GatewayAddress OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Search the route table for a most specific match to the Dst. It searches
 | |
|   from the longest route area (prefix length == 128) to the shortest route area
 | |
|   (default routes). In each route area, it will first search the instance's
 | |
|   route table, then the default route table. This is required per the following
 | |
|   requirements:
 | |
|   1. IP search the route table for a most specific match.
 | |
|   2. The local route entries have precedence over the default route entry.
 | |
| 
 | |
|   @param[in]  RtTable       The route table to search from.
 | |
|   @param[in]  Destination   The destionation address to search. If NULL, search
 | |
|                             the route table by NextHop.
 | |
|   @param[in]  NextHop       The next hop address. If NULL, search the route table
 | |
|                             by Destination.
 | |
| 
 | |
|   @return NULL if no route matches the Dst. Otherwise the point to the
 | |
|           most specific route to the Dst.
 | |
| 
 | |
| **/
 | |
| IP6_ROUTE_ENTRY *
 | |
| Ip6FindRouteEntry (
 | |
|   IN IP6_ROUTE_TABLE        *RtTable,
 | |
|   IN EFI_IPv6_ADDRESS       *Destination OPTIONAL,
 | |
|   IN EFI_IPv6_ADDRESS       *NextHop     OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Free the route table entry. It is reference counted.
 | |
| 
 | |
|   @param[in, out]  RtEntry  The route entry to free.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| Ip6FreeRouteEntry (
 | |
|   IN OUT IP6_ROUTE_ENTRY    *RtEntry
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Add a route entry to the route table. It is the help function for EfiIp6Routes.
 | |
| 
 | |
|   @param[in, out]  RtTable        Route table to add route to.
 | |
|   @param[in]       Destination    The destination of the network.
 | |
|   @param[in]       PrefixLength   The PrefixLength of the destination.
 | |
|   @param[in]       GatewayAddress The next hop address.
 | |
| 
 | |
|   @retval EFI_ACCESS_DENIED     The same route already exists.
 | |
|   @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory for the entry.
 | |
|   @retval EFI_SUCCESS           The route was added successfully.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| Ip6AddRoute (
 | |
|   IN OUT IP6_ROUTE_TABLE    *RtTable,
 | |
|   IN EFI_IPv6_ADDRESS       *Destination,
 | |
|   IN UINT8                  PrefixLength,
 | |
|   IN EFI_IPv6_ADDRESS       *GatewayAddress
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Remove a route entry and all the route caches spawn from it.
 | |
|   It is the help function for EfiIp6Routes.
 | |
| 
 | |
|   @param[in, out] RtTable           The route table to remove the route from.
 | |
|   @param[in]      Destination       The destination network.
 | |
|   @param[in]      PrefixLength      The PrefixLength of the Destination.
 | |
|   @param[in]      GatewayAddress    The next hop address.
 | |
| 
 | |
|   @retval EFI_SUCCESS           Successfully removed the route entry.
 | |
|   @retval EFI_NOT_FOUND         There is no route entry in the table with that
 | |
|                                 properity.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| Ip6DelRoute (
 | |
|   IN OUT IP6_ROUTE_TABLE    *RtTable,
 | |
|   IN EFI_IPv6_ADDRESS       *Destination,
 | |
|   IN UINT8                  PrefixLength,
 | |
|   IN EFI_IPv6_ADDRESS       *GatewayAddress
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Search the route table to route the packet. Return/create a route
 | |
|   cache if there is a route to the destination.
 | |
| 
 | |
|   @param[in]  IpSb          The IP6 service data.
 | |
|   @param[in]  Dest          The destination address to search for.
 | |
|   @param[in]  Src           The source address to search for.
 | |
| 
 | |
|   @return NULL if failed to route packet. Otherwise, a route cache
 | |
|           entry that can be used to route packet.
 | |
| 
 | |
| **/
 | |
| IP6_ROUTE_CACHE_ENTRY *
 | |
| Ip6Route (
 | |
|   IN IP6_SERVICE            *IpSb,
 | |
|   IN EFI_IPv6_ADDRESS       *Dest,
 | |
|   IN EFI_IPv6_ADDRESS       *Src
 | |
|   );
 | |
| 
 | |
| #endif
 |