LAGG failover en FreeBSD 14.4 em0 (primaria) y wlan0 (respaldo via iwm0)
Fuente:
https://www.ccammack.com/posts/configure-a-wifi-client-on-freebsd
https://wiki.freebsd.org/Devd
https://headthirst.com/freebsd-suspend.html
https://forums.freebsd.org/threads/freebsd-command-line-wifi-manager.89090/
https://www.dwarmstrong.org/freebsd-network-laptop/
https://libreboot.org/docs/bsd/suspend-resume-speedup.html
https://forums.freebsd.org/threads/freebsd-command-line-wifi-manager.89090/
https://forums.freebsd.org/threads/wifi-stops-working-after-suspend-resume.85889/
https://www.reddit.com/r/voidlinux/comments/1lfxurz/wifi_disappears_after_waking_from_suspend_i
Nombres de los dispositivos 802.11 disponibles
sysctl net.wlan.devices net.wlan.devices: iwm0
Tomando como ejemplo mi computadora portátil (Dell Latitude 7390), la interfaz Ethernet em0 funcionará como puerto maestro y la interfaz inalámbrica wlan0 será el dispositivo de respaldo. Combino las dos interfaces en una interfaz virtual sobrescribiendo la dirección MAC de la interfaz Ethernet con la dirección MAC de la interfaz inalámbrica.
Determinar la dirección MAC de la interfaz inalámbrica
ifconfig wlan0 | grep ether ether 18:56:80:f8:98:e6
Cambiar la dirección MAC de la interfaz Ethernet para que coincidan
ifconfig em0 ether 18:56:80:f8:98:e6
/etc/rc.conf
... ifconfig_em0="ether 18:56:80:f8:98:e6" wlans_iwm0="wlan0" ifconfig_wlan0="WPA" cloned_interfaces="lagg0" ifconfig_lagg0="laggproto failover laggport em0 laggport wlan0 SYNCDHCP" create_args_wlan0="country ES" defaultrouter="192.168.88.1" defaultroute_delay="10" background_dhclient_lagg0="YES" ...Archivo /etc/wpa_supplicant
/etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
eapol_version=2
fast_reauth=1
network={
ssid="MikroTik-39F9C0"
psk=755862a5b1a4ef59e2e62590677a75f5317193637a8629dccb18c40e8634a68e
}
Reiniciar
Estado general del LAGG
ifconfig lagg0 lagg0: flags=1008843 UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP metric 0 mtu 1500 options=0 ether 18:56:80:f8:98:e6 hwaddr 00:00:00:00:00:00 inet 192.168.88.50 netmask 0xffffff00 broadcast 192.168.88.255 laggproto failover lagghash l2,l3,l4 laggport: em0 flags=1 MASTER laggport: wlan0 flags=4 ACTIVE groups: lagg media: Ethernet autoselect status: active nd6 options=29 PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL
Ver puerto activo
ifconfig lagg0 | grep -E "laggport|status" laggport: em0 flags=1 MASTER laggport: wlan0 flags=4 ACTIVE status: active
Estadísticas en detalle
sysctl net.link.lagg net.link.lagg.lacp.default_strict_mode: 1 net.link.lagg.lacp.debug: 0 net.link.lagg.default_flowid_shift: 16 net.link.lagg.default_use_numa: 1 net.link.lagg.default_use_flowid: 0 net.link.lagg.failover_rx_all: 0
En /etc/rc.conf em0 no debe tener IP propia, es gestionado por lagg0 wlan0 no debe tener DHCP propio cuando está bajo lagg0; el DHCP lo gestiona lagg0. El failover es automático, al detectar pérdida de carrier en em0, el tráfico pasa a wlan0 sin intervención manual.
Sin conexión a Internet después de salir de hibernación
Al salir de hibernación, devd no recrea lagg0 de forma automática. La solución es un script de resume que se ejecute al despertar.
Crear el script de resume
#!/bin/sh
sleep 3
# Destruir interfaces
ifconfig lagg0 destroy 2>/dev/null
ifconfig wlan0 destroy 2>/dev/null
# Recrear wlan0 sin country (lo hereda de rc.conf al crear)
ifconfig wlan0 create wlandev iwm0
ifconfig wlan0 country ES 2>/dev/null
# Recrear lagg0
ifconfig lagg0 create
ifconfig lagg0 laggproto failover
ifconfig lagg0 laggport em0
ifconfig lagg0 laggport wlan0
ifconfig lagg0 up
# Arrancar wpa_supplicant
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
# Esperar asociacion (max 30s)
i=0
while [ $i -lt 30 ]; do
status=$(ifconfig wlan0 | grep "status:" | awk '{print $2}')
[ "$status" = "associated" ] && break
sleep 1
i=$((i + 1))
done
logger "resume-network: wlan0 status=$status tras ${i}s"
# Matar dhclient previo si existe
pkill -F /var/run/dhclient/dhclient.lagg0.pid 2>/dev/null
sleep 1
# Obtener IP
dhclient lagg0
# Ruta por defecto si dhclient no la puso
sleep 2
netstat -rn | grep -q "^default" || route add default 192.168.88.1
logger "resume-network: completado"
Aumentar timeout de dhclient
vim /etc/dhclient.conf
interface "lagg0" {
timeout 60;
retry 10;
}
Configurar devd para se ejecute al despertar
vim /etc/devd/resume-network.conf
notify 100 {
match "system" "ACPI";
match "subsystem" "Resume";
action "/usr/local/sbin/resume-network.sh &";
};
Reinicar devd
sudo service devd restart
Comprobar que devd capta el evento revisando tras salir de hibernación
tail -5 /var/log/messages Apr 5 16:11:50 solaris dhclient[13642]: New IP Address (lagg0): 192.168.88.50 Apr 5 16:11:50 solaris dhclient[13646]: New Subnet Mask (lagg0): 255.255.255.0 Apr 5 16:11:50 solaris dhclient[13650]: New Broadcast Address (lagg0): 192.168.88.255 Apr 5 16:11:50 solaris dhclient[13654]: New Routers (lagg0): 192.168.88.1 Apr 5 16:11:51 solaris root[13671]: resume-network: completado
Al hibernar, FreeBSD destruye las interfaces clonadas (lagg0) y en algunos casos también wlan0. Al despertar, rc.conf no se reprocesa. devd es el mecanismo correcto para reaccionar a eventos ACPI como Resume.
El sleep 3 inicial es importante porque iwm0 necesita unos segundos para que el firmware del adaptador WiFi Intel esté operativo tras el resume.
Ver si devd captó el evento Resume
grep -E "Resume|resume-network" /var/log/messages | tail -5 Apr 5 15:48:07 solaris carlos[12362]: resume-network: wlan0 status=associated tras 3s Apr 5 15:48:09 solaris carlos[12527]: resume-network: completado Apr 5 16:11:39 solaris kernel: rtsx0: Resume Apr 5 16:11:49 solaris root[13506]: resume-network: wlan0 status=associated tras 3s Apr 5 16:11:51 solaris root[13671]: resume-network: completadoFreeBSD es genial!.
No hay comentarios:
Publicar un comentario