if (r < 0)
return log_link_error_errno(link, r, "Could not append NHA_GATEWAY attribute: %m");
- if (nexthop->onlink > 0) {
- r = sd_rtnl_message_nexthop_set_flags(req, RTNH_F_ONLINK);
- if (r < 0)
- return log_link_error_errno(link, r, "Failed to set RTNH_F_ONLINK flag: %m");
- }
+ r = sd_rtnl_message_nexthop_set_flags(req, nexthop->flags & RTNH_F_ONLINK);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Failed to set nexthop flags: %m");
}
}
}
}
- return gateway_is_ready(link, nexthop->onlink, nexthop->family, &nexthop->gw);
+ return gateway_is_ready(link, FLAGS_SET(nexthop->flags, RTNH_F_ONLINK), nexthop->family, &nexthop->gw);
}
int request_process_nexthop(Request *req) {
return 0;
}
+ r = sd_rtnl_message_nexthop_get_flags(message, &tmp->flags);
+ if (r < 0) {
+ log_link_warning_errno(link, r, "rtnl: could not get nexthop flags, ignoring: %m");
+ return 0;
+ }
+
r = sd_netlink_message_read_data(message, NHA_GROUP, &raw_group_size, &raw_group);
if (r < 0 && r != -ENODATA) {
log_link_warning_errno(link, r, "rtnl: could not get NHA_GROUP attribute, ignoring: %m");
switch (type) {
case RTM_NEWNEXTHOP:
if (nexthop) {
+ nexthop->flags = tmp->flags;
nexthop_enter_configured(nexthop);
log_nexthop_debug(tmp, "Received remembered", link);
} else {
nh->onlink = true;
}
+ if (nh->onlink >= 0)
+ SET_FLAG(nh->flags, RTNH_F_ONLINK, nh->onlink);
+
return 0;
}
}
static int route_set_netlink_message(const Route *route, sd_netlink_message *req, Link *link) {
- unsigned flags;
int r;
assert(route);
if (r < 0)
return log_link_error_errno(link, r, "Could not set scope: %m");
- flags = route->flags;
- if (route->gateway_onlink >= 0)
- SET_FLAG(flags, RTNH_F_ONLINK, route->gateway_onlink);
-
- r = sd_rtnl_message_route_set_flags(req, flags);
+ r = sd_rtnl_message_route_set_flags(req, route->flags & RTNH_F_ONLINK);
if (r < 0)
return log_link_error_errno(link, r, "Could not set flags: %m");
return 0;
}
-bool gateway_is_ready(Link *link, int onlink, int family, const union in_addr_union *gw) {
+bool gateway_is_ready(Link *link, bool onlink, int family, const union in_addr_union *gw) {
assert(link);
assert(gw);
- if (onlink > 0)
+ if (onlink)
return true;
if (!in_addr_is_set(family, gw))
return r;
}
- if (!gateway_is_ready(link, route->gateway_onlink, route->gw_family, &route->gw))
+ if (!gateway_is_ready(link, FLAGS_SET(route->flags, RTNH_F_ONLINK), route->gw_family, &route->gw))
return false;
MultipathRoute *m;
m->ifindex = l->ifindex;
}
- if (!gateway_is_ready(l ?: link, route->gateway_onlink, m->gateway.family, &a))
+ if (!gateway_is_ready(l ?: link, FLAGS_SET(route->flags, RTNH_F_ONLINK), m->gateway.family, &a))
return false;
}
switch (type) {
case RTM_NEWROUTE:
if (route) {
+ route->flags = tmp->flags;
route_enter_configured(route);
log_route_debug(route, "Received remembered", link, manager);
return 0;
}
+ r = sd_rtnl_message_route_get_flags(message, &tmp->flags);
+ if (r < 0) {
+ log_warning_errno(r, "rtnl: received route message without route flags, ignoring: %m");
+ return 0;
+ }
+
r = netlink_message_read_in_addr_union(message, RTA_DST, tmp->family, &tmp->dst);
if (r < 0 && r != -ENODATA) {
log_link_warning_errno(link, r, "rtnl: received route message without valid destination, ignoring: %m");
route->gateway_onlink = true;
}
+ if (route->gateway_onlink >= 0)
+ SET_FLAG(route->flags, RTNH_F_ONLINK, route->gateway_onlink);
+
if (route->family == AF_INET6) {
MultipathRoute *m;
uint32_t advmss;
unsigned char pref;
unsigned flags;
- int gateway_onlink;
+ int gateway_onlink; /* Only used in conf parser and route_section_verify(). */
uint32_t nexthop_id;
bool scope_set:1;
int route_get(Manager *manager, Link *link, const Route *in, Route **ret);
int manager_find_uplink(Manager *m, int family, Link *exclude, Link **ret);
-bool gateway_is_ready(Link *link, int onlink, int family, const union in_addr_union *gw);
+bool gateway_is_ready(Link *link, bool onlink, int family, const union in_addr_union *gw);
int link_drop_routes(Link *link);
int link_drop_foreign_routes(Link *link);