# endif /* HAVE_LIBNL3_ROUTE */
} nl_sockets;
#endif /* HAVE_LIBNL3 */
+
+#ifdef HAVE_LIBNL3
+# ifdef HAVE_LIBNL3_GENL
+ int nl80211id;
+# endif /* HAVE_LIBNL3_GENL */
+#endif /* HAVE_LIBNL3 */
};
static int td_daemon_init(sd_event_source* source, void* data) {
# ifdef HAVE_LIBNL3_GENL
struct nl_sock* td_daemon_get_nl_80211_socket(td_daemon* self) {
+ // Create socket if not already done
+ if (!self->nl_sockets.nl80211)
+ self->nl_sockets.nl80211 = td_daemon_get_nl_socket(self, NETLINK_GENERIC);
+
+ return self->nl_sockets.nl80211;
+}
+
+int td_daemon_get_nl_80211_id(td_daemon* self) {
struct nl_sock* sock = NULL;
int r;
- // Create socket if not already done
- if (!self->nl_sockets.nl80211) {
- sock = td_daemon_get_nl_socket(self, NETLINK_GENERIC);
+ if (!self->nl80211id) {
+ // Fetch the nl80211 socket
+ sock = td_daemon_get_nl_80211_socket(self);
+ if (!sock)
+ return -errno;
- // Resolve 802.11
+ // Retrieve the ID
r = genl_ctrl_resolve(sock, "nl80211");
if (r < 0) {
- ERROR(self->ctx, "Failed to resolve nl80211: %s\n", nl_geterror(r));
- errno = ENOTSUP;
- goto ERROR;
+ ERROR(self->ctx, "Failed to resolve nl80211 family id: %s\n", nl_geterror(r));
+ return -ENOTSUP;
}
- // Store the socket
- self->nl_sockets.nl80211 = sock;
+ // Cache the ID
+ self->nl80211id = r;
}
- return self->nl_sockets.nl80211;
-
-ERROR:
- if (sock)
- nl_socket_free(sock);
-
- return NULL;
+ return self->nl80211id;
}
# endif /* HAVE_LIBNL3_GENL */