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

Fork of PicoTCP by Daniele Lacamera

Committer:
daniele
Date:
Sat Aug 03 08:50:27 2013 +0000
Revision:
51:18637a3d071f
Parent:
3:b4047e8a0123
Branch for CDC-ECM: Work in progress

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 3:b4047e8a0123 1 /*********************************************************************
daniele 3:b4047e8a0123 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 3:b4047e8a0123 3 See LICENSE and COPYING for usage.
daniele 3:b4047e8a0123 4
daniele 3:b4047e8a0123 5 .
daniele 3:b4047e8a0123 6
daniele 3:b4047e8a0123 7 Authors: Frederik Van Slycken
daniele 3:b4047e8a0123 8 *********************************************************************/
daniele 3:b4047e8a0123 9
daniele 3:b4047e8a0123 10 #include "pico_config.h"
daniele 3:b4047e8a0123 11 #include "pico_stack.h"
daniele 3:b4047e8a0123 12 #include "pico_dhcp_common.h"
daniele 3:b4047e8a0123 13
daniele 3:b4047e8a0123 14 #if defined (PICO_SUPPORT_DHCPC) || defined (PICO_SUPPORT_DHCPD)
daniele 3:b4047e8a0123 15 //this function should only be used after you checked if the options are valid! otherwise it could read from bad memory!
daniele 3:b4047e8a0123 16 uint8_t dhcp_get_next_option(uint8_t *begin, uint8_t *data, int *len, uint8_t **nextopt)
daniele 3:b4047e8a0123 17 {
daniele 3:b4047e8a0123 18 uint8_t *p;
daniele 3:b4047e8a0123 19 uint8_t type;
daniele 3:b4047e8a0123 20 uint8_t opt_len;
daniele 3:b4047e8a0123 21
daniele 3:b4047e8a0123 22 if (!begin)
daniele 3:b4047e8a0123 23 p = *nextopt;
daniele 3:b4047e8a0123 24 else
daniele 3:b4047e8a0123 25 p = begin;
daniele 3:b4047e8a0123 26
daniele 3:b4047e8a0123 27 type = *p;
daniele 3:b4047e8a0123 28 *nextopt = ++p;
daniele 3:b4047e8a0123 29 if ((type == PICO_DHCPOPT_END) || (type == PICO_DHCPOPT_PAD)) {
daniele 3:b4047e8a0123 30 memset(data, 0, *len);
daniele 3:b4047e8a0123 31 len = 0;
daniele 3:b4047e8a0123 32 return type;
daniele 3:b4047e8a0123 33 }
daniele 3:b4047e8a0123 34 opt_len = *p;
daniele 3:b4047e8a0123 35 p++;
daniele 3:b4047e8a0123 36 if (*len > opt_len)
daniele 3:b4047e8a0123 37 *len = opt_len;
daniele 3:b4047e8a0123 38 memcpy(data, p, *len);
daniele 3:b4047e8a0123 39 *nextopt = p + opt_len;
daniele 3:b4047e8a0123 40 return type;
daniele 3:b4047e8a0123 41 }
daniele 3:b4047e8a0123 42
daniele 3:b4047e8a0123 43 int is_options_valid(uint8_t *opt_buffer, int len)
daniele 3:b4047e8a0123 44 {
daniele 3:b4047e8a0123 45 uint8_t *p = opt_buffer;
daniele 3:b4047e8a0123 46 while (len > 0) {
daniele 3:b4047e8a0123 47 if (*p == PICO_DHCPOPT_END)
daniele 3:b4047e8a0123 48 return 1;
daniele 3:b4047e8a0123 49 else if (*p == PICO_DHCPOPT_PAD) {
daniele 3:b4047e8a0123 50 p++;
daniele 3:b4047e8a0123 51 len--;
daniele 3:b4047e8a0123 52 } else {
daniele 3:b4047e8a0123 53 uint8_t opt_len;
daniele 3:b4047e8a0123 54 p++;
daniele 3:b4047e8a0123 55 len--;
daniele 3:b4047e8a0123 56 if(len > 0) {
daniele 3:b4047e8a0123 57 opt_len = *p;
daniele 3:b4047e8a0123 58 p += opt_len + 1;
daniele 3:b4047e8a0123 59 len -= opt_len;
daniele 3:b4047e8a0123 60 }else
daniele 3:b4047e8a0123 61 return 0;
daniele 3:b4047e8a0123 62 }
daniele 3:b4047e8a0123 63 }
daniele 3:b4047e8a0123 64 return 0;
daniele 3:b4047e8a0123 65 }
daniele 3:b4047e8a0123 66
daniele 3:b4047e8a0123 67 #endif