}
#endif
-u16 lookup_dhcp_opt(int prot, char *name)
+int lookup_dhcp_opt(int prot, char *name)
{
const struct opttab_t *t;
int i;
if (strcasecmp(t[i].name, name) == 0)
return t[i].val;
- return 0;
+ return -1;
}
-u16 lookup_dhcp_len(int prot, u16 val)
+int lookup_dhcp_len(int prot, int val)
{
const struct opttab_t *t;
int i;
int match_bytes(struct dhcp_opt *o, unsigned char *p, int len);
void dhcp_update_configs(struct dhcp_config *configs);
void display_opts(void);
-u16 lookup_dhcp_opt(int prot, char *name);
-u16 lookup_dhcp_len(int prot, u16 val);
+int lookup_dhcp_opt(int prot, char *name);
+int lookup_dhcp_len(int prot, int val);
char *option_string(int prot, unsigned int opt, unsigned char *val,
int opt_len, char *buf, int buf_len);
#ifdef HAVE_LINUX_NETWORK
struct dhcp_netid *np = NULL;
u16 opt_len = 0;
int is6 = 0;
+ int option_ok = 0;
new->len = 0;
new->flags = flags;
{
new->opt = atoi(arg);
opt_len = 0;
+ option_ok = 1;
break;
}
if (strstr(arg, "option:") == arg)
{
- new->opt = lookup_dhcp_opt(AF_INET, arg+7);
- opt_len = lookup_dhcp_len(AF_INET, new->opt);
- /* option:<optname> must follow tag and vendor string. */
- if ((opt_len & OT_INTERNAL) && flags != DHOPT_MATCH)
- new->opt = 0;
+ if ((new->opt = lookup_dhcp_opt(AF_INET, arg+7)) != -1)
+ {
+ opt_len = lookup_dhcp_len(AF_INET, new->opt);
+ /* option:<optname> must follow tag and vendor string. */
+ if (!(opt_len & OT_INTERNAL) || flags == DHOPT_MATCH)
+ option_ok = 1;
+ }
break;
}
#ifdef HAVE_DHCP6
{
new->opt = atoi(arg+8);
opt_len = 0;
+ option_ok = 1;
}
else
{
- new->opt = lookup_dhcp_opt(AF_INET6, arg+8);
- opt_len = lookup_dhcp_len(AF_INET6, new->opt);
- if ((opt_len & OT_INTERNAL) && flags != DHOPT_MATCH)
- new->opt = 0;
+ if ((new->opt = lookup_dhcp_opt(AF_INET6, arg+8)) != -1)
+ {
+ opt_len = lookup_dhcp_len(AF_INET6, new->opt);
+ if (!(opt_len & OT_INTERNAL) || flags == DHOPT_MATCH)
+ option_ok = 1;
+ }
}
/* option6:<opt>|<optname> must follow tag and vendor string. */
is6 = 1;
new->flags |= DHOPT_RFC3925;
if (flags == DHOPT_MATCH)
{
- new->opt = 1; /* avoid error below */
+ option_ok = 1;
break;
}
}
if (opt_len == 0 &&
!(new->flags & DHOPT_RFC3925))
- opt_len = lookup_dhcp_len(AF_INET6 ,new->opt);
+ opt_len = lookup_dhcp_len(AF_INET6, new->opt);
}
else
#endif
if (opt_len == 0 &&
!(new->flags & (DHOPT_VENDOR | DHOPT_ENCAPSULATE | DHOPT_RFC3925)))
- opt_len = lookup_dhcp_len(AF_INET ,new->opt);
+ opt_len = lookup_dhcp_len(AF_INET, new->opt);
/* option may be missing with rfc3925 match */
- if (new->opt == 0)
+ if (!option_ok)
ret_err(_("bad dhcp-option"));
if (comma)