Skip to content

Commit

Permalink
network: drop old ndisc configurations after new ones are configured
Browse files Browse the repository at this point in the history
Previously, `ndisc_remove_old_one()` checked `ndisc_{addresses,routes}_configured`
flags, but they are not unset when all addresses or routes are already
assigned.
After the request queue is implemented, the address or route requests
are not processed within the same event of ndisc handler is called, but
will processed later when they are ready. So, calling `ndisc_remove_old()`
in the event of ndisc handler will remove all addresses and routes
previously assigned even they are requested to be updated.

This makes `ndisc_remove_old()` do nothing when there exist some
requests to configure addresses and routes, thus previously assigned
addresses and routes are kept until all requests are processed.

Fixes systemd#20050.
  • Loading branch information
yuwata committed Jul 2, 2021
1 parent 36eb692 commit c87d7d0
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions src/network/networkd-ndisc.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,6 @@ static int ndisc_remove_old_one(Link *link, const struct in6_addr *router, bool
if (!force) {
bool set_callback = false;

if (!link->ndisc_addresses_configured || !link->ndisc_routes_configured)
return 0;

SET_FOREACH(na, link->ndisc_addresses)
if (!na->marked && in6_addr_equal(&na->router, router)) {
set_callback = true;
Expand Down Expand Up @@ -212,6 +209,10 @@ static int ndisc_remove_old(Link *link) {

assert(link);

if (link->ndisc_addresses_messages > 0 ||
link->ndisc_routes_messages > 0)
return 0;

routers = set_new(&in6_addr_hash_ops);
if (!routers)
return -ENOMEM;
Expand Down

0 comments on commit c87d7d0

Please sign in to comment.