- interface_trigger_ula_prefix(iface, prefix, true);
- } else if (add && (iface->state == IFS_UP || iface->state == IFS_SETUP)) {
- system_add_address(l3_downlink, &addr);
- if (uplink && uplink->l3_dev.dev) {
- int mtu = system_update_ipv6_mtu(
- uplink->l3_dev.dev, 0);
- if (mtu > 0)
+ if (prefix->iface && !assignment->enabled) {
+ set_ip_source_policy(true, true, IPRULE_PRIORITY_REJECT, &addr.addr,
+ addr.mask, 0, iface, "unreachable");
+
+ if (prefix->iface->ip6table)
+ set_ip_source_policy(true, true, IPRULE_PRIORITY_NW, &addr.addr,
+ addr.mask, prefix->iface->ip6table, iface, NULL);
+ }
+
+ route.metric = iface->metric;
+ system_add_route(l3_downlink, &route);
+
+ if (uplink && uplink->l3_dev.dev && !(l3_downlink->settings.flags & DEV_OPT_MTU6)) {
+ int mtu = system_update_ipv6_mtu(uplink->l3_dev.dev, 0);
+ int mtu_old = system_update_ipv6_mtu(l3_downlink, 0);
+
+ if (mtu > 0 && mtu_old > mtu)