Skip to content

Commit fe7ca21

Browse files
ssahanikeszybz
authored andcommitted
networkd: add route expiration handler (systemd#3242)
Fix for systemd#3232.
1 parent 246ba4a commit fe7ca21

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

src/network/networkd-route.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,15 +406,45 @@ int route_remove(Route *route, Link *link,
406406
return 0;
407407
}
408408

409+
static int route_expire_callback(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
410+
Link *link = userdata;
411+
int r;
412+
413+
assert(rtnl);
414+
assert(m);
415+
assert(link);
416+
assert(link->ifname);
417+
assert(link->link_messages > 0);
418+
419+
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
420+
return 1;
421+
422+
link->link_messages--;
423+
424+
r = sd_netlink_message_get_errno(m);
425+
if (r < 0 && r != -EEXIST)
426+
log_link_warning_errno(link, r, "could not remove route: %m");
427+
428+
if (link->link_messages == 0)
429+
log_link_debug(link, "route removed");
430+
431+
return 1;
432+
}
433+
409434
int route_expire_handler(sd_event_source *s, uint64_t usec, void *userdata) {
410435
Route *route = userdata;
411436
int r;
412437

413438
assert(route);
414439

415-
r = route_remove(route, route->link, NULL);
440+
r = route_remove(route, route->link, route_expire_callback);
416441
if (r < 0)
417442
log_warning_errno(r, "Could not remove route: %m");
443+
else {
444+
/* route may not be exist in kernel. If we fail still remove it */
445+
route->link->link_messages++;
446+
route_free(route);
447+
}
418448

419449
return 1;
420450
}

0 commit comments

Comments
 (0)