diff options
-rw-r--r-- | bridge.c | 8 | ||||
-rw-r--r-- | config.c | 191 | ||||
-rw-r--r-- | config.h | 39 | ||||
-rw-r--r-- | device.c | 6 | ||||
-rw-r--r-- | device.h | 4 | ||||
-rw-r--r-- | interface-ip.c | 2 | ||||
-rw-r--r-- | interface-ip.h | 2 | ||||
-rw-r--r-- | interface.c | 8 | ||||
-rw-r--r-- | interface.h | 2 | ||||
-rw-r--r-- | iprule.c | 2 | ||||
-rw-r--r-- | iprule.h | 2 | ||||
-rw-r--r-- | proto-shell.c | 4 | ||||
-rw-r--r-- | proto.c | 4 | ||||
-rw-r--r-- | proto.h | 4 | ||||
-rw-r--r-- | system.c | 2 | ||||
-rw-r--r-- | system.h | 2 |
16 files changed, 28 insertions, 254 deletions
@@ -45,11 +45,11 @@ static const struct blobmsg_policy bridge_attrs[__BRIDGE_ATTR_MAX] = { [BRIDGE_ATTR_IGMP_SNOOP] = { "igmp_snooping", BLOBMSG_TYPE_BOOL }, }; -static const union config_param_info bridge_attr_info[__BRIDGE_ATTR_MAX] = { +static const struct uci_blob_param_info bridge_attr_info[__BRIDGE_ATTR_MAX] = { [BRIDGE_ATTR_IFNAME] = { .type = BLOBMSG_TYPE_STRING }, }; -static const struct config_param_list bridge_attr_list = { +static const struct uci_blob_param_list bridge_attr_list = { .n_params = __BRIDGE_ATTR_MAX, .params = bridge_attrs, .info = bridge_attr_info, @@ -525,7 +525,7 @@ bridge_reload(struct device *dev, struct blob_attr *attr) blob_data(bst->config_data), blob_len(bst->config_data)); diff = 0; - config_diff(tb_dev, otb_dev, &device_attr_list, &diff); + uci_blob_diff(tb_dev, otb_dev, &device_attr_list, &diff); if (diff & ~(1 << DEV_ATTR_IFNAME)) ret = DEV_CONFIG_RESTART; @@ -533,7 +533,7 @@ bridge_reload(struct device *dev, struct blob_attr *attr) blob_data(bst->config_data), blob_len(bst->config_data)); diff = 0; - config_diff(tb_br, otb_br, &bridge_attr_list, &diff); + uci_blob_diff(tb_br, otb_br, &bridge_attr_list, &diff); if (diff & ~(1 << BRIDGE_ATTR_IFNAME)) ret = DEV_CONFIG_RESTART; @@ -30,119 +30,6 @@ static struct uci_context *uci_ctx; static struct uci_package *uci_network; static struct blob_buf b; -static bool uci_attr_to_blob(struct blob_buf *b, const char *str, - const char *name, enum blobmsg_type type) -{ - char *err; - int intval; - - switch (type) { - case BLOBMSG_TYPE_STRING: - blobmsg_add_string(b, name, str); - break; - case BLOBMSG_TYPE_BOOL: - if (!strcmp(str, "true") || !strcmp(str, "1")) - intval = 1; - else if (!strcmp(str, "false") || !strcmp(str, "0")) - intval = 0; - else - return false; - - blobmsg_add_u8(b, name, intval); - break; - case BLOBMSG_TYPE_INT32: - intval = strtol(str, &err, 0); - if (*err) - return false; - - blobmsg_add_u32(b, name, intval); - break; - default: - return false; - } - return true; -} - -static void uci_array_to_blob(struct blob_buf *b, struct uci_option *o, - enum blobmsg_type type) -{ - struct uci_element *e; - char *str, *next, *word; - - if (o->type == UCI_TYPE_LIST) { - uci_foreach_element(&o->v.list, e) { - uci_attr_to_blob(b, e->name, NULL, type); - } - return; - } - - str = strdup(o->v.string); - next = str; - - while ((word = strsep(&next, " \t")) != NULL) { - if (!*word) - continue; - - uci_attr_to_blob(b, word, NULL, type); - } - - free(str); -} - -static int __uci_to_blob(struct blob_buf *b, struct uci_section *s, - const struct config_param_list *p) -{ - const struct blobmsg_policy *attr = NULL; - struct uci_element *e; - struct uci_option *o; - void *array; - int i, ret = 0; - - uci_foreach_element(&s->options, e) { - for (i = 0; i < p->n_params; i++) { - attr = &p->params[i]; - if (!strcmp(attr->name, e->name)) - break; - } - - if (i == p->n_params) - continue; - - o = uci_to_option(e); - - if (attr->type == BLOBMSG_TYPE_ARRAY) { - if (!p->info) - continue; - - array = blobmsg_open_array(b, attr->name); - uci_array_to_blob(b, o, p->info[i].type); - blobmsg_close_array(b, array); - ret++; - continue; - } - - if (o->type == UCI_TYPE_LIST) - continue; - - ret += uci_attr_to_blob(b, o->v.string, attr->name, attr->type); - } - - return ret; -} - -static int uci_to_blob(struct blob_buf *b, struct uci_section *s, - const struct config_param_list *p) -{ - int ret = 0; - int i; - - ret += __uci_to_blob(b, s, p); - for (i = 0; i < p->n_next; i++) - ret += uci_to_blob(b, s, p->next[i]); - - return ret; -} - static int config_parse_bridge_interface(struct uci_section *s) { @@ -196,12 +83,10 @@ config_parse_interface(struct uci_section *s, bool alias) if (!bridge && uci_to_blob(&b, s, simple_device_type.config_params)) iface->device_config = true; - config = malloc(blob_pad_len(b.head)); + config = blob_memdup(b.head); if (!config) goto error; - memcpy(config, b.head, blob_pad_len(b.head)); - if (alias) { if (!interface_add_alias(iface, config)) goto error_free_config; @@ -292,80 +177,6 @@ config_init_devices(void) } } -bool -config_diff(struct blob_attr **tb1, struct blob_attr **tb2, - const struct config_param_list *config, unsigned long *diff) -{ - bool ret = false; - int i; - - for (i = 0; i < config->n_params; i++) { - if (!tb1[i] && !tb2[i]) - continue; - - if (!!tb1[i] != !!tb2[i]) - goto mark; - - if (blob_len(tb1[i]) != blob_len(tb2[i])) - goto mark; - - if (memcmp(tb1[i], tb2[i], blob_raw_len(tb1[i])) != 0) - goto mark; - - continue; - -mark: - ret = true; - if (diff) - set_bit(diff, i); - else - return ret; - } - - return ret; -} - - -static bool -__config_check_equal(struct blob_attr *c1, struct blob_attr *c2, - const struct config_param_list *config) -{ - struct blob_attr **tb1, **tb2; - - if (!!c1 ^ !!c2) - return false; - - if (!c1 && !c2) - return true; - - tb1 = alloca(config->n_params * sizeof(struct blob_attr *)); - blobmsg_parse(config->params, config->n_params, tb1, - blob_data(c1), blob_len(c1)); - - tb2 = alloca(config->n_params * sizeof(struct blob_attr *)); - blobmsg_parse(config->params, config->n_params, tb2, - blob_data(c2), blob_len(c2)); - - return !config_diff(tb1, tb2, config, NULL); -} - -bool -config_check_equal(struct blob_attr *c1, struct blob_attr *c2, - const struct config_param_list *config) -{ - int i; - - if (!__config_check_equal(c1, c2, config)) - return false; - - for (i = 0; i < config->n_next; i++) { - if (!__config_check_equal(c1, c2, config->next[i])) - return false; - } - - return true; -} - static struct uci_package * config_init_package(const char *config) { @@ -15,47 +15,10 @@ #define __NETIFD_CONFIG_H #include <libubox/blobmsg.h> +#include <uci_blob.h> extern bool config_init; -enum config_param_type { - CONFIG_PARAM_TYPE_SIMPLE, - CONFIG_PARAM_TYPE_LIST, - CONFIG_PARAM_TYPE_SECTION, -}; - -union config_param_info { - enum blobmsg_type type; - struct config_params *section; -}; - -struct config_param_list { - int n_params, n_next; - - const struct blobmsg_policy *params; - const union config_param_info *info; - - const struct config_param_list *next[]; -}; - -#ifndef BITS_PER_LONG -#define BITS_PER_LONG (8 * sizeof(unsigned long)) -#endif - -static inline void set_bit(unsigned long *bits, int bit) -{ - bits[bit / BITS_PER_LONG] |= (1UL << (bit % BITS_PER_LONG)); -} - -static inline bool test_bit(unsigned long *bits, int bit) -{ - return !!(bits[bit / BITS_PER_LONG] & (1UL << (bit % BITS_PER_LONG))); -} - void config_init_all(void); -bool config_check_equal(struct blob_attr *c1, struct blob_attr *c2, - const struct config_param_list *config); -bool config_diff(struct blob_attr **tb1, struct blob_attr **tb2, - const struct config_param_list *config, unsigned long *diff); #endif @@ -39,7 +39,7 @@ static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = { [DEV_ATTR_ENABLED] = { "enabled", BLOBMSG_TYPE_BOOL }, }; -const struct config_param_list device_attr_list = { +const struct uci_blob_param_list device_attr_list = { .n_params = __DEV_ATTR_MAX, .params = dev_attrs, }; @@ -499,9 +499,9 @@ static enum dev_change_type device_reload_config(struct device *dev, struct blob_attr *attr) { struct blob_attr *tb[__DEV_ATTR_MAX]; - const struct config_param_list *cfg = dev->type->config_params; + const struct uci_blob_param_list *cfg = dev->type->config_params; - if (config_check_equal(dev->config, attr, cfg)) + if (uci_blob_check_equal(dev->config, attr, cfg)) return DEV_CONFIG_NO_CHANGE; if (cfg == &device_attr_list) { @@ -45,7 +45,7 @@ struct device_type { struct list_head list; const char *name; - const struct config_param_list *config_params; + const struct uci_blob_param_list *config_params; struct device *(*create)(const char *name, struct blob_attr *attr); void (*config_init)(struct device *); @@ -148,7 +148,7 @@ struct device_hotplug_ops { int (*del)(struct device *main, struct device *member); }; -extern const struct config_param_list device_attr_list; +extern const struct uci_blob_param_list device_attr_list; extern const struct device_type simple_device_type; extern const struct device_type bridge_device_type; extern const struct device_type tunnel_device_type; diff --git a/interface-ip.c b/interface-ip.c index a945147..44dd63d 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -51,7 +51,7 @@ static const struct blobmsg_policy route_attr[__ROUTE_MAX] = { [ROUTE_VALID] = { .name = "valid", .type = BLOBMSG_TYPE_INT32 }, }; -const struct config_param_list route_attr_list = { +const struct uci_blob_param_list route_attr_list = { .n_params = __ROUTE_MAX, .params = route_attr, }; diff --git a/interface-ip.h b/interface-ip.h index 5cc5665..c78a076 100644 --- a/interface-ip.h +++ b/interface-ip.h @@ -122,7 +122,7 @@ struct dns_search_domain { char name[]; }; -extern const struct config_param_list route_attr_list; +extern const struct uci_blob_param_list route_attr_list; extern struct list_head prefixes; void interface_ip_init(struct interface *iface); diff --git a/interface.c b/interface.c index 96f8e6d..81de337 100644 --- a/interface.c +++ b/interface.c @@ -63,12 +63,12 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = { [IFACE_ATTR_IP6CLASS] = { .name = "ip6class", .type = BLOBMSG_TYPE_ARRAY }, }; -static const union config_param_info iface_attr_info[IFACE_ATTR_MAX] = { +static const struct uci_blob_param_info iface_attr_info[IFACE_ATTR_MAX] = { [IFACE_ATTR_DNS] = { .type = BLOBMSG_TYPE_STRING }, [IFACE_ATTR_IP6CLASS] = { .type = BLOBMSG_TYPE_STRING }, }; -const struct config_param_list interface_attr_list = { +const struct uci_blob_param_list interface_attr_list = { .n_params = IFACE_ATTR_MAX, .params = iface_attrs, .info = iface_attr_info, @@ -833,8 +833,8 @@ interface_change_config(struct interface *if_old, struct interface *if_new) if (!if_old->proto_handler->config_params) D(INTERFACE, "No config parameters for interface '%s'\n", if_old->name); - else if (!config_check_equal(if_old->config, if_new->config, - if_old->proto_handler->config_params)) + else if (!uci_blob_check_equal(if_old->config, if_new->config, + if_old->proto_handler->config_params)) reload = true; #define UPDATE(field, __var) ({ \ diff --git a/interface.h b/interface.h index 13761f8..0a947b4 100644 --- a/interface.h +++ b/interface.h @@ -140,7 +140,7 @@ struct interface { extern struct vlist_tree interfaces; -extern const struct config_param_list interface_attr_list; +extern const struct uci_blob_param_list interface_attr_list; void interface_init(struct interface *iface, const char *name, struct blob_attr *config); @@ -60,7 +60,7 @@ static const struct blobmsg_policy rule_attr[__RULE_MAX] = { [RULE_GOTO] = { .name = "goto", .type = BLOBMSG_TYPE_INT32 }, }; -const struct config_param_list rule_attr_list = { +const struct uci_blob_param_list rule_attr_list = { .n_params = __RULE_MAX, .params = rule_attr, }; @@ -91,7 +91,7 @@ struct iprule { }; extern struct vlist_tree iprules; -extern const struct config_param_list rule_attr_list; +extern const struct uci_blob_param_list rule_attr_list; void iprule_add(struct blob_attr *attr, bool v6); void iprule_update_start(void); diff --git a/proto-shell.c b/proto-shell.c index 8bbc36e..4bb0744 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -44,7 +44,7 @@ enum proto_shell_sm { struct proto_shell_handler { struct list_head list; struct proto_handler proto; - struct config_param_list config; + struct uci_blob_param_list config; char *config_buf; bool init_available; char script_name[]; @@ -755,7 +755,7 @@ get_field(json_object *obj, const char *name, json_type type) } static char * -proto_shell_parse_config(struct config_param_list *config, json_object *obj) +proto_shell_parse_config(struct uci_blob_param_list *config, json_object *obj) { struct blobmsg_policy *attrs; char *str_buf, *str_cur; @@ -49,13 +49,13 @@ static const struct blobmsg_policy proto_ip_attributes[__OPT_MAX] = { [OPT_IP6PREFIX] = { .name = "ip6prefix", .type = BLOBMSG_TYPE_ARRAY }, }; -static const union config_param_info proto_ip_attr_info[__OPT_MAX] = { +static const struct uci_blob_param_info proto_ip_attr_info[__OPT_MAX] = { [OPT_IPADDR] = { .type = BLOBMSG_TYPE_STRING }, [OPT_IP6ADDR] = { .type = BLOBMSG_TYPE_STRING }, [OPT_IP6PREFIX] = { .type = BLOBMSG_TYPE_STRING }, }; -const struct config_param_list proto_ip_attr = { +const struct uci_blob_param_list proto_ip_attr = { .n_params = __OPT_MAX, .params = proto_ip_attributes, .info = proto_ip_attr_info, @@ -55,13 +55,13 @@ struct proto_handler { unsigned int flags; const char *name; - const struct config_param_list *config_params; + const struct uci_blob_param_list *config_params; struct interface_proto_state *(*attach)(const struct proto_handler *h, struct interface *iface, struct blob_attr *attr); }; -extern const struct config_param_list proto_ip_attr; +extern const struct uci_blob_param_list proto_ip_attr; void add_proto_handler(struct proto_handler *p); void proto_init_interface(struct interface *iface, struct blob_attr *attr); @@ -25,7 +25,7 @@ static const struct blobmsg_policy tunnel_attrs[__TUNNEL_ATTR_MAX] = { [TUNNEL_ATTR_LINK] = { "link", BLOBMSG_TYPE_STRING }, }; -const struct config_param_list tunnel_attr_list = { +const struct uci_blob_param_list tunnel_attr_list = { .n_params = __TUNNEL_ATTR_MAX, .params = tunnel_attrs, }; @@ -32,7 +32,7 @@ enum tunnel_param { __TUNNEL_ATTR_MAX }; -const struct config_param_list tunnel_attr_list; +const struct uci_blob_param_list tunnel_attr_list; enum bridge_opt { /* stp and forward delay always set */ |