X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=device.c;h=128151a1eb8105116ac04f46cbb7d088c518f9ea;hb=3392046d51959b228133e69f54893898df75635e;hp=a851037f16415442cf4853d2f18914abf91e52ca;hpb=4268193c90bdd1532ee0555dd109a43eb8524b04;p=oweals%2Fnetifd.git diff --git a/device.c b/device.c index a851037..128151a 100644 --- a/device.c +++ b/device.c @@ -32,10 +32,6 @@ static struct list_head devtypes = LIST_HEAD_INIT(devtypes); static struct avl_tree devices; -static bool default_ps = true; -static int default_rps_val; -static int default_rps_flow_cnt; -static int default_xps_val; static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = { [DEV_ATTR_TYPE] = { .name = "type", .type = BLOBMSG_TYPE_STRING }, @@ -52,8 +48,6 @@ static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = { [DEV_ATTR_MLDVERSION] = { .name = "mldversion", .type = BLOBMSG_TYPE_INT32 }, [DEV_ATTR_NEIGHREACHABLETIME] = { .name = "neighreachabletime", .type = BLOBMSG_TYPE_INT32 }, [DEV_ATTR_NEIGHGCSTALETIME] = { .name = "neighgcstaletime", .type = BLOBMSG_TYPE_INT32 }, - [DEV_ATTR_RPS] = { .name = "rps", .type = BLOBMSG_TYPE_BOOL }, - [DEV_ATTR_XPS] = { .name = "xps", .type = BLOBMSG_TYPE_BOOL }, [DEV_ATTR_DADTRANSMITS] = { .name = "dadtransmits", .type = BLOBMSG_TYPE_INT32 }, [DEV_ATTR_MULTICAST_TO_UNICAST] = { .name = "multicast_to_unicast", .type = BLOBMSG_TYPE_BOOL }, [DEV_ATTR_MULTICAST_ROUTER] = { .name = "multicast_router", .type = BLOBMSG_TYPE_INT32 }, @@ -63,6 +57,7 @@ static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = { [DEV_ATTR_UNICAST_FLOOD] = { .name ="unicast_flood", .type = BLOBMSG_TYPE_BOOL }, [DEV_ATTR_SENDREDIRECTS] = { .name = "sendredirects", .type = BLOBMSG_TYPE_BOOL }, [DEV_ATTR_NEIGHLOCKTIME] = { .name = "neighlocktime", .type = BLOBMSG_TYPE_INT32 }, + [DEV_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL }, }; const struct uci_blob_param_list device_attr_list = { @@ -325,20 +320,6 @@ device_init_settings(struct device *dev, struct blob_attr **tb) s->flags |= DEV_OPT_NEIGHLOCKTIME; } - if ((cur = tb[DEV_ATTR_RPS])) { - s->rps = blobmsg_get_bool(cur); - s->flags |= DEV_OPT_RPS; - } - else - s->rps = default_ps; - - if ((cur = tb[DEV_ATTR_XPS])) { - s->xps = blobmsg_get_bool(cur); - s->flags |= DEV_OPT_XPS; - } - else - s->xps = default_ps; - if ((cur = tb[DEV_ATTR_DADTRANSMITS])) { s->dadtransmits = blobmsg_get_u32(cur); s->flags |= DEV_OPT_DADTRANSMITS; @@ -382,6 +363,11 @@ device_init_settings(struct device *dev, struct blob_attr **tb) s->flags |= DEV_OPT_SENDREDIRECTS; } + if ((cur = tb[DEV_ATTR_ISOLATE])) { + s->isolate = blobmsg_get_bool(cur); + s->flags |= DEV_OPT_ISOLATE; + } + device_set_disabled(dev, disabled); } @@ -484,7 +470,7 @@ int device_check_state(struct device *dev) return dev->type->check_state(dev); } -void device_init_virtual(struct device *dev, struct device_type *type, const char *name) +int device_init_virtual(struct device *dev, struct device_type *type, const char *name) { assert(dev); assert(type); @@ -494,18 +480,27 @@ void device_init_virtual(struct device *dev, struct device_type *type, const cha INIT_SAFE_LIST(&dev->aliases); dev->type = type; - if (name) - device_set_ifname(dev, name); + if (name) { + int ret; + + ret = device_set_ifname(dev, name); + if (ret < 0) + return ret; + } if (!dev->set_state) dev->set_state = set_device_state; + + return 0; } int device_init(struct device *dev, struct device_type *type, const char *ifname) { int ret; - device_init_virtual(dev, type, ifname); + ret = device_init_virtual(dev, type, ifname); + if (ret < 0) + return ret; dev->avl.key = dev->ifname; @@ -515,8 +510,6 @@ int device_init(struct device *dev, struct device_type *type, const char *ifname system_if_clear_state(dev); device_check_state(dev); - dev->settings.rps = default_ps; - dev->settings.xps = default_ps; return 0; } @@ -536,7 +529,13 @@ device_create_default(const char *name, bool external) dev->external = external; dev->set_state = simple_device_set_state; - device_init(dev, &simple_device_type, name); + + if (device_init(dev, &simple_device_type, name) < 0) { + device_cleanup(dev); + free(dev); + return NULL; + } + dev->default_config = true; if (external) system_if_apply_settings(dev, &dev->settings, dev->settings.flags); @@ -664,10 +663,13 @@ int device_set_ifname(struct device *dev, const char *name) if (!strcmp(dev->ifname, name)) return 0; + if (strlen(name) > sizeof(dev->ifname) - 1) + return -1; + if (dev->avl.key) avl_delete(&devices, &dev->avl); - strncpy(dev->ifname, name, IFNAMSIZ); + strcpy(dev->ifname, name); if (dev->avl.key) ret = avl_insert(&devices, &dev->avl); @@ -731,7 +733,7 @@ void device_add_user(struct device_user *dep, struct device *dev) __device_add_user(dep, dev); } -void +static void device_free(struct device *dev) { __devlock++; @@ -914,48 +916,6 @@ device_reset_old(void) } } -void -device_set_default_ps(bool state, int xps, int rps, int rps_flow_cnt) -{ - struct device *dev; - - if ((state == default_ps) && (default_rps_val == rps) && - (default_xps_val == xps) && (default_rps_flow_cnt == rps_flow_cnt)) - return; - - default_ps = state; - default_rps_val = rps; - default_rps_flow_cnt = rps_flow_cnt; - default_xps_val = xps; - - avl_for_each_element(&devices, dev, avl) { - struct device_settings *s = &dev->settings; - unsigned int apply_mask = 0; - - if (!(s->flags & DEV_OPT_RPS)) { - s->rps = default_ps; - s->rps_val = default_rps_val; - s->rps_flow_cnt = default_rps_flow_cnt; - apply_mask |= DEV_OPT_RPS; - } - - if (!(s->flags & DEV_OPT_XPS)) { - s->xps = default_ps; - s->xps_val = default_xps_val; - apply_mask |= DEV_OPT_XPS; - } - - if (!apply_mask) - continue; - - if (!(dev->external || (dev->present && dev->active)) || - dev->config_pending) - continue; - - system_if_apply_settings(dev, s, apply_mask); - } -} - struct device * device_create(const char *name, struct device_type *type, struct blob_attr *config)