ReactOS 0.4.16-dev-2613-g9533ad7
api.c
Go to the documentation of this file.
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
15
17
20}
21
24}
25
28}
29
32}
33
37 LPVOID lpParameter)
38{
40
41 Status = RpcServerUseProtseqEpW(L"ncacn_np", 20, L"\\pipe\\dhcpcsvc", NULL);
42 if (Status != RPC_S_OK)
43 {
44 DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
45 return 0;
46 }
47
48 Status = RpcServerRegisterIf(Server_dhcpcsvc_v0_0_s_ifspec, NULL, NULL);
49 if (Status != RPC_S_OK)
50 {
51 DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);
52 return 0;
53 }
54
56 if (Status != RPC_S_OK)
57 {
58 DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);
59 }
60
61 return 0;
62}
63
66{
68}
69
70VOID
72{
74}
75
76/* This represents the service portion of the DHCP client API */
77
78/* Function 0 */
82 _In_ PDHCP_SERVER_NAME ServerName,
85{
86 PDHCP_ADAPTER Adapter;
87 struct protocol* proto;
89
90 DPRINT1("Server_EnableDhcp(%S %u)\n", AdapterName, Enable);
91
92 ApiLock();
93
95 if (Adapter == NULL)
96 {
98 goto done;
99 }
100
101 DPRINT1("Adapter: %p\n", Adapter);
102
103 if (Enable)
104 {
105 DPRINT1("Enable DHCP for Adapter: %p\n", Adapter);
106
107 if (Adapter->DhclientState.state != S_STATIC)
108 {
109 DPRINT1("The Adapter is already enabled!\n");
110 goto done;
111 }
112
113 add_protocol(Adapter->DhclientInfo.name,
114 Adapter->DhclientInfo.rfdesc, got_one,
115 &Adapter->DhclientInfo);
116
117 Adapter->DhclientInfo.client->state = S_INIT;
118 state_reboot(&Adapter->DhclientInfo);
119 }
120 else
121 {
122 DPRINT1("Disable DHCP for Adapter: %p\n", Adapter);
123
124 if (Adapter->DhclientState.state == S_STATIC)
125 {
126 DPRINT1("The Adapter is already disabled!\n");
127 goto done;
128 }
129
130 Adapter->DhclientState.state = S_STATIC;
132 if (proto)
134 }
135
138
139done:
140 ApiUnlock();
141
142 return ret;
143}
144
145/* Function 1 */
146DWORD
149 _In_ PDHCP_SERVER_NAME ServerName,
151{
152 PDHCP_ADAPTER Adapter;
153 struct protocol* proto;
155
156 DPRINT("Server_AcquireParameters(%S)\n", AdapterName);
157
158 ApiLock();
159
160 Adapter = AdapterFindName(AdapterName);
161 if (Adapter == NULL || Adapter->DhclientState.state == S_STATIC)
162 {
164 goto done;
165 }
166
167 DPRINT("Adapter: %p\n", Adapter);
168
170 if (proto)
172
173 add_protocol(Adapter->DhclientInfo.name,
174 Adapter->DhclientInfo.rfdesc, got_one,
175 &Adapter->DhclientInfo);
176
177 Adapter->DhclientInfo.client->state = S_INIT;
178 state_reboot(&Adapter->DhclientInfo);
179
182
183done:
184 ApiUnlock();
185
186 return ret;
187}
188
189/* Function 2 */
190DWORD
193 _In_ PDHCP_SERVER_NAME ServerName,
195{
196 DPRINT1("Server_AcquireParametersByBroadcast(%S) is unimplemented!\n", AdapterName);
197 return ERROR_SUCCESS;
198}
199
200/* Function 3 */
201DWORD
204 _In_ PDHCP_SERVER_NAME ServerName,
206{
207 PDHCP_ADAPTER Adapter;
208 struct protocol* proto;
210
211 DPRINT("Server_ReleaseParameters(%S)\n", AdapterName);
212
213 ApiLock();
214
215 Adapter = AdapterFindName(AdapterName);
216 if (Adapter == NULL)
217 {
219 goto done;
220 }
221
222 DPRINT("Adapter: %p\n", Adapter);
223
224 state_release(&Adapter->DhclientInfo);
225
227 if (proto)
229
232
233done:
234 ApiUnlock();
235
236 return ret;
237}
238
239/* Function 4 */
240DWORD
243 _In_ PDHCP_SERVER_NAME ServerName,
245{
246 PDHCP_ADAPTER Adapter;
247 HKEY hAdapterKey;
249
250 DPRINT("Server_FallbackRefreshParams(%S)\n", AdapterName);
251
252 ApiLock();
253
254 Adapter = AdapterFindName(AdapterName);
255 if (Adapter == NULL)
256 {
258 goto done;
259 }
260
261 DPRINT("Adapter: %p\n", Adapter);
262
263 if (Adapter->AlternateConfiguration)
264 {
266 Adapter->AlternateConfiguration = NULL;
267 }
268
269 hAdapterKey = FindAdapterKey(Adapter);
270 if (hAdapterKey)
271 {
272 ret = LoadAlternateConfiguration(Adapter, hAdapterKey);
273 RegCloseKey(hAdapterKey);
274 }
275
276done:
277 ApiUnlock();
278
279 return ret;
280}
281
282
283/* Function 5 */
284DWORD
287 _In_ PDHCP_SERVER_NAME ServerName,
288 _In_ DWORD AdapterIndex,
290 _In_ DWORD Netmask)
291{
292 PDHCP_ADAPTER Adapter;
293 struct protocol* proto;
295
296 DPRINT("Server_StaticRefreshParams()\n");
297
298 ApiLock();
299
300 Adapter = AdapterFindIndex(AdapterIndex);
301 if (Adapter == NULL)
302 {
304 goto done;
305 }
306
307 DPRINT("Adapter: %p\n", Adapter);
308
309 if (Adapter->NteContext)
310 {
311 DeleteIPAddress(Adapter->NteContext);
312 Adapter->NteContext = 0;
313 }
314 if (Adapter->RouterMib.dwForwardNextHop)
315 {
317 Adapter->RouterMib.dwForwardNextHop = 0;
318 }
319
320 Adapter->DhclientState.state = S_STATIC;
322 if (proto)
324
326 Netmask,
327 AdapterIndex,
328 &Adapter->NteContext,
329 &Adapter->NteInstance);
330
333
334done:
335 ApiUnlock();
336
337 return ret;
338}
339
340/* Function 6 */
341DWORD
344 _In_ PDHCP_SERVER_NAME ServerName)
345{
346 DPRINT1("Server_RemoveDNSRegistrations()\n");
347 /* FIXME: Call dnsapi.DnsRemoveRegistrations() */
348 return ERROR_SUCCESS;
349}
#define DPRINT1
Definition: precomp.h:8
PDHCP_ADAPTER AdapterFindIndex(unsigned int indx)
Definition: adapter.c:608
PDHCP_ADAPTER AdapterFindName(const WCHAR *name)
Definition: adapter.c:622
HKEY FindAdapterKey(PDHCP_ADAPTER Adapter)
Definition: adapter.c:105
DWORD LoadAlternateConfiguration(PDHCP_ADAPTER Adapter, HKEY hAdapterKey)
Definition: adapter.c:154
DWORD __stdcall Server_AcquireParametersByBroadcast(_In_ PDHCP_SERVER_NAME ServerName, _In_ LPWSTR AdapterName)
Definition: api.c:192
DWORD __stdcall Server_ReleaseParameters(_In_ PDHCP_SERVER_NAME ServerName, _In_ LPWSTR AdapterName)
Definition: api.c:203
HANDLE hAdapterStateChangedEvent
Definition: dhcpcsvc.c:21
VOID ShutdownRpc(VOID)
Definition: api.c:71
VOID ApiFree()
Definition: api.c:30
DWORD __stdcall Server_EnableDhcp(_In_ PDHCP_SERVER_NAME ServerName, _In_ LPWSTR AdapterName, _In_ BOOL Enable)
Definition: api.c:81
VOID ApiLock()
Definition: api.c:22
VOID ApiInit()
Definition: api.c:18
DWORD __stdcall Server_FallbackRefreshParams(_In_ PDHCP_SERVER_NAME ServerName, _In_ LPWSTR AdapterName)
Definition: api.c:242
DWORD __stdcall Server_RemoveDNSRegistrations(_In_ PDHCP_SERVER_NAME ServerName)
Definition: api.c:343
DWORD __stdcall Server_StaticRefreshParams(_In_ PDHCP_SERVER_NAME ServerName, _In_ DWORD AdapterIndex, _In_ DWORD Address, _In_ DWORD Netmask)
Definition: api.c:286
DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter)
Definition: api.c:36
DWORD __stdcall Server_AcquireParameters(_In_ PDHCP_SERVER_NAME ServerName, _In_ LPWSTR AdapterName)
Definition: api.c:148
static CRITICAL_SECTION ApiCriticalSection
Definition: api.c:14
VOID ApiUnlock()
Definition: api.c:26
HANDLE InitRpc(VOID)
Definition: api.c:65
void add_protocol(char *name, int fd, void(*handler)(struct protocol *), void *local)
Definition: dispatch.c:342
void remove_protocol(struct protocol *proto)
Definition: dispatch.c:359
void got_one(struct protocol *l)
Definition: dispatch.c:194
struct protocol * find_protocol_by_adapter(struct interface_info *info)
Definition: dispatch.c:412
#define RegCloseKey(hKey)
Definition: registry.h:49
#define free
Definition: debug_ros.c:5
#define ERROR_SUCCESS
Definition: deptool.c:10
void state_release(void *ipp)
Definition: dhclient.c:231
void state_reboot(void *ipp)
Definition: dhclient.c:172
wchar_t * PDHCP_SERVER_NAME
Definition: dhcpcsvc.idl:7
@ S_INIT
Definition: dhcpd.h:173
@ S_STATIC
Definition: dhcpd.h:179
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
#define __stdcall
Definition: corecrt.h:120
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
Status
Definition: gdiplustypes.h:25
DWORD WINAPI AddIPAddress(IPAddr Address, IPMask Netmask, DWORD IfIndex, PULONG NteContext, PULONG NteInstance)
Definition: iphlpapi_main.c:67
DWORD WINAPI DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute)
DWORD WINAPI DeleteIPAddress(ULONG NTEContext)
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE _Out_ PUINT _In_ UINT _In_ NDIS_HANDLE _In_ NDIS_HANDLE _In_ PNDIS_STRING AdapterName
Definition: ndis.h:6016
#define _In_
Definition: no_sal2.h:158
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
static WCHAR Address[46]
Definition: ping.c:68
RPC_STATUS WINAPI RpcServerListen(UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait)
Definition: rpc_server.c:1520
RPC_STATUS WINAPI RpcServerRegisterIf(RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, RPC_MGR_EPV *MgrEpv)
Definition: rpc_server.c:1116
RPC_STATUS WINAPI RpcServerUseProtseqEpW(RPC_WSTR Protseq, UINT MaxCalls, RPC_WSTR Endpoint, LPVOID SecurityDescriptor)
Definition: rpc_server.c:927
RPC_STATUS WINAPI RpcMgmtStopServerListening(RPC_BINDING_HANDLE Binding)
Definition: rpc_server.c:1596
#define RPC_C_LISTEN_MAX_CALLS_DEFAULT
Definition: rpcdce.h:122
#define RPC_S_OK
Definition: rpcnterr.h:22
long RPC_STATUS
Definition: rpc.h:48
#define DPRINT
Definition: sndvol32.h:73
ULONG NteContext
Definition: rosdhcp.h:85
ULONG NteInstance
Definition: rosdhcp.h:85
MIB_IPFORWARDROW RouterMib
Definition: rosdhcp.h:82
PALTERNATE_CONFIGURATION AlternateConfiguration
Definition: rosdhcp.h:80
struct interface_info DhclientInfo
Definition: rosdhcp.h:86
struct client_state DhclientState
Definition: rosdhcp.h:87
DWORD dwForwardNextHop
Definition: ipmib.h:74
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:687
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
uint16_t * LPWSTR
Definition: typedefs.h:56
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6