From: Michael Tremer Date: Mon, 13 Feb 2023 15:14:01 +0000 (+0000) Subject: networkd: Add function to check whether a link has a carrier X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dfd49c2cc85fcee2303a96bc2186de0e21d8da4f;p=network.git networkd: Add function to check whether a link has a carrier Signed-off-by: Michael Tremer --- diff --git a/src/networkd/link.c b/src/networkd/link.c index 6392a90a..80478f43 100644 --- a/src/networkd/link.c +++ b/src/networkd/link.c @@ -18,7 +18,7 @@ # # #############################################################################*/ -#include +#include #include #include #include @@ -39,7 +39,7 @@ struct nw_link { int ifindex; // Interface Name - char ifname[IF_NAMESIZE]; + char ifname[IFNAMSIZ]; // MTU uint32_t mtu; @@ -98,6 +98,20 @@ int nw_link_ifindex(nw_link* link) { return link->ifindex; } +// Carrier + +int nw_link_has_carrier(nw_link* link) { + return link->operstate == IF_OPER_UP; +} + +static int nw_link_carrier_gained(nw_link* link) { + return 0; // XXX TODO +} + +static int nw_link_carrier_lost(nw_link* link) { + return 0; // XXX TODO +} + static int nw_link_update_ifname(nw_link* link, sd_netlink_message* message) { const char* ifname = NULL; int r; @@ -197,10 +211,24 @@ static int nw_link_update_flags(nw_link* link, sd_netlink_message* message) { // XXX We should log any changes here + // Fetch current carrier state + const int had_carrier = nw_link_has_carrier(link); + // Store the new flags & operstate link->flags = flags; link->operstate = operstate; + // Notify if carrier was gained or lost + if (!had_carrier && nw_link_has_carrier(link)) { + r = nw_link_carrier_gained(link); + if (r < 0) + return r; + + } else if (had_carrier && !nw_link_has_carrier(link)) { + r = nw_link_carrier_lost(link); + if (r < 0) + return r; + } return 0; } diff --git a/src/networkd/link.h b/src/networkd/link.h index acb5e7b3..3d8d3974 100644 --- a/src/networkd/link.h +++ b/src/networkd/link.h @@ -33,6 +33,8 @@ nw_link* nw_link_unref(nw_link* link); int nw_link_ifindex(nw_link* link); const char* nw_link_name(nw_link* link); +int nw_link_has_carrier(nw_link* link); + int nw_link_process(sd_netlink* rtnl, sd_netlink_message* message, void* data); #endif /* NETWORKD_LINK_H */