ReactOS 0.4.15-dev-7931-gfd331f1
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
34/* This represents the service portion of the DHCP client API */
35
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 ) {
49 if (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
61 }
62
63 ApiUnlock();
64
65 return Send(CommPipe, &Reply );
66}
67
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
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
114 if (proto)
116
117 Adapter->DhclientInfo.client->active = NULL;
118 Adapter->DhclientInfo.client->state = S_INIT;
119
122 }
123
124 ApiUnlock();
125
126 return Send(CommPipe, &Reply );
127}
128
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
147 if (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
159
160 ApiUnlock();
161
162 return Send(CommPipe, &Reply );
163}
164
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;
191 if (proto)
194 Req->Body.StaticRefreshParams.Netmask,
195 Req->AdapterIndex,
196 &Adapter->NteContext,
197 &Adapter->NteInstance );
198 Reply.Reply = NT_SUCCESS(Status);
199
202 }
203
204 ApiUnlock();
205
206 return Send(CommPipe, &Reply );
207}
208
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}
LONG NTSTATUS
Definition: precomp.h:26
#define INADDR_NONE
Definition: tcp.c:42
#define DPRINT1
Definition: precomp.h:8
PDHCP_ADAPTER AdapterFindIndex(unsigned int indx)
Definition: adapter.c:498
DWORD DSQueryHWInfo(PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req)
Definition: api.c:68
HANDLE hAdapterStateChangedEvent
Definition: dhcpcsvc.c:20
DWORD DSStaticRefreshParams(PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req)
Definition: api.c:165
DWORD DSRenewIpAddressLease(PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req)
Definition: api.c:129
DWORD DSReleaseIpAddressLease(PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req)
Definition: api.c:90
VOID ApiFree()
Definition: api.c:30
VOID ApiLock()
Definition: api.c:22
VOID ApiInit()
Definition: api.c:18
DWORD DSGetAdapterInfo(PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req)
Definition: api.c:209
DWORD DSLeaseIpAddress(PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req)
Definition: api.c:36
static CRITICAL_SECTION ApiCriticalSection
Definition: api.c:14
VOID ApiUnlock()
Definition: api.c:26
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
void state_reboot(void *ipp)
Definition: dhclient.c:172
@ S_BOUND
Definition: dhcpd.h:175
@ S_INIT
Definition: dhcpd.h:172
@ S_STATIC
Definition: dhcpd.h:178
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
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 memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define htonl(x)
Definition: module.h:214
DWORD(* PipeSendFunc)(HANDLE CommPipe, COMM_DHCP_REPLY *Reply)
Definition: rosdhcp.h:79
union _COMM_DHCP_REQ::@3453 Body
struct _COMM_DHCP_REQ::@3453::@3457 StaticRefreshParams
ULONG NteContext
Definition: rosdhcp.h:70
ULONG NteInstance
Definition: rosdhcp.h:70
MIB_IPFORWARDROW RouterMib
Definition: rosdhcp.h:67
struct interface_info DhclientInfo
Definition: rosdhcp.h:71
struct client_state DhclientState
Definition: rosdhcp.h:72
MIB_IFROW IfMib
Definition: rosdhcp.h:66
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
struct _COMM_DHCP_REPLY::@3459 GetAdapterInfo
struct _COMM_DHCP_REPLY::@3458 QueryHWInfo
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)