mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-10-27 18:55:09 +03:00
resolved: when checking whether a link is relevant, check kernel operstate
This mimics what networkd is doing to detect a carrier.
This commit is contained in:
parent
55abd6dadd
commit
6955a3ba9d
@ -1149,3 +1149,14 @@ static inline key_serial_t request_key(const char *type, const char *description
|
||||
#ifndef PR_CAP_AMBIENT_CLEAR_ALL
|
||||
#define PR_CAP_AMBIENT_CLEAR_ALL 4
|
||||
#endif
|
||||
|
||||
/* The following two defines are actually available in the kernel headers for longer, but we define them here anyway,
|
||||
* since that makes it easier to use them in conjunction with the glibc net/if.h header which conflicts with
|
||||
* linux/if.h. */
|
||||
#ifndef IF_OPER_UNKNOWN
|
||||
#define IF_OPER_UNKNOWN 0
|
||||
#endif
|
||||
|
||||
#ifndef IF_OPER_UP
|
||||
#define IF_OPER_UP 6
|
||||
#endif
|
||||
|
@ -49,6 +49,7 @@ int link_new(Manager *m, Link **ret, int ifindex) {
|
||||
l->llmnr_support = RESOLVE_SUPPORT_YES;
|
||||
l->mdns_support = RESOLVE_SUPPORT_NO;
|
||||
l->dnssec_mode = _DNSSEC_MODE_INVALID;
|
||||
l->operstate = IF_OPER_UNKNOWN;
|
||||
|
||||
r = hashmap_put(m->links, INT_TO_PTR(ifindex), l);
|
||||
if (r < 0)
|
||||
@ -177,7 +178,8 @@ int link_update_rtnl(Link *l, sd_netlink_message *m) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
sd_netlink_message_read_u32(m, IFLA_MTU, &l->mtu);
|
||||
(void) sd_netlink_message_read_u32(m, IFLA_MTU, &l->mtu);
|
||||
(void) sd_netlink_message_read_u8(m, IFLA_OPERSTATE, &l->operstate);
|
||||
|
||||
if (sd_netlink_message_read_string(m, IFLA_IFNAME, &n) >= 0) {
|
||||
strncpy(l->name, n, sizeof(l->name)-1);
|
||||
@ -514,7 +516,12 @@ bool link_relevant(Link *l, int family, bool multicast) {
|
||||
return false;
|
||||
}
|
||||
|
||||
sd_network_link_get_operational_state(l->ifindex, &state);
|
||||
/* Check kernel operstate
|
||||
* https://www.kernel.org/doc/Documentation/networking/operstates.txt */
|
||||
if (!IN_SET(l->operstate, IF_OPER_UNKNOWN, IF_OPER_UP))
|
||||
return false;
|
||||
|
||||
(void) sd_network_link_get_operational_state(l->ifindex, &state);
|
||||
if (state && !STR_IN_SET(state, "unknown", "degraded", "routable"))
|
||||
return false;
|
||||
|
||||
|
@ -82,6 +82,7 @@ struct Link {
|
||||
|
||||
char name[IF_NAMESIZE];
|
||||
uint32_t mtu;
|
||||
uint8_t operstate;
|
||||
};
|
||||
|
||||
int link_new(Manager *m, Link **ret, int ifindex);
|
||||
|
Loading…
Reference in New Issue
Block a user