CDC/ECM driver for mbed, based on USBDevice by mbed-official. Uses PicoTCP to access Ethernet USB device. License: GPLv2

Dependents:   USBEthernet_TEST

Fork of USB_Ethernet by Daniele Lacamera

Committer:
daniele
Date:
Sat Aug 03 13:16:14 2013 +0000
Revision:
2:540f6e142d59
Moved to single package

Who changed what in which revision?

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