Free (GPLv2) TCP/IP stack developed by TASS Belgium

Fork of PicoTCP by Daniele Lacamera

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?

UserRevisionLine numberNew 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