Skip to content

Commit

Permalink
[nrf fromlist] net: wifi: Add support to handle Wi-Fi NM's in Wi-Fi m…
Browse files Browse the repository at this point in the history
…anagement

Check if a network interface is managed by a network manager before
falling back to offload API.

Upstream-Pr: zephyrproject-rtos/zephyr#59249

Signed-off-by: Chaitanya Tata <Chaitanya.Tata@nordicsemi.no>
  • Loading branch information
krish2718 authored and nordicjm committed Jul 5, 2023
1 parent 6ef7200 commit 80f1eb3
Showing 1 changed file with 23 additions and 33 deletions.
56 changes: 23 additions & 33 deletions subsys/net/l2/wifi/wifi_mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,22 @@ LOG_MODULE_REGISTER(net_wifi_mgmt, CONFIG_NET_L2_WIFI_MGMT_LOG_LEVEL);
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/wifi_mgmt.h>
#include <zephyr/net/wifi_native.h>
#ifdef CONFIG_WIFI_NM
#include <zephyr/net/wifi_nm.h>
#endif /* CONFIG_WIFI_NM */

static const struct wifi_mgmt_ops *const get_wifi_api(struct net_if *iface)
{
const struct device *dev = net_if_get_device(iface);
struct net_wifi_mgmt_offload *off_api =
(struct net_wifi_mgmt_offload *) dev->api;
#ifdef CONFIG_WIFI_NM
struct wifi_nm_instance *nm = wifi_nm_get_instance_iface(iface);

if (nm) {
return nm->ops;
}
#endif /* CONFIG_WIFI_NM */
return off_api ? off_api->wifi_mgmt_api : NULL;
}

Expand All @@ -28,9 +37,8 @@ static int wifi_connect(uint32_t mgmt_request, struct net_if *iface,
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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;

const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);

if (wifi_mgmt_api == NULL || wifi_mgmt_api->connect == NULL) {
return -ENOTSUP;
Expand Down Expand Up @@ -93,7 +101,7 @@ static int wifi_scan(uint32_t mgmt_request, struct net_if *iface,
{
const struct device *dev = net_if_get_device(iface);
struct wifi_scan_params *params = data;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);

if (wifi_mgmt_api == NULL || wifi_mgmt_api->scan == NULL) {
return -ENOTSUP;
Expand All @@ -114,9 +122,7 @@ 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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);

if (wifi_mgmt_api == NULL || wifi_mgmt_api->disconnect == NULL) {
return -ENOTSUP;
Expand Down Expand Up @@ -155,9 +161,7 @@ static int wifi_ap_enable(uint32_t mgmt_request, struct net_if *iface,
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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);

if (wifi_mgmt_api == NULL || wifi_mgmt_api->ap_enable == NULL) {
return -ENOTSUP;
Expand All @@ -172,9 +176,7 @@ 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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);

if (wifi_mgmt_api == NULL || wifi_mgmt_api->ap_enable == NULL) {
return -ENOTSUP;
Expand All @@ -189,9 +191,7 @@ static int wifi_iface_status(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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);
struct wifi_iface_status *status = data;

if (wifi_mgmt_api == NULL || wifi_mgmt_api->iface_status == NULL) {
Expand Down Expand Up @@ -219,9 +219,7 @@ static int wifi_iface_stats(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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);
struct net_stats_wifi *stats = data;

if (wifi_mgmt_api == NULL || wifi_mgmt_api->get_stats == NULL) {
Expand All @@ -241,9 +239,7 @@ static int wifi_set_power_save(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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);
struct wifi_ps_params *ps_params = data;
struct wifi_iface_status info = { 0 };

Expand Down Expand Up @@ -286,9 +282,7 @@ static int wifi_get_power_save_config(uint32_t mgmt_request, struct net_if *ifac
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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);
struct wifi_ps_config *ps_config = data;

if (wifi_mgmt_api == NULL || wifi_mgmt_api->get_power_save_config == NULL) {
Expand All @@ -308,9 +302,7 @@ static int wifi_set_twt(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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);
struct wifi_twt_params *twt_params = data;
struct wifi_iface_status info = { 0 };

Expand All @@ -321,7 +313,7 @@ static int wifi_set_twt(uint32_t mgmt_request, struct net_if *iface,
}

if (twt_params->operation == WIFI_TWT_TEARDOWN) {
return off_api->set_twt(dev, twt_params);
return wifi_mgmt_api->set_twt(dev, twt_params);
}

if (net_mgmt(NET_REQUEST_WIFI_IFACE_STATUS, iface, &info,
Expand Down Expand Up @@ -380,9 +372,7 @@ static int wifi_reg_domain(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;
const struct wifi_mgmt_ops *const wifi_mgmt_api = off_api ? off_api->wifi_mgmt_api : NULL;
const struct wifi_mgmt_ops *const wifi_mgmt_api = get_wifi_api(iface);
struct wifi_reg_domain *reg_domain = data;

if (wifi_mgmt_api == NULL || wifi_mgmt_api->reg_domain == NULL) {
Expand Down

0 comments on commit 80f1eb3

Please sign in to comment.