410f2c2f98b2597ec69b8e704d99da1b1e925757
[reactos.git] / reactos / drivers / lib / ip / network / prefix.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: network/ip.c
5 * PURPOSE: Internet Protocol module
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * Art Yerkes (arty@users.sourceforge.net)
8 * REVISIONS:
9 * CSH 01/08-2000 Created
10 */
11
12 #include "precomp.h"
13
14
15 LIST_ENTRY PrefixListHead;
16 KSPIN_LOCK PrefixListLock;
17
18 /* --------- The Prefix List ---------- */
19
20 VOID InitPLE() {
21 /* Initialize the prefix list and protecting lock */
22 InitializeListHead(&PrefixListHead);
23 TcpipInitializeSpinLock(&PrefixListLock);
24 }
25
26
27 PPREFIX_LIST_ENTRY CreatePLE(PIP_INTERFACE IF, PIP_ADDRESS Prefix, UINT Length)
28 /*
29 * FUNCTION: Creates a prefix list entry and binds it to an interface
30 * ARGUMENTS:
31 * IF = Pointer to interface
32 * Prefix = Pointer to prefix
33 * Length = Length of prefix
34 * RETURNS:
35 * Pointer to PLE, NULL if there was not enough free resources
36 * NOTES:
37 * The prefix list entry retains a reference to the interface and
38 * the provided address. The caller is responsible for providing
39 * these references
40 */
41 {
42 PPREFIX_LIST_ENTRY PLE;
43
44 TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X) Prefix (0x%X) Length (%d).\n", IF, Prefix, Length));
45
46 TI_DbgPrint(DEBUG_IP, ("Prefix (%s).\n", A2S(Prefix)));
47
48 /* Allocate space for an PLE and set it up */
49 PLE = PoolAllocateBuffer(sizeof(PREFIX_LIST_ENTRY));
50 if (!PLE) {
51 TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
52 return NULL;
53 }
54
55 INIT_TAG(PLE, TAG('P','L','E',' '));
56 PLE->Interface = IF;
57 RtlCopyMemory(&PLE->Prefix, Prefix, sizeof(PLE->Prefix));
58 PLE->PrefixLength = Length;
59
60 /* Add PLE to the global prefix list */
61 ExInterlockedInsertTailList(&PrefixListHead, &PLE->ListEntry, &PrefixListLock);
62
63 return PLE;
64 }
65
66
67 VOID DestroyPLE(
68 PPREFIX_LIST_ENTRY PLE)
69 /*
70 * FUNCTION: Destroys an prefix list entry
71 * ARGUMENTS:
72 * PLE = Pointer to prefix list entry
73 * NOTES:
74 * The prefix list lock must be held when called
75 */
76 {
77 TI_DbgPrint(DEBUG_IP, ("Called. PLE (0x%X).\n", PLE));
78
79 TI_DbgPrint(DEBUG_IP, ("PLE (%s).\n", PLE->Prefix));
80
81 /* Unlink the prefix list entry from the list */
82 RemoveEntryList(&PLE->ListEntry);
83
84 /* And free the PLE */
85 PoolFreeBuffer(PLE);
86 }
87
88
89 VOID DestroyPLEs(
90 VOID)
91 /*
92 * FUNCTION: Destroys all prefix list entries
93 */
94 {
95 KIRQL OldIrql;
96 PLIST_ENTRY CurrentEntry;
97 PLIST_ENTRY NextEntry;
98 PPREFIX_LIST_ENTRY Current;
99
100 TI_DbgPrint(DEBUG_IP, ("Called.\n"));
101
102 TcpipAcquireSpinLock(&PrefixListLock, &OldIrql);
103
104 /* Search the list and remove every PLE we find */
105 CurrentEntry = PrefixListHead.Flink;
106 while (CurrentEntry != &PrefixListHead) {
107 NextEntry = CurrentEntry->Flink;
108 Current = CONTAINING_RECORD(CurrentEntry, PREFIX_LIST_ENTRY, ListEntry);
109 /* Destroy the PLE */
110 DestroyPLE(Current);
111 CurrentEntry = NextEntry;
112 }
113 TcpipReleaseSpinLock(&PrefixListLock, OldIrql);
114 }
115