110 lines
3.2 KiB
C
110 lines
3.2 KiB
C
|
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
|
||
|
//
|
||
|
// Copyright (c) 1998-2000 Microsoft Corporation
|
||
|
//
|
||
|
// This file is part of the Microsoft Research IPv6 Network Protocol Stack.
|
||
|
// You should have received a copy of the Microsoft End-User License Agreement
|
||
|
// for this software along with this release; see the file "license.txt".
|
||
|
// If not, please see http://www.research.microsoft.com/msripv6/license.htm,
|
||
|
// or write to Microsoft Research, One Microsoft Way, Redmond, WA 98052-6399.
|
||
|
//
|
||
|
// Abstract:
|
||
|
//
|
||
|
// Exported Neighbor Discovery definitions and declarations.
|
||
|
//
|
||
|
|
||
|
|
||
|
#ifndef NEIGHBOR_INCLUDED
|
||
|
#define NEIGHBOR_INCLUDED
|
||
|
|
||
|
extern uint NeighborCacheLimit;
|
||
|
|
||
|
extern uint
|
||
|
CalcReachableTime(uint BaseReachableTime);
|
||
|
|
||
|
extern void
|
||
|
NeighborCacheInit(Interface *IF);
|
||
|
|
||
|
extern void
|
||
|
NeighborCacheDestroy(Interface *IF);
|
||
|
|
||
|
extern void
|
||
|
NeighborCacheTimeout(Interface *IF);
|
||
|
|
||
|
extern void
|
||
|
NeighborCacheFlush(Interface *IF, const IPv6Addr *Addr);
|
||
|
|
||
|
extern NeighborCacheEntry *
|
||
|
FindOrCreateNeighbor(Interface *IF, const IPv6Addr *Addr);
|
||
|
|
||
|
extern void
|
||
|
NeighborCacheCleanup(Interface *IF);
|
||
|
|
||
|
extern void
|
||
|
NeighborCacheCompletePackets(Interface *IF, NDIS_PACKET *PacketList);
|
||
|
|
||
|
extern void
|
||
|
ControlNeighborLoopback(NeighborCacheEntry *NCE, int Loopback);
|
||
|
|
||
|
typedef enum {
|
||
|
NeighborRoundRobin = -1, // Time to round-robin.
|
||
|
NeighborInterfaceDisconnected = 0, // Interface is disconnected -
|
||
|
// definitely not reachable.
|
||
|
NeighborUnreachable = 1, // ND failed - probably not reachable.
|
||
|
NeighborMayBeReachable = 2 // ND succeeded, or has not concluded.
|
||
|
} NeighborReachability;
|
||
|
|
||
|
extern NeighborReachability
|
||
|
GetReachability(NeighborCacheEntry *NCE);
|
||
|
|
||
|
extern void
|
||
|
NeighborCacheReachabilityConfirmation(NeighborCacheEntry *NCE);
|
||
|
|
||
|
extern void
|
||
|
NeighborCacheReachabilityInDoubt(NeighborCacheEntry *NCE);
|
||
|
|
||
|
extern void
|
||
|
NeighborCacheProbeUnreachability(NeighborCacheEntry *NCE);
|
||
|
|
||
|
extern void
|
||
|
DADTimeout(NetTableEntry *NTE);
|
||
|
|
||
|
extern void
|
||
|
RouterSolicitSend(Interface *IF);
|
||
|
|
||
|
extern void
|
||
|
RouterSolicitTimeout(Interface *IF);
|
||
|
|
||
|
extern void
|
||
|
RouterAdvertTimeout(Interface *IF, int Force);
|
||
|
|
||
|
extern void
|
||
|
RouterSolicitReceive(IPv6Packet *Packet, ICMPv6Header UNALIGNED *ICMP);
|
||
|
|
||
|
extern void
|
||
|
RouterAdvertReceive(IPv6Packet *Packet, ICMPv6Header UNALIGNED *ICMP);
|
||
|
|
||
|
extern void
|
||
|
NeighborSolicitReceive(IPv6Packet *Packet, ICMPv6Header UNALIGNED *ICMP);
|
||
|
|
||
|
extern void
|
||
|
NeighborAdvertReceive(IPv6Packet *Packet, ICMPv6Header UNALIGNED *ICMP);
|
||
|
|
||
|
extern void
|
||
|
RedirectReceive(IPv6Packet *Packet, ICMPv6Header UNALIGNED *ICMP);
|
||
|
|
||
|
extern void
|
||
|
RedirectSend(
|
||
|
NeighborCacheEntry *NCE, // Neighbor getting the Redirect.
|
||
|
NeighborCacheEntry *TargetNCE, // Better first-hop to use
|
||
|
const IPv6Addr *Destination, // for this Destination address.
|
||
|
NetTableEntryOrInterface *NTEorIF, // Source of the Redirect.
|
||
|
PNDIS_PACKET FwdPacket, // Packet triggering the redirect.
|
||
|
uint FwdOffset,
|
||
|
uint FwdPayloadLength);
|
||
|
|
||
|
extern void
|
||
|
NeighborSolicitSend(NeighborCacheEntry *NCE, const IPv6Addr *Source);
|
||
|
|
||
|
#endif // NEIGHBOR_INCLUDED
|