Add NetworkPkg (P.UDK2010.UP3.Network.P1)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10986 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
299
NetworkPkg/Ip6Dxe/Ip6Route.h
Normal file
299
NetworkPkg/Ip6Dxe/Ip6Route.h
Normal file
@@ -0,0 +1,299 @@
|
||||
/** @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
|
Reference in New Issue
Block a user