udhcp: finish support of classless static routes (now the correct patch!)
Signed-off-by: Michael McTernan <Michael.McTernan.2001@cs.bris.ac.uk> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
7b57ff4436
commit
ee0f444f11
@ -57,13 +57,13 @@ const struct dhcp_optflag dhcp_optflags[] = {
|
|||||||
{ OPTION_DNS_STRING | OPTION_LIST , 0x77 }, /* DHCP_DOMAIN_SEARCH */
|
{ OPTION_DNS_STRING | OPTION_LIST , 0x77 }, /* DHCP_DOMAIN_SEARCH */
|
||||||
{ OPTION_SIP_SERVERS , 0x78 }, /* DHCP_SIP_SERVERS */
|
{ OPTION_SIP_SERVERS , 0x78 }, /* DHCP_SIP_SERVERS */
|
||||||
#endif
|
#endif
|
||||||
{ OPTION_STATIC_ROUTES , 0x79 }, /* DHCP_STATIC_ROUTES */
|
{ OPTION_STATIC_ROUTES | OPTION_LIST , 0x79 }, /* DHCP_STATIC_ROUTES */
|
||||||
#if ENABLE_FEATURE_UDHCP_8021Q
|
#if ENABLE_FEATURE_UDHCP_8021Q
|
||||||
{ OPTION_U16 , 0x84 }, /* DHCP_VLAN_ID */
|
{ OPTION_U16 , 0x84 }, /* DHCP_VLAN_ID */
|
||||||
{ OPTION_U8 , 0x85 }, /* DHCP_VLAN_PRIORITY */
|
{ OPTION_U8 , 0x85 }, /* DHCP_VLAN_PRIORITY */
|
||||||
#endif
|
#endif
|
||||||
{ OPTION_6RD , 0xd4 }, /* DHCP_6RD */
|
{ OPTION_6RD , 0xd4 }, /* DHCP_6RD */
|
||||||
{ OPTION_STATIC_ROUTES , 0xf9 }, /* DHCP_MS_STATIC_ROUTES */
|
{ OPTION_STATIC_ROUTES | OPTION_LIST , 0xf9 }, /* DHCP_MS_STATIC_ROUTES */
|
||||||
{ OPTION_STRING , 0xfc }, /* DHCP_WPAD */
|
{ OPTION_STRING , 0xfc }, /* DHCP_WPAD */
|
||||||
|
|
||||||
/* Options below have no match in dhcp_option_strings[],
|
/* Options below have no match in dhcp_option_strings[],
|
||||||
@ -123,8 +123,6 @@ const char dhcp_option_strings[] ALIGN1 =
|
|||||||
// is not handled yet by "string->option" conversion code:
|
// is not handled yet by "string->option" conversion code:
|
||||||
"sipsrv" "\0" /* DHCP_SIP_SERVERS */
|
"sipsrv" "\0" /* DHCP_SIP_SERVERS */
|
||||||
#endif
|
#endif
|
||||||
// doesn't work in udhcpd.conf since OPTION_STATIC_ROUTES
|
|
||||||
// is not handled yet by "string->option" conversion code:
|
|
||||||
"staticroutes" "\0"/* DHCP_STATIC_ROUTES */
|
"staticroutes" "\0"/* DHCP_STATIC_ROUTES */
|
||||||
#if ENABLE_FEATURE_UDHCP_8021Q
|
#if ENABLE_FEATURE_UDHCP_8021Q
|
||||||
"vlanid" "\0" /* DHCP_VLAN_ID */
|
"vlanid" "\0" /* DHCP_VLAN_ID */
|
||||||
@ -338,7 +336,8 @@ int FAST_FUNC udhcp_str2nip(const char *str, void *arg)
|
|||||||
lsa = host_and_af2sockaddr(str, 0, AF_INET);
|
lsa = host_and_af2sockaddr(str, 0, AF_INET);
|
||||||
if (!lsa)
|
if (!lsa)
|
||||||
return 0;
|
return 0;
|
||||||
*(uint32_t*)arg = lsa->u.sin.sin_addr.s_addr;
|
/* arg maybe unaligned */
|
||||||
|
move_to_unaligned32((uint32_t*)arg, lsa->u.sin.sin_addr.s_addr);
|
||||||
free(lsa);
|
free(lsa);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -437,13 +436,14 @@ static NOINLINE void attach_option(
|
|||||||
int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg)
|
int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg)
|
||||||
{
|
{
|
||||||
struct option_set **opt_list = arg;
|
struct option_set **opt_list = arg;
|
||||||
char *opt, *val, *endptr;
|
char *opt, *val;
|
||||||
char *str;
|
char *str;
|
||||||
const struct dhcp_optflag *optflag;
|
const struct dhcp_optflag *optflag;
|
||||||
struct dhcp_optflag bin_optflag;
|
struct dhcp_optflag bin_optflag;
|
||||||
unsigned optcode;
|
unsigned optcode;
|
||||||
int retval, length;
|
int retval, length;
|
||||||
char buffer[8] ALIGNED(4);
|
/* IP_PAIR needs 8 bytes, STATIC_ROUTES needs 9 max */
|
||||||
|
char buffer[9] ALIGNED(4);
|
||||||
uint16_t *result_u16 = (uint16_t *) buffer;
|
uint16_t *result_u16 = (uint16_t *) buffer;
|
||||||
uint32_t *result_u32 = (uint32_t *) buffer;
|
uint32_t *result_u32 = (uint32_t *) buffer;
|
||||||
|
|
||||||
@ -501,34 +501,53 @@ int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg)
|
|||||||
// break;
|
// break;
|
||||||
// }
|
// }
|
||||||
case OPTION_U8:
|
case OPTION_U8:
|
||||||
buffer[0] = strtoul(val, &endptr, 0);
|
buffer[0] = bb_strtou32(val, NULL, 0);
|
||||||
retval = (endptr[0] == '\0');
|
retval = (errno == 0);
|
||||||
break;
|
break;
|
||||||
/* htonX are macros in older libc's, using temp var
|
/* htonX are macros in older libc's, using temp var
|
||||||
* in code below for safety */
|
* in code below for safety */
|
||||||
/* TODO: use bb_strtoX? */
|
/* TODO: use bb_strtoX? */
|
||||||
case OPTION_U16: {
|
case OPTION_U16: {
|
||||||
unsigned long tmp = strtoul(val, &endptr, 0);
|
uint32_t tmp = bb_strtou32(val, NULL, 0);
|
||||||
*result_u16 = htons(tmp);
|
*result_u16 = htons(tmp);
|
||||||
retval = (endptr[0] == '\0' /*&& tmp < 0x10000*/);
|
retval = (errno == 0 /*&& tmp < 0x10000*/);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// case OPTION_S16: {
|
// case OPTION_S16: {
|
||||||
// long tmp = strtol(val, &endptr, 0);
|
// long tmp = bb_strtoi32(val, NULL, 0);
|
||||||
// *result_u16 = htons(tmp);
|
// *result_u16 = htons(tmp);
|
||||||
// retval = (endptr[0] == '\0');
|
// retval = (errno == 0);
|
||||||
// break;
|
// break;
|
||||||
// }
|
// }
|
||||||
case OPTION_U32: {
|
case OPTION_U32: {
|
||||||
unsigned long tmp = strtoul(val, &endptr, 0);
|
uint32_t tmp = bb_strtou32(val, NULL, 0);
|
||||||
*result_u32 = htonl(tmp);
|
*result_u32 = htonl(tmp);
|
||||||
retval = (endptr[0] == '\0');
|
retval = (errno == 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OPTION_S32: {
|
case OPTION_S32: {
|
||||||
long tmp = strtol(val, &endptr, 0);
|
int32_t tmp = bb_strtoi32(val, NULL, 0);
|
||||||
*result_u32 = htonl(tmp);
|
*result_u32 = htonl(tmp);
|
||||||
retval = (endptr[0] == '\0');
|
retval = (errno == 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OPTION_STATIC_ROUTES: {
|
||||||
|
/* Input: "a.b.c.d/m" */
|
||||||
|
/* Output: mask(1 byte),pfx(0-4 bytes),gw(4 bytes) */
|
||||||
|
unsigned mask;
|
||||||
|
char *slash = strchr(val, '/');
|
||||||
|
if (slash) {
|
||||||
|
*slash = '\0';
|
||||||
|
retval = udhcp_str2nip(val, buffer + 1);
|
||||||
|
buffer[0] = mask = bb_strtou(slash + 1, NULL, 10);
|
||||||
|
val = strtok(NULL, ", \t/-");
|
||||||
|
if (!val || mask > 32 || errno)
|
||||||
|
retval = 0;
|
||||||
|
if (retval) {
|
||||||
|
length = ((mask + 7) >> 3) + 5;
|
||||||
|
retval = udhcp_str2nip(val, buffer + (length - 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OPTION_BIN: /* handled in attach_option() */
|
case OPTION_BIN: /* handled in attach_option() */
|
||||||
@ -539,7 +558,7 @@ int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg)
|
|||||||
}
|
}
|
||||||
if (retval)
|
if (retval)
|
||||||
attach_option(opt_list, optflag, opt, length);
|
attach_option(opt_list, optflag, opt, length);
|
||||||
} while (retval && optflag->flags & OPTION_LIST);
|
} while (retval && (optflag->flags & OPTION_LIST));
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user