Add a new boolean attribute ip6deprecated to the static protocol which can
be used to mark IPv6 addresses as deprecated (i.e., set the preferred
lifetime to 0). This is useful to configure addresses that may be used for
incoming, but not for outgoing connections unless bound explicitly.
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
OPT_GATEWAY,
OPT_IP6GW,
OPT_IP6PREFIX,
OPT_GATEWAY,
OPT_IP6GW,
OPT_IP6PREFIX,
[OPT_GATEWAY] = { .name = "gateway", .type = BLOBMSG_TYPE_STRING },
[OPT_IP6GW] = { .name = "ip6gw", .type = BLOBMSG_TYPE_STRING },
[OPT_IP6PREFIX] = { .name = "ip6prefix", .type = BLOBMSG_TYPE_ARRAY },
[OPT_GATEWAY] = { .name = "gateway", .type = BLOBMSG_TYPE_STRING },
[OPT_IP6GW] = { .name = "ip6gw", .type = BLOBMSG_TYPE_STRING },
[OPT_IP6PREFIX] = { .name = "ip6prefix", .type = BLOBMSG_TYPE_ARRAY },
+ [OPT_IP6DEPRECATED] = { .name = "ip6deprecated", .type = BLOBMSG_TYPE_BOOL },
};
static const struct uci_blob_param_info proto_ip_attr_info[__OPT_MAX] = {
};
static const struct uci_blob_param_info proto_ip_attr_info[__OPT_MAX] = {
static bool
parse_addr(struct interface *iface, const char *str, bool v6, int mask,
static bool
parse_addr(struct interface *iface, const char *str, bool v6, int mask,
- bool ext, uint32_t broadcast)
+ bool ext, uint32_t broadcast, bool deprecated)
{
struct device_addr *addr;
int af = v6 ? AF_INET6 : AF_INET;
{
struct device_addr *addr;
int af = v6 ? AF_INET6 : AF_INET;
if (broadcast)
addr->broadcast = broadcast;
if (broadcast)
addr->broadcast = broadcast;
+ if (deprecated)
+ addr->preferred_until = system_get_rtime();
+
vlist_add(&iface->proto_ip.addr, &addr->node, &addr->flags);
return true;
vlist_add(&iface->proto_ip.addr, &addr->node, &addr->flags);
return true;
static int
parse_static_address_option(struct interface *iface, struct blob_attr *attr,
static int
parse_static_address_option(struct interface *iface, struct blob_attr *attr,
- bool v6, int netmask, bool ext, uint32_t broadcast)
+ bool v6, int netmask, bool ext, uint32_t broadcast,
+ bool deprecated)
{
struct blob_attr *cur;
int n_addr = 0;
{
struct blob_attr *cur;
int n_addr = 0;
n_addr++;
if (!parse_addr(iface, blobmsg_data(cur), v6, netmask, ext,
n_addr++;
if (!parse_addr(iface, blobmsg_data(cur), v6, netmask, ext,
+ broadcast, deprecated))
struct blob_attr *cur;
const char *error;
unsigned int netmask = 32;
struct blob_attr *cur;
const char *error;
unsigned int netmask = 32;
int n_v4 = 0, n_v6 = 0;
struct in_addr bcast = {};
int n_v4 = 0, n_v6 = 0;
struct in_addr bcast = {};
+ ip6deprecated = blobmsg_get_bool_default(tb[OPT_IP6DEPRECATED], false);
+
if ((cur = tb[OPT_IPADDR]))
n_v4 = parse_static_address_option(iface, cur, false,
if ((cur = tb[OPT_IPADDR]))
n_v4 = parse_static_address_option(iface, cur, false,
- netmask, false, bcast.s_addr);
+ netmask, false, bcast.s_addr, false);
if ((cur = tb[OPT_IP6ADDR]))
n_v6 = parse_static_address_option(iface, cur, true,
if ((cur = tb[OPT_IP6ADDR]))
n_v6 = parse_static_address_option(iface, cur, true,
+ 128, false, 0, ip6deprecated);
if ((cur = tb[OPT_IP6PREFIX]))
if (parse_prefix_list(iface, cur) < 0)
if ((cur = tb[OPT_IP6PREFIX]))
if (parse_prefix_list(iface, cur) < 0)