static int link_drop_config(Link *link) {
Address *address, *pool_address;
- Route *route;
int r;
SET_FOREACH(address, link->addresses) {
if (r < 0)
return r;
- SET_FOREACH(route, link->routes) {
- /* do not touch routes managed by the kernel */
- if (route->protocol == RTPROT_KERNEL)
- continue;
-
- r = route_remove(route, link, NULL);
- if (r < 0)
- return r;
- }
+ r = link_drop_routes(link);
+ if (r < 0)
+ return r;
ndisc_flush(link);
return r;
}
+int link_drop_routes(Link *link) {
+ Route *route;
+ int k, r = 0;
+
+ assert(link);
+
+ SET_FOREACH(route, link->routes) {
+ /* do not touch routes managed by the kernel */
+ if (route->protocol == RTPROT_KERNEL)
+ continue;
+
+ k = route_remove(route, link, NULL);
+ if (k < 0 && r >= 0)
+ r = k;
+ }
+
+ return r;
+}
+
int route_expire_handler(sd_event_source *s, uint64_t usec, void *userdata) {
Route *route = userdata;
int r;
int route_remove(Route *route, Link *link, link_netlink_message_handler_t callback);
int link_set_routes(Link *link);
+int link_drop_routes(Link *link);
int link_drop_foreign_routes(Link *link);
int manager_rtnl_process_route(sd_netlink *rtnl, sd_netlink_message *message, Manager *m);