Scrubbed more.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6454 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jgong5 2008-11-11 09:23:25 +00:00
parent a8d048d54d
commit 96e1079fa4
11 changed files with 170 additions and 169 deletions

View File

@ -66,9 +66,9 @@ typedef enum {
#define IP4_ALLSYSTEM_ADDRESS 0xE0000001u #define IP4_ALLSYSTEM_ADDRESS 0xE0000001u
#define IP4_ALLROUTER_ADDRESS 0xE0000002u #define IP4_ALLROUTER_ADDRESS 0xE0000002u
// ///
// Compose the fragment field to be used in the IP4 header. /// Compose the fragment field to be used in the IP4 header.
// ///
#define IP4_HEAD_FRAGMENT_FIELD(Df, Mf, Offset) \ #define IP4_HEAD_FRAGMENT_FIELD(Df, Mf, Offset) \
((UINT16)(((Df) ? 0x4000 : 0) | ((Mf) ? 0x2000 : 0) | (((Offset) >> 3) & 0x1fff))) ((UINT16)(((Df) ? 0x4000 : 0) | ((Mf) ? 0x2000 : 0) | (((Offset) >> 3) & 0x1fff)))
@ -80,10 +80,10 @@ typedef enum {
#define IP4_IS_BROADCAST(CastType) ((CastType) >= IP4_LOCAL_BROADCAST) #define IP4_IS_BROADCAST(CastType) ((CastType) >= IP4_LOCAL_BROADCAST)
// ///
// Conver the Microsecond to second. IP transmit/receive time is /// Conver the Microsecond to second. IP transmit/receive time is
// in the unit of microsecond. IP ticks once per second. /// in the unit of microsecond. IP ticks once per second.
// ///
#define IP4_US_TO_SEC(Us) (((Us) + 999999) / 1000000) #define IP4_US_TO_SEC(Us) (((Us) + 999999) / 1000000)
INTN INTN

View File

@ -64,12 +64,12 @@ VOID
IN VOID *Context IN VOID *Context
); );
// ///
// Each receive request is wrapped in an IP4_LINK_RX_TOKEN. /// Each receive request is wrapped in an IP4_LINK_RX_TOKEN.
// Upon completion, the Callback will be called. Only one /// Upon completion, the Callback will be called. Only one
// receive request is send to MNP. IpInstance is always NULL. /// receive request is send to MNP. IpInstance is always NULL.
// Reference MNP's spec for information. /// Reference MNP's spec for information.
// ///
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
IP4_INTERFACE *Interface; IP4_INTERFACE *Interface;
@ -81,10 +81,10 @@ typedef struct {
EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken; EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken;
} IP4_LINK_RX_TOKEN; } IP4_LINK_RX_TOKEN;
// ///
// Each transmit request is wrapped in an IP4_LINK_TX_TOKEN. /// Each transmit request is wrapped in an IP4_LINK_TX_TOKEN.
// Upon completion, the Callback will be called. /// Upon completion, the Callback will be called.
// ///
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
LIST_ENTRY Link; LIST_ENTRY Link;
@ -103,12 +103,12 @@ typedef struct {
EFI_MANAGED_NETWORK_TRANSMIT_DATA MnpTxData; EFI_MANAGED_NETWORK_TRANSMIT_DATA MnpTxData;
} IP4_LINK_TX_TOKEN; } IP4_LINK_TX_TOKEN;
// ///
// Only one ARP request is requested for all the frames in /// Only one ARP request is requested for all the frames in
// a time. It is started for the first frames to the Ip. Any /// a time. It is started for the first frames to the Ip. Any
// subsequent transmission frame will be linked to Frames, and /// subsequent transmission frame will be linked to Frames, and
// be sent all at once the ARP requests succeed. /// be sent all at once the ARP requests succeed.
// ///
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
LIST_ENTRY Link; LIST_ENTRY Link;

View File

@ -31,12 +31,12 @@ typedef struct {
} IGMP_HEAD; } IGMP_HEAD;
#pragma pack() #pragma pack()
// ///
// The status of multicast group. It isn't necessary to maintain /// The status of multicast group. It isn't necessary to maintain
// explicit state of host state diagram. A group with non-zero /// explicit state of host state diagram. A group with non-zero
// DelayTime is in "delaying member" state. otherwise, it is in /// DelayTime is in "delaying member" state. otherwise, it is in
// "idle member" state. /// "idle member" state.
// ///
typedef struct { typedef struct {
LIST_ENTRY Link; LIST_ENTRY Link;
INTN RefCnt; INTN RefCnt;
@ -46,11 +46,11 @@ typedef struct {
EFI_MAC_ADDRESS Mac; EFI_MAC_ADDRESS Mac;
} IGMP_GROUP; } IGMP_GROUP;
// ///
// The IGMP status. Each IP4 service instance has a IGMP_SERVICE_DATA /// The IGMP status. Each IP4 service instance has a IGMP_SERVICE_DATA
// attached. The Igmpv1QuerySeen remember whether the server on this /// attached. The Igmpv1QuerySeen remember whether the server on this
// connected network is v1 or v2. /// connected network is v1 or v2.
// ///
typedef struct { typedef struct {
INTN Igmpv1QuerySeen; INTN Igmpv1QuerySeen;
LIST_ENTRY Groups; LIST_ENTRY Groups;

View File

@ -2435,7 +2435,7 @@ EfiIp4Poll (
/** /**
Decrease the life of the transmitted packets. If it is Decrease the life of the transmitted packets. If it is
decreased to zero, cancel the packet. This function is decreased to zero, cancel the packet. This function is
called by Ip4packetTimerTicking which time out both the called by Ip4PacketTimerTicking which time out both the
received-but-not-delivered and transmitted-but-not-recycle received-but-not-delivered and transmitted-but-not-recycle
packets. packets.

View File

@ -76,15 +76,15 @@ typedef enum {
IP4_SERVICE_DESTORY IP4_SERVICE_DESTORY
} IP4_IMPL_ENUM_TYPES; } IP4_IMPL_ENUM_TYPES;
// ///
// IP4_TXTOKEN_WRAP wraps the upper layer's transmit token. /// IP4_TXTOKEN_WRAP wraps the upper layer's transmit token.
// The user's data is kept in the Packet. When fragment is /// The user's data is kept in the Packet. When fragment is
// needed, each fragment of the Packet has a reference to the /// needed, each fragment of the Packet has a reference to the
// Packet, no data is actually copied. The Packet will be /// Packet, no data is actually copied. The Packet will be
// released when all the fragments of it have been recycled by /// released when all the fragments of it have been recycled by
// MNP. Upon then, the IP4_TXTOKEN_WRAP will be released, and /// MNP. Upon then, the IP4_TXTOKEN_WRAP will be released, and
// user's event signalled. /// user's event signalled.
// ///
typedef struct { typedef struct {
IP4_PROTOCOL *IpInstance; IP4_PROTOCOL *IpInstance;
EFI_IP4_COMPLETION_TOKEN *Token; EFI_IP4_COMPLETION_TOKEN *Token;
@ -93,15 +93,15 @@ typedef struct {
INTN Life; INTN Life;
} IP4_TXTOKEN_WRAP; } IP4_TXTOKEN_WRAP;
// ///
// IP4_RXDATA_WRAP wraps the data IP4 child delivers to the /// IP4_RXDATA_WRAP wraps the data IP4 child delivers to the
// upper layers. The received packet is kept in the Packet. /// upper layers. The received packet is kept in the Packet.
// The Packet itself may be constructured from some fragments. /// The Packet itself may be constructured from some fragments.
// All the fragments of the Packet is organized by a /// All the fragments of the Packet is organized by a
// IP4_ASSEMBLE_ENTRY structure. If the Packet is recycled by /// IP4_ASSEMBLE_ENTRY structure. If the Packet is recycled by
// the upper layer, the assemble entry and its associated /// the upper layer, the assemble entry and its associated
// fragments will be freed at last. /// fragments will be freed at last.
// ///
typedef struct { typedef struct {
LIST_ENTRY Link; LIST_ENTRY Link;
IP4_PROTOCOL *IpInstance; IP4_PROTOCOL *IpInstance;

View File

@ -24,7 +24,7 @@ Abstract:
/** /**
Create a empty assemble entry for the packet identified by Create an empty assemble entry for the packet identified by
(Dst, Src, Id, Protocol). The default life for the packet is (Dst, Src, Id, Protocol). The default life for the packet is
120 seconds. 120 seconds.
@ -72,7 +72,7 @@ Ip4CreateAssembleEntry (
/** /**
Release all the fragments of a packet, then free the assemble entry Release all the fragments of a packet, then free the assemble entry.
@param Assemble The assemble entry to free @param Assemble The assemble entry to free
@ -110,7 +110,7 @@ Ip4FreeAssembleEntry (
**/ **/
VOID VOID
Ip4InitAssembleTable ( Ip4InitAssembleTable (
IN IP4_ASSEMBLE_TABLE *Table IN OUT IP4_ASSEMBLE_TABLE *Table
) )
{ {
UINT32 Index; UINT32 Index;
@ -164,7 +164,7 @@ Ip4CleanAssembleTable (
**/ **/
VOID VOID
Ip4TrimPacket ( Ip4TrimPacket (
IN NET_BUF *Packet, IN OUT NET_BUF *Packet,
IN INTN Start, IN INTN Start,
IN INTN End IN INTN End
) )
@ -220,17 +220,19 @@ Ip4OnFreeFragments (
return it to caller. If the packet can't be assembled, NULL is return it to caller. If the packet can't be assembled, NULL is
return. return.
@param Table The assemble table used. @param Table The assemble table used. New assemble entry will be created
@param Packet The fragment to assemble if the Packet is from a new chain of fragments.
@param Packet The fragment to assemble. It might be freed if the fragment
can't be re-assembled.
@return NULL if the packet can't be reassemble. The point to just assembled @return NULL if the packet can't be reassemble. The point to just assembled
@return packet if all the fragments of the packet have arrived. packet if all the fragments of the packet have arrived.
**/ **/
NET_BUF * NET_BUF *
Ip4Reassemble ( Ip4Reassemble (
IN IP4_ASSEMBLE_TABLE *Table, IN OUT IP4_ASSEMBLE_TABLE *Table,
IN NET_BUF *Packet IN OUT NET_BUF *Packet
) )
{ {
IP4_HEAD *IpHead; IP4_HEAD *IpHead;
@ -393,7 +395,7 @@ Ip4Reassemble (
// //
// Deliver the whole packet if all the fragments received. // Deliver the whole packet if all the fragments received.
// All fragments received if: // All fragments received if:
// 1. received the last one, so, the totoal length is know // 1. received the last one, so, the total length is know
// 2. received all the data. If the last fragment on the // 2. received all the data. If the last fragment on the
// queue ends at the total length, all data is received. // queue ends at the total length, all data is received.
// //
@ -481,7 +483,7 @@ Ip4AccpetFrame (
} }
// //
// Check that the IP4 header is correctly formated // Check that the IP4 header is correctly formatted
// //
if (Packet->TotalSize < IP4_MIN_HEADLEN) { if (Packet->TotalSize < IP4_MIN_HEADLEN) {
goto RESTART; goto RESTART;
@ -627,7 +629,8 @@ DROP:
@param Head The IP header of the packet @param Head The IP header of the packet
@param Packet The data of the packet @param Packet The data of the packet
@return TRUE if the child wants to receive the packet, otherwise return FALSE. @retval TRUE If the child wants to receive the packet.
@retval FALSE Otherwise.
**/ **/
BOOLEAN BOOLEAN
@ -648,7 +651,7 @@ Ip4InstanceFrameAcceptable (
// //
// Dirty trick for the Tiano UEFI network stack implmentation. If // Dirty trick for the Tiano UEFI network stack implmentation. If
// ReceiveTimeout == -1, the receive of the packet for this instance // ReceiveTimeout == -1, the receive of the packet for this instance
// is disabled. The UEFI spec don't have such captibility. We add // is disabled. The UEFI spec don't have such capability. We add
// this to improve the performance because IP will make a copy of // this to improve the performance because IP will make a copy of
// the received packet for each accepting instance. Some IP instances // the received packet for each accepting instance. Some IP instances
// used by UDP/TCP only send packets, they don't wants to receive. // used by UDP/TCP only send packets, they don't wants to receive.
@ -1114,7 +1117,7 @@ Ip4InterfaceDeliverPacket (
to each IP4 child that accepts the packet. The second pass will to each IP4 child that accepts the packet. The second pass will
deliver a non-shared copy of the packet to each IP4 child that deliver a non-shared copy of the packet to each IP4 child that
has pending receive requests. Data is copied if more than one has pending receive requests. Data is copied if more than one
child wants to consume the packet bacause each IP child need child wants to consume the packet because each IP child needs
its own copy of the packet to make changes. its own copy of the packet to make changes.
@param IpSb The IP4 service instance that received the packet @param IpSb The IP4 service instance that received the packet

View File

@ -21,25 +21,25 @@ Abstract:
#ifndef __EFI_IP4_INPUT_H__ #ifndef __EFI_IP4_INPUT_H__
#define __EFI_IP4_INPUT_H__ #define __EFI_IP4_INPUT_H__
enum { typedef enum {
IP4_MIN_HEADLEN = 20, IP4_MIN_HEADLEN = 20,
IP4_MAX_HEADLEN = 60, IP4_MAX_HEADLEN = 60,
IP4_ASSEMLE_HASH_SIZE = 31, IP4_ASSEMLE_HASH_SIZE = 31,
IP4_FRAGMENT_LIFE = 120, IP4_FRAGMENT_LIFE = 120,
IP4_MAX_PACKET_SIZE = 65535 IP4_MAX_PACKET_SIZE = 65535
}; } IP4_INPUT_ENUM_TYPES;
// ///
// Per packet information for input process. LinkFlag specifies whether /// Per packet information for input process. LinkFlag specifies whether
// the packet is received as Link layer unicast, multicast or broadcast. /// the packet is received as Link layer unicast, multicast or broadcast.
// The CastType is the IP layer cast type, such as IP multicast or unicast. /// The CastType is the IP layer cast type, such as IP multicast or unicast.
// Start, End and Length are staffs used to assemble the packets. Start /// Start, End and Length are staffs used to assemble the packets. Start
// is the sequence number of the first byte of data in the packet. Length /// is the sequence number of the first byte of data in the packet. Length
// is the number of bytes of data. End = Start + Length, that is, the /// is the number of bytes of data. End = Start + Length, that is, the
// sequence number of last byte + 1. Each assembled packet has a count down /// sequence number of last byte + 1. Each assembled packet has a count down
// life. If it isn't consumed before Life reaches zero, the packet is released. /// life. If it isn't consumed before Life reaches zero, the packet is released.
// ///
typedef struct { typedef struct {
UINTN LinkFlag; UINTN LinkFlag;
INTN CastType; INTN CastType;
@ -50,9 +50,9 @@ typedef struct {
EFI_STATUS Status; EFI_STATUS Status;
} IP4_CLIP_INFO; } IP4_CLIP_INFO;
// ///
// Structure used to assemble IP packets. /// Structure used to assemble IP packets.
// ///
typedef struct { typedef struct {
LIST_ENTRY Link; LIST_ENTRY Link;
@ -74,11 +74,11 @@ typedef struct {
INTN Life; // Count down life for the packet. INTN Life; // Count down life for the packet.
} IP4_ASSEMBLE_ENTRY; } IP4_ASSEMBLE_ENTRY;
// ///
// Each Ip service instance has an assemble table to reassemble /// Each Ip service instance has an assemble table to reassemble
// the packets before delivery to its children. It is organized /// the packets before delivery to its children. It is organized
// as hash table. /// as hash table.
// ///
typedef struct { typedef struct {
LIST_ENTRY Bucket[IP4_ASSEMLE_HASH_SIZE]; LIST_ENTRY Bucket[IP4_ASSEMLE_HASH_SIZE];
} IP4_ASSEMBLE_TABLE; } IP4_ASSEMBLE_TABLE;

View File

@ -33,8 +33,8 @@ Abstract:
@param Rcvd The option is from the packet we received if TRUE, @param Rcvd The option is from the packet we received if TRUE,
otherwise the option we wants to transmit. otherwise the option we wants to transmit.
@return TRUE: The option is properly formated @retval TRUE The option is properly formatted
@return FALSE: The option is mal-formated @retval FALSE The option is mal-formated
**/ **/
BOOLEAN BOOLEAN
@ -74,7 +74,7 @@ Ip4OptionIsValid (
Point = Option[Cur + 2]; Point = Option[Cur + 2];
// //
// SRR/RR options are formated as |Type|Len|Point|Ip1|Ip2|... // SRR/RR options are formatted as |Type|Len|Point|Ip1|Ip2|...
// //
if ((OptionLen - Cur < Len) || (Len < 3) || ((Len - 3) % 4 != 0)) { if ((OptionLen - Cur < Len) || (Len < 3) || ((Len - 3) % 4 != 0)) {
IcmpPoint = Cur + 1; IcmpPoint = Cur + 1;
@ -125,16 +125,16 @@ Ip4OptionIsValid (
handles the details such as: handles the details such as:
1. whether copy the single IP4 option to the first/non-first 1. whether copy the single IP4 option to the first/non-first
fragments. fragments.
2. Pad the options copied over to aligened to 4 bytes. 2. Pad the options copied over to aligned to 4 bytes.
@param Option The original option to copy from @param Option The original option to copy from
@param OptionLen The length of the original option @param OptionLen The length of the original option
@param FirstFragment Whether it is the first fragment @param FirstFragment Whether it is the first fragment
@param Buf The buffer to copy options to @param Buf The buffer to copy options to. NULL
@param BufLen The length of the buffer @param BufLen The length of the buffer
@retval EFI_SUCCESS The options are copied over @retval EFI_SUCCESS The options are copied over
@retval EFI_BUFFER_TOO_SMALL The buffer caller provided is too small. @retval EFI_BUFFER_TOO_SMALL Buf is NULL or BufLen provided is too small.
**/ **/
EFI_STATUS EFI_STATUS
@ -142,7 +142,7 @@ Ip4CopyOption (
IN UINT8 *Option, IN UINT8 *Option,
IN UINT32 OptionLen, IN UINT32 OptionLen,
IN BOOLEAN FirstFragment, IN BOOLEAN FirstFragment,
IN UINT8 *Buf, OPTIONAL IN OUT UINT8 *Buf, OPTIONAL
IN OUT UINT32 *BufLen IN OUT UINT32 *BufLen
) )
{ {

View File

@ -45,7 +45,7 @@ UINT16 mIp4Id;
**/ **/
EFI_STATUS EFI_STATUS
Ip4PrependHead ( Ip4PrependHead (
IN NET_BUF *Packet, IN OUT NET_BUF *Packet,
IN IP4_HEAD *Head, IN IP4_HEAD *Head,
IN UINT8 *Option, IN UINT8 *Option,
IN UINT32 OptLen IN UINT32 OptLen
@ -106,7 +106,7 @@ Ip4PrependHead (
@param Src The source of the packet @param Src The source of the packet
@return NULL if no proper interface is found, otherwise the interface that @return NULL if no proper interface is found, otherwise the interface that
@return can be used to send the system packet from. can be used to send the system packet from.
**/ **/
IP4_INTERFACE * IP4_INTERFACE *
@ -269,8 +269,8 @@ Ip4Output (
if (IP4_IS_BROADCAST (Ip4GetNetCast (Dest, IpIf)) || (Dest == IP4_ALLONE_ADDRESS)) { if (IP4_IS_BROADCAST (Ip4GetNetCast (Dest, IpIf)) || (Dest == IP4_ALLONE_ADDRESS)) {
// //
// Set the gateway to local broadcast if the Dest is // Set the gateway to local broadcast if the Dest is
// is the broadcast address for the connected network // the broadcast address for the connected network or
// or it is local broadcast. // it is local broadcast.
// //
GateWay = IP4_ALLONE_ADDRESS; GateWay = IP4_ALLONE_ADDRESS;
@ -423,8 +423,8 @@ ON_ERROR:
**/ **/
BOOLEAN BOOLEAN
Ip4CancelPacketFragments ( Ip4CancelPacketFragments (
IP4_LINK_TX_TOKEN *Frame, IN IP4_LINK_TX_TOKEN *Frame,
VOID *Context IN VOID *Context
) )
{ {
if ((Frame->Packet == (NET_BUF *) Context) || (Frame->Context == Context)) { if ((Frame->Packet == (NET_BUF *) Context) || (Frame->Context == Context)) {

View File

@ -31,7 +31,7 @@ Abstract:
@param GateWay The nexthop address @param GateWay The nexthop address
@return NULL if failed to allocate memeory, otherwise the newly created @return NULL if failed to allocate memeory, otherwise the newly created
@return route entry. route entry.
**/ **/
IP4_ROUTE_ENTRY * IP4_ROUTE_ENTRY *
@ -83,7 +83,7 @@ Ip4FreeRouteEntry (
/** /**
Allocate and initialize a IP4 route cache entry. Allocate and initialize an IP4 route cache entry.
@param Dst The destination address @param Dst The destination address
@param Src The source address @param Src The source address
@ -92,7 +92,7 @@ Ip4FreeRouteEntry (
entries spawned from one route table entry. entries spawned from one route table entry.
@return NULL if failed to allocate memory for the cache, other point @return NULL if failed to allocate memory for the cache, other point
@return to the created route cache entry. to the created route cache entry.
**/ **/
IP4_ROUTE_CACHE_ENTRY * IP4_ROUTE_CACHE_ENTRY *
@ -154,7 +154,7 @@ Ip4FreeRouteCacheEntry (
**/ **/
VOID VOID
Ip4InitRouteCache ( Ip4InitRouteCache (
IN IP4_ROUTE_CACHE *RtCache IN OUT IP4_ROUTE_CACHE *RtCache
) )
{ {
UINT32 Index; UINT32 Index;
@ -199,10 +199,8 @@ Ip4CleanRouteCache (
/** /**
Create an empty route table, includes its internal route cache Create an empty route table, includes its internal route cache
None
@return NULL if failed to allocate memory for the route table, otherwise @return NULL if failed to allocate memory for the route table, otherwise
@return the point to newly created route table. the point to newly created route table.
**/ **/
IP4_ROUTE_TABLE * IP4_ROUTE_TABLE *
@ -291,7 +289,7 @@ Ip4FreeRouteTable (
**/ **/
VOID VOID
Ip4PurgeRouteCache ( Ip4PurgeRouteCache (
IN IP4_ROUTE_CACHE *RtCache, IN OUT IP4_ROUTE_CACHE *RtCache,
IN UINTN Tag IN UINTN Tag
) )
{ {
@ -330,7 +328,7 @@ Ip4PurgeRouteCache (
**/ **/
EFI_STATUS EFI_STATUS
Ip4AddRoute ( Ip4AddRoute (
IN IP4_ROUTE_TABLE *RtTable, IN OUT IP4_ROUTE_TABLE *RtTable,
IN IP4_ADDR Dest, IN IP4_ADDR Dest,
IN IP4_ADDR Netmask, IN IP4_ADDR Netmask,
IN IP4_ADDR Gateway IN IP4_ADDR Gateway
@ -392,7 +390,7 @@ Ip4AddRoute (
**/ **/
EFI_STATUS EFI_STATUS
Ip4DelRoute ( Ip4DelRoute (
IN IP4_ROUTE_TABLE *RtTable, IN OUT IP4_ROUTE_TABLE *RtTable,
IN IP4_ADDR Dest, IN IP4_ADDR Dest,
IN IP4_ADDR Netmask, IN IP4_ADDR Netmask,
IN IP4_ADDR Gateway IN IP4_ADDR Gateway
@ -433,7 +431,7 @@ Ip4DelRoute (
@param Src The source address @param Src The source address
@return NULL if no route entry to the (Dest, Src). Otherwise the point @return NULL if no route entry to the (Dest, Src). Otherwise the point
@return to the correct route cache entry. to the correct route cache entry.
**/ **/
IP4_ROUTE_CACHE_ENTRY * IP4_ROUTE_CACHE_ENTRY *
@ -464,8 +462,8 @@ Ip4FindRouteCache (
/** /**
Search the route table for a most specific match to the Dst. It searches Search the route table for a most specific match to the Dst. It searches
from the longest route area (mask length == 32) to the shortest route area ( from the longest route area (mask length == 32) to the shortest route area
default routes). In each route area, it will first search the instance's (default routes). In each route area, it will first search the instance's
route table, then the default route table. This is required by the following route table, then the default route table. This is required by the following
requirements: requirements:
1. IP search the route table for a most specific match 1. IP search the route table for a most specific match
@ -510,7 +508,7 @@ Ip4FindRouteEntry (
/** /**
Search the route table to route the packet. Return/creat a route Search the route table to route the packet. Return/create a route
cache if there is a route to the destination. cache if there is a route to the destination.
@param RtTable The route table to search from @param RtTable The route table to search from
@ -518,7 +516,7 @@ Ip4FindRouteEntry (
@param Src The source address to search for @param Src The source address to search for
@return NULL if failed to route packet, otherwise a route cache @return NULL if failed to route packet, otherwise a route cache
@return entry that can be used to route packet. entry that can be used to route packet.
**/ **/
IP4_ROUTE_CACHE_ENTRY * IP4_ROUTE_CACHE_ENTRY *
@ -562,9 +560,9 @@ Ip4Route (
// //
// Found a route to the Dest, if it is a direct route, the packet // Found a route to the Dest, if it is a direct route, the packet
// will be send directly to the destination, such as for connected // will be sent directly to the destination, such as for connected
// network. Otherwise, it is an indirect route, the packet will be // network. Otherwise, it is an indirect route, the packet will be
// send the next hop router. // sent to the next hop router.
// //
if ((RtEntry->Flag & IP4_DIRECT_ROUTE) != 0) { if ((RtEntry->Flag & IP4_DIRECT_ROUTE) != 0) {
NextHop = Dest; NextHop = Dest;

View File

@ -35,13 +35,13 @@ typedef enum {
#define IP4_ROUTE_CACHE_HASH(Dst, Src) (((Dst) ^ (Src)) % IP4_ROUTE_CACHE_HASH) #define IP4_ROUTE_CACHE_HASH(Dst, Src) (((Dst) ^ (Src)) % IP4_ROUTE_CACHE_HASH)
// ///
// The route entry in the route table. Dest/Netmask is the destion /// The route entry in the route table. Dest/Netmask is the destion
// network. The nexthop is the gateway to send the packet to in /// network. The nexthop is the gateway to send the packet to in
// order to reach the Dest/Netmask. If the Flag has IP4_DIRECT_ROUTE /// order to reach the Dest/Netmask. If the Flag has IP4_DIRECT_ROUTE
// on, the gateway is the destination of the IP packet itself. Route /// on, the gateway is the destination of the IP packet itself. Route
// enties of the connected network have the flag on. /// enties of the connected network have the flag on.
// ///
typedef struct { typedef struct {
LIST_ENTRY Link; LIST_ENTRY Link;
INTN RefCnt; INTN RefCnt;
@ -51,16 +51,16 @@ typedef struct {
UINT32 Flag; UINT32 Flag;
} IP4_ROUTE_ENTRY; } IP4_ROUTE_ENTRY;
// ///
// The route cache entry. The route cache entry is optional. /// The route cache entry. The route cache entry is optional.
// But it is necessary to support the ICMP redirect message. /// But it is necessary to support the ICMP redirect message.
// Check Ip4ProcessIcmpRedirect for information. /// Check Ip4ProcessIcmpRedirect for information.
// ///
// The cache entry field Tag is used to tag all the route /// The cache entry field Tag is used to tag all the route
// cache entry spawned from a route table entry. This makes /// cache entry spawned from a route table entry. This makes
// it simple to delete all the route cache entries from a /// it simple to delete all the route cache entries from a
// to-be-deleted route entry. /// to-be-deleted route entry.
// ///
typedef struct { typedef struct {
LIST_ENTRY Link; LIST_ENTRY Link;
INTN RefCnt; INTN RefCnt;
@ -70,25 +70,25 @@ typedef struct {
UINTN Tag; UINTN Tag;
} IP4_ROUTE_CACHE_ENTRY; } IP4_ROUTE_CACHE_ENTRY;
// ///
// The route cache table is organized as a hash table. Each /// The route cache table is organized as a hash table. Each
// IP4 route table has a embedded route cache. For now the /// IP4 route table has a embedded route cache. For now the
// route cache and route table are binded togehter. But keep /// route cache and route table are binded togehter. But keep
// the route cache a seperated structure in case we want to /// the route cache a seperated structure in case we want to
// detach them later. /// detach them later.
// ///
typedef struct { typedef struct {
LIST_ENTRY CacheBucket[IP4_ROUTE_CACHE_HASH]; LIST_ENTRY CacheBucket[IP4_ROUTE_CACHE_HASH];
} IP4_ROUTE_CACHE; } IP4_ROUTE_CACHE;
// ///
// Each IP4 instance has its own route table. Each ServiceBinding /// Each IP4 instance has its own route table. Each ServiceBinding
// instance has a default route table and default address. /// instance has a default route table and default address.
// ///
// All the route table entries with the same mask are linked /// All the route table entries with the same mask are linked
// together in one route area. For example, RouteArea[0] contains /// together in one route area. For example, RouteArea[0] contains
// the default routes. A route table also contains a route cache. /// the default routes. A route table also contains a route cache.
// ///
typedef struct _IP4_ROUTE_TABLE IP4_ROUTE_TABLE; typedef struct _IP4_ROUTE_TABLE IP4_ROUTE_TABLE;
struct _IP4_ROUTE_TABLE { struct _IP4_ROUTE_TABLE {