1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS TCP/IP protocol driver 4 * FILE: include/neighbor.h 5 * PURPOSE: Neighbor definitions 6 */ 7 8 #pragma once 9 10 #define NB_HASHMASK 0xF /* Hash mask for neighbor cache */ 11 12 typedef VOID (*PNEIGHBOR_PACKET_COMPLETE) 13 ( PVOID Context, PNDIS_PACKET Packet, NDIS_STATUS Status ); 14 15 typedef struct _NEIGHBOR_PACKET { 16 LIST_ENTRY Next; 17 PNDIS_PACKET Packet; 18 PNEIGHBOR_PACKET_COMPLETE Complete; 19 PVOID Context; 20 } NEIGHBOR_PACKET, *PNEIGHBOR_PACKET; 21 22 typedef struct NEIGHBOR_CACHE_TABLE { 23 struct NEIGHBOR_CACHE_ENTRY *Cache; /* Pointer to cache */ 24 KSPIN_LOCK Lock; /* Protecting lock */ 25 } NEIGHBOR_CACHE_TABLE, *PNEIGHBOR_CACHE_TABLE; 26 27 /* Information about a neighbor */ 28 typedef struct NEIGHBOR_CACHE_ENTRY { 29 struct NEIGHBOR_CACHE_ENTRY *Next; /* Pointer to next entry */ 30 UCHAR State; /* State of NCE */ 31 UINT EventTimer; /* Ticks since last event */ 32 UINT EventCount; /* Number of events */ 33 PIP_INTERFACE Interface; /* Pointer to interface */ 34 UINT LinkAddressLength; /* Length of link address */ 35 PVOID LinkAddress; /* Pointer to link address */ 36 IP_ADDRESS Address; /* IP address of neighbor */ 37 LIST_ENTRY PacketQueue; /* Packet queue */ 38 } NEIGHBOR_CACHE_ENTRY, *PNEIGHBOR_CACHE_ENTRY; 39 40 /* NCE states */ 41 #define NUD_INCOMPLETE 0x01 42 #define NUD_PERMANENT 0x02 43 #define NUD_STALE 0x04 44 45 /* Timeout for incomplete NCE ARP requests */ 46 #define ARP_INCOMPLETE_TIMEOUT 3 47 48 /* Number of seconds between ARP transmissions */ 49 #define ARP_RATE 900 50 51 /* Number of seconds before the NCE times out */ 52 #define ARP_COMPLETE_TIMEOUT (ARP_RATE + 9) 53 54 /* Number of seconds before retransmission */ 55 #define ARP_TIMEOUT_RETRANSMISSION 3 56 57 extern NEIGHBOR_CACHE_TABLE NeighborCache[NB_HASHMASK + 1]; 58 59 60 VOID NBTimeout( 61 VOID); 62 63 VOID NBStartup( 64 VOID); 65 66 VOID NBShutdown( 67 VOID); 68 69 VOID NBSendSolicit( 70 PNEIGHBOR_CACHE_ENTRY NCE); 71 72 PNEIGHBOR_CACHE_ENTRY NBAddNeighbor( 73 PIP_INTERFACE Interface, 74 PIP_ADDRESS Address, 75 PVOID LinkAddress, 76 UINT LinkAddressLength, 77 UCHAR Type, 78 UINT EventTimer); 79 80 VOID NBUpdateNeighbor( 81 PNEIGHBOR_CACHE_ENTRY NCE, 82 PVOID LinkAddress, 83 UCHAR State); 84 85 PNEIGHBOR_CACHE_ENTRY NBLocateNeighbor( 86 PIP_ADDRESS Address, 87 PIP_INTERFACE Interface); 88 89 PNEIGHBOR_CACHE_ENTRY NBFindOrCreateNeighbor( 90 PIP_INTERFACE Interface, 91 PIP_ADDRESS Address, 92 BOOLEAN NoTimeout); 93 94 BOOLEAN NBQueuePacket( 95 PNEIGHBOR_CACHE_ENTRY NCE, 96 PNDIS_PACKET NdisPacket, 97 PNEIGHBOR_PACKET_COMPLETE PacketComplete, 98 PVOID PacketContext); 99 100 VOID NBRemoveNeighbor( 101 PNEIGHBOR_CACHE_ENTRY NCE); 102 103 ULONG NBCopyNeighbors( 104 PIP_INTERFACE Interface, 105 PIPARP_ENTRY ArpTable); 106 107 VOID NBResetNeighborTimeout( 108 PIP_ADDRESS Address); 109 110 VOID NBDestroyNeighborsForInterface(PIP_INTERFACE Interface); 111 112 /* EOF */ 113