OPT_NETMASK,
OPT_GATEWAY,
OPT_IP6GW,
+ OPT_DNS,
__OPT_MAX,
};
[OPT_NETMASK] = { .name = "netmask", .type = BLOBMSG_TYPE_STRING },
[OPT_GATEWAY] = { .name = "gateway", .type = BLOBMSG_TYPE_STRING },
[OPT_IP6GW] = { .name = "ip6gw", .type = BLOBMSG_TYPE_STRING },
+ [OPT_DNS] = { .name = "dns", .type = BLOBMSG_TYPE_ARRAY },
};
static const union config_param_info static_attr_info[__OPT_MAX] = {
[OPT_IPADDR] = { .type = BLOBMSG_TYPE_STRING },
[OPT_IP6ADDR] = { .type = BLOBMSG_TYPE_STRING },
+ [OPT_DNS] = { .type = BLOBMSG_TYPE_STRING },
};
static const struct config_param_list static_attr_list = {
};
static bool
-split_netmask(char *str, unsigned int *netmask)
-{
- char *delim, *err = NULL;
-
- delim = strchr(str, '/');
- if (delim) {
- *(delim++) = 0;
-
- *netmask = strtoul(delim, &err, 10);
- if (err && *err)
- return false;
- }
- return true;
-}
-
-static int
-parse_ip_and_netmask(int af, const char *str, void *addr, unsigned int *netmask)
-{
- char *astr = alloca(strlen(str) + 1);
-
- strcpy(astr, str);
- if (!split_netmask(astr, netmask))
- return 0;
-
- if (af == AF_INET6) {
- if (*netmask > 128)
- return 0;
- } else {
- if (*netmask > 32)
- return 0;
- }
-
- return inet_pton(af, str, addr);
-}
-
-static bool
parse_addr(struct interface *iface, const char *str, bool v6, int mask)
{
struct device_addr *addr;
- int af = v6 ? AF_INET6 : AF_INET;
- addr = calloc(1, sizeof(*addr));
- addr->flags = v6 ? DEVADDR_INET6 : DEVADDR_INET4;
- addr->mask = mask;
- if (!parse_ip_and_netmask(af, str, &addr->addr, &addr->mask)) {
+ addr = proto_parse_ip_addr_string(str, v6, mask);
+ if (!addr) {
interface_add_error(iface, "proto-static", "INVALID_ADDRESS", &str, 1);
- free(addr);
return false;
}
- vlist_add(&iface->proto_addr, &addr->node);
+ vlist_add(&iface->proto_ip.addr, &addr->node);
return true;
}
}
route->mask = 0;
route->flags = DEVADDR_DEVICE | (v6 ? DEVADDR_INET6 : DEVADDR_INET4);
- vlist_add(&iface->proto_route, &route->node);
+ vlist_add(&iface->proto_ip.route, &route->node);
return true;
}
proto_apply_static_settings(struct interface *iface, struct blob_attr *attr)
{
struct blob_attr *tb[__OPT_MAX];
- struct in_addr ina;
const char *error;
- int netmask = 32;
+ unsigned int netmask = 32;
int n_v4 = 0, n_v6 = 0;
blobmsg_parse(static_attrs, __OPT_MAX, tb, blob_data(attr), blob_len(attr));
if (tb[OPT_NETMASK]) {
- if (!inet_aton(blobmsg_data(tb[OPT_NETMASK]), &ina)) {
+ netmask = parse_netmask_string(blobmsg_data(tb[OPT_NETMASK]), false);
+ if (netmask > 32) {
error = "INVALID_NETMASK";
goto error;
}
-
- netmask = 32 - fls(~(ntohl(ina.s_addr)));
}
if (tb[OPT_IPADDR])
goto out;
}
+ if (tb[OPT_DNS])
+ interface_add_dns_server_list(&iface->proto_ip, tb[OPT_DNS]);
+
return 0;
error:
free(state);
}
-struct interface_proto_state *
+static struct interface_proto_state *
static_attach(const struct proto_handler *h, struct interface *iface,
struct blob_attr *attr)
{