Fold req_opts[] and list_opts[] into options[].type, and modify accessors
accordingly.
This commit is contained in:
parent
5d7bcbb2d4
commit
09613fd77a
@ -1,5 +1,5 @@
|
|||||||
/* options.c - DHCP options handling
|
/* options.c - DHCP options handling
|
||||||
* Time-stamp: <2011-03-30 16:01:18 nk>
|
* Time-stamp: <2011-03-30 16:31:50 nk>
|
||||||
*
|
*
|
||||||
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
||||||
*
|
*
|
||||||
@ -32,28 +32,32 @@ struct dhcp_option {
|
|||||||
uint8_t code;
|
uint8_t code;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* supported options are easily added here */
|
// Marks an option that will be sent on the parameter request list to the
|
||||||
|
// remote DHCP server.
|
||||||
|
#define OPTION_REQ 16
|
||||||
|
// Marks an option that can be sent as a list of multiple items.
|
||||||
|
#define OPTION_LIST 32
|
||||||
static struct dhcp_option options[] = {
|
static struct dhcp_option options[] = {
|
||||||
/* name[10] type code */
|
/* name[10] type code */
|
||||||
{"subnet" , OPTION_IP, 0x01},
|
{"subnet" , OPTION_IP | OPTION_LIST | OPTION_REQ, 0x01},
|
||||||
{"timezone" , OPTION_S32, 0x02},
|
{"timezone" , OPTION_S32, 0x02},
|
||||||
{"router" , OPTION_IP, 0x03},
|
{"router" , OPTION_IP | OPTION_REQ, 0x03},
|
||||||
{"timesvr" , OPTION_IP, 0x04},
|
{"timesvr" , OPTION_IP | OPTION_LIST, 0x04},
|
||||||
{"namesvr" , OPTION_IP, 0x05},
|
{"namesvr" , OPTION_IP | OPTION_LIST, 0x05},
|
||||||
{"dns" , OPTION_IP, 0x06},
|
{"dns" , OPTION_IP | OPTION_LIST | OPTION_REQ, 0x06},
|
||||||
{"logsvr" , OPTION_IP, 0x07},
|
{"logsvr" , OPTION_IP | OPTION_LIST, 0x07},
|
||||||
{"cookiesvr", OPTION_IP, 0x08},
|
{"cookiesvr", OPTION_IP | OPTION_LIST, 0x08},
|
||||||
{"lprsvr" , OPTION_IP, 0x09},
|
{"lprsvr" , OPTION_IP | OPTION_LIST, 0x09},
|
||||||
{"hostname" , OPTION_STRING, 0x0c},
|
{"hostname" , OPTION_STRING | OPTION_REQ, 0x0c},
|
||||||
{"bootsize" , OPTION_U16, 0x0d},
|
{"bootsize" , OPTION_U16, 0x0d},
|
||||||
{"domain" , OPTION_STRING, 0x0f},
|
{"domain" , OPTION_STRING | OPTION_REQ, 0x0f},
|
||||||
{"swapsvr" , OPTION_IP, 0x10},
|
{"swapsvr" , OPTION_IP, 0x10},
|
||||||
{"rootpath" , OPTION_STRING, 0x11},
|
{"rootpath" , OPTION_STRING, 0x11},
|
||||||
{"ipttl" , OPTION_U8, 0x17},
|
{"ipttl" , OPTION_U8, 0x17},
|
||||||
{"mtu" , OPTION_U16, 0x1a},
|
{"mtu" , OPTION_U16, 0x1a},
|
||||||
{"broadcast", OPTION_IP, 0x1c},
|
{"broadcast", OPTION_IP | OPTION_REQ, 0x1c},
|
||||||
{"ntpsrv" , OPTION_IP, 0x2a},
|
{"ntpsrv" , OPTION_IP | OPTION_LIST, 0x2a},
|
||||||
{"wins" , OPTION_IP, 0x2c},
|
{"wins" , OPTION_IP | OPTION_LIST, 0x2c},
|
||||||
{"requestip", OPTION_IP, 0x32},
|
{"requestip", OPTION_IP, 0x32},
|
||||||
{"lease" , OPTION_U32, 0x33},
|
{"lease" , OPTION_U32, 0x33},
|
||||||
{"dhcptype" , OPTION_U8, 0x35},
|
{"dhcptype" , OPTION_U8, 0x35},
|
||||||
@ -65,38 +69,13 @@ static struct dhcp_option options[] = {
|
|||||||
{"NONE" , OPTION_NONE, 0x00}
|
{"NONE" , OPTION_NONE, 0x00}
|
||||||
};
|
};
|
||||||
|
|
||||||
// List of options that will be sent on the parameter request list to the
|
|
||||||
// remote DHCP server.
|
|
||||||
static uint8_t req_opts[] = {
|
|
||||||
DHCP_SUBNET,
|
|
||||||
DHCP_ROUTER,
|
|
||||||
DHCP_DNS_SERVER,
|
|
||||||
DHCP_HOST_NAME,
|
|
||||||
DHCP_DOMAIN_NAME,
|
|
||||||
DHCP_BROADCAST,
|
|
||||||
0x00
|
|
||||||
};
|
|
||||||
|
|
||||||
static uint8_t list_opts[] = {
|
|
||||||
DHCP_ROUTER,
|
|
||||||
DHCP_TIME_SERVER,
|
|
||||||
DHCP_NAME_SERVER,
|
|
||||||
DHCP_DNS_SERVER,
|
|
||||||
DHCP_LOG_SERVER,
|
|
||||||
DHCP_COOKIE_SERVER,
|
|
||||||
DHCP_LPR_SERVER,
|
|
||||||
DHCP_NTP_SERVER,
|
|
||||||
DHCP_WINS_SERVER,
|
|
||||||
0x00
|
|
||||||
};
|
|
||||||
|
|
||||||
enum option_type option_type(uint8_t code)
|
enum option_type option_type(uint8_t code)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; options[i].code; ++i)
|
for (i = 0; options[i].code; ++i)
|
||||||
if (options[i].code == code)
|
if (options[i].code == code)
|
||||||
return options[i].type;
|
return options[i].type & 0xf;
|
||||||
return OPTION_NONE;
|
return OPTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char bad_option_name[] = "BADOPTION";
|
static const char bad_option_name[] = "BADOPTION";
|
||||||
@ -127,7 +106,7 @@ uint8_t option_length(uint8_t code)
|
|||||||
int i;
|
int i;
|
||||||
for (i = 0; options[i].code; i++)
|
for (i = 0; options[i].code; i++)
|
||||||
if (options[i].code == code)
|
if (options[i].code == code)
|
||||||
return option_type_length(options[i].type);
|
return option_type_length(options[i].type & 0xf);
|
||||||
log_warning("option_length: unknown length for code 0x%02x", code);
|
log_warning("option_length: unknown length for code 0x%02x", code);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -135,8 +114,8 @@ uint8_t option_length(uint8_t code)
|
|||||||
int option_valid_list(uint8_t code)
|
int option_valid_list(uint8_t code)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < sizeof list_opts; ++i)
|
for (i = 0; options[i].code; ++i)
|
||||||
if (list_opts[i] == code)
|
if ((options[i].code == code) && (options[i].type & OPTION_LIST))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -339,12 +318,14 @@ size_t add_u32_option(uint8_t *optbuf, size_t buflen, uint8_t code,
|
|||||||
/* Add a paramater request list for stubborn DHCP servers */
|
/* Add a paramater request list for stubborn DHCP servers */
|
||||||
void add_option_request_list(uint8_t *optbuf, size_t buflen)
|
void add_option_request_list(uint8_t *optbuf, size_t buflen)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j = 0;
|
||||||
uint8_t reqdata[sizeof req_opts + 1];
|
uint8_t reqdata[256];
|
||||||
|
|
||||||
reqdata[0] = DHCP_PARAM_REQ;
|
reqdata[0] = DHCP_PARAM_REQ;
|
||||||
reqdata[1] = sizeof reqdata - 2;
|
for (i = 0, j = 2; options[i].code; i++) {
|
||||||
for (i = 0; req_opts[i]; i++)
|
if (options[i].type & OPTION_REQ)
|
||||||
reqdata[i + 2] = req_opts[i];
|
reqdata[j++] = options[i].code;
|
||||||
add_option_string(optbuf, buflen, reqdata);
|
}
|
||||||
|
reqdata[1] = j - 2;
|
||||||
|
add_option_string(optbuf, buflen, reqdata);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* options.h - DHCP options handling
|
/* options.h - DHCP options handling
|
||||||
* Time-stamp: <2011-03-30 16:01:26 nk>
|
* Time-stamp: <2011-03-30 16:07:24 nk>
|
||||||
*
|
*
|
||||||
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
|
||||||
*
|
*
|
||||||
@ -71,13 +71,13 @@
|
|||||||
|
|
||||||
enum option_type {
|
enum option_type {
|
||||||
OPTION_NONE = 0,
|
OPTION_NONE = 0,
|
||||||
OPTION_IP,
|
OPTION_IP = 1,
|
||||||
OPTION_STRING,
|
OPTION_STRING = 2,
|
||||||
OPTION_U8,
|
OPTION_U8 = 3,
|
||||||
OPTION_U16,
|
OPTION_U16 = 4,
|
||||||
OPTION_S16,
|
OPTION_S16 = 5,
|
||||||
OPTION_U32,
|
OPTION_U32 = 6,
|
||||||
OPTION_S32
|
OPTION_S32 = 7
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *option_name(uint8_t code);
|
const char *option_name(uint8_t code);
|
||||||
|
Loading…
Reference in New Issue
Block a user