X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=proto.c;h=23304f35676ba68b46a2bbb60e764e80f5d779d6;hp=45eeb4b985937f8c1a95e0173639e09cc0c5a34c;hb=b8ef742bd04ebef324ae11aee56c6e1d2cb7e0ad;hpb=1fceaa57f9359ab9792cc97aa81ba5af3f5ffca7 diff --git a/proto.c b/proto.c index 45eeb4b..23304f3 100644 --- a/proto.c +++ b/proto.c @@ -123,17 +123,27 @@ parse_addr(struct interface *iface, const char *str, bool v6, int mask, return false; addr->mask = mask; - if (!parse_ip_and_netmask(af, str, &addr->addr, &addr->mask)) { - interface_add_error(iface, "proto", "INVALID_ADDRESS", &str, 1); - free(addr); - return false; - } + if (!parse_ip_and_netmask(af, str, &addr->addr, &addr->mask)) + goto error; + + if (!v6) { + if (IN_EXPERIMENTAL(ntohl(addr->addr.in.s_addr))) + goto error; + + } else if (IN6_IS_ADDR_MULTICAST(&addr->addr.in6)) + goto error; if (broadcast) addr->broadcast = broadcast; vlist_add(&iface->proto_ip.addr, &addr->node, &addr->flags); return true; + +error: + interface_add_error(iface, "proto", "INVALID_ADDRESS", &str, 1); + free(addr); + + return false; } static int @@ -567,7 +577,14 @@ proto_dump_handlers(struct blob_buf *b) blobmsg_add_string(b, p->config_params->params[i].name, uci_get_validate_string(p->config_params, i)); blobmsg_close_table(b, v); } + blobmsg_add_u8(b, "immediate", !!(p->flags & PROTO_FLAG_IMMEDIATE)); blobmsg_add_u8(b, "no_device", !!(p->flags & PROTO_FLAG_NODEV)); + blobmsg_add_u8(b, "init_available", !!(p->flags & PROTO_FLAG_INIT_AVAILABLE)); + blobmsg_add_u8(b, "renew_available", !!(p->flags & PROTO_FLAG_RENEW_AVAILABLE)); + blobmsg_add_u8(b, "force_link_default", !!(p->flags & PROTO_FLAG_FORCE_LINK_DEFAULT)); + blobmsg_add_u8(b, "last_error", !!(p->flags & PROTO_FLAG_LASTERROR)); + blobmsg_add_u8(b, "teardown_on_l3_link_down", !!(p->flags & PROTO_FLAG_TEARDOWN_ON_L3_LINK_DOWN)); + blobmsg_add_u8(b, "no_task", !!(p->flags & PROTO_FLAG_NO_TASK)); blobmsg_close_table(b, c); } }