]> git.ipfire.org Git - people/ms/network.git/commitdiff
networkd: Add function to check whether a link has a carrier
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 13 Feb 2023 15:14:01 +0000 (15:14 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 13 Feb 2023 15:14:01 +0000 (15:14 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/networkd/link.c
src/networkd/link.h

index 6392a90a3b90c33024119df990d9245739e8f5b9..80478f4342a4e4c659ea71c0cba58d038c9a8587 100644 (file)
@@ -18,7 +18,7 @@
 #                                                                             #
 #############################################################################*/
 
-#include <net/if.h>
+#include <linux/if.h>
 #include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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;
 }
index acb5e7b3561e52b248e2f20c84580403d5ac8882..3d8d3974babc5211c80c9b17e422ee1547aacf51 100644 (file)
@@ -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 */