- if (!(a_new->flags & DEVADDR_EXTERNAL) && !keep) {
- system_add_address(dev, a_new);
-
- if ((a_new->flags & DEVADDR_FAMILY) == DEVADDR_INET6)
- v6 = true;
-
- set_ip_source_policy(true, v6, IPRULE_PRIORITY_ADDR, &a_new->addr,
- (v6) ? 128 : 32, iface);
- set_ip_source_policy(true, v6, IPRULE_PRIORITY_NW, &a_new->addr,
- a_new->mask, iface);
+ if (!(a_new->flags & DEVADDR_EXTERNAL) && (!keep || replace)) {
+ if (system_add_address(dev, a_new))
+ a_new->failed = true;
+
+ if (!keep) {
+ if ((a_new->flags & DEVADDR_FAMILY) == DEVADDR_INET6)
+ v6 = true;
+
+ unsigned int table = (v6) ? iface->ip6table : iface->ip4table;
+
+ if (table) {
+ set_ip_source_policy(true, v6, IPRULE_PRIORITY_ADDR, &a_new->addr,
+ (v6) ? 128 : 32, table, NULL, NULL);
+ set_ip_source_policy(true, v6, IPRULE_PRIORITY_NW, &a_new->addr,
+ a_new->mask, table, NULL, NULL);
+ }
+ }