+ } else {
+ time_t now = system_get_rtime();
+ if ((cur = tb[ADDR_PREFERRED])) {
+ int64_t preferred = blobmsg_get_u32(cur);
+ int64_t preferred_until = preferred + (int64_t)now;
+ if (preferred_until <= LONG_MAX && preferred != 0xffffffffLL)
+ addr->preferred_until = preferred_until;
+ }
+
+ if ((cur = tb[ADDR_VALID])) {
+ int64_t valid = blobmsg_get_u32(cur);
+ int64_t valid_until = valid + (int64_t)now;
+ if (valid_until <= LONG_MAX && valid != 0xffffffffLL)
+ addr->valid_until = valid_until;
+
+ }
+
+ if (addr->valid_until) {
+ if (!addr->preferred_until)
+ addr->preferred_until = addr->valid_until;
+ else if (addr->preferred_until > addr->valid_until)
+ goto error;
+ }
+
+ if ((cur = tb[ADDR_CLASS]))
+ addr->pclass = strdup(blobmsg_get_string(cur));