mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2025-02-18 09:10:38 +01:00
ap: Convert to IWD_MODULE
This commit is contained in:
parent
eeac3e8f40
commit
c80d32a162
@ -195,8 +195,7 @@ src_iwd_SOURCES = src/main.c linux/nl80211.h src/iwd.h src/missing.h \
|
|||||||
src/knownnetworks.c \
|
src/knownnetworks.c \
|
||||||
src/rfkill.h src/rfkill.c \
|
src/rfkill.h src/rfkill.c \
|
||||||
src/ft.h src/ft.c \
|
src/ft.h src/ft.c \
|
||||||
src/ap.h src/ap.c \
|
src/ap.c src/adhoc.c \
|
||||||
src/adhoc.c \
|
|
||||||
src/sae.h src/sae.c \
|
src/sae.h src/sae.c \
|
||||||
src/nl80211util.h src/nl80211util.c \
|
src/nl80211util.h src/nl80211util.c \
|
||||||
src/owe.h src/owe.c \
|
src/owe.h src/owe.c \
|
||||||
|
66
src/ap.c
66
src/ap.c
@ -42,12 +42,12 @@
|
|||||||
#include "src/util.h"
|
#include "src/util.h"
|
||||||
#include "src/eapol.h"
|
#include "src/eapol.h"
|
||||||
#include "src/handshake.h"
|
#include "src/handshake.h"
|
||||||
#include "src/ap.h"
|
|
||||||
#include "src/dbus.h"
|
#include "src/dbus.h"
|
||||||
#include "src/nl80211util.h"
|
#include "src/nl80211util.h"
|
||||||
|
|
||||||
struct ap_state {
|
struct ap_state {
|
||||||
struct netdev *netdev;
|
struct netdev *netdev;
|
||||||
|
struct l_genl_family *nl80211;
|
||||||
char *ssid;
|
char *ssid;
|
||||||
uint8_t channel;
|
uint8_t channel;
|
||||||
unsigned int ciphers;
|
unsigned int ciphers;
|
||||||
@ -84,21 +84,21 @@ struct sta_state {
|
|||||||
uint32_t gtk_query_cmd_id;
|
uint32_t gtk_query_cmd_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct l_genl_family *nl80211 = NULL;
|
|
||||||
static uint32_t netdev_watch;
|
static uint32_t netdev_watch;
|
||||||
|
|
||||||
static void ap_sta_free(void *data)
|
static void ap_sta_free(void *data)
|
||||||
{
|
{
|
||||||
struct sta_state *sta = data;
|
struct sta_state *sta = data;
|
||||||
|
struct ap_state *ap = sta->ap;
|
||||||
|
|
||||||
l_uintset_free(sta->rates);
|
l_uintset_free(sta->rates);
|
||||||
l_free(sta->assoc_rsne);
|
l_free(sta->assoc_rsne);
|
||||||
|
|
||||||
if (sta->assoc_resp_cmd_id)
|
if (sta->assoc_resp_cmd_id)
|
||||||
l_genl_family_cancel(nl80211, sta->assoc_resp_cmd_id);
|
l_genl_family_cancel(ap->nl80211, sta->assoc_resp_cmd_id);
|
||||||
|
|
||||||
if (sta->gtk_query_cmd_id)
|
if (sta->gtk_query_cmd_id)
|
||||||
l_genl_family_cancel(nl80211, sta->gtk_query_cmd_id);
|
l_genl_family_cancel(ap->nl80211, sta->gtk_query_cmd_id);
|
||||||
|
|
||||||
if (sta->sm)
|
if (sta->sm)
|
||||||
eapol_sm_free(sta->sm);
|
eapol_sm_free(sta->sm);
|
||||||
@ -136,7 +136,7 @@ static void ap_reset(struct ap_state *ap)
|
|||||||
l_queue_destroy(ap->frame_watch_ids, NULL);
|
l_queue_destroy(ap->frame_watch_ids, NULL);
|
||||||
|
|
||||||
if (ap->start_stop_cmd_id)
|
if (ap->start_stop_cmd_id)
|
||||||
l_genl_family_cancel(nl80211, ap->start_stop_cmd_id);
|
l_genl_family_cancel(ap->nl80211, ap->start_stop_cmd_id);
|
||||||
|
|
||||||
l_queue_destroy(ap->sta_states, ap_sta_free);
|
l_queue_destroy(ap->sta_states, ap_sta_free);
|
||||||
|
|
||||||
@ -154,19 +154,21 @@ static void ap_free(void *data)
|
|||||||
struct ap_state *ap = data;
|
struct ap_state *ap = data;
|
||||||
|
|
||||||
ap_reset(ap);
|
ap_reset(ap);
|
||||||
|
l_genl_family_free(ap->nl80211);
|
||||||
l_free(ap);
|
l_free(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ap_del_station(struct sta_state *sta, uint16_t reason,
|
static void ap_del_station(struct sta_state *sta, uint16_t reason,
|
||||||
bool disassociate)
|
bool disassociate)
|
||||||
{
|
{
|
||||||
netdev_del_station(sta->ap->netdev, sta->addr, reason, disassociate);
|
struct ap_state *ap = sta->ap;
|
||||||
|
|
||||||
|
netdev_del_station(ap->netdev, sta->addr, reason, disassociate);
|
||||||
sta->associated = false;
|
sta->associated = false;
|
||||||
sta->rsna = false;
|
sta->rsna = false;
|
||||||
|
|
||||||
if (sta->gtk_query_cmd_id) {
|
if (sta->gtk_query_cmd_id) {
|
||||||
l_genl_family_cancel(nl80211, sta->gtk_query_cmd_id);
|
l_genl_family_cancel(ap->nl80211, sta->gtk_query_cmd_id);
|
||||||
sta->gtk_query_cmd_id = 0;
|
sta->gtk_query_cmd_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,6 +224,7 @@ static void ap_new_rsna(struct sta_state *sta)
|
|||||||
|
|
||||||
static void ap_drop_rsna(struct sta_state *sta)
|
static void ap_drop_rsna(struct sta_state *sta)
|
||||||
{
|
{
|
||||||
|
struct ap_state *ap = sta->ap;
|
||||||
struct l_genl_msg *msg;
|
struct l_genl_msg *msg;
|
||||||
uint32_t ifindex = netdev_get_ifindex(sta->ap->netdev);
|
uint32_t ifindex = netdev_get_ifindex(sta->ap->netdev);
|
||||||
uint8_t key_id = 0;
|
uint8_t key_id = 0;
|
||||||
@ -232,7 +235,7 @@ static void ap_drop_rsna(struct sta_state *sta)
|
|||||||
|
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_STA_AID, 2, &sta->aid);
|
l_genl_msg_append_attr(msg, NL80211_ATTR_STA_AID, 2, &sta->aid);
|
||||||
|
|
||||||
if (!l_genl_family_send(nl80211, msg, ap_set_sta_cb, NULL, NULL)) {
|
if (!l_genl_family_send(ap->nl80211, msg, ap_set_sta_cb, NULL, NULL)) {
|
||||||
l_genl_msg_unref(msg);
|
l_genl_msg_unref(msg);
|
||||||
l_error("Issuing SET_STATION failed");
|
l_error("Issuing SET_STATION failed");
|
||||||
}
|
}
|
||||||
@ -242,7 +245,7 @@ static void ap_drop_rsna(struct sta_state *sta)
|
|||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_KEY_IDX, 1, &key_id);
|
l_genl_msg_append_attr(msg, NL80211_ATTR_KEY_IDX, 1, &key_id);
|
||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_MAC, 6, sta->addr);
|
l_genl_msg_append_attr(msg, NL80211_ATTR_MAC, 6, sta->addr);
|
||||||
|
|
||||||
if (!l_genl_family_send(nl80211, msg, ap_del_key_cb, NULL, NULL)) {
|
if (!l_genl_family_send(ap->nl80211, msg, ap_del_key_cb, NULL, NULL)) {
|
||||||
l_genl_msg_unref(msg);
|
l_genl_msg_unref(msg);
|
||||||
l_error("Issuing DEL_KEY failed");
|
l_error("Issuing DEL_KEY failed");
|
||||||
}
|
}
|
||||||
@ -370,7 +373,7 @@ static uint32_t ap_send_mgmt_frame(struct ap_state *ap,
|
|||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_DONT_WAIT_FOR_ACK,
|
l_genl_msg_append_attr(msg, NL80211_ATTR_DONT_WAIT_FOR_ACK,
|
||||||
0, NULL);
|
0, NULL);
|
||||||
|
|
||||||
id = l_genl_family_send(nl80211, msg, callback, user_data, NULL);
|
id = l_genl_family_send(ap->nl80211, msg, callback, user_data, NULL);
|
||||||
|
|
||||||
if (!id)
|
if (!id)
|
||||||
l_genl_msg_unref(msg);
|
l_genl_msg_unref(msg);
|
||||||
@ -571,7 +574,7 @@ static void ap_associate_sta_cb(struct l_genl_msg *msg, void *user_data)
|
|||||||
ap->gtk, gtk_len, NULL,
|
ap->gtk, gtk_len, NULL,
|
||||||
0, NULL);
|
0, NULL);
|
||||||
|
|
||||||
if (!l_genl_family_send(nl80211, msg, ap_gtk_op_cb, NULL,
|
if (!l_genl_family_send(ap->nl80211, msg, ap_gtk_op_cb, NULL,
|
||||||
NULL)) {
|
NULL)) {
|
||||||
l_genl_msg_unref(msg);
|
l_genl_msg_unref(msg);
|
||||||
l_error("Issuing NEW_KEY failed");
|
l_error("Issuing NEW_KEY failed");
|
||||||
@ -580,7 +583,7 @@ static void ap_associate_sta_cb(struct l_genl_msg *msg, void *user_data)
|
|||||||
|
|
||||||
msg = nl80211_build_set_key(netdev_get_ifindex(ap->netdev),
|
msg = nl80211_build_set_key(netdev_get_ifindex(ap->netdev),
|
||||||
ap->gtk_index);
|
ap->gtk_index);
|
||||||
if (!l_genl_family_send(nl80211, msg, ap_gtk_op_cb, NULL,
|
if (!l_genl_family_send(ap->nl80211, msg, ap_gtk_op_cb, NULL,
|
||||||
NULL)) {
|
NULL)) {
|
||||||
l_genl_msg_unref(msg);
|
l_genl_msg_unref(msg);
|
||||||
l_error("Issuing SET_KEY failed");
|
l_error("Issuing SET_KEY failed");
|
||||||
@ -599,7 +602,7 @@ static void ap_associate_sta_cb(struct l_genl_msg *msg, void *user_data)
|
|||||||
else {
|
else {
|
||||||
msg = nl80211_build_get_key(netdev_get_ifindex(ap->netdev),
|
msg = nl80211_build_get_key(netdev_get_ifindex(ap->netdev),
|
||||||
ap->gtk_index);
|
ap->gtk_index);
|
||||||
sta->gtk_query_cmd_id = l_genl_family_send(nl80211, msg,
|
sta->gtk_query_cmd_id = l_genl_family_send(ap->nl80211, msg,
|
||||||
ap_gtk_query_cb,
|
ap_gtk_query_cb,
|
||||||
sta, NULL);
|
sta, NULL);
|
||||||
if (!sta->gtk_query_cmd_id) {
|
if (!sta->gtk_query_cmd_id) {
|
||||||
@ -647,7 +650,8 @@ static void ap_associate_sta(struct ap_state *ap, struct sta_state *sta)
|
|||||||
l_genl_msg_append_attr(msg, NL80211_ATTR_STA_CAPABILITY, 2,
|
l_genl_msg_append_attr(msg, NL80211_ATTR_STA_CAPABILITY, 2,
|
||||||
&capability);
|
&capability);
|
||||||
|
|
||||||
if (!l_genl_family_send(nl80211, msg, ap_associate_sta_cb, sta, NULL)) {
|
if (!l_genl_family_send(ap->nl80211, msg, ap_associate_sta_cb,
|
||||||
|
sta, NULL)) {
|
||||||
l_genl_msg_unref(msg);
|
l_genl_msg_unref(msg);
|
||||||
if (l_genl_msg_get_command(msg) == NL80211_CMD_NEW_STATION)
|
if (l_genl_msg_get_command(msg) == NL80211_CMD_NEW_STATION)
|
||||||
l_error("Issuing NEW_STATION failed");
|
l_error("Issuing NEW_STATION failed");
|
||||||
@ -1162,7 +1166,7 @@ static void ap_disassoc_cb(struct netdev *netdev,
|
|||||||
sta = l_queue_find(ap->sta_states, ap_sta_match_addr, hdr->address_2);
|
sta = l_queue_find(ap->sta_states, ap_sta_match_addr, hdr->address_2);
|
||||||
|
|
||||||
if (sta && sta->assoc_resp_cmd_id) {
|
if (sta && sta->assoc_resp_cmd_id) {
|
||||||
l_genl_family_cancel(nl80211, sta->assoc_resp_cmd_id);
|
l_genl_family_cancel(ap->nl80211, sta->assoc_resp_cmd_id);
|
||||||
sta->assoc_resp_cmd_id = 0;
|
sta->assoc_resp_cmd_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1470,8 +1474,8 @@ static int ap_start(struct ap_state *ap, const char *ssid, const char *psk,
|
|||||||
if (!cmd)
|
if (!cmd)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
ap->start_stop_cmd_id = l_genl_family_send(nl80211, cmd, ap_start_cb,
|
ap->start_stop_cmd_id = l_genl_family_send(ap->nl80211, cmd,
|
||||||
ap, NULL);
|
ap_start_cb, ap, NULL);
|
||||||
if (!ap->start_stop_cmd_id) {
|
if (!ap->start_stop_cmd_id) {
|
||||||
l_genl_msg_unref(cmd);
|
l_genl_msg_unref(cmd);
|
||||||
goto error;
|
goto error;
|
||||||
@ -1530,9 +1534,9 @@ static int ap_stop(struct ap_state *ap, struct l_dbus_message *message)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if (ap->start_stop_cmd_id)
|
if (ap->start_stop_cmd_id)
|
||||||
l_genl_family_cancel(nl80211, ap->start_stop_cmd_id);
|
l_genl_family_cancel(ap->nl80211, ap->start_stop_cmd_id);
|
||||||
|
|
||||||
ap->start_stop_cmd_id = l_genl_family_send(nl80211, cmd, ap_stop_cb,
|
ap->start_stop_cmd_id = l_genl_family_send(ap->nl80211, cmd, ap_stop_cb,
|
||||||
ap, NULL);
|
ap, NULL);
|
||||||
if (!ap->start_stop_cmd_id) {
|
if (!ap->start_stop_cmd_id) {
|
||||||
l_genl_msg_unref(cmd);
|
l_genl_msg_unref(cmd);
|
||||||
@ -1545,7 +1549,7 @@ static int ap_stop(struct ap_state *ap, struct l_dbus_message *message)
|
|||||||
ap->gtk_set = false;
|
ap->gtk_set = false;
|
||||||
|
|
||||||
msg = ap_build_cmd_del_key(ap);
|
msg = ap_build_cmd_del_key(ap);
|
||||||
if (!l_genl_family_send(nl80211, msg, ap_gtk_op_cb, NULL,
|
if (!l_genl_family_send(ap->nl80211, msg, ap_gtk_op_cb, NULL,
|
||||||
NULL)) {
|
NULL)) {
|
||||||
l_genl_msg_unref(msg);
|
l_genl_msg_unref(msg);
|
||||||
l_error("Issuing DEL_KEY failed");
|
l_error("Issuing DEL_KEY failed");
|
||||||
@ -1630,9 +1634,14 @@ static void ap_add_interface(struct netdev *netdev)
|
|||||||
{
|
{
|
||||||
struct ap_state *ap;
|
struct ap_state *ap;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: Check wiphy supported channels and NL80211_ATTR_TX_FRAME_TYPES
|
||||||
|
*/
|
||||||
|
|
||||||
/* just allocate/set device, Start method will complete setup */
|
/* just allocate/set device, Start method will complete setup */
|
||||||
ap = l_new(struct ap_state, 1);
|
ap = l_new(struct ap_state, 1);
|
||||||
ap->netdev = netdev;
|
ap->netdev = netdev;
|
||||||
|
ap->nl80211 = l_genl_family_new(iwd_get_genl(), NL80211_GENL_NAME);
|
||||||
|
|
||||||
/* setup ap dbus interface */
|
/* setup ap dbus interface */
|
||||||
l_dbus_object_add_interface(dbus_get_bus(),
|
l_dbus_object_add_interface(dbus_get_bus(),
|
||||||
@ -1664,21 +1673,20 @@ static void ap_netdev_watch(struct netdev *netdev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ap_init(struct l_genl_family *in)
|
static int ap_init(void)
|
||||||
{
|
{
|
||||||
netdev_watch = netdev_watch_add(ap_netdev_watch, NULL, NULL);
|
netdev_watch = netdev_watch_add(ap_netdev_watch, NULL, NULL);
|
||||||
nl80211 = in;
|
|
||||||
|
|
||||||
return l_dbus_register_interface(dbus_get_bus(), IWD_AP_INTERFACE,
|
l_dbus_register_interface(dbus_get_bus(), IWD_AP_INTERFACE,
|
||||||
ap_setup_interface, ap_destroy_interface, false);
|
ap_setup_interface, ap_destroy_interface, false);
|
||||||
/*
|
|
||||||
* TODO: Check wiphy supports AP mode, supported channels,
|
return 0;
|
||||||
* check wiphy's NL80211_ATTR_TX_FRAME_TYPES.
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ap_exit(void)
|
static void ap_exit(void)
|
||||||
{
|
{
|
||||||
netdev_watch_remove(netdev_watch);
|
netdev_watch_remove(netdev_watch);
|
||||||
l_dbus_unregister_interface(dbus_get_bus(), IWD_AP_INTERFACE);
|
l_dbus_unregister_interface(dbus_get_bus(), IWD_AP_INTERFACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IWD_MODULE(ap, ap_init, ap_exit)
|
||||||
|
26
src/ap.h
26
src/ap.h
@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Wireless daemon for Linux
|
|
||||||
*
|
|
||||||
* Copyright (C) 2017 Intel Corporation. All rights reserved.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct device;
|
|
||||||
|
|
||||||
bool ap_init(struct l_genl_family *in);
|
|
||||||
void ap_exit(void);
|
|
@ -39,7 +39,6 @@
|
|||||||
#include "src/eap.h"
|
#include "src/eap.h"
|
||||||
#include "src/eapol.h"
|
#include "src/eapol.h"
|
||||||
#include "src/rfkill.h"
|
#include "src/rfkill.h"
|
||||||
#include "src/ap.h"
|
|
||||||
#include "src/plugin.h"
|
#include "src/plugin.h"
|
||||||
#include "src/storage.h"
|
#include "src/storage.h"
|
||||||
|
|
||||||
@ -155,8 +154,6 @@ static void nl80211_appeared(const struct l_genl_family_info *info,
|
|||||||
l_error("Unable to init wiphy functionality");
|
l_error("Unable to init wiphy functionality");
|
||||||
|
|
||||||
netdev_set_nl80211(nl80211);
|
netdev_set_nl80211(nl80211);
|
||||||
|
|
||||||
ap_init(nl80211);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern struct iwd_module_desc __start___iwd_module[];
|
extern struct iwd_module_desc __start___iwd_module[];
|
||||||
@ -532,7 +529,6 @@ fail_netdev:
|
|||||||
|
|
||||||
if (nl80211) {
|
if (nl80211) {
|
||||||
manager_exit();
|
manager_exit();
|
||||||
ap_exit();
|
|
||||||
wiphy_exit();
|
wiphy_exit();
|
||||||
l_genl_family_free(nl80211);
|
l_genl_family_free(nl80211);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user