You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何执行wpa_cli scan操作会触发Netlink的RTM_NEWLINK事件?

问题描述

我正在使用Netlink套接字检测WiFi接口的链路与地址事件,套接字初始化代码如下:

void open_netlink(int *sock_ptr)
{
    int sock = socket(AF_NETLINK,SOCK_RAW,NETLINK_ROUTE);
    struct sockaddr_nl addr;

    memset((void *)&addr, 0, sizeof(addr));

    if (sock<0)
    {
        return;
    }
    addr.nl_family = AF_NETLINK;
    addr.nl_pid = (unsigned int)getpid();
    addr.nl_groups = RTMGRP_LINK|RTMGRP_IPV4_IFADDR|RTMGRP_IPV6_IFADDR;
    if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0)
    {
        syslog(LOG_CRIT, "Could not bind to netlink socket!");
        return;
    }
    *sock_ptr = sock;

}

执行wpa_cli的scan操作时,Netlink套接字收到了RTM_NEWLINK事件,操作日志如下:

-sh-4.4# wpa_cli
wpa_cli v2.10
Copyright (c) 2004-2022, Jouni Malinen <j@w1.fi> and contributors

This software may be distributed under the terms of the BSD license.
See README for more details.


Selected interface 'wlan0'

Interactive mode

> scan
OK
<3>CTRL-EVENT-SCAN-STARTED 
<3>CTRL-EVENT-SCAN-RESULTS

我的守护进程中打印了事件信息:

msg_handler: RTM_NEWLINK : wlan0

请问wpa_supplicant是否会为扫描AP创建临时接口,从而触发内核的RTM_NEWLINK事件?


回答

wpa_supplicant不会为AP扫描创建临时接口,你收到的RTM_NEWLINK事件并非来自临时接口的创建。

实际原因是:当wpa_supplicant触发WiFi扫描时,部分WiFi驱动会对现有物理接口(比如你的wlan0)的状态进行修改——比如临时切换接口模式、调整链路参数,这些操作会被内核识别为接口属性变更,进而发送RTM_NEWLINK事件。这类事件是针对原有wlan0接口的状态更新,而非新接口的创建。

你可以通过解析RTM_NEWLINK事件中的ifinfomsg结构体内容来验证:查看其中的ifi_flags字段变化,就能确认是接口状态变更而非新接口添加。

内容的提问来源于stack exchange,提问作者jbrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:53:12