RFC 4242 support.

This commit is contained in:
Simon Kelley
2012-07-18 16:21:11 +01:00
parent b271446f82
commit 23245c0cb2
5 changed files with 49 additions and 9 deletions

View File

@@ -54,6 +54,11 @@ version 2.62
two addresses in the same network. Thanks to Jim Bos for two addresses in the same network. Thanks to Jim Bos for
his help nailing this. his help nailing this.
Teach DHCPv6 about the RFC 4242 information-refresh-time
option, and add parsing if the minutes, hours and days
format for options. Thanks to Francois-Xavier Le Bail for
the suggestion.
version 2.61 version 2.61
Re-write interface discovery code on *BSD to use Re-write interface discovery code on *BSD to use

View File

@@ -326,6 +326,9 @@
# dnsmasq and another. # dnsmasq and another.
#dhcp-option=option6:dns-server,[::],[1234::88] #dhcp-option=option6:dns-server,[::],[1234::88]
# Ask client to poll for option changes every six hours. (RFC4242)
#dhcp-option=option6:information-refresh-time,6h
# Set the NTP time server address to be the same machine as # Set the NTP time server address to be the same machine as
# is running dnsmasq # is running dnsmasq
#dhcp-option=42,0.0.0.0 #dhcp-option=42,0.0.0.0

View File

@@ -487,15 +487,15 @@ static const struct opttab_t {
{ "x-windows-fs", 48, OT_ADDR_LIST }, { "x-windows-fs", 48, OT_ADDR_LIST },
{ "x-windows-dm", 49, OT_ADDR_LIST }, { "x-windows-dm", 49, OT_ADDR_LIST },
{ "requested-address", 50, OT_INTERNAL | OT_ADDR_LIST }, { "requested-address", 50, OT_INTERNAL | OT_ADDR_LIST },
{ "lease-time", 51, OT_INTERNAL | OT_DEC }, { "lease-time", 51, OT_INTERNAL | OT_TIME },
{ "option-overload", 52, OT_INTERNAL }, { "option-overload", 52, OT_INTERNAL },
{ "message-type", 53, OT_INTERNAL | OT_DEC }, { "message-type", 53, OT_INTERNAL | OT_DEC },
{ "server-identifier", 54, OT_INTERNAL | OT_ADDR_LIST }, { "server-identifier", 54, OT_INTERNAL | OT_ADDR_LIST },
{ "parameter-request", 55, OT_INTERNAL }, { "parameter-request", 55, OT_INTERNAL },
{ "message", 56, OT_INTERNAL }, { "message", 56, OT_INTERNAL },
{ "max-message-size", 57, OT_INTERNAL }, { "max-message-size", 57, OT_INTERNAL },
{ "T1", 58, OT_INTERNAL | OT_DEC}, { "T1", 58, OT_INTERNAL | OT_TIME},
{ "T2", 59, OT_INTERNAL | OT_DEC}, { "T2", 59, OT_INTERNAL | OT_TIME},
{ "vendor-class", 60, 0 }, { "vendor-class", 60, 0 },
{ "client-id", 61, OT_INTERNAL }, { "client-id", 61, OT_INTERNAL },
{ "nis+-domain", 64, OT_NAME }, { "nis+-domain", 64, OT_NAME },
@@ -546,6 +546,7 @@ static const struct opttab_t opttab6[] = {
{ "nis-domain", 29, OT_RFC1035_NAME }, { "nis-domain", 29, OT_RFC1035_NAME },
{ "nis+-domain", 30, OT_RFC1035_NAME }, { "nis+-domain", 30, OT_RFC1035_NAME },
{ "sntp-server", 31, OT_ADDR_LIST }, { "sntp-server", 31, OT_ADDR_LIST },
{ "information-refresh-time", 32, OT_TIME },
{ "FQDN", 39, OT_INTERNAL | OT_RFC1035_NAME }, { "FQDN", 39, OT_INTERNAL | OT_RFC1035_NAME },
{ "ntp-server", 56, OT_ADDR_LIST }, { "ntp-server", 56, OT_ADDR_LIST },
{ "bootfile-url", 59, OT_NAME }, { "bootfile-url", 59, OT_NAME },
@@ -710,14 +711,17 @@ char *option_string(int prot, unsigned int opt, unsigned char *val, int opt_len,
} }
} }
#endif #endif
else if ((ot[o].size & OT_DEC) && opt_len != 0) else if ((ot[o].size & (OT_DEC | OT_TIME)) && opt_len != 0)
{ {
unsigned int dec = 0; unsigned int dec = 0;
for (i = 0; i < opt_len; i++) for (i = 0; i < opt_len; i++)
dec = (dec << 8) | val[i]; dec = (dec << 8) | val[i];
sprintf(buf, "%u", dec); if (ot[o].size & OT_TIME)
prettyprint_time(buf, dec);
else
sprintf(buf, "%u", dec);
} }
else else
nodecode = 1; nodecode = 1;

View File

@@ -475,7 +475,7 @@ struct frec {
#define OT_NAME 0x1000 #define OT_NAME 0x1000
#define OT_CSTRING 0x0800 #define OT_CSTRING 0x0800
#define OT_DEC 0x0400 #define OT_DEC 0x0400
#define OT_TIME 0x0200
/* actions in the daemon->helper RPC */ /* actions in the daemon->helper RPC */
#define ACTION_DEL 1 #define ACTION_DEL 1

View File

@@ -764,7 +764,7 @@ static int parse_dhcp_opt(char *errstr, char *arg, int flags)
} }
else if (c == '.') else if (c == '.')
{ {
is_addr6 =is_dec = is_hex = 0; is_addr6 = is_dec = is_hex = 0;
dots++; dots++;
} }
else if (c == '-') else if (c == '-')
@@ -812,7 +812,35 @@ static int parse_dhcp_opt(char *errstr, char *arg, int flags)
else if (opt_len & (OT_NAME | OT_RFC1035_NAME | OT_CSTRING)) else if (opt_len & (OT_NAME | OT_RFC1035_NAME | OT_CSTRING))
is_addr6 = is_addr = is_dec = is_hex = 0; is_addr6 = is_addr = is_dec = is_hex = 0;
if (is_hex && digs > 1) if (found_dig && (opt_len & OT_TIME) && strlen(comma) > 0)
{
int val, fac = 1;
switch (comma[strlen(comma) - 1])
{
case 'd':
case 'D':
fac *= 24;
/* fall though */
case 'h':
case 'H':
fac *= 60;
/* fall through */
case 'm':
case 'M':
fac *= 60;
/* fall through */
case 's':
case 'S':
comma[strlen(comma) - 1] = 0;
}
new->len = 4;
new->val = opt_malloc(4);
val = atoi(comma);
*((int *)new->val) = htonl(val * fac);
}
else if (is_hex && digs > 1)
{ {
new->len = digs; new->len = digs;
new->val = opt_malloc(new->len); new->val = opt_malloc(new->len);