X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=device.c;h=84e652802dc700f560fb50be874cf275288a7939;hb=ccac483fb60917eb83765b4942a9c778c017471a;hp=7253bb99bdeb1191ef510212d731fce4b52c7544;hpb=fcbec58e1494281dfeb2f19576c52667a512fad2;p=project%2Fnetifd.git diff --git a/device.c b/device.c index 7253bb9..84e6528 100644 --- a/device.c +++ b/device.c @@ -175,33 +175,50 @@ static const struct device_type alias_device_type = { .free = alias_device_free, }; +static void +device_merge_settings(struct device *dev, struct device_settings *n) +{ + struct device_settings *os = &dev->orig_settings; + struct device_settings *s = &dev->settings; + + memset(n, 0, sizeof(*n)); + n->mtu = s->flags & DEV_OPT_MTU ? s->mtu : os->mtu; + n->txqueuelen = s->flags & DEV_OPT_TXQUEUELEN ? + s->txqueuelen : os->txqueuelen; + memcpy(n->macaddr, + (s->flags & DEV_OPT_MACADDR ? s->macaddr : os->macaddr), + sizeof(n->macaddr)); + n->flags = s->flags | os->flags; +} + void device_init_settings(struct device *dev, struct blob_attr **tb) { + struct device_settings *s = &dev->settings; struct blob_attr *cur; struct ether_addr *ea; - dev->flags = 0; + s->flags = 0; dev->disabled = false; if ((cur = tb[DEV_ATTR_ENABLED])) device_set_disabled(dev, !blobmsg_get_bool(cur)); if ((cur = tb[DEV_ATTR_MTU])) { - dev->mtu = blobmsg_get_u32(cur); - dev->flags |= DEV_OPT_MTU; + s->mtu = blobmsg_get_u32(cur); + s->flags |= DEV_OPT_MTU; } if ((cur = tb[DEV_ATTR_TXQUEUELEN])) { - dev->txqueuelen = blobmsg_get_u32(cur); - dev->flags |= DEV_OPT_TXQUEUELEN; + s->txqueuelen = blobmsg_get_u32(cur); + s->flags |= DEV_OPT_TXQUEUELEN; } if ((cur = tb[DEV_ATTR_MACADDR])) { ea = ether_aton(blob_data(cur)); if (ea) { - memcpy(dev->macaddr, ea, sizeof(dev->macaddr)); - dev->flags |= DEV_OPT_MACADDR; + memcpy(s->macaddr, ea, 6); + s->flags |= DEV_OPT_MACADDR; } } } @@ -651,6 +668,7 @@ device_create(const char *name, const struct device_type *type, void device_dump_status(struct blob_buf *b, struct device *dev) { + struct device_settings st; void *c, *s; if (!dev) { @@ -675,6 +693,16 @@ device_dump_status(struct blob_buf *b, struct device *dev) else system_if_dump_info(dev, b); + if (dev->active) { + device_merge_settings(dev, &st); + if (st.flags & DEV_OPT_MTU) + blobmsg_add_u32(b, "mtu", st.mtu); + if (st.flags & DEV_OPT_MACADDR) + blobmsg_add_string(b, "macaddr", ether_ntoa((struct ether_addr *) st.macaddr)); + if (st.flags & DEV_OPT_TXQUEUELEN) + blobmsg_add_u32(b, "txqueuelen", st.txqueuelen); + } + s = blobmsg_open_table(b, "statistics"); if (dev->type->dump_stats) dev->type->dump_stats(dev, b);