为何执行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
相关产品推荐
相关产品推荐

