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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers pico_dhcp_common.c Source File

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