WiFi: `iw reg set US` não tem efeito

13

No processo de tentar diagnosticar desistências de WiFi, descobri que o domínio regulatório na minha interface WiFi está definido como "mundo" (00) e alterá-lo para minha região (EUA) deve ajudar a corrigir o problema. No entanto, todas as tentativas que fiz foram ignoradas.

Correr iw reg set USnão tem efeito evidente:

$ 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)

Depois de pesquisar bastante sobre o assunto, parece que o que deveria acontecer é fazer iw reg setcom que o kernel emita um evento udev, o que faz crdacom que seja executado e expele as informações regulatórias relevantes. No entanto, quase como posso dizer udevadm, esse evento nunca é emitido. A ausência deste evento é corroborada pelo seguinte kluge não funcionando:

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

A mensagem de erro é de crda. O kernel aceitará alterações regulatórias de WiFi apenas se tiver emitido um evento / solicitação do udev para eles e estiver esperando uma resposta. Como crdafalha, o kernel claramente não esperava por isso, sugerindo que nenhum evento udev foi emitido.

A interface WiFi é um Intel 7265D; cujo driver do kernel é iwlmvm. Eu tenho crdae wireless-regdbinstalado, e /etc/default/crdacontém REGDOMAIN=US. Remover e recarregar o iwlmvmdriver não tem efeito.

Alguma sugestão do que mais deve ser verificado?

ewhac
fonte
1
Você verificou o log do kernel para ver se alguma alteração foi feita? Estou obtendo a mesma saída que você está no stdout, mas meus registros dizem que o domínio regulatório foi realmente atualizado.
precisa saber é o seguinte
Não encontro nada na dmesgsaída ou em qualquer um dos logs que sugira que foi feita alguma tentativa de alterar o domínio regulatório. A única mensagem para esse efeito aparece quando o driver é carregado pela primeira vez, informando: "região mestre DFS: unset"
ewhac
1
Sua solução parece boa. Mova-o para uma resposta em vez de uma edição na pergunta. Você também aceita sua própria resposta.
roaima 14/07

Respostas:

11

Tentei revisar esse problema ontem e ainda tenho o problema, mesmo com o kernel 4.6.3. A instalação manual da imagem de firmware mais recente também não ajudou. No entanto, experimentar iw reg set USum segundo laptop executando o mesmo kernel funcionou bem.

A máquina com problema é um Thinkpad X1 Carbon (Gen.3), que possui uma placa WiFi Intel 7265D; a máquina em funcionamento é um Thinkpad T440p, que possui um Intel 7260. Portanto, concluo que há um erro no driver ou firmware 7265D.

Gambiarra

Eu também descobri uma solução alternativa para o 7265D. Esteja ciente de que esta é uma solução alternativa e pode causar conflitos se / quando uma correção real for lançada:

  • Remova todos os drivers do kernel WiFi e módulos dependentes:
    sudo modprobe -r iwlmvm
  • Instale o cfg80211módulo do kernel, usando um parâmetro do kernel para forçar o domínio regulador (neste caso, 'US'):
    sudo modprobe cfg80211 ieee80211_regdom=US
  • Reinstale os drivers do kernel WiFi:
    sudo modprobe iwlmvm

Agora você deve ver a interface WiFi configurada para o domínio regulatório dos EUA (ou qualquer outro):

$ 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)

Atualização 2016.11.17: corrigida no Kernel 4.8 Series

Verifiquei esse problema novamente hoje pela primeira vez, depois de atualizar algumas semanas atrás, para um kernel 4.8.x, e descobri que a interface WiFi agora parece estar aceitando corretamente o domínio regulador. Isso aconteceu no ou antes da versão 4.8.5 do kernel.

$ 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
ewhac
fonte
Isso não funcionou para o meu Intel Wireless 7265D, existem alguns tópicos na Internet que mencionam que a configuração 00-World está codificada no firmware ou hardware bloqueado.
CMCDragonkai
5

Após algumas pesquisas de código, descobri qual é o problema:

O dispositivo Intel WiFi aparece como um dispositivo "autônomo", portanto, o conjunto de registros iw não será aplicado a ele.

Tudo que você precisa fazer é definir o iwlwifiparâmetro lar_disable=1:

  1. Manualmente: modprobe -r iwlwifi & modprobe iwlwifi lar_disable=1
  2. Automaticamente: echo "options iwlwifi lar_disable=1" >/etc/modprobe.d/iwlwifi.conf
Philip
fonte
Obrigado; Vou tentar isso. BTW, o que é "LAR"? É aquela coisa de evitar radar para a banda de 5 GHz?
ewhac
O arquivo /etc/modprobe.d/iwlwifi.confpode existir, portanto, é melhor anexar. Use em >>vez de >ou echo "options iwlwifi lar_disable=1" | sudo tee -a /etc/modprobe.d/iwlwifi.conf(obtém privilégios de root, conforme necessário).
Lucas
1
@ewhac unix.stackexchange.com/a/385590/3285
Evan Carroll
-2
 #!/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"
Joel Cruz
fonte
Por favor, faça uma descrição do código apresentado. Ajude os usuários a aprender a pescar, não apenas dê a eles um peixe.
Isaac
Sei que não responde à pergunta e Jan pode estar certo. Mas é uma dica na direção certa da conscientização dos arquivos subjacentes usados. Além disso eu não tenho que /lib/crda/regulatory.bin pasta
JackGrinningCat