160 lines
4.2 KiB
C
160 lines
4.2 KiB
C
/*
|
|
* Copyright (c) 2016 Intel Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <logging/log.h>
|
|
LOG_MODULE_REGISTER(net_wifi_mgmt, CONFIG_NET_L2_WIFI_MGMT_LOG_LEVEL);
|
|
|
|
#include <errno.h>
|
|
|
|
#include <net/net_core.h>
|
|
#include <net/net_if.h>
|
|
#include <net/wifi_mgmt.h>
|
|
|
|
static int wifi_connect(uint32_t mgmt_request, struct net_if *iface,
|
|
void *data, size_t len)
|
|
{
|
|
struct wifi_connect_req_params *params =
|
|
(struct wifi_connect_req_params *)data;
|
|
const struct device *dev = net_if_get_device(iface);
|
|
struct net_wifi_mgmt_offload *off_api =
|
|
(struct net_wifi_mgmt_offload *) dev->api;
|
|
|
|
if (off_api == NULL || off_api->connect == NULL) {
|
|
return -ENOTSUP;
|
|
}
|
|
|
|
LOG_HEXDUMP_DBG(params->ssid, params->ssid_length, "ssid");
|
|
LOG_HEXDUMP_DBG(params->psk, params->psk_length, "psk");
|
|
NET_DBG("ch %u sec %u", params->channel, params->security);
|
|
|
|
if ((params->security > WIFI_SECURITY_TYPE_PSK) ||
|
|
(params->ssid_length > WIFI_SSID_MAX_LEN) ||
|
|
(params->ssid_length == 0U) ||
|
|
((params->security == WIFI_SECURITY_TYPE_PSK) &&
|
|
((params->psk_length < 8) || (params->psk_length > 64) ||
|
|
(params->psk_length == 0U) || !params->psk)) ||
|
|
((params->channel != WIFI_CHANNEL_ANY) &&
|
|
(params->channel > WIFI_CHANNEL_MAX)) ||
|
|
!params->ssid) {
|
|
return -EINVAL;
|
|
}
|
|
|
|
return off_api->connect(dev, params);
|
|
}
|
|
|
|
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_WIFI_CONNECT, wifi_connect);
|
|
|
|
static void scan_result_cb(struct net_if *iface, int status,
|
|
struct wifi_scan_result *entry)
|
|
{
|
|
if (!iface) {
|
|
return;
|
|
}
|
|
|
|
if (!entry) {
|
|
struct wifi_status scan_status = {
|
|
.status = status,
|
|
};
|
|
|
|
net_mgmt_event_notify_with_info(NET_EVENT_WIFI_SCAN_DONE,
|
|
iface, &scan_status,
|
|
sizeof(struct wifi_status));
|
|
return;
|
|
}
|
|
|
|
net_mgmt_event_notify_with_info(NET_EVENT_WIFI_SCAN_RESULT, iface,
|
|
entry, sizeof(struct wifi_scan_result));
|
|
}
|
|
|
|
static int wifi_scan(uint32_t mgmt_request, struct net_if *iface,
|
|
void *data, size_t len)
|
|
{
|
|
const struct device *dev = net_if_get_device(iface);
|
|
struct net_wifi_mgmt_offload *off_api =
|
|
(struct net_wifi_mgmt_offload *) dev->api;
|
|
|
|
if (off_api == NULL || off_api->scan == NULL) {
|
|
return -ENOTSUP;
|
|
}
|
|
|
|
return off_api->scan(dev, scan_result_cb);
|
|
}
|
|
|
|
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_WIFI_SCAN, wifi_scan);
|
|
|
|
|
|
static int wifi_disconnect(uint32_t mgmt_request, struct net_if *iface,
|
|
void *data, size_t len)
|
|
{
|
|
const struct device *dev = net_if_get_device(iface);
|
|
struct net_wifi_mgmt_offload *off_api =
|
|
(struct net_wifi_mgmt_offload *) dev->api;
|
|
|
|
if (off_api == NULL || off_api->disconnect == NULL) {
|
|
return -ENOTSUP;
|
|
}
|
|
|
|
return off_api->disconnect(dev);
|
|
}
|
|
|
|
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_WIFI_DISCONNECT, wifi_disconnect);
|
|
|
|
void wifi_mgmt_raise_connect_result_event(struct net_if *iface, int status)
|
|
{
|
|
struct wifi_status cnx_status = {
|
|
.status = status,
|
|
};
|
|
|
|
net_mgmt_event_notify_with_info(NET_EVENT_WIFI_CONNECT_RESULT,
|
|
iface, &cnx_status,
|
|
sizeof(struct wifi_status));
|
|
}
|
|
|
|
void wifi_mgmt_raise_disconnect_result_event(struct net_if *iface, int status)
|
|
{
|
|
struct wifi_status cnx_status = {
|
|
.status = status,
|
|
};
|
|
|
|
net_mgmt_event_notify_with_info(NET_EVENT_WIFI_DISCONNECT_RESULT,
|
|
iface, &cnx_status,
|
|
sizeof(struct wifi_status));
|
|
}
|
|
|
|
static int wifi_ap_enable(uint32_t mgmt_request, struct net_if *iface,
|
|
void *data, size_t len)
|
|
{
|
|
struct wifi_connect_req_params *params =
|
|
(struct wifi_connect_req_params *)data;
|
|
const struct device *dev = net_if_get_device(iface);
|
|
struct net_wifi_mgmt_offload *off_api =
|
|
(struct net_wifi_mgmt_offload *) dev->api;
|
|
|
|
if (off_api == NULL || off_api->ap_enable == NULL) {
|
|
return -ENOTSUP;
|
|
}
|
|
|
|
return off_api->ap_enable(dev, params);
|
|
}
|
|
|
|
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_WIFI_AP_ENABLE, wifi_ap_enable);
|
|
|
|
static int wifi_ap_disable(uint32_t mgmt_request, struct net_if *iface,
|
|
void *data, size_t len)
|
|
{
|
|
const struct device *dev = net_if_get_device(iface);
|
|
struct net_wifi_mgmt_offload *off_api =
|
|
(struct net_wifi_mgmt_offload *) dev->api;
|
|
|
|
if (off_api == NULL || off_api->ap_enable == NULL) {
|
|
return -ENOTSUP;
|
|
}
|
|
|
|
return off_api->ap_disable(dev);
|
|
}
|
|
|
|
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_WIFI_AP_DISABLE, wifi_ap_disable);
|