xref: /reactos/base/services/dhcpcsvc/dhcp/api.c (revision 9393fc32)
1 /*
2  * COPYRIGHT:        See COPYING in the top level directory
3  * PROJECT:          ReactOS kernel
4  * FILE:             subsys/system/dhcp/api.c
5  * PURPOSE:          DHCP client api handlers
6  * PROGRAMMER:       arty
7  */
8 
9 #include <rosdhcp.h>
10 
11 #define NDEBUG
12 #include <reactos/debug.h>
13 
14 static CRITICAL_SECTION ApiCriticalSection;
15 
16 extern HANDLE hAdapterStateChangedEvent;
17 
ApiInit()18 VOID ApiInit() {
19     InitializeCriticalSection( &ApiCriticalSection );
20 }
21 
ApiLock()22 VOID ApiLock() {
23     EnterCriticalSection( &ApiCriticalSection );
24 }
25 
ApiUnlock()26 VOID ApiUnlock() {
27     LeaveCriticalSection( &ApiCriticalSection );
28 }
29 
ApiFree()30 VOID ApiFree() {
31     DeleteCriticalSection( &ApiCriticalSection );
32 }
33 
34 /* This represents the service portion of the DHCP client API */
35 
DSLeaseIpAddress(PipeSendFunc Send,HANDLE CommPipe,COMM_DHCP_REQ * Req)36 DWORD DSLeaseIpAddress( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req ) {
37     COMM_DHCP_REPLY Reply;
38     PDHCP_ADAPTER Adapter;
39     struct protocol* proto;
40 
41     ApiLock();
42 
43     Adapter = AdapterFindIndex( Req->AdapterIndex );
44 
45     Reply.Reply = Adapter ? 1 : 0;
46 
47     if( Adapter ) {
48         proto = find_protocol_by_adapter( &Adapter->DhclientInfo );
49         if (proto)
50             remove_protocol(proto);
51 
52         add_protocol( Adapter->DhclientInfo.name,
53                       Adapter->DhclientInfo.rfdesc, got_one,
54                       &Adapter->DhclientInfo );
55 
56         Adapter->DhclientInfo.client->state = S_INIT;
57         state_reboot(&Adapter->DhclientInfo);
58 
59         if (hAdapterStateChangedEvent != NULL)
60             SetEvent(hAdapterStateChangedEvent);
61     }
62 
63     ApiUnlock();
64 
65     return Send(CommPipe, &Reply );
66 }
67 
DSQueryHWInfo(PipeSendFunc Send,HANDLE CommPipe,COMM_DHCP_REQ * Req)68 DWORD DSQueryHWInfo( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req ) {
69     COMM_DHCP_REPLY Reply;
70     PDHCP_ADAPTER Adapter;
71 
72     ApiLock();
73 
74     Adapter = AdapterFindIndex( Req->AdapterIndex );
75 
76     Reply.Reply = Adapter ? 1 : 0;
77 
78     if (Adapter) {
79         Reply.QueryHWInfo.AdapterIndex = Req->AdapterIndex;
80         Reply.QueryHWInfo.MediaType = Adapter->IfMib.dwType;
81         Reply.QueryHWInfo.Mtu = Adapter->IfMib.dwMtu;
82         Reply.QueryHWInfo.Speed = Adapter->IfMib.dwSpeed;
83     }
84 
85     ApiUnlock();
86 
87     return Send(CommPipe,  &Reply );
88 }
89 
DSReleaseIpAddressLease(PipeSendFunc Send,HANDLE CommPipe,COMM_DHCP_REQ * Req)90 DWORD DSReleaseIpAddressLease( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req ) {
91     COMM_DHCP_REPLY Reply;
92     PDHCP_ADAPTER Adapter;
93     struct protocol* proto;
94 
95     ApiLock();
96 
97     Adapter = AdapterFindIndex( Req->AdapterIndex );
98 
99     Reply.Reply = Adapter ? 1 : 0;
100 
101     if( Adapter ) {
102         if (Adapter->NteContext)
103         {
104             DeleteIPAddress( Adapter->NteContext );
105             Adapter->NteContext = 0;
106         }
107         if (Adapter->RouterMib.dwForwardNextHop)
108         {
109             DeleteIpForwardEntry( &Adapter->RouterMib );
110             Adapter->RouterMib.dwForwardNextHop = 0;
111         }
112 
113         proto = find_protocol_by_adapter( &Adapter->DhclientInfo );
114         if (proto)
115            remove_protocol(proto);
116 
117         Adapter->DhclientInfo.client->active = NULL;
118         Adapter->DhclientInfo.client->state = S_INIT;
119 
120         if (hAdapterStateChangedEvent != NULL)
121             SetEvent(hAdapterStateChangedEvent);
122     }
123 
124     ApiUnlock();
125 
126     return Send(CommPipe,  &Reply );
127 }
128 
DSRenewIpAddressLease(PipeSendFunc Send,HANDLE CommPipe,COMM_DHCP_REQ * Req)129 DWORD DSRenewIpAddressLease( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req ) {
130     COMM_DHCP_REPLY Reply;
131     PDHCP_ADAPTER Adapter;
132     struct protocol* proto;
133 
134     ApiLock();
135 
136     Adapter = AdapterFindIndex( Req->AdapterIndex );
137 
138     if( !Adapter || Adapter->DhclientState.state == S_STATIC ) {
139         Reply.Reply = 0;
140         ApiUnlock();
141         return Send(CommPipe,  &Reply );
142     }
143 
144     Reply.Reply = 1;
145 
146     proto = find_protocol_by_adapter( &Adapter->DhclientInfo );
147     if (proto)
148         remove_protocol(proto);
149 
150     add_protocol( Adapter->DhclientInfo.name,
151                   Adapter->DhclientInfo.rfdesc, got_one,
152                   &Adapter->DhclientInfo );
153 
154     Adapter->DhclientInfo.client->state = S_INIT;
155     state_reboot(&Adapter->DhclientInfo);
156 
157     if (hAdapterStateChangedEvent != NULL)
158         SetEvent(hAdapterStateChangedEvent);
159 
160     ApiUnlock();
161 
162     return Send(CommPipe,  &Reply );
163 }
164 
DSStaticRefreshParams(PipeSendFunc Send,HANDLE CommPipe,COMM_DHCP_REQ * Req)165 DWORD DSStaticRefreshParams( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req ) {
166     NTSTATUS Status;
167     COMM_DHCP_REPLY Reply;
168     PDHCP_ADAPTER Adapter;
169     struct protocol* proto;
170 
171     ApiLock();
172 
173     Adapter = AdapterFindIndex( Req->AdapterIndex );
174 
175     Reply.Reply = Adapter ? 1 : 0;
176 
177     if( Adapter ) {
178         if (Adapter->NteContext)
179         {
180             DeleteIPAddress( Adapter->NteContext );
181             Adapter->NteContext = 0;
182         }
183         if (Adapter->RouterMib.dwForwardNextHop)
184         {
185             DeleteIpForwardEntry( &Adapter->RouterMib );
186             Adapter->RouterMib.dwForwardNextHop = 0;
187         }
188 
189         Adapter->DhclientState.state = S_STATIC;
190         proto = find_protocol_by_adapter( &Adapter->DhclientInfo );
191         if (proto)
192             remove_protocol(proto);
193         Status = AddIPAddress( Req->Body.StaticRefreshParams.IPAddress,
194                                Req->Body.StaticRefreshParams.Netmask,
195                                Req->AdapterIndex,
196                                &Adapter->NteContext,
197                                &Adapter->NteInstance );
198         Reply.Reply = NT_SUCCESS(Status);
199 
200         if (hAdapterStateChangedEvent != NULL)
201             SetEvent(hAdapterStateChangedEvent);
202     }
203 
204     ApiUnlock();
205 
206     return Send(CommPipe,  &Reply );
207 }
208 
DSGetAdapterInfo(PipeSendFunc Send,HANDLE CommPipe,COMM_DHCP_REQ * Req)209 DWORD DSGetAdapterInfo( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req ) {
210     COMM_DHCP_REPLY Reply;
211     PDHCP_ADAPTER Adapter;
212 
213     ApiLock();
214 
215     Adapter = AdapterFindIndex( Req->AdapterIndex );
216 
217     Reply.Reply = Adapter ? 1 : 0;
218 
219     if( Adapter ) {
220         Reply.GetAdapterInfo.DhcpEnabled = (S_STATIC != Adapter->DhclientState.state);
221         if (S_BOUND == Adapter->DhclientState.state) {
222             if (sizeof(Reply.GetAdapterInfo.DhcpServer) ==
223                 Adapter->DhclientState.active->serveraddress.len) {
224                 memcpy(&Reply.GetAdapterInfo.DhcpServer,
225                        Adapter->DhclientState.active->serveraddress.iabuf,
226                        Adapter->DhclientState.active->serveraddress.len);
227             } else {
228                 DPRINT1("Unexpected server address len %d\n",
229                         Adapter->DhclientState.active->serveraddress.len);
230                 Reply.GetAdapterInfo.DhcpServer = htonl(INADDR_NONE);
231             }
232             Reply.GetAdapterInfo.LeaseObtained = Adapter->DhclientState.active->obtained;
233             Reply.GetAdapterInfo.LeaseExpires = Adapter->DhclientState.active->expiry;
234         } else {
235             Reply.GetAdapterInfo.DhcpServer = htonl(INADDR_NONE);
236             Reply.GetAdapterInfo.LeaseObtained = 0;
237             Reply.GetAdapterInfo.LeaseExpires = 0;
238         }
239     }
240 
241     ApiUnlock();
242 
243     return Send(CommPipe,  &Reply );
244 }
245