WiFi:“iw reg set US”无效

WiFi:“iw reg set US”无效

在尝试诊断 WiFi 丢失的过程中,我发现我的 WiFi 接口上的监管域设置为“世界”(00),将其更改为我的区域(美国)应该有助于解决问题。然而,我所做的每一次尝试都被忽略了。

跑步iw reg set US没有明显效果:

$ iw reg get
country 00: DFS-UNSET
    (2402 - 2472 @ 40), (6, 20), (N/A)
    (2457 - 2482 @ 40), (6, 20), (N/A), PASSIVE-SCAN
    (2474 - 2494 @ 20), (6, 20), (N/A), NO-OFDM, PASSIVE-SCAN
    (5170 - 5250 @ 160), (6, 20), (N/A), PASSIVE-SCAN
    (5250 - 5330 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5490 - 5730 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5735 - 5835 @ 80), (6, 20), (N/A), PASSIVE-SCAN
    (57240 - 63720 @ 2160), (N/A, 0), (N/A)
$ sudo iw reg set US
$ iw reg get
country 00: DFS-UNSET
    (2402 - 2472 @ 40), (6, 20), (N/A)
    (2457 - 2482 @ 40), (6, 20), (N/A), PASSIVE-SCAN
    (2474 - 2494 @ 20), (6, 20), (N/A), NO-OFDM, PASSIVE-SCAN
    (5170 - 5250 @ 160), (6, 20), (N/A), PASSIVE-SCAN
    (5250 - 5330 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5490 - 5730 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5735 - 5835 @ 80), (6, 20), (N/A), PASSIVE-SCAN
    (57240 - 63720 @ 2160), (N/A, 0), (N/A)

在对这个主题进行了广泛的谷歌搜索之后,似乎应该发生的事情是iw reg set导致内核发出一个 udev 事件,这会导致crda执行并吐出相关的监管信息。然而,据我所知udevadm,这个事件永远不会被发出。以下 kluge 不起作用证实了此事件的缺席:

$ sudo iw reg set US; sudo COUNTRY=US crda
Failed to set regulatory domain: -7

错误信息来自crda.仅当内核已发出 udev 事件/请求并期待响应时,内核才会接受 WiFi 法规更改。由于crda失败,内核显然没有预料到它,表明没有发出 udev 事件。

WiFi接口为Intel 7265D;其内核驱动程序是iwlmvm.我已经crda安装wireless-regdb/etc/default/crda包含REGDOMAIN=US.删除并重新加载iwlmvm驱动程序没有任何效果。

还有什么建议需要检查吗?

答案1

我昨天尝试重新审视这个问题,即使使用内核 4.6.3 仍然存在问题。手动安装最新的固件映像也没有帮助。然而,尝试iw reg set US在第二台运行相同内核的笔记本电脑上运行得很好。

问题机器是 Thinkpad X1 Carbon (Gen.3),配有 Intel 7265D WiFi 卡;工作机器是Thinkpad T440p,它有Intel 7260。因此我断定7265D驱动程序或固件中存在错误。

解决方法

我还发现了 7265D 的解决方法。请注意,这是一种解决方法,如果/当发布实际修复程序时可能会导致冲突:

  • 删除所有 WiFi 内核驱动程序和依赖模块:
    sudo modprobe -r iwlmvm
  • 安装cfg80211内核模块,使用内核参数强制监管域(在本例中为“US”):
    sudo modprobe cfg80211 ieee80211_regdom=US
  • 重新安装 WiFi 内核驱动程序:
    sudo modprobe iwlmvm

您现在应该看到为美国(或其他)监管域配置的 WiFi 接口:

$ iw reg get
country US: DFS-FCC
    (2402 - 2472 @ 40), (N/A, 30), (N/A)
    (5170 - 5250 @ 80), (N/A, 17), (N/A)
    (5250 - 5330 @ 80), (N/A, 23), (0 ms), DFS
    (5490 - 5730 @ 160), (N/A, 23), (0 ms), DFS
    (5735 - 5835 @ 80), (N/A, 30), (N/A)
    (57240 - 63720 @ 2160), (N/A, 40), (N/A)

2016.11.17 更新:在内核 4.8 系列中修复

在几周前更新到 4.8.x 内核后,我今天再次检查了这个问题,发现 WiFi 接口现在似乎已经正确接受了监管域。这发生在内核版本 4.8.5 中或之前。

$ iw reg get
global
country 00: DFS-UNSET
    (2402 - 2472 @ 40), (6, 20), (N/A)
    (2457 - 2482 @ 20), (6, 20), (N/A), AUTO-BW, PASSIVE-SCAN
    (2474 - 2494 @ 20), (6, 20), (N/A), NO-OFDM, PASSIVE-SCAN
    (5170 - 5250 @ 80), (6, 20), (N/A), AUTO-BW, PASSIVE-SCAN
    (5250 - 5330 @ 80), (6, 20), (0 ms), DFS, AUTO-BW, PASSIVE-SCAN
    (5490 - 5730 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5735 - 5835 @ 80), (6, 20), (N/A), PASSIVE-SCAN
    (57240 - 63720 @ 2160), (N/A, 0), (N/A)

phy#0 (self-managed)
country US: DFS-UNSET
    (2402 - 2482 @ 40), (6, 22), (N/A), AUTO-BW, NO-HT40PLUS, NO-80MHZ, NO-160MHZ
    (5170 - 5250 @ 80), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-160MHZ, PASSIVE-SCAN
    (5250 - 5330 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, PASSIVE-SCAN
    (5490 - 5730 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, PASSIVE-SCAN
    (5735 - 5815 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-160MHZ, PASSIVE-SCAN
    (5815 - 5835 @ 20), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-HT40PLUS, NO-80MHZ, NO-160MHZ, PASSIVE-SCAN

答案2

经过一些代码研究,我发现了问题所在:

Intel WiFi 设备显示为“自我管理”设备,因此 iw reg 集不会应用于它。

您所需要做的就是设置iwlwifi参数lar_disable=1

  1. 手动:modprobe -r iwlwifi & modprobe iwlwifi lar_disable=1
  2. 自动地:echo "options iwlwifi lar_disable=1" >/etc/modprobe.d/iwlwifi.conf

答案3

就我而言BCM43228(如b43驱动程序和 所报告lspci),当我使用内核b43驱动程序时,没有任何帮助看到 regdb 允许的扩展通道范围。只有00我的本地数据库(当前)的交集AM有效可用。

切换到专有broadcom-sta驱动程序立即解决了问题,现在我看到了我需要的所有无线网络。顺便说一下,这个驱动程序调用了BCM4359中的卡。dmesg

答案4

 #!/bin/bash

echo "hello root"
git clone git://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git

echo ""
cd wireless-regdb/
sleep 3

echo ""
gedit db.txt
sleep 1

echo ""
make

echo ""
sudo rm /lib/crda/regulatory.bin

echo ""
sudo cp regulatory.bin /lib/crda/regulatory.bin

echo ""
sudo cp $USER.key.pub.pem /lib/crda/pubkeys/

echo ""
sudo iw reg get

echo ""
ip link set wlan1 down
sleep 3

echo "Boosting Tx Power To 30 Fixed"
iw dev wlan1 set txpower fixed 30mbm
sleep 3

echo "starting wlan1"
ip link set wlan1 up
sleep 2

echo "Checking wlan1 TxPower"
iw dev
sleep 3

echo "Checking Regulatory Domain"
iw reg get
sleep 2

echo "Good Luck"

相关内容