X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=proto-static.c;h=ca39b7c8edf86271c8c72226c88cebacad59cf6c;hp=17cff0aa570bf0f7d87e6e60753b8a0971b7f16f;hb=e19e9800b93dbaec566c43d752b9cf1a3c7c913b;hpb=3bd56db589071948eebd30b00cda7ef1fb38a61b diff --git a/proto-static.c b/proto-static.c index 17cff0a..ca39b7c 100644 --- a/proto-static.c +++ b/proto-static.c @@ -17,6 +17,7 @@ enum { OPT_NETMASK, OPT_GATEWAY, OPT_IP6GW, + OPT_DNS, __OPT_MAX, }; @@ -26,11 +27,13 @@ static const struct blobmsg_policy static_attrs[__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 = { @@ -55,7 +58,7 @@ parse_addr(struct interface *iface, const char *str, bool v6, int mask) interface_add_error(iface, "proto-static", "INVALID_ADDRESS", &str, 1); return false; } - vlist_add(&iface->proto_addr, &addr->node); + vlist_add(&iface->proto_ip.addr, &addr->node); return true; } @@ -91,7 +94,7 @@ parse_gateway_option(struct interface *iface, struct blob_attr *attr, bool v6) } 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; } @@ -100,20 +103,18 @@ static int 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]) @@ -140,6 +141,9 @@ proto_apply_static_settings(struct interface *iface, struct blob_attr *attr) goto out; } + if (tb[OPT_DNS]) + interface_add_dns_server_list(&iface->proto_ip, tb[OPT_DNS]); + return 0; error: @@ -185,7 +189,7 @@ static_free(struct interface_proto_state *proto) 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) {