| /* |
| * Copyright (c) 2016 Intel Corporation. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/logging/log.h> |
| LOG_MODULE_REGISTER(net_wifi_mgmt, CONFIG_NET_L2_WIFI_MGMT_LOG_LEVEL); |
| |
| #include <errno.h> |
| |
| #include <zephyr/net/net_core.h> |
| #include <zephyr/net/net_if.h> |
| #include <zephyr/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); |