interface: Fix triggering of interface update event
[project/netifd.git] / proto.c
diff --git a/proto.c b/proto.c
index 45eeb4b..23304f3 100644 (file)
--- 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);
        }
 }