wpa_supplicant-2.11/src/drivers/driver_nl80211_scan.c

f1340704@lhbvm177:~/work4/ti_yocto$ git diff 
diff --git  /wpa_supplicant-2.11/src/drivers/driver_nl80211_scan.c
              /wpa_supplicant-2.11/src/drivers/driver_nl80211_scan.c
index b055e684a..31cf7f4f1 100644
---    /wpa_supplicant-2.11/src/drivers/driver_nl80211_scan.c
+++ /wpa_supplicant-2.11/src/drivers/driver_nl80211_scan.c
@@ -867,12 +867,28 @@ struct nl80211_bss_info_arg {
        const u8 *bssid;
 };
 
+#define WLAN_EID_SSID 0
+
+
+static const u8 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie)
+{
+       size_t ie_len = res->ie_len;
+
+       /* Use the Beacon frame IEs if res->ie_len is not available */
+       if (!ie_len)
+               ie_len = res->beacon_ie_len;
+
+       return get_ie((const u8 *) (res + 1), ie_len, ie);
+}
+
 static int bss_info_handler(struct nl_msg *msg, void *arg)
 {
diff --git a/wpa_supplicant-2.11/src/drivers/driver_nl80211_scan.c
             b/wpa_supplicant-2.11/src/drivers/driver_nl80211_scan.c
index b055e684a..31cf7f4f1 100644
--- a//wpa_supplicant-2.11/src/drivers/driver_nl80211_scan.c
+++ b/wpa_supplicant-2.11/src/drivers/driver_nl80211_scan.c
@@ -867,12 +867,28 @@ struct nl80211_bss_info_arg {
        const u8 *bssid;
 };
 
+#define WLAN_EID_SSID 0
+
+
+static const u8 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie)
+{
+       size_t ie_len = res->ie_len;
+
+       /* Use the Beacon frame IEs if res->ie_len is not available */
+       if (!ie_len)
+               ie_len = res->beacon_ie_len;
+
+       return get_ie((const u8 *) (res + 1), ie_len, ie);
+}
+
 static int bss_info_handler(struct nl_msg *msg, void *arg)
 {
        struct nl80211_bss_info_arg *_arg = arg;
        struct wpa_scan_results *res = _arg->res;
        struct wpa_scan_res **tmp;
        struct wpa_scan_res *r;
+       const u8 *ssid;
+       u8 ssid_name[36] = {0};
 
        r = nl80211_parse_bss_info(_arg->drv, msg, _arg->bssid);
        if (!r)
@@ -882,6 +898,12 @@ static int bss_info_handler(struct nl_msg *msg, void *arg)
                os_free(r);
                return NL_SKIP;
        }
+
+       ssid = wpa_scan_get_ie(r, WLAN_EID_SSID);
+
+       strncpy(ssid_name, ssid + 2, (size_t)ssid[1]);
+       wpa_printf(MSG_DEBUG, "[ssh] ssid_name: %s ", ssid_name);
+
        tmp = os_realloc_array(res->res, res->num + 1,
                               sizeof(struct wpa_scan_res *));
        if (tmp == NULL) {

你执行了: ```bash wpa_cli -p /var/run/wpa_supplicant -i wlan1 scan ``` 这是对无线接口 `wlan1` 发起一次 **主动扫描(Active Scan)**。下面我们详细解释这个命令的原理、作用、底层机制以及它与被动扫描的区别。 --- ## ✅ 命令解析 ```bash wpa_cli -p /var/run/wpa_supplicant -i wlan1 scan ``` | 部分 | 说明 | |------|------| | `wpa_cli` | `wpa_supplicant` 的命令行控制工具 | | `-p /var/run/wpa_supplicant` | 指定控制接口路径(Unix domain socket 所在目录) | | `-i wlan1` | 指定操作的无线网络接口为 `wlan1` | | `scan` | 向 `wpa_supplicant` 发送“开始扫描”指令 | 📌 这条命令会触发 `wpa_supplicant` 通过 `nl80211` 驱动接口,让无线网卡发送 **Probe Request 帧**,主动探测周围 AP。 --- ## 🔍 主动扫描(Active Scan)的工作原理 ### 📡 什么是主动扫描? 主动扫描是指客户端(你的设备)主动向空中广播 **Probe Request 帧**,询问:“有哪些 AP 在这里?” 或 “某个特定 SSID 的 AP 在吗?” 收到请求的 AP 会回复一个 **Probe Response 帧**,包含其 BSSID、SSID、加密方式、信号强度等信息。 --- ### 🔄 主动扫描流程 ```text [你的设备] [周围的AP] | | |--- Probe Request --------> (广播或指定 SSID) |<-- Probe Response -------| | | 收集所有响应 → 构建扫描结果列表 ``` - 如果没有指定 SSID:发送 **广播 Probe Request**(请求所有 AP 回应) - 如果配置中设置了目标 SSID:可能只探查该 SSID(取决于驱动和配置) --- ### ✅ 主动扫描的优点 | 优点 | 说明 | |------|------| | 快速发现隐藏网络 | 即使 AP 不广播 Beacon,也能通过 Probe 探出 | | 扫描速度快 | 主动触发,无需等待 Beacon 帧周期性出现 | | 可定向探测 | 可以只扫描某个 SSID,节省时间 | --- ### ⚠️ 主动扫描的缺点 | 缺点 | 说明 | |------|------| | 暴露设备存在 | 发送 Probe Request 会被监听者捕获(隐私问题) | | 耗电略高 | 主动发射射频信号 | | 可能被干扰 | 在密集环境中,多个设备同时扫描会导致冲突 | --- ## 🆚 主动扫描 vs 被动扫描 | 特性 | 主动扫描(Active Scan) | 被动扫描(Passive Scan) | |------|--------------------------|----------------------------| | 是否发送帧 | 是(Probe Request) | 否 | | 如何获取信息 | 等待 AP 回复 Probe Response | 监听 AP 定期广播的 Beacon 帧 | | 能否发现隐藏网络 | ✅ 可以(只要 Probe 中包含 SSID) | ❌ 很难(Beacon 不含 SSID) | | 速度 | 快(几秒内完成) | 慢(需等待每个信道上的 Beacon) | | 隐私性 | 差(暴露 MAC 和想连的 SSID) | 较好(不发任何帧) | | 典型使用场景 | 用户点击“刷新网络列表” | 安全监控、嗅探模式 | --- ## 🔧 底层技术细节 当你运行 `wpa_cli scan` 时,发生了什么? 1. `wpa_cli` 通过 Unix Socket `/var/run/wpa_supplicant/wlan1` 连接到 `wpa_supplicant` 2. `wpa_supplicant` 调用 `nl80211` API 向内核发送扫描请求 3. 内核通知无线驱动: - 切换到各个信道(如 1,6,11,...- 在每个信道上发送 Probe Request 4. 驱动收集 Probe Response 和 Beacon 帧 5. 结果返回给 `wpa_supplicant` 并缓存 6. 你可以用 `scan_results` 查看 --- ## 📋 查看扫描结果 ```bash wpa_cli -p /var/run/wpa_supplicant -i wlan1 scan_results ``` 输出示例: ```text b0:e1:7e:xx:xx:xx 2437 -65 [WPA2-PSK-CCMP][ESS] rax8 aa:bb:cc:dd:ee:ff 5180 -72 [WPA2-PSK-CCMP][ESS] HomeWiFi ``` 字段含义: | 字段 | 说明 | |------|------| | BSSID | AP 的 MAC 地址 | | Frequency (MHz) | 工作频段(2412=Channel 1, 2437=Channel 6, 5180=Channel 36) | | Signal (dBm) | 信号强度(越接近 0 越强) | | Flags | 加密/认证方式(`WPA2-PSK`, `CCMP`, `ESS`, `IBSS` 等) | | SSID | 网络名称 | --- ## ✅ 如何控制扫描行为? 可以在 `wpa_supplicant.conf` 中设置以下参数: ```conf network={ ssid="MyNetwork" psk="password" # 强制扫描此 SSID(用于隐藏网络) scan_ssid=1 } # 全局设置:限制扫描信道(例如只扫 2.4G) ctrl_interface=/var/run/wpa_supplicant ap_scan=1 # 可选:自定义扫描间隔 # fast_reauth=1 # mesh_max_inactivity=300 ``` --- ## 🛠 实际应用场景 ### 场景 1:连接隐藏 SSID 的 Mesh 网络 ```conf network={ ssid="mesh_internal" psk="secret" scan_ssid=1 # 必须加!否则找不到 } ``` 然后手动触发扫描: ```bash wpa_cli -i wlan1 scan ``` 即可发现并连接。 --- ### 场景 2:调试连接失败问题 ```bash # 清除旧结果 wpa_cli -i wlan1 scan sleep 3 wpa_cli -i wlan1 scan_results | grep rax8 ``` 确认目标 AP 是否在范围内。 --- ## ✅ 总结 ```bash wpa_cli -p /var/run/wpa_supplicant -i wlan1 scan ``` 是一次 **主动扫描** 操作,它的本质是: > 让无线网卡主动发出 Probe Request 帧,探测周边 Wi-Fi 网络,以便后续选择和连接。 ✅ 它适用于: - 刷新可用网络列表 - 发现隐藏 SSID - 调试连接问题 - 初始化网络连接流程 ⚠️ 注意: - 扫描完成后要调用 `scan_results` 查看结果 - 若未看到目标 AP,请检查距离、信道、加密类型、是否被屏蔽 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值