NetworkPkg/Ip6Dxe/Ip6Route.c File Reference


Functions

UINT32 Ip6RouteCacheHash (IN EFI_IPv6_ADDRESS *Ip1, IN EFI_IPv6_ADDRESS *Ip2)
IP6_ROUTE_ENTRYIp6CreateRouteEntry (IN EFI_IPv6_ADDRESS *Destination, IN UINT8 PrefixLength, IN EFI_IPv6_ADDRESS *GatewayAddress)
VOID Ip6FreeRouteEntry (IN OUT IP6_ROUTE_ENTRY *RtEntry)
IP6_ROUTE_ENTRYIp6FindRouteEntry (IN IP6_ROUTE_TABLE *RtTable, IN EFI_IPv6_ADDRESS *Destination, IN EFI_IPv6_ADDRESS *NextHop)
IP6_ROUTE_CACHE_ENTRYIp6CreateRouteCacheEntry (IN EFI_IPv6_ADDRESS *Dst, IN EFI_IPv6_ADDRESS *Src, IN EFI_IPv6_ADDRESS *GateWay, IN UINTN Tag)
VOID Ip6FreeRouteCacheEntry (IN OUT IP6_ROUTE_CACHE_ENTRY *RtCacheEntry)
IP6_ROUTE_CACHE_ENTRYIp6FindRouteCache (IN IP6_ROUTE_TABLE *RtTable, IN EFI_IPv6_ADDRESS *Dest, IN EFI_IPv6_ADDRESS *Src)
EFI_STATUS Ip6BuildEfiRouteTable (IN IP6_ROUTE_TABLE *RouteTable, OUT UINT32 *EfiRouteCount, OUT EFI_IP6_ROUTE_TABLE **EfiRouteTable)
IP6_ROUTE_TABLEIp6CreateRouteTable (VOID)
VOID Ip6CleanRouteTable (IN OUT IP6_ROUTE_TABLE *RtTable)
VOID Ip6PurgeRouteCache (IN IP6_ROUTE_CACHE *RtCache, IN UINTN Tag)
EFI_STATUS Ip6AddRoute (IN OUT IP6_ROUTE_TABLE *RtTable, IN EFI_IPv6_ADDRESS *Destination, IN UINT8 PrefixLength, IN EFI_IPv6_ADDRESS *GatewayAddress)
EFI_STATUS Ip6DelRoute (IN OUT IP6_ROUTE_TABLE *RtTable, IN EFI_IPv6_ADDRESS *Destination, IN UINT8 PrefixLength, IN EFI_IPv6_ADDRESS *GatewayAddress)
IP6_ROUTE_CACHE_ENTRYIp6Route (IN IP6_SERVICE *IpSb, IN EFI_IPv6_ADDRESS *Dest, IN EFI_IPv6_ADDRESS *Src)

Detailed Description

The functions and routines to handle the route caches and route table.

Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.

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.


Function Documentation

EFI_STATUS Ip6AddRoute ( IN OUT IP6_ROUTE_TABLE RtTable,
IN EFI_IPv6_ADDRESS *  Destination,
IN UINT8  PrefixLength,
IN EFI_IPv6_ADDRESS *  GatewayAddress 
)

Add a route entry to the route table. It is the help function for EfiIp6Routes.

Parameters:
[in,out] RtTable Route table to add route to.
[in] Destination The destination of the network.
[in] PrefixLength The PrefixLength of the destination.
[in] GatewayAddress The next hop address.
Return values:
EFI_ACCESS_DENIED The same route already exists.
EFI_OUT_OF_RESOURCES Failed to allocate memory for the entry.
EFI_SUCCESS The route was added successfully.

References IP6_ROUTE_ENTRY::Destination, IP6_ROUTE_ENTRY::Flag, IP6_DIRECT_ROUTE, Ip6CreateRouteEntry(), IP6_ROUTE_ENTRY::Link, and IP6_ROUTE_ENTRY::NextHop.

Referenced by EfiIp6Routes().

EFI_STATUS Ip6BuildEfiRouteTable ( IN IP6_ROUTE_TABLE RouteTable,
OUT UINT32 *  EfiRouteCount,
OUT EFI_IP6_ROUTE_TABLE **  EfiRouteTable 
)

Build an array of EFI_IP6_ROUTE_TABLE to be returned to the caller. The number of EFI_IP6_ROUTE_TABLE is also returned.

Parameters:
[in] RouteTable The pointer of IP6_ROUTE_TABLE internal used.
[out] EfiRouteCount The number of returned route entries.
[out] EfiRouteTable The pointer to the array of EFI_IP6_ROUTE_TABLE. If NULL, only the route entry count is returned.
Return values:
EFI_SUCCESS The EFI_IP6_ROUTE_TABLE successfully built.
EFI_OUT_OF_RESOURCES Failed to allocate the memory for the route table.

References IP6_ROUTE_ENTRY::Destination, Ip6CopyAddressByPrefix(), IP6_ROUTE_ENTRY::NextHop, and IP6_ROUTE_ENTRY::PrefixLength.

Referenced by EfiIp6GetModeData(), and Ip6ConfigGetIfInfo().

VOID Ip6CleanRouteTable ( IN OUT IP6_ROUTE_TABLE RtTable  ) 

Free the route table and its associated route cache. Route table is reference counted.

Parameters:
[in,out] RtTable The route table to free.

References IP6_ROUTE_CACHE_HASH_SIZE, Ip6FreeRouteCacheEntry(), and Ip6FreeRouteEntry().

Referenced by Ip6CleanService().

IP6_ROUTE_CACHE_ENTRY* Ip6CreateRouteCacheEntry ( IN EFI_IPv6_ADDRESS *  Dst,
IN EFI_IPv6_ADDRESS *  Src,
IN EFI_IPv6_ADDRESS *  GateWay,
IN UINTN  Tag 
)

Allocate and initialize a IP6 route cache entry.

Parameters:
[in] Dst The destination address.
[in] Src The source address.
[in] GateWay The next hop address.
[in] Tag The tag from the caller. This marks all the cache entries spawned from one route table entry.
Returns:
NULL if failed to allocate memory for the cache. Otherwise, point to the created route cache entry.

References IP6_ROUTE_CACHE_ENTRY::Destination, IP6_ROUTE_CACHE_ENTRY::NextHop, IP6_ROUTE_CACHE_ENTRY::RefCnt, IP6_ROUTE_CACHE_ENTRY::Source, and IP6_ROUTE_CACHE_ENTRY::Tag.

Referenced by Ip6ProcessRedirect(), and Ip6Route().

IP6_ROUTE_ENTRY* Ip6CreateRouteEntry ( IN EFI_IPv6_ADDRESS *  Destination,
IN UINT8  PrefixLength,
IN EFI_IPv6_ADDRESS *  GatewayAddress 
)

Allocate a route entry then initialize it with the Destination/PrefixLength and Gateway.

Parameters:
[in] Destination The IPv6 destination address. This is an optional parameter that may be NULL.
[in] PrefixLength The destination network's prefix length.
[in] GatewayAddress The next hop address. This is an optional parameter that may be NULL.
Returns:
NULL if failed to allocate memeory; otherwise, the newly created route entry.

References IP6_ROUTE_ENTRY::Destination, IP6_ROUTE_ENTRY::Flag, IP6_ROUTE_ENTRY::NextHop, IP6_ROUTE_ENTRY::PrefixLength, and IP6_ROUTE_ENTRY::RefCnt.

Referenced by Ip6AddRoute(), Ip6CreateDefaultRouter(), Ip6CreatePrefixListEntry(), Ip6ProcessPacketTooBig(), and Ip6ProcessRedirect().

IP6_ROUTE_TABLE* Ip6CreateRouteTable ( VOID   ) 

Create an empty route table. This includes its internal route cache.

Returns:
NULL if failed to allocate memory for the route table. Otherwise, the point to newly created route table.

References _IP6_ROUTE_TABLE::Cache, IP6_ROUTE_CACHE::CacheBucket, IP6_ROUTE_CACHE::CacheNum, IP6_ROUTE_CACHE_HASH_SIZE, _IP6_ROUTE_TABLE::RefCnt, _IP6_ROUTE_TABLE::RouteArea, and _IP6_ROUTE_TABLE::TotalNum.

Referenced by Ip6CreateService().

EFI_STATUS Ip6DelRoute ( 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.

Parameters:
[in,out] RtTable The route table to remove the route from.
[in] Destination The destination network.
[in] PrefixLength The PrefixLength of the Destination.
[in] GatewayAddress The next hop address.
Return values:
EFI_SUCCESS The route entry was successfully removed.
EFI_NOT_FOUND There is no route entry in the table with that property.

References IP6_ROUTE_ENTRY::Destination, Ip6FreeRouteEntry(), Ip6PurgeRouteCache(), and IP6_ROUTE_ENTRY::NextHop.

Referenced by EfiIp6Routes(), Ip6DestroyDefaultRouter(), and Ip6DestroyPrefixListEntry().

IP6_ROUTE_CACHE_ENTRY* Ip6FindRouteCache ( IN IP6_ROUTE_TABLE RtTable,
IN EFI_IPv6_ADDRESS *  Dest,
IN EFI_IPv6_ADDRESS *  Src 
)

Find a route cache with the destination and source address. This is used by the ICMPv6 redirect messasge process.

Parameters:
[in] RtTable The route table to search the cache for.
[in] Dest The destination address.
[in] Src The source address.
Returns:
NULL if no route entry to the (Dest, Src). Otherwise, the pointer to the correct route cache entry.

References IP6_ROUTE_CACHE_ENTRY::Destination, IP6_ROUTE_CACHE_HASH, and IP6_ROUTE_CACHE_ENTRY::Source.

Referenced by Ip6ProcessRedirect(), and Ip6Route().

IP6_ROUTE_ENTRY* Ip6FindRouteEntry ( IN IP6_ROUTE_TABLE RtTable,
IN EFI_IPv6_ADDRESS *  Destination,
IN EFI_IPv6_ADDRESS *  NextHop 
)

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.

Parameters:
[in] RtTable The route table to search from.
[in] Destination The destionation address to search. If NULL, search the route table by NextHop.
[in] NextHop The next hop address. If NULL, search the route table by Destination.
Returns:
NULL if no route matches the Dst. Otherwise, the point to the

most specific route to the Dst.

References IP6_ROUTE_ENTRY::Destination, IP6_ROUTE_ENTRY::NextHop, and IP6_ROUTE_ENTRY::PrefixLength.

Referenced by Ip6Output(), Ip6ProcessPacketTooBig(), Ip6ProcessRedirect(), and Ip6Route().

VOID Ip6FreeRouteCacheEntry ( IN OUT IP6_ROUTE_CACHE_ENTRY RtCacheEntry  ) 

Free the route cache entry. It is reference counted.

Parameters:
[in,out] RtCacheEntry The route cache entry to free.

Referenced by Ip6CleanRouteTable(), Ip6NdTimerTicking(), Ip6Output(), and Ip6PurgeRouteCache().

VOID Ip6FreeRouteEntry ( IN OUT IP6_ROUTE_ENTRY RtEntry  ) 

Free the route table entry. It is reference counted.

Parameters:
[in,out] RtEntry The route entry to free.

Referenced by Ip6CleanRouteTable(), Ip6DelRoute(), Ip6Output(), Ip6ProcessPacketTooBig(), and Ip6Route().

VOID Ip6PurgeRouteCache ( IN IP6_ROUTE_CACHE RtCache,
IN UINTN  Tag 
)

Remove all the cache entries bearing the Tag. When a route cache entry is created, it is tagged with the address of route entry from which it is spawned. When a route entry is deleted, the cache entries spawned from it are also deleted.

Parameters:
[in] RtCache Route cache to remove the entries from.
[in] Tag The Tag of the entries to remove.

References IP6_ROUTE_CACHE_HASH_SIZE, Ip6FreeRouteCacheEntry(), and IP6_ROUTE_CACHE_ENTRY::Tag.

Referenced by Ip6DelRoute().

IP6_ROUTE_CACHE_ENTRY* Ip6Route ( IN IP6_SERVICE IpSb,
IN EFI_IPv6_ADDRESS *  Dest,
IN EFI_IPv6_ADDRESS *  Src 
)

Search the route table to route the packet. Return/create a route cache if there is a route to the destination.

Parameters:
[in] IpSb The IP6 service data.
[in] Dest The destination address to search for.
[in] Src The source address to search for.
Returns:
NULL if it failed to route the packet. Otherwise, a route cache entry that can be used to route packets.

References _IP6_ROUTE_TABLE::Cache, IP6_ROUTE_CACHE::CacheBucket, IP6_ROUTE_CACHE::CacheNum, IP6_ROUTE_ENTRY::Flag, IP6_DIRECT_ROUTE, IP6_ROUTE_CACHE_HASH, Ip6CreateRouteCacheEntry(), Ip6FindRouteCache(), Ip6FindRouteEntry(), Ip6FreeRouteEntry(), IP6_ROUTE_CACHE_ENTRY::Link, and IP6_ROUTE_ENTRY::NextHop.

Referenced by Ip6Output().

UINT32 Ip6RouteCacheHash ( IN EFI_IPv6_ADDRESS *  Ip1,
IN EFI_IPv6_ADDRESS *  Ip2 
)

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.

Parameters:
[in] Ip1 The IPv6 address.
[in] Ip2 The IPv6 address.
Returns:
The hash value of the prefix of two IPv6 addresses.

References IP6_ROUTE_CACHE_HASH_SIZE.


Generated on Mon Sep 28 08:49:06 2015 for NetworkPkg[ALL] by  doxygen 1.5.7.1