Skip to content

Commit adef6d0

Browse files
authored
Merge pull request systemd#21122 from yuwata/network-optimize-reload
network: slightly optimize "networkctl reload"
2 parents 1845ba3 + 5b47f35 commit adef6d0

12 files changed

+141
-23
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: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,7 +1042,7 @@ static int link_drop_config(Link *link) {
10421042
if (k < 0 && r >= 0)
10431043
r = k;
10441044

1045-
k = manager_drop_routing_policy_rules(link->manager, link);
1045+
k = link_drop_routing_policy_rules(link);
10461046
if (k < 0 && r >= 0)
10471047
r = k;
10481048

@@ -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)