This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit dce89e18200fe3ca56ebca14df8f12e884e64db0
Author: liqinhui <[email protected]>
AuthorDate: Tue Apr 15 15:07:14 2025 +0800

    simwifi: Refactor the interfaces of simwifi and simnet
    
    Refactor simwifi to separate host and sim logic.
    
    Signed-off-by: liqinhui <[email protected]>
---
 arch/sim/src/Makefile                              |   1 +
 arch/sim/src/sim/CMakeLists.txt                    |   5 +
 arch/sim/src/sim/sim_netdriver.c                   |  33 +++--
 .../src/sim/{sim_wifidriver.c => sim_wifihost.c}   | 145 ++++++++++++---------
 arch/sim/src/sim/sim_wifihost.h                    |  73 +++++++++++
 5 files changed, 188 insertions(+), 69 deletions(-)

diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile
index 1f65cdff48a..a84649acbd6 100644
--- a/arch/sim/src/Makefile
+++ b/arch/sim/src/Makefile
@@ -211,6 +211,7 @@ endif
 
 ifneq ($(CONFIG_SIM_WIFIDEV_NUMBER),0)
   CFLAGS += -DTOPDIR=\"$(TOPDIR)\"
+  CSRCS += sim_wifihost.c
 endif
 
 ifeq ($(CONFIG_SIM_NETDEV_TAP),y)
diff --git a/arch/sim/src/sim/CMakeLists.txt b/arch/sim/src/sim/CMakeLists.txt
index 2c90e3fad47..875040d5ef0 100644
--- a/arch/sim/src/sim/CMakeLists.txt
+++ b/arch/sim/src/sim/CMakeLists.txt
@@ -213,6 +213,11 @@ if(CONFIG_SIM_X11FB)
   endif()
 endif()
 
+if(NOT ${CONFIG_SIM_WIFIDEV_NUMBER} EQUAL 0)
+  add_compile_options(-DTOPDIR=$(TOPDIR))
+  list(APPEND SRCS sim_wifihost.c)
+endif()
+
 if(CONFIG_SIM_NETDEV_TAP)
   list(APPEND SRCS sim_netdriver.c)
 
diff --git a/arch/sim/src/sim/sim_netdriver.c b/arch/sim/src/sim/sim_netdriver.c
index 4dfef8da682..9a893b53b64 100644
--- a/arch/sim/src/sim/sim_netdriver.c
+++ b/arch/sim/src/sim/sim_netdriver.c
@@ -72,6 +72,7 @@
 #include <nuttx/net/pkt.h>
 
 #include "sim_internal.h"
+#include "sim_wifihost.h"
 
 #define SIM_NETDEV_BUFSIZE (CONFIG_SIM_NETDEV_MTU + ETH_HDRLEN + \
                             CONFIG_NET_GUARDSIZE)
@@ -90,20 +91,22 @@
 #define DEVIDX(p) ((struct sim_netdev_s *)(p) - g_sim_dev)
 #define DEVBUF(p) (((struct sim_netdev_s *)(p))->buf)
 
-#if CONFIG_SIM_WIFIDEV_NUMBER != 0
-#  include "sim_wifidriver.c"
-#else
+#define IDXDEV(i) ((struct netdev_lowerhalf_s *)(&g_sim_dev[i].dev))
+
 /****************************************************************************
  * Private Types
  ****************************************************************************/
 
 struct sim_netdev_s
 {
+#if CONFIG_SIM_WIFIDEV_NUMBER != 0
+  struct sim_wifihost_lowerhalf_s dev;
+#else
   struct netdev_lowerhalf_s dev;
+#endif
   uint8_t buf[SIM_NETDEV_BUFSIZE]; /* Used when packet buffer is fragmented */
   struct wdog_s wdog;
 };
-#endif
 
 /****************************************************************************
  * Private Function Prototypes
@@ -211,7 +214,7 @@ static int netdriver_ifup(struct netdev_lowerhalf_s *dev)
 #if CONFIG_SIM_WIFIDEV_NUMBER != 0
   if (DEVIDX(dev) < CONFIG_SIM_WIFIDEV_NUMBER)
     {
-      if (wifidriver_connected(dev))
+      if (sim_wifihost_connected((struct sim_wifihost_lowerhalf_s *)dev))
         {
           netdev_lower_carrier_on(dev);
         }
@@ -283,7 +286,7 @@ int sim_netdriver_init(void)
 
   for (devidx = 0; devidx < CONFIG_SIM_NETDEV_NUMBER; devidx++)
     {
-      dev = &g_sim_dev[devidx].dev;
+      dev = IDXDEV(devidx);
 
       /* Internal initialization */
 
@@ -300,7 +303,8 @@ int sim_netdriver_init(void)
 #if CONFIG_SIM_WIFIDEV_NUMBER != 0
       if (devidx < CONFIG_SIM_WIFIDEV_NUMBER)
         {
-          wifidriver_init(dev, devidx);
+          sim_wifihost_init((struct sim_wifihost_lowerhalf_s *)dev,
+                            devidx);
         }
 #endif
 
@@ -319,13 +323,24 @@ int sim_netdriver_init(void)
 
 void sim_netdriver_setmacaddr(int devidx, unsigned char *macaddr)
 {
-  memcpy(g_sim_dev[devidx].dev.netdev.d_mac.ether.ether_addr_octet, macaddr,
+  memcpy(IDXDEV(devidx)->netdev.d_mac.ether.ether_addr_octet, macaddr,
          IFHWADDRLEN);
 }
 
 void sim_netdriver_setmtu(int devidx, int mtu)
 {
-  g_sim_dev[devidx].dev.netdev.d_pktsize = MIN(SIM_NETDEV_BUFSIZE,
+  IDXDEV(devidx)->netdev.d_pktsize = MIN(SIM_NETDEV_BUFSIZE,
                                                mtu + ETH_HDRLEN);
 }
 
+void sim_netdriver_loop(void)
+{
+  int devidx;
+  for (devidx = 0; devidx < CONFIG_SIM_NETDEV_NUMBER; devidx++)
+    {
+      if (sim_netdev_avail(devidx))
+        {
+          netdev_lower_rxready(IDXDEV(devidx));
+        }
+    }
+}
diff --git a/arch/sim/src/sim/sim_wifidriver.c b/arch/sim/src/sim/sim_wifihost.c
similarity index 91%
rename from arch/sim/src/sim/sim_wifidriver.c
rename to arch/sim/src/sim/sim_wifihost.c
index 16036860e33..5d45177167e 100644
--- a/arch/sim/src/sim/sim_wifidriver.c
+++ b/arch/sim/src/sim/sim_wifihost.c
@@ -1,7 +1,6 @@
 /****************************************************************************
- * arch/sim/src/sim/sim_wifidriver.c
- *
- * SPDX-License-Identifier: Apache-2.0
+ * arch/sim/src/sim/sim_wifihost.c
+ * Manage the host wireless
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -35,6 +34,7 @@
 #include <sys/time.h>
 
 #include "sim_internal.h"
+#include "sim_wifihost.h"
 
 /****************************************************************************
  * Pre-processor Definitions
@@ -105,6 +105,9 @@
     ret__;                                                       \
   })
 
+#define NETDEV2WIFI(dev) \
+  ((struct sim_wifi_s *)((struct sim_wifihost_lowerhalf_s *)dev)->wifi)
+
 /****************************************************************************
  * Private Types
  ****************************************************************************/
@@ -155,10 +158,9 @@ struct sim_bss_info_s
   int16_t snr;                  /* average SNR of during frame reception */
 };
 
-struct sim_netdev_s
+struct sim_wifi_s
 {
-  struct netdev_lowerhalf_s dev;
-  uint8_t buf[SIM_NETDEV_BUFSIZE]; /* Used when packet buffer is fragmented */
+  struct netdev_lowerhalf_s *dev;
   char ssid[SSID_MAX_LEN];
   char bssid[ETH_ALEN];
   uint16_t channel;
@@ -257,7 +259,7 @@ static const struct wireless_ops_s g_iw_ops =
  * Private Functions
  ****************************************************************************/
 
-static int get_cmd_result_num(struct sim_netdev_s *wifidev, char *cmd)
+static int get_cmd_result_num(struct sim_wifi_s *wifidev, char *cmd)
 {
   int num = 0;
   char rbuf[BUF_LEN];
@@ -277,21 +279,21 @@ static int get_cmd_result_num(struct sim_netdev_s 
*wifidev, char *cmd)
 
 /* For sta, add an available network. */
 
-static int wpa_add_network(struct sim_netdev_s *wifidev)
+static int wpa_add_network(struct sim_wifi_s *wifidev)
 {
   return get_cmd_result_num(wifidev, "add_network");
 }
 
 /* For sta, get the number of available networks. */
 
-static int wpa_get_network_num(struct sim_netdev_s *wifidev)
+static int wpa_get_network_num(struct sim_wifi_s *wifidev)
 {
   return get_cmd_result_num(wifidev, "list_network | grep \"\\[\" | wc -l");
 }
 
 /* For sta, get the available network_id. */
 
-static int wpa_get_last_network_id(struct sim_netdev_s *wifidev,
+static int wpa_get_last_network_id(struct sim_wifi_s *wifidev,
                                    int network_num)
 {
   int num;
@@ -823,7 +825,7 @@ static int get_bss_info(struct sim_bss_info_s *bss_info, 
char *buf, int len)
   return OK;
 }
 
-static int get_scan_results(struct sim_netdev_s *wifidev,
+static int get_scan_results(struct sim_wifi_s *wifidev,
                             struct sim_scan_result_s *scan_reqs)
 {
   int ret;
@@ -898,7 +900,7 @@ get_scan:
   return ret;
 }
 
-static bool get_wpa_state(struct sim_netdev_s *wifidev)
+static bool get_wpa_state(struct sim_wifi_s *wifidev)
 {
   int ret;
   char rbuf[BUF_LEN];
@@ -914,7 +916,7 @@ static bool get_wpa_state(struct sim_netdev_s *wifidev)
   return false;
 }
 
-static bool get_wpa_bssid(struct sim_netdev_s *wifidev,
+static bool get_wpa_bssid(struct sim_wifi_s *wifidev,
                           unsigned char *bssid)
 {
   int ret;
@@ -931,7 +933,7 @@ static bool get_wpa_bssid(struct sim_netdev_s *wifidev,
   return false;
 }
 
-static bool get_wpa_rssi(struct sim_netdev_s *wifidev, int32_t *rssi)
+static bool get_wpa_rssi(struct sim_wifi_s *wifidev, int32_t *rssi)
 {
   int ret;
   char rbuf[BUF_LEN];
@@ -948,14 +950,14 @@ static bool get_wpa_rssi(struct sim_netdev_s *wifidev, 
int32_t *rssi)
   return false;
 }
 
-static void get_wpa_ssid(struct sim_netdev_s *wifidev,
+static void get_wpa_ssid(struct sim_wifi_s *wifidev,
                          struct iw_point *essid)
 {
   essid->length = strlen(wifidev->ssid);
   strlcpy(essid->pointer, wifidev->ssid, essid->length + 1);
 }
 
-static int get_wpa_freq(struct sim_netdev_s *wifidev)
+static int get_wpa_freq(struct sim_wifi_s *wifidev)
 {
   return get_cmd_result_num(wifidev,
                             "status | grep freq | awk -F'=' '{print $2}'");
@@ -1075,7 +1077,7 @@ static int wifi_send_event(struct net_driver_s *dev, 
unsigned int cmd,
   return OK;
 }
 
-static int wifidriver_start_scan(struct sim_netdev_s *wifidev,
+static int wifidriver_start_scan(struct sim_wifi_s *wifidev,
                                  struct iwreq *pwrq)
 {
   int ret;
@@ -1110,7 +1112,7 @@ static int wifidriver_start_scan(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_scan_result(struct sim_netdev_s *wifidev,
+static int wifidriver_scan_result(struct sim_wifi_s *wifidev,
                                struct iwreq *pwrq)
 {
   struct sim_scan_result_s scan_req;
@@ -1139,7 +1141,7 @@ static int wifidriver_scan_result(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_set_auth(struct sim_netdev_s *wifidev,
+static int wifidriver_set_auth(struct sim_wifi_s *wifidev,
                                struct iwreq *pwrq)
 {
   int ret = 0;
@@ -1210,7 +1212,7 @@ static int wifidriver_set_auth(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_get_auth(struct sim_netdev_s *wifidev,
+static int wifidriver_get_auth(struct sim_wifi_s *wifidev,
                                struct iwreq *pwrq)
 {
   int ret = 0;
@@ -1233,7 +1235,7 @@ static int wifidriver_get_auth(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_set_psk(struct sim_netdev_s *wifidev,
+static int wifidriver_set_psk(struct sim_wifi_s *wifidev,
                               struct iwreq *pwrq)
 {
   struct iw_encode_ext *ext;
@@ -1287,7 +1289,7 @@ static int wifidriver_set_psk(struct sim_netdev_s 
*wifidev,
   return ret ;
 }
 
-static int wifidriver_get_psk(struct sim_netdev_s *wifidev,
+static int wifidriver_get_psk(struct sim_wifi_s *wifidev,
                               struct iwreq *pwrq)
 {
   struct iw_encode_ext *ext;
@@ -1323,7 +1325,7 @@ static int wifidriver_get_psk(struct sim_netdev_s 
*wifidev,
   return ret ;
 }
 
-static int wifidriver_set_essid(struct sim_netdev_s *wifidev,
+static int wifidriver_set_essid(struct sim_wifi_s *wifidev,
                              struct iwreq *pwrq)
 {
   char ssid_buf[SSID_MAX_LEN];
@@ -1379,7 +1381,7 @@ static int wifidriver_set_essid(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_get_essid(struct sim_netdev_s *wifidev,
+static int wifidriver_get_essid(struct sim_wifi_s *wifidev,
                              struct iwreq *pwrq)
 {
   int ret = 0;
@@ -1414,7 +1416,7 @@ static int wifidriver_get_essid(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_set_bssid(struct sim_netdev_s *wifidev,
+static int wifidriver_set_bssid(struct sim_wifi_s *wifidev,
                              struct iwreq *pwrq)
 {
   int ret = 0;
@@ -1453,7 +1455,7 @@ static int wifidriver_set_bssid(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_get_bssid(struct sim_netdev_s *wifidev,
+static int wifidriver_get_bssid(struct sim_wifi_s *wifidev,
                                 struct iwreq *pwrq)
 {
   struct sockaddr *sockaddr = &pwrq->u.ap_addr;
@@ -1485,7 +1487,7 @@ static int wifidriver_get_bssid(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_start_connect(struct sim_netdev_s *wifidev)
+static int wifidriver_start_connect(struct sim_wifi_s *wifidev)
 {
   int timeout = 10;
 
@@ -1519,7 +1521,7 @@ static int wifidriver_start_connect(struct sim_netdev_s 
*wifidev)
 
                memset(&wrqu, 0, sizeof(wrqu));
                memcpy(wrqu.ap_addr.sa_data, bssid, ETH_ALEN);
-               wifi_send_event(&wifidev->dev.netdev, SIOCGIWAP, &wrqu);
+               wifi_send_event(&wifidev->dev->netdev, SIOCGIWAP, &wrqu);
                return OK;
              }
 
@@ -1544,7 +1546,7 @@ static int wifidriver_start_connect(struct sim_netdev_s 
*wifidev)
   return OK;
 }
 
-static int wifidriver_start_disconnect(struct sim_netdev_s *wifidev)
+static int wifidriver_start_disconnect(struct sim_wifi_s *wifidev)
 {
   int ret;
 
@@ -1564,14 +1566,14 @@ static int wifidriver_start_disconnect(struct 
sim_netdev_s *wifidev)
   return ret;
 }
 
-static int wifidriver_get_mode(struct sim_netdev_s *wifidev,
+static int wifidriver_get_mode(struct sim_wifi_s *wifidev,
                                struct iwreq *pwrq)
 {
   pwrq->u.mode = wifidev->mode;
   return OK;
 }
 
-static int wifidriver_set_mode(struct sim_netdev_s *wifidev,
+static int wifidriver_set_mode(struct sim_wifi_s *wifidev,
                                struct iwreq *pwrq)
 {
   int ret;
@@ -1638,7 +1640,7 @@ static int wifidriver_set_mode(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_set_country(struct sim_netdev_s *wifidev,
+static int wifidriver_set_country(struct sim_wifi_s *wifidev,
                                struct iwreq *pwrq)
 {
   char country[4] =
@@ -1658,7 +1660,7 @@ static int wifidriver_set_country(struct sim_netdev_s 
*wifidev,
   return set_cmd(wifidev, "set country %s", country);
 }
 
-static int wifidriver_get_country(struct sim_netdev_s *wifidev,
+static int wifidriver_get_country(struct sim_wifi_s *wifidev,
                                struct iwreq *pwrq)
 {
   char country[128];
@@ -1696,7 +1698,7 @@ static int wifidriver_get_country(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-static int wifidriver_get_sensitivity(struct sim_netdev_s *wifidev,
+static int wifidriver_get_sensitivity(struct sim_wifi_s *wifidev,
                                       struct iwreq *pwrq)
 {
   int32_t rssi;
@@ -1722,7 +1724,7 @@ static int wifidriver_get_sensitivity(struct sim_netdev_s 
*wifidev,
   return ret;
 }
 
-int wifidriver_set_freq(struct sim_netdev_s *wifidev, struct iwreq *pwrq)
+int wifidriver_set_freq(struct sim_wifi_s *wifidev, struct iwreq *pwrq)
 {
   int channel;
   int ret = 0;
@@ -1747,7 +1749,7 @@ int wifidriver_set_freq(struct sim_netdev_s *wifidev, 
struct iwreq *pwrq)
   return ret;
 }
 
-static int wifidriver_get_freq(struct sim_netdev_s *wifidev,
+static int wifidriver_get_freq(struct sim_wifi_s *wifidev,
                                struct iwreq *pwrq)
 {
   switch (wifidev->mode)
@@ -1775,7 +1777,7 @@ static int wifidriver_get_freq(struct sim_netdev_s 
*wifidev,
   return OK;
 }
 
-static int wifidriver_get_range(struct sim_netdev_s *wifidev,
+static int wifidriver_get_range(struct sim_wifi_s *wifidev,
                              struct iwreq *pwrq)
 {
   int k;
@@ -1798,7 +1800,7 @@ static int wifidriver_connect(struct netdev_lowerhalf_s 
*dev)
 {
   int ret;
 
-  ret = wifidriver_start_connect((struct sim_netdev_s *)dev);
+  ret = wifidriver_start_connect(NETDEV2WIFI(dev));
   if (ret >= 0)
     {
       netdev_lower_carrier_on(dev);
@@ -1812,7 +1814,7 @@ static int wifidriver_disconnect(struct 
netdev_lowerhalf_s *dev)
   int ret;
   union iwreq_data wrqu;
 
-  ret = wifidriver_start_disconnect((struct sim_netdev_s *)dev);
+  ret = wifidriver_start_disconnect(NETDEV2WIFI(dev));
   if (ret >= 0)
     {
       netdev_lower_carrier_off(dev);
@@ -1827,7 +1829,7 @@ static int wifidriver_disconnect(struct 
netdev_lowerhalf_s *dev)
 static int wifidriver_essid(struct netdev_lowerhalf_s *dev,
                             struct iwreq *iwr, bool set)
 {
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *wifidev = NETDEV2WIFI(dev);
 
   if (set)
     {
@@ -1843,7 +1845,7 @@ static int wifidriver_bssid(struct netdev_lowerhalf_s 
*dev,
                             struct iwreq *iwr, bool set)
 {
   int ret;
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *wifidev = NETDEV2WIFI(dev);
 
   if (set)
     {
@@ -1866,18 +1868,18 @@ static int wifidriver_passwd(struct netdev_lowerhalf_s 
*dev,
 {
   if (set)
     {
-      return wifidriver_set_psk((struct sim_netdev_s *)dev, iwr);
+      return wifidriver_set_psk(NETDEV2WIFI(dev), iwr);
     }
   else
     {
-      return wifidriver_get_psk((struct sim_netdev_s *)dev, iwr);
+      return wifidriver_get_psk(NETDEV2WIFI(dev), iwr);
     }
 }
 
 static int wifidriver_mode(struct netdev_lowerhalf_s *dev,
                            struct iwreq *iwr, bool set)
 {
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *wifidev = NETDEV2WIFI(dev);
 
   if (set)
     {
@@ -1892,7 +1894,7 @@ static int wifidriver_mode(struct netdev_lowerhalf_s *dev,
 static int wifidriver_auth(struct netdev_lowerhalf_s *dev,
                            struct iwreq *iwr, bool set)
 {
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *wifidev = NETDEV2WIFI(dev);
 
   if (set)
     {
@@ -1907,7 +1909,7 @@ static int wifidriver_auth(struct netdev_lowerhalf_s *dev,
 static int wifidriver_freq(struct netdev_lowerhalf_s *dev,
                            struct iwreq *iwr, bool set)
 {
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *wifidev = NETDEV2WIFI(dev);
 
   if (set)
     {
@@ -1934,7 +1936,7 @@ static int wifidriver_txpower(struct netdev_lowerhalf_s 
*dev,
 static int wifidriver_country(struct netdev_lowerhalf_s *dev,
                               struct iwreq *iwr, bool set)
 {
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *wifidev = NETDEV2WIFI(dev);
 
   if (set)
     {
@@ -1949,7 +1951,7 @@ static int wifidriver_country(struct netdev_lowerhalf_s 
*dev,
 static int wifidriver_sensitivity(struct netdev_lowerhalf_s *dev,
                                   struct iwreq *iwr, bool set)
 {
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *wifidev = NETDEV2WIFI(dev);
 
   if (set)
     {
@@ -1964,7 +1966,7 @@ static int wifidriver_sensitivity(struct 
netdev_lowerhalf_s *dev,
 static int wifidriver_scan(struct netdev_lowerhalf_s *dev,
                            struct iwreq *iwr, bool set)
 {
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *wifidev = NETDEV2WIFI(dev);
 
   if (set)
     {
@@ -1979,12 +1981,20 @@ static int wifidriver_scan(struct netdev_lowerhalf_s 
*dev,
 static int wifidriver_range(struct netdev_lowerhalf_s *dev,
                             struct iwreq *iwr)
 {
-  return wifidriver_get_range((struct sim_netdev_s *)dev, iwr);
+  return wifidriver_get_range(NETDEV2WIFI(dev), iwr);
 }
 
-static bool wifidriver_connected(struct netdev_lowerhalf_s *dev)
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: sim_wifihost_connected
+ ****************************************************************************/
+
+bool sim_wifihost_connected(struct sim_wifihost_lowerhalf_s *dev)
 {
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *wifidev = (struct sim_wifi_s *)dev->wifi;
 
   if (wifidev->mode == IW_MODE_MASTER)
     {
@@ -1998,21 +2008,36 @@ static bool wifidriver_connected(struct 
netdev_lowerhalf_s *dev)
   return false;
 }
 
-static void wifidriver_init(struct netdev_lowerhalf_s *dev, int devidx)
+/****************************************************************************
+ * Name: sim_wifihost_init
+ ****************************************************************************/
+
+int sim_wifihost_init(struct sim_wifihost_lowerhalf_s *dev, int devidx)
 {
-  struct sim_netdev_s *wifidev = (struct sim_netdev_s *)dev;
+  struct sim_wifi_s *priv;
 
-  wifidev->mode = IW_MODE_AUTO;
-  wifidev->devidx = devidx;
+  priv = kmm_zalloc(sizeof(*priv));
+  if (priv == NULL)
+    {
+      nerr("wifi driver priv alloc failed\n");
+      return -ENOMEM;
+    }
+
+  dev->wifi    = priv;
+  priv->dev    = &dev->lower;
+  priv->mode   = IW_MODE_AUTO;
+  priv->devidx = devidx;
+
+  /* Bind the wireless ops interfaces. */
+
+  dev->lower.iw_ops  = &g_iw_ops;
 
   /* The default host wlan interface name is corresponding to the nuttx
    * wlan interface name. If not, should modify the host wlan interface
    * name.
    */
 
-  snprintf(wifidev->host_ifname, IFNAMSIZ, "wlan%d", devidx);
+  snprintf(priv->host_ifname, IFNAMSIZ, "wlan%d", devidx);
 
-  /* Bind the wireless ops interfaces. */
-
-  dev->iw_ops = &g_iw_ops;
+  return OK;
 }
diff --git a/arch/sim/src/sim/sim_wifihost.h b/arch/sim/src/sim/sim_wifihost.h
new file mode 100644
index 00000000000..8c2c0d90b4f
--- /dev/null
+++ b/arch/sim/src/sim/sim_wifihost.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * arch/sim/src/sim/sim_wifihost.h
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_SIM_SRC_SIM_WIFIHOST_H
+#define __ARCH_SIM_SRC_SIM_WIFIHOST_H
+
+#if CONFIG_SIM_WIFIDEV_NUMBER != 0
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/net/netdev_lowerhalf.h>
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Type Definitions
+ ****************************************************************************/
+
+struct sim_wifihost_lowerhalf_s
+{
+  /* This holds the information visible to the NuttX network */
+
+  struct netdev_lowerhalf_s lower;     /* The netdev lowerhalf */
+
+  void *wifi;
+};
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+int sim_wifihost_init(struct sim_wifihost_lowerhalf_s *dev, int devidx);
+bool sim_wifihost_connected(struct sim_wifihost_lowerhalf_s *dev);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_DRIVERS_WIFI_SIM */
+#endif /* __ARCH_SIM_SRC_SIM_WIFIHOST_H */

Reply via email to