Skip to content

Commit b4564f4

Browse files
committed
network: delay dropping addresses or so on reloading .network files
When a .network file is updated but its change is not so big, it is not necessary to first drop all configs and then reassign later again. This slightly optimize such situation. First foreignize all configs, and then drop later when it is not requested by the updated .network file.
1 parent 756f1f5 commit b4564f4

11 files changed

+135
-18
lines changed

src/network/networkd-address.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,15 @@ int link_drop_addresses(Link *link) {
910910
return r;
911911
}
912912

913+
void link_foreignize_addresses(Link *link) {
914+
Address *address;
915+
916+
assert(link);
917+
918+
SET_FOREACH(address, link->addresses)
919+
address->source = NETWORK_CONFIG_SOURCE_FOREIGN;
920+
}
921+
913922
static int address_acquire(Link *link, const Address *original, Address **ret) {
914923
_cleanup_(address_freep) Address *na = NULL;
915924
union in_addr_union in_addr;

src/network/networkd-address.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ DEFINE_NETWORK_SECTION_FUNCTIONS(Address, address_free);
7575
int link_drop_addresses(Link *link);
7676
int link_drop_foreign_addresses(Link *link);
7777
int link_drop_ipv6ll_addresses(Link *link);
78+
void link_foreignize_addresses(Link *link);
7879
bool link_address_is_dynamic(const Link *link, const Address *address);
7980
int link_get_ipv6_address(Link *link, const struct in6_addr *address, Address **ret);
8081
int link_get_ipv4_address(Link *link, const struct in_addr *address, unsigned char prefixlen, Address **ret);

src/network/networkd-link.c

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,17 @@ static int link_drop_config(Link *link) {
10511051
return r;
10521052
}
10531053

1054+
static void link_foreignize_config(Link *link) {
1055+
assert(link);
1056+
assert(link->manager);
1057+
1058+
link_foreignize_routes(link);
1059+
link_foreignize_nexthops(link);
1060+
link_foreignize_addresses(link);
1061+
link_foreignize_neighbors(link);
1062+
link_foreignize_routing_policy_rules(link);
1063+
}
1064+
10541065
static int link_configure(Link *link) {
10551066
int r;
10561067

@@ -1249,9 +1260,16 @@ static int link_reconfigure_impl(Link *link, bool force) {
12491260

12501261
link_drop_requests(link);
12511262

1252-
r = link_drop_config(link);
1253-
if (r < 0)
1254-
return r;
1263+
if (network && !force)
1264+
/* When a new/updated .network file is assigned, first make all configs (addresses,
1265+
* routes, and so on) foreign, and then drop unnecessary configs later by
1266+
* link_drop_foreign_config() in link_configure(). */
1267+
link_foreignize_config(link);
1268+
else {
1269+
r = link_drop_config(link);
1270+
if (r < 0)
1271+
return r;
1272+
}
12551273

12561274
link_free_carrier_maps(link);
12571275
link_free_engines(link);

src/network/networkd-neighbor.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,15 @@ int link_drop_neighbors(Link *link) {
437437
return r;
438438
}
439439

440+
void link_foreignize_neighbors(Link *link) {
441+
Neighbor *neighbor;
442+
443+
assert(link);
444+
445+
SET_FOREACH(neighbor, link->neighbors)
446+
neighbor->source = NETWORK_CONFIG_SOURCE_FOREIGN;
447+
}
448+
440449
int request_process_neighbor(Request *req) {
441450
int r;
442451

src/network/networkd-neighbor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void network_drop_invalid_neighbors(Network *network);
4242

4343
int link_drop_neighbors(Link *link);
4444
int link_drop_foreign_neighbors(Link *link);
45+
void link_foreignize_neighbors(Link *link);
4546

4647
int link_request_static_neighbors(Link *link);
4748
int request_process_neighbor(Request *req);

src/network/networkd-nexthop.c

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -602,10 +602,9 @@ int link_request_static_nexthops(Link *link, bool only_ipv4) {
602602
return 0;
603603
}
604604

605-
static int manager_drop_nexthops(Manager *manager, bool foreign, const Link *except) {
605+
static void manager_mark_nexthops(Manager *manager, bool foreign, const Link *except) {
606606
NextHop *nexthop;
607607
Link *link;
608-
int k, r = 0;
609608

610609
assert(manager);
611610

@@ -641,8 +640,14 @@ static int manager_drop_nexthops(Manager *manager, bool foreign, const Link *exc
641640
nexthop_unmark(existing);
642641
}
643642
}
643+
}
644+
645+
static int manager_drop_nexthops(Manager *manager) {
646+
NextHop *nexthop;
647+
int k, r = 0;
648+
649+
assert(manager);
644650

645-
/* Finally, remove all marked nexthops. */
646651
SET_FOREACH(nexthop, manager->nexthops) {
647652
if (!nexthop_is_marked(nexthop))
648653
continue;
@@ -698,7 +703,9 @@ int link_drop_foreign_nexthops(Link *link) {
698703
r = k;
699704
}
700705

701-
k = manager_drop_nexthops(link->manager, /* foreign = */ true, NULL);
706+
manager_mark_nexthops(link->manager, /* foreign = */ true, NULL);
707+
708+
k = manager_drop_nexthops(link->manager);
702709
if (k < 0 && r >= 0)
703710
r = k;
704711

@@ -726,13 +733,33 @@ int link_drop_nexthops(Link *link) {
726733
r = k;
727734
}
728735

729-
k = manager_drop_nexthops(link->manager, /* foreign = */ false, link);
736+
manager_mark_nexthops(link->manager, /* foreign = */ false, link);
737+
738+
k = manager_drop_nexthops(link->manager);
730739
if (k < 0 && r >= 0)
731740
r = k;
732741

733742
return r;
734743
}
735744

745+
void link_foreignize_nexthops(Link *link) {
746+
NextHop *nexthop;
747+
748+
assert(link);
749+
750+
SET_FOREACH(nexthop, link->nexthops)
751+
nexthop->source = NETWORK_CONFIG_SOURCE_FOREIGN;
752+
753+
manager_mark_nexthops(link->manager, /* foreign = */ false, link);
754+
755+
SET_FOREACH(nexthop, link->manager->nexthops) {
756+
if (!nexthop_is_marked(nexthop))
757+
continue;
758+
759+
nexthop->source = NETWORK_CONFIG_SOURCE_FOREIGN;
760+
}
761+
}
762+
736763
static bool nexthop_is_ready_to_configure(Link *link, const NextHop *nexthop) {
737764
struct nexthop_grp *nhg;
738765

src/network/networkd-nexthop.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ void network_drop_invalid_nexthops(Network *network);
4545

4646
int link_drop_nexthops(Link *link);
4747
int link_drop_foreign_nexthops(Link *link);
48+
void link_foreignize_nexthops(Link *link);
4849

4950
int link_request_static_nexthops(Link *link, bool only_ipv4);
5051
int request_process_nexthop(Request *req);

src/network/networkd-route.c

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,10 +1037,10 @@ int route_remove(Route *route) {
10371037
return 0;
10381038
}
10391039

1040-
static int manager_drop_routes(Manager *manager, bool foreign, const Link *except) {
1040+
static void manager_mark_routes(Manager *manager, bool foreign, const Link *except) {
10411041
Route *route;
10421042
Link *link;
1043-
int k, r;
1043+
int r;
10441044

10451045
assert(manager);
10461046

@@ -1090,9 +1090,14 @@ static int manager_drop_routes(Manager *manager, bool foreign, const Link *excep
10901090
route_unmark(existing);
10911091
}
10921092
}
1093+
}
1094+
1095+
static int manager_drop_routes(Manager *manager) {
1096+
Route *route;
1097+
int k, r = 0;
1098+
1099+
assert(manager);
10931100

1094-
/* Finally, remove all marked routes. */
1095-
r = 0;
10961101
SET_FOREACH(route, manager->routes) {
10971102
if (!route_is_marked(route))
10981103
continue;
@@ -1182,7 +1187,9 @@ int link_drop_foreign_routes(Link *link) {
11821187
r = k;
11831188
}
11841189

1185-
k = manager_drop_routes(link->manager, /* foreign = */ true, NULL);
1190+
manager_mark_routes(link->manager, /* foreign = */ true, NULL);
1191+
1192+
k = manager_drop_routes(link->manager);
11861193
if (k < 0 && r >= 0)
11871194
r = k;
11881195

@@ -1208,13 +1215,33 @@ int link_drop_routes(Link *link) {
12081215
r = k;
12091216
}
12101217

1211-
k = manager_drop_routes(link->manager, /* foreign = */ false, link);
1218+
manager_mark_routes(link->manager, /* foreign = */ false, link);
1219+
1220+
k = manager_drop_routes(link->manager);
12121221
if (k < 0 && r >= 0)
12131222
r = k;
12141223

12151224
return r;
12161225
}
12171226

1227+
void link_foreignize_routes(Link *link) {
1228+
Route *route;
1229+
1230+
assert(link);
1231+
1232+
SET_FOREACH(route, link->routes)
1233+
route->source = NETWORK_CONFIG_SOURCE_FOREIGN;
1234+
1235+
manager_mark_routes(link->manager, /* foreign = */ false, link);
1236+
1237+
SET_FOREACH(route, link->manager->routes) {
1238+
if (!route_is_marked(route))
1239+
continue;
1240+
1241+
route->source = NETWORK_CONFIG_SOURCE_FOREIGN;
1242+
}
1243+
}
1244+
12181245
static int route_expire_handler(sd_event_source *s, uint64_t usec, void *userdata) {
12191246
Route *route = userdata;
12201247
int r;

src/network/networkd-route.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ bool gateway_is_ready(Link *link, int onlink, int family, const union in_addr_un
8585

8686
int link_drop_routes(Link *link);
8787
int link_drop_foreign_routes(Link *link);
88+
void link_foreignize_routes(Link *link);
8889

8990
void route_cancel_request(Route *route);
9091
int link_request_route(

src/network/networkd-routing-policy-rule.c

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -619,10 +619,9 @@ static int routing_policy_rule_configure(
619619
return r;
620620
}
621621

622-
int manager_drop_routing_policy_rules_internal(Manager *m, bool foreign, const Link *except) {
622+
static void manager_mark_routing_policy_rules(Manager *m, bool foreign, const Link *except) {
623623
RoutingPolicyRule *rule;
624624
Link *link;
625-
int k, r;
626625

627626
assert(m);
628627

@@ -671,9 +670,16 @@ int manager_drop_routing_policy_rules_internal(Manager *m, bool foreign, const L
671670
}
672671
}
673672
}
673+
}
674+
675+
int manager_drop_routing_policy_rules_internal(Manager *m, bool foreign, const Link *except) {
676+
RoutingPolicyRule *rule;
677+
int k, r = 0;
678+
679+
assert(m);
680+
681+
manager_mark_routing_policy_rules(m, foreign, except);
674682

675-
/* Finally, remove all marked rules. */
676-
r = 0;
677683
SET_FOREACH(rule, m->rules) {
678684
if (!routing_policy_rule_is_marked(rule))
679685
continue;
@@ -686,6 +692,22 @@ int manager_drop_routing_policy_rules_internal(Manager *m, bool foreign, const L
686692
return r;
687693
}
688694

695+
void link_foreignize_routing_policy_rules(Link *link) {
696+
RoutingPolicyRule *rule;
697+
698+
assert(link);
699+
assert(link->manager);
700+
701+
manager_mark_routing_policy_rules(link->manager, /* foreign = */ false, link);
702+
703+
SET_FOREACH(rule, link->manager->rules) {
704+
if (!routing_policy_rule_is_marked(rule))
705+
continue;
706+
707+
rule->source = NETWORK_CONFIG_SOURCE_FOREIGN;
708+
}
709+
}
710+
689711
static int static_routing_policy_rule_configure_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
690712
int r;
691713

0 commit comments

Comments
 (0)