📄 dhcpc.lst
字号:
184 1 }
185 /*---------------------------------------------------------------------------*/
186 static void
187 send_request(void)
188 {
189 1 u8_t *end;
190 1 struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
191 1
192 1 create_msg(m);
193 1
194 1 end = add_msg_type(&m->options[4], DHCPREQUEST);
195 1 end = add_server_id(end);
196 1 end = add_req_ipaddr(end);
197 1 end = add_end(end);
198 1
199 1 uip_send(uip_appdata, end - (u8_t *)uip_appdata);
200 1 }
201 /*---------------------------------------------------------------------------*/
202 static u8_t
203 parse_options(u8_t *optptr, int len)
204 {
205 1 u8_t *end = optptr + len;
206 1 u8_t type = 0;
207 1
208 1 while(optptr < end) {
209 2 switch(*optptr) {
210 3 case DHCP_OPTION_SUBNET_MASK:
211 3 memcpy(s.netmask, optptr + 2, 4);
212 3 break;
213 3 case DHCP_OPTION_ROUTER:
214 3 memcpy(s.default_router, optptr + 2, 4);
215 3 break;
216 3 case DHCP_OPTION_DNS_SERVER:
217 3 memcpy(s.dnsaddr, optptr + 2, 4);
218 3 break;
219 3 case DHCP_OPTION_MSG_TYPE:
220 3 type = *(optptr + 2);
221 3 break;
222 3 case DHCP_OPTION_SERVER_ID:
223 3 memcpy(s.serverid, optptr + 2, 4);
224 3 break;
225 3 case DHCP_OPTION_LEASE_TIME:
226 3 memcpy(s.lease_time, optptr + 2, 4);
227 3 break;
228 3 case DHCP_OPTION_END:
229 3 return type;
230 3 }
231 2
232 2 optptr += optptr[1] + 2;
233 2 }
234 1 return type;
235 1 }
236 /*---------------------------------------------------------------------------*/
237 static u8_t
238 parse_msg(void)
239 {
C51 COMPILER V9.00 DHCPC 02/08/2010 20:58:33 PAGE 5
240 1 struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
241 1
242 1 if(m->op == DHCP_REPLY &&
243 1 memcmp(m->xid, xid, sizeof(xid)) == 0 &&
244 1 memcmp(m->chaddr, s.mac_addr, s.mac_len) == 0) {
245 2 memcpy(s.ipaddr, m->yiaddr, 4);
246 2 return parse_options(&m->options[4], uip_datalen());
247 2 }
248 1 return 0;
249 1 }
250 /*---------------------------------------------------------------------------*/
251 static
252 PT_THREAD(handle_dhcp(void))
253 {
254 1 PT_BEGIN(&s.pt);
255 3
256 3 /* try_again:*/
257 3 s.state = STATE_SENDING;
258 3 s.ticks = CLOCK_SECOND;
259 3
260 3 do {
261 4 send_discover();
262 4 timer_set(&s.timer, s.ticks);
263 4 PT_YIELD(&s.pt);
264 4 PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
265 4
266 4 if(uip_newdata() && parse_msg() == DHCPOFFER) {
267 5 s.state = STATE_OFFER_RECEIVED;
268 5 break;
269 5 }
270 4
271 4 if(s.ticks < CLOCK_SECOND * 60) {
272 5 s.ticks *= 2;
273 5 }
274 4 } while(s.state != STATE_OFFER_RECEIVED);
275 3
276 3 s.ticks = CLOCK_SECOND;
277 3
278 3 do {
279 4 send_request();
280 4 timer_set(&s.timer, s.ticks);
281 4 PT_YIELD(&s.pt);
282 4 PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
283 4
284 4 if(uip_newdata() && parse_msg() == DHCPACK) {
285 5 s.state = STATE_CONFIG_RECEIVED;
286 5 break;
287 5 }
288 4
289 4 if(s.ticks <= CLOCK_SECOND * 10) {
290 5 s.ticks += CLOCK_SECOND;
291 5 } else {
292 5 PT_RESTART(&s.pt);
293 5 }
294 4 } while(s.state != STATE_CONFIG_RECEIVED);
295 3
296 3 #if 0
printf("Got IP address %d.%d.%d.%d\n",
uip_ipaddr1(s.ipaddr), uip_ipaddr2(s.ipaddr),
uip_ipaddr3(s.ipaddr), uip_ipaddr4(s.ipaddr));
printf("Got netmask %d.%d.%d.%d\n",
uip_ipaddr1(s.netmask), uip_ipaddr2(s.netmask),
C51 COMPILER V9.00 DHCPC 02/08/2010 20:58:33 PAGE 6
uip_ipaddr3(s.netmask), uip_ipaddr4(s.netmask));
printf("Got DNS server %d.%d.%d.%d\n",
uip_ipaddr1(s.dnsaddr), uip_ipaddr2(s.dnsaddr),
uip_ipaddr3(s.dnsaddr), uip_ipaddr4(s.dnsaddr));
printf("Got default router %d.%d.%d.%d\n",
uip_ipaddr1(s.default_router), uip_ipaddr2(s.default_router),
uip_ipaddr3(s.default_router), uip_ipaddr4(s.default_router));
printf("Lease expires in %ld seconds\n",
ntohs(s.lease_time[0])*65536ul + ntohs(s.lease_time[1]));
#endif
312 3
313 3 dhcpc_configured(&s);
314 3
315 3 /* timer_stop(&s.timer);*/
316 3
317 3 /*
318 3 * PT_END restarts the thread so we do this instead. Eventually we
319 3 * should reacquire expired leases here.
320 3 */
321 3 while(1) {
322 4 PT_YIELD(&s.pt);
323 4 }
324 3
325 3 PT_END(&s.pt);
326 1 }
327 /*---------------------------------------------------------------------------*/
328 void
329 dhcpc_init(const void *mac_addr, int mac_len)
330 {
331 1 uip_ipaddr_t addr;
332 1
333 1 s.mac_addr = mac_addr;
334 1 s.mac_len = mac_len;
335 1
336 1 s.state = STATE_INITIAL;
337 1 uip_ipaddr(addr, 255,255,255,255);
338 1 s.conn = uip_udp_new(&addr, HTONS(DHCPC_SERVER_PORT));
*** WARNING C182 IN LINE 338 OF ..\UIP1.0\APPS\DHCPC\DHCPC.C: pointer to different objects
339 1 if(s.conn != NULL) {
340 2 uip_udp_bind(s.conn, HTONS(DHCPC_CLIENT_PORT));
341 2 }
342 1 PT_INIT(&s.pt);
343 1 }
344 /*---------------------------------------------------------------------------*/
345 void
346 dhcpc_appcall(void)
347 {
348 1 handle_dhcp();
349 1 }
350 /*---------------------------------------------------------------------------*/
351 void
352 dhcpc_request(void)
353 {
354 1 u16_t ipaddr[2];
355 1 if(s.state == STATE_INITIAL) {
356 2 uip_ipaddr(ipaddr, 0,0,0,0);
357 2 uip_sethostaddr(ipaddr);
358 2 /* handle_dhcp(PROCESS_EVENT_NONE, NULL);*/
359 2 }
360 1 }
361 /*---------------------------------------------------------------------------*/
C51 COMPILER V9.00 DHCPC 02/08/2010 20:58:33 PAGE 7
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2102 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 49 49
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -