Free (GPLv2) TCP/IP stack developed by TASS Belgium
Dependents: lpc1768-picotcp-demo ZeroMQ_PicoTCP_Publisher_demo TCPSocket_HelloWorld_PicoTCP Pico_TCP_UDP_Test ... more
pico_dhcp_common.c
00001 /********************************************************************* 00002 PicoTCP. Copyright (c) 2012-2015 Altran Intelligent Systems. Some rights reserved. 00003 See LICENSE and COPYING for usage. 00004 00005 . 00006 00007 Authors: Frederik Van Slycken 00008 *********************************************************************/ 00009 00010 #include "pico_config.h" 00011 #include "pico_stack.h" 00012 #include "pico_dhcp_common.h" 00013 00014 #if defined (PICO_SUPPORT_DHCPC) || defined (PICO_SUPPORT_DHCPD) 00015 /* pico_dhcp_are_options_valid needs to be called first to prevent illegal memory access */ 00016 /* The argument pointer is moved forward to the next option */ 00017 struct pico_dhcp_opt *pico_dhcp_next_option(struct pico_dhcp_opt **ptr) 00018 { 00019 uint8_t **p = (uint8_t **)ptr; 00020 struct pico_dhcp_opt *opt = *ptr; 00021 00022 if (opt->code == PICO_DHCP_OPT_END) 00023 return NULL; 00024 00025 if (opt->code == PICO_DHCP_OPT_PAD) { 00026 *p += 1; 00027 return *ptr; 00028 } 00029 00030 *p += (opt->len + 2); /* (len + 2) to account for code and len octet */ 00031 return *ptr; 00032 } 00033 00034 uint8_t pico_dhcp_are_options_valid(void *ptr, int32_t len) 00035 { 00036 uint8_t optlen = 0, *p = ptr; 00037 00038 while (len > 0) { 00039 switch (*p) 00040 { 00041 case PICO_DHCP_OPT_END: 00042 return 1; 00043 00044 case PICO_DHCP_OPT_PAD: 00045 p++; 00046 len--; 00047 break; 00048 00049 default: 00050 p++; /* move pointer from code octet to len octet */ 00051 len--; 00052 if ((len <= 0) || (len - (*p + 1) < 0)) /* (*p + 1) to account for len octet */ 00053 return 0; 00054 00055 optlen = *p; 00056 p += optlen + 1; 00057 len -= optlen; 00058 break; 00059 } 00060 } 00061 return 0; 00062 } 00063 00064 uint8_t pico_dhcp_opt_netmask(void *ptr, struct pico_ip4 *ip) 00065 { 00066 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00067 00068 /* option: netmask */ 00069 opt->code = PICO_DHCP_OPT_NETMASK; 00070 opt->len = PICO_DHCP_OPTLEN_NETMASK - PICO_DHCP_OPTLEN_HDR; 00071 opt->ext.netmask.ip = *ip; 00072 return PICO_DHCP_OPTLEN_NETMASK; 00073 } 00074 00075 uint8_t pico_dhcp_opt_router(void *ptr, struct pico_ip4 *ip) 00076 { 00077 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00078 00079 /* option: router */ 00080 opt->code = PICO_DHCP_OPT_ROUTER; 00081 opt->len = PICO_DHCP_OPTLEN_ROUTER - PICO_DHCP_OPTLEN_HDR; 00082 opt->ext.router.ip = *ip; 00083 return PICO_DHCP_OPTLEN_ROUTER; 00084 } 00085 00086 uint8_t pico_dhcp_opt_dns(void *ptr, struct pico_ip4 *ip) 00087 { 00088 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00089 00090 /* option: dns */ 00091 opt->code = PICO_DHCP_OPT_DNS; 00092 opt->len = PICO_DHCP_OPTLEN_DNS - PICO_DHCP_OPTLEN_HDR; 00093 opt->ext.dns1.ip = *ip; 00094 return PICO_DHCP_OPTLEN_DNS; 00095 } 00096 00097 uint8_t pico_dhcp_opt_broadcast(void *ptr, struct pico_ip4 *ip) 00098 { 00099 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00100 00101 /* option: broadcast */ 00102 opt->code = PICO_DHCP_OPT_BROADCAST; 00103 opt->len = PICO_DHCP_OPTLEN_BROADCAST - PICO_DHCP_OPTLEN_HDR; 00104 opt->ext.broadcast.ip = *ip; 00105 return PICO_DHCP_OPTLEN_BROADCAST; 00106 } 00107 00108 uint8_t pico_dhcp_opt_reqip(void *ptr, struct pico_ip4 *ip) 00109 { 00110 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00111 00112 /* option: request IP address */ 00113 opt->code = PICO_DHCP_OPT_REQIP; 00114 opt->len = PICO_DHCP_OPTLEN_REQIP - PICO_DHCP_OPTLEN_HDR; 00115 opt->ext.req_ip.ip = *ip; 00116 return PICO_DHCP_OPTLEN_REQIP; 00117 } 00118 00119 uint8_t pico_dhcp_opt_leasetime(void *ptr, uint32_t time) 00120 { 00121 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00122 00123 /* option: lease time */ 00124 opt->code = PICO_DHCP_OPT_LEASETIME; 00125 opt->len = PICO_DHCP_OPTLEN_LEASETIME - PICO_DHCP_OPTLEN_HDR; 00126 opt->ext.lease_time.time = time; 00127 return PICO_DHCP_OPTLEN_LEASETIME; 00128 } 00129 00130 uint8_t pico_dhcp_opt_msgtype(void *ptr, uint8_t type) 00131 { 00132 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00133 00134 /* option: message type */ 00135 opt->code = PICO_DHCP_OPT_MSGTYPE; 00136 opt->len = PICO_DHCP_OPTLEN_MSGTYPE - PICO_DHCP_OPTLEN_HDR; 00137 opt->ext.msg_type.type = type; 00138 return PICO_DHCP_OPTLEN_MSGTYPE; 00139 } 00140 00141 uint8_t pico_dhcp_opt_serverid(void *ptr, struct pico_ip4 *ip) 00142 { 00143 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00144 00145 /* option: server identifier */ 00146 opt->code = PICO_DHCP_OPT_SERVERID; 00147 opt->len = PICO_DHCP_OPTLEN_SERVERID - PICO_DHCP_OPTLEN_HDR; 00148 opt->ext.server_id.ip = *ip; 00149 return PICO_DHCP_OPTLEN_SERVERID; 00150 } 00151 00152 uint8_t pico_dhcp_opt_paramlist(void *ptr) 00153 { 00154 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00155 00156 /* option: parameter list */ 00157 opt->code = PICO_DHCP_OPT_PARAMLIST; 00158 opt->len = PICO_DHCP_OPTLEN_PARAMLIST - PICO_DHCP_OPTLEN_HDR; 00159 opt->ext.param_list.code[0] = PICO_DHCP_OPT_NETMASK; 00160 opt->ext.param_list.code[1] = PICO_DHCP_OPT_TIME; 00161 opt->ext.param_list.code[2] = PICO_DHCP_OPT_ROUTER; 00162 opt->ext.param_list.code[3] = PICO_DHCP_OPT_HOSTNAME; 00163 opt->ext.param_list.code[4] = PICO_DHCP_OPT_RENEWALTIME; 00164 opt->ext.param_list.code[5] = PICO_DHCP_OPT_REBINDINGTIME; 00165 opt->ext.param_list.code[6] = PICO_DHCP_OPT_DNS; 00166 return PICO_DHCP_OPTLEN_PARAMLIST; 00167 } 00168 00169 uint8_t pico_dhcp_opt_maxmsgsize(void *ptr, uint16_t size) 00170 { 00171 struct pico_dhcp_opt *opt = (struct pico_dhcp_opt *)ptr; 00172 00173 /* option: maximum message size */ 00174 opt->code = PICO_DHCP_OPT_MAXMSGSIZE; 00175 opt->len = PICO_DHCP_OPTLEN_MAXMSGSIZE - PICO_DHCP_OPTLEN_HDR; 00176 opt->ext.max_msg_size.size = short_be(size); 00177 return PICO_DHCP_OPTLEN_MAXMSGSIZE; 00178 } 00179 00180 uint8_t pico_dhcp_opt_end(void *ptr) 00181 { 00182 uint8_t *opt = (uint8_t *)ptr; 00183 00184 /* option: end of options */ 00185 *opt = PICO_DHCP_OPT_END; 00186 return PICO_DHCP_OPTLEN_END; 00187 } 00188 00189 #endif
Generated on Tue Jul 12 2022 15:59:21 by 1.7.2