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