ReactOS 0.4.16-dev-1948-gd260c1d
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,
84{
85 PDHCP_ADAPTER Adapter;
86 struct protocol* proto;
88
89 DPRINT("Server_AcquireParameters()\n");
90
91 ApiLock();
92
94 if (Adapter == NULL || Adapter->DhclientState.state == S_STATIC)
95 {
97 goto done;
98 }
99
100 DPRINT("Adapter: %p\n", Adapter);
101
103 if (proto)
105
106 add_protocol(Adapter->DhclientInfo.name,
107 Adapter->DhclientInfo.rfdesc, got_one,
108 &Adapter->DhclientInfo);
109
110 Adapter->DhclientInfo.client->state = S_INIT;
111 state_reboot(&Adapter->DhclientInfo);
112
115
116done:
117 ApiUnlock();
118
119 return ret;
120}
121
122
123/* Function 1 */
124DWORD
127 _In_ PDHCP_SERVER_NAME ServerName,
129{
130 PDHCP_ADAPTER Adapter;
131 struct protocol* proto;
133
134 DPRINT("Server_ReleaseParameters()\n");
135
136 ApiLock();
137
138 Adapter = AdapterFindName(AdapterName);
139 if (Adapter == NULL)
140 {
142 goto done;
143 }
144
145 DPRINT("Adapter: %p\n", Adapter);
146
147 state_release(&Adapter->DhclientInfo);
148
150 if (proto)
152
155
156done:
157 ApiUnlock();
158
159 return ret;
160}
161
162/* Function 2 */
163DWORD
166 _In_ PDHCP_SERVER_NAME ServerName,
167 _In_ DWORD AdapterIndex,
168 _Out_ PDWORD MediaType,
169 _Out_ PDWORD Mtu,
170 _Out_ PDWORD Speed)
171{
172 PDHCP_ADAPTER Adapter;
174
175 DPRINT("Server_QueryHWInfo()\n");
176
177 ApiLock();
178
179 Adapter = AdapterFindIndex(AdapterIndex);
180 if (Adapter == NULL)
181 {
183 goto done;
184 }
185
186 DPRINT("Adapter: %p\n", Adapter);
187
188 *MediaType = Adapter->IfMib.dwType;
189 *Mtu = Adapter->IfMib.dwMtu;
190 *Speed = Adapter->IfMib.dwSpeed;
191
192done:
193 ApiUnlock();
194
195 return ret;
196}
197
198/* Function 3 */
199DWORD
202 _In_ PDHCP_SERVER_NAME ServerName,
203 _In_ DWORD AdapterIndex,
205 _In_ DWORD Netmask)
206{
207 PDHCP_ADAPTER Adapter;
208 struct protocol* proto;
210
211 DPRINT("Server_StaticRefreshParams()\n");
212
213 ApiLock();
214
215 Adapter = AdapterFindIndex(AdapterIndex);
216 if (Adapter == NULL)
217 {
219 goto done;
220 }
221
222 DPRINT("Adapter: %p\n", Adapter);
223
224 if (Adapter->NteContext)
225 {
226 DeleteIPAddress(Adapter->NteContext);
227 Adapter->NteContext = 0;
228 }
229 if (Adapter->RouterMib.dwForwardNextHop)
230 {
232 Adapter->RouterMib.dwForwardNextHop = 0;
233 }
234
235 Adapter->DhclientState.state = S_STATIC;
237 if (proto)
239
241 Netmask,
242 AdapterIndex,
243 &Adapter->NteContext,
244 &Adapter->NteInstance);
245
248
249done:
250 ApiUnlock();
251
252 return ret;
253}
254
255/* Function 4 */
256DWORD
259 _In_ PDHCP_SERVER_NAME ServerName)
260{
261 DPRINT1("Server_RemoveDNSRegistrations()\n");
262 /* FIXME: Call dnsapi.DnsRemoveRegistrations() */
263 return ERROR_SUCCESS;
264}
#define DPRINT1
Definition: precomp.h:8
PDHCP_ADAPTER AdapterFindIndex(unsigned int indx)
Definition: adapter.c:500
PDHCP_ADAPTER AdapterFindName(const WCHAR *name)
Definition: adapter.c:514
DWORD __stdcall Server_ReleaseParameters(_In_ PDHCP_SERVER_NAME ServerName, _In_ LPWSTR AdapterName)
Definition: api.c:126
HANDLE hAdapterStateChangedEvent
Definition: dhcpcsvc.c:20
DWORD __stdcall Server_QueryHWInfo(_In_ PDHCP_SERVER_NAME ServerName, _In_ DWORD AdapterIndex, _Out_ PDWORD MediaType, _Out_ PDWORD Mtu, _Out_ PDWORD Speed)
Definition: api.c:165
VOID ShutdownRpc(VOID)
Definition: api.c:71
VOID ApiFree()
Definition: api.c:30
VOID ApiLock()
Definition: api.c:22
VOID ApiInit()
Definition: api.c:18
DWORD __stdcall Server_RemoveDNSRegistrations(_In_ PDHCP_SERVER_NAME ServerName)
Definition: api.c:258
DWORD __stdcall Server_StaticRefreshParams(_In_ PDHCP_SERVER_NAME ServerName, _In_ DWORD AdapterIndex, _In_ DWORD Address, _In_ DWORD Netmask)
Definition: api.c:201
DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter)
Definition: api.c:36
DWORD __stdcall Server_AcquireParameters(_In_ PDHCP_SERVER_NAME ServerName, _In_ LPWSTR AdapterName)
Definition: api.c:81
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 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
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
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 _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
DWORD * PDWORD
Definition: pedump.c:68
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:72
ULONG NteInstance
Definition: rosdhcp.h:72
MIB_IPFORWARDROW RouterMib
Definition: rosdhcp.h:69
struct interface_info DhclientInfo
Definition: rosdhcp.h:73
struct client_state DhclientState
Definition: rosdhcp.h:74
MIB_IFROW IfMib
Definition: rosdhcp.h:68
DWORD dwSpeed
Definition: ifmib.h:41
DWORD dwMtu
Definition: ifmib.h:40
DWORD dwType
Definition: ifmib.h:39
DWORD dwForwardNextHop
Definition: ipmib.h:74
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
#define __stdcall
Definition: typedefs.h:25
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6
WCHAR * LPWSTR
Definition: xmlstorage.h:184