ReactOS  0.4.12-dev-102-g4b7f1e0
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 
19  InitializeCriticalSection( &ApiCriticalSection );
20 }
21 
23  EnterCriticalSection( &ApiCriticalSection );
24 }
25 
27  LeaveCriticalSection( &ApiCriticalSection );
28 }
29 
31  DeleteCriticalSection( &ApiCriticalSection );
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 ) {
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 (AdapterStateChangedEvent != NULL)
60  SetEvent(AdapterStateChangedEvent);
61  }
62 
63  ApiUnlock();
64 
65  return Send( &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( &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 
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 (AdapterStateChangedEvent != NULL)
121  SetEvent(AdapterStateChangedEvent);
122  }
123 
124  ApiUnlock();
125 
126  return Send( &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( &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 (AdapterStateChangedEvent != NULL)
158  SetEvent(AdapterStateChangedEvent);
159 
160  ApiUnlock();
161 
162  return Send( &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;
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 (AdapterStateChangedEvent != NULL)
201  SetEvent(AdapterStateChangedEvent);
202  }
203 
204  ApiUnlock();
205 
206  return Send( &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( &Reply );
244 }
ULONG NteInstance
Definition: rosdhcp.h:70
Definition: dhcpd.h:175
MIB_IFROW IfMib
Definition: rosdhcp.h:66
struct _COMM_DHCP_REPLY::@3289 GetAdapterInfo
void state_reboot(void *ipp)
Definition: dhclient.c:180
DWORD WINAPI DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute)
DWORD dwType
Definition: ifmib.h:39
ULONG NteContext
Definition: rosdhcp.h:70
#define htonl(x)
Definition: module.h:212
#define INADDR_NONE
Definition: tcp.c:42
Definition: dhcpd.h:172
LONG NTSTATUS
Definition: precomp.h:26
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:679
void got_one(struct protocol *l)
Definition: dispatch.c:195
VOID ApiFree()
Definition: api.c:30
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
union _COMM_DHCP_REQ::@3283 Body
void remove_protocol(struct protocol *proto)
Definition: dispatch.c:360
DWORD DSGetAdapterInfo(PipeSendFunc Send, COMM_DHCP_REQ *Req)
Definition: api.c:209
DWORD DSRenewIpAddressLease(PipeSendFunc Send, COMM_DHCP_REQ *Req)
Definition: api.c:129
DWORD dwSpeed
Definition: ifmib.h:41
VOID ApiInit()
Definition: api.c:18
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:697
smooth NULL
Definition: ftsmooth.c:416
static CRITICAL_SECTION ApiCriticalSection
Definition: api.c:14
MIB_IPFORWARDROW RouterMib
Definition: rosdhcp.h:67
DWORD DSStaticRefreshParams(PipeSendFunc Send, COMM_DHCP_REQ *Req)
Definition: api.c:165
struct protocol * find_protocol_by_adapter(struct interface_info *info)
Definition: dispatch.c:413
DWORD WINAPI AddIPAddress(IPAddr Address, IPMask Netmask, DWORD IfIndex, PULONG NteContext, PULONG NteInstance)
Definition: iphlpapi_main.c:71
DWORD dwForwardNextHop
Definition: ipmib.h:74
void add_protocol(char *name, int fd, void(*handler)(struct protocol *), void *local)
Definition: dispatch.c:343
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:24
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD DSQueryHWInfo(PipeSendFunc Send, COMM_DHCP_REQ *Req)
Definition: api.c:68
struct _COMM_DHCP_REPLY::@3288 QueryHWInfo
PDHCP_ADAPTER AdapterFindIndex(unsigned int indx)
Definition: adapter.c:513
struct interface_info DhclientInfo
Definition: rosdhcp.h:71
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
struct client_state DhclientState
Definition: rosdhcp.h:72
Status
Definition: gdiplustypes.h:24
DWORD(* PipeSendFunc)(COMM_DHCP_REPLY *Reply)
Definition: rosdhcp.h:79
DWORD WINAPI DeleteIPAddress(ULONG NTEContext)
DWORD DSReleaseIpAddressLease(PipeSendFunc Send, COMM_DHCP_REQ *Req)
Definition: api.c:90
DWORD DSLeaseIpAddress(PipeSendFunc Send, COMM_DHCP_REQ *Req)
Definition: api.c:36
#define DPRINT1
Definition: precomp.h:8
VOID ApiUnlock()
Definition: api.c:26
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
HANDLE AdapterStateChangedEvent
Definition: dispatch.c:51
DWORD dwMtu
Definition: ifmib.h:40
struct _COMM_DHCP_REQ::@3283::@3287 StaticRefreshParams
VOID ApiLock()
Definition: api.c:22