Free (GPLv2) TCP/IP stack developed by TASS Belgium
Fork of PicoTCP by
modules/pico_dhcp_common.c@1:cfe8984a32b4, 2013-05-17 (annotated)
- Committer:
- tass
- Date:
- Fri May 17 12:09:59 2013 +0000
- Revision:
- 1:cfe8984a32b4
- Parent:
- libraries/picotcp/modules/pico_dhcp_common.c@0:d7f2341ab245
Update for smaller SOCKETQ
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daniele | 0:d7f2341ab245 | 1 | /********************************************************************* |
daniele | 0:d7f2341ab245 | 2 | PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved. |
daniele | 0:d7f2341ab245 | 3 | See LICENSE and COPYING for usage. |
daniele | 0:d7f2341ab245 | 4 | |
daniele | 0:d7f2341ab245 | 5 | . |
daniele | 0:d7f2341ab245 | 6 | |
daniele | 0:d7f2341ab245 | 7 | Authors: Frederik Van Slycken |
daniele | 0:d7f2341ab245 | 8 | *********************************************************************/ |
daniele | 0:d7f2341ab245 | 9 | |
daniele | 0:d7f2341ab245 | 10 | #include "pico_config.h" |
daniele | 0:d7f2341ab245 | 11 | #include "pico_stack.h" |
daniele | 0:d7f2341ab245 | 12 | #include "pico_dhcp_common.h" |
daniele | 0:d7f2341ab245 | 13 | |
daniele | 0:d7f2341ab245 | 14 | #if defined (PICO_SUPPORT_DHCPC) || defined (PICO_SUPPORT_DHCPD) |
daniele | 0:d7f2341ab245 | 15 | //this function should only be used after you checked if the options are valid! otherwise it could read from bad memory! |
daniele | 0:d7f2341ab245 | 16 | uint8_t dhcp_get_next_option(uint8_t *begin, uint8_t *data, int *len, uint8_t **nextopt) |
daniele | 0:d7f2341ab245 | 17 | { |
daniele | 0:d7f2341ab245 | 18 | uint8_t *p; |
daniele | 0:d7f2341ab245 | 19 | uint8_t type; |
daniele | 0:d7f2341ab245 | 20 | uint8_t opt_len; |
daniele | 0:d7f2341ab245 | 21 | |
daniele | 0:d7f2341ab245 | 22 | if (!begin) |
daniele | 0:d7f2341ab245 | 23 | p = *nextopt; |
daniele | 0:d7f2341ab245 | 24 | else |
daniele | 0:d7f2341ab245 | 25 | p = begin; |
daniele | 0:d7f2341ab245 | 26 | |
daniele | 0:d7f2341ab245 | 27 | type = *p; |
daniele | 0:d7f2341ab245 | 28 | *nextopt = ++p; |
daniele | 0:d7f2341ab245 | 29 | if ((type == PICO_DHCPOPT_END) || (type == PICO_DHCPOPT_PAD)) { |
daniele | 0:d7f2341ab245 | 30 | memset(data, 0, *len); |
daniele | 0:d7f2341ab245 | 31 | len = 0; |
daniele | 0:d7f2341ab245 | 32 | return type; |
daniele | 0:d7f2341ab245 | 33 | } |
daniele | 0:d7f2341ab245 | 34 | opt_len = *p; |
daniele | 0:d7f2341ab245 | 35 | p++; |
daniele | 0:d7f2341ab245 | 36 | if (*len > opt_len) |
daniele | 0:d7f2341ab245 | 37 | *len = opt_len; |
daniele | 0:d7f2341ab245 | 38 | memcpy(data, p, *len); |
daniele | 0:d7f2341ab245 | 39 | *nextopt = p + opt_len; |
daniele | 0:d7f2341ab245 | 40 | return type; |
daniele | 0:d7f2341ab245 | 41 | } |
daniele | 0:d7f2341ab245 | 42 | |
daniele | 0:d7f2341ab245 | 43 | int is_options_valid(uint8_t *opt_buffer, int len) |
daniele | 0:d7f2341ab245 | 44 | { |
daniele | 0:d7f2341ab245 | 45 | uint8_t *p = opt_buffer; |
daniele | 0:d7f2341ab245 | 46 | while (len > 0) { |
daniele | 0:d7f2341ab245 | 47 | if (*p == PICO_DHCPOPT_END) |
daniele | 0:d7f2341ab245 | 48 | return 1; |
daniele | 0:d7f2341ab245 | 49 | else if (*p == PICO_DHCPOPT_PAD) { |
daniele | 0:d7f2341ab245 | 50 | p++; |
daniele | 0:d7f2341ab245 | 51 | len--; |
daniele | 0:d7f2341ab245 | 52 | } else { |
daniele | 0:d7f2341ab245 | 53 | uint8_t opt_len; |
daniele | 0:d7f2341ab245 | 54 | p++; |
daniele | 0:d7f2341ab245 | 55 | len--; |
daniele | 0:d7f2341ab245 | 56 | if(len > 0) { |
daniele | 0:d7f2341ab245 | 57 | opt_len = *p; |
daniele | 0:d7f2341ab245 | 58 | p += opt_len + 1; |
daniele | 0:d7f2341ab245 | 59 | len -= opt_len; |
daniele | 0:d7f2341ab245 | 60 | }else |
daniele | 0:d7f2341ab245 | 61 | return 0; |
daniele | 0:d7f2341ab245 | 62 | } |
daniele | 0:d7f2341ab245 | 63 | } |
daniele | 0:d7f2341ab245 | 64 | return 0; |
daniele | 0:d7f2341ab245 | 65 | } |
daniele | 0:d7f2341ab245 | 66 | |
daniele | 0:d7f2341ab245 | 67 | #endif |