Portál AbcLinuxu, 3. května 2025 05:35

krutý boj s madwifi

8.9.2007 16:45 | Přečteno: 3364× | Linux | poslední úprava: 8.9.2007 16:51

Po delší době bych chtěl udělat upgrade softwaru (kernel, ovladače, programy), který používáme na routery v naší síti, ze začátku šlo vše skoro hladce, tedy když nepočítám to, že některé volby v jádře nedovolily systému nastartovat například ve VMware, nebo ve VirtualBoxu (ten chodil až se zapnutým SMP a pamětí nastavenou maximálně na 4GB, 64GB mu dělalo obrovský problém).

Po cca dvou dnech jsem nasadil celý systém do ostrého provozu, ovšem nestačil jsem se divit, vypadával mi jeden kernel panic za druhým a ve virtuálních strojích se nic takového nedělo, zkusil jsem tedy nasadit starší jádro (včetně ovladačů) a vše opět fungovalo normálně.

Hned ze začátku mi bylo jasné, že problém bude někde v madwifi ovladačích, které si s každou novou verzí připraví novou chuťovku v podobě kernel panicu za speciálních nikým nedokumentovaných okolností, ovšem že tyto okolnosti najdu 2 v aktuální stabilní verzi a 3 v trunk verzi jsem tedy z počátku opravdu netušil.

Protože mi kamarád, který má obchod na prodej PC dovezl dvě hračky, které jsem si objednal přímo na testování, tak jsem dlouho nelenil, obě PC jsem složil na stole a začal jsem simulovat některé normální situace.

Nejprve jsem použil aktuální nejnovější stable ovladač 0.9.3.2, hned po prvním staru jsem ale zjistil, že při nahození v režimu master (ap) je to jistý kernel-panic. Zkusil jsem tedy starší verzi 0.9.3 o které jsem věděl že chodila dobře, musel jsem najít patch, díky kterému jí zkompiluji s kernelem 2.6.22.5, poté jsem to zkusil znovu a tentokrát opravdu vše fungovalo normálně, až na jednu maličkost o té ale později.

Začal jsem tedy pátrat který patch způsobil takto závažné problémy, po cca 14 kompilacích jsem zjistil, že tento problém způsobuje patch, který měl vyřešit ticket 1388. Po jeho odstranění ve verzi 0.9.3.2 vše šlapalo jako hodinky. Až na jednu maličkost.

Po delším testování jsem našel další jistý kernel panic, ne tak snadno reprodukovatelný, ale přesto velmi častý. Začal jsem nejdřív simulovat různé situace, kdy se tak děje a kdy ne, přišel jsem na to, že se tak stává hlavně pokud používám AP v režimu WDS a klient v režimu WDS se nově připojí, nebo změní rychlost, ne vždy, ale třeba každé 3 připojení. Tento bug se projevuje jak ve verzi 0.9.3, tak ve verzi 0.9.3.2 a existuje i ticket 1516, který ho asi popisuje. Pokud tedy znáte nějaké AP s madwifi ve WDS režimu a chcete mu způsobit ošklivý kernel panic, nic vám v tom nezabrání :)

Zkusil jsem tedy nejnovější trunk verzi madwifi ovladače, nejprve však DFS, která trpěla ještě větší nestabilitou, než původní verze 0.9.3.2. Kernel panic při nahození karty v režimu AP byl naprosto běžný i po odstranění výše zmíněného patche, tak se při větších přenosech stávalo, že DFS verze detekovala radar naprosto chybně (u mě doma a vždy na stejném kanále, na jakém se vysílalo) při velké zátěži, po této detekci se spojení na daném kanále přerušilo. Hledat chyby se mi už opravdu nechtělo, takže jsem to vzdal a přešel na trunk verzi.

Trunk verz 2702, s touto verzí se mi zaseknout kernel sice nepodařilo, podotýkám že až po odstranění patche z ticketu 1388, jinak padala hned po startu karty, respektive už také podařilo, ale nejedná se o běžnou situaci (přepínání xr režimu pře iwpriv), ale nedařilo se mi navázat spojení, takže data neprotékala.

Podíval jsem se tedy do výpisu jaké patche v poslední době šly do trunk verze, hned ten poslední byl dost divný, takže jsem zkusil předposlední verzi a hurá, už žádné časté zasekávání jádra, už žádné další libovolné restarty, po odstranění patche z ticketu 1388 a jedné drobné úpravě mohu verzi 2695 prohlásit za opravdu stabilní (relativně vzato).

Už zbýval jen jediný problém, po instalaci aktuální verze jsem zjistil, že přenosová rychlost poklesla o cca 35%, z původních 4,2MB/s jedním směrem na 3,3MB/s, hledal jsem co se změnilo, nakonec jsem našel že to dělá asi aktivní doth režim, stačil tedy příkaz iwpriv ath0 doth 0 a už to zase jede krásné 4MB/s.

Co z tohoto zápisu plyne, že vývojáři ovladačů jsou zase jen lidi, někteří horší, někteří lepší a že podobnou zkušenost nikomu z vás nepřeji.

PS: O problému "udev v Debianu vs madwifi" už raději ani psát nebudu, už takhle je to ho opravdu dost.

Přikládám obrázky a ukázkový skript, který používám pro nahození atheros karet, jednotlivé parametry si určitě doplníte:
	dev=ath"`echo $name | perl -ne 'print $1 if (/ath([0-9])/);'`"
	if [ $dev = "ath" ]; then
	    echo "Wrong file name, please rename file to format *athX*"
	    exit 1
	fi
	# Nastaveni karet
	. "$1"
	echo -n "Starting $dev..."
	# musime provest slozitou kontrolu na chybny udev v debianu, chyba se tyka jen madwifi!
	if [ -e "/etc/udev/persistent-net-generator.rules" ]; then
	    while read LINE; do
	        if [ "`echo \"$LINE\" | cut -c 1`" != "#" ]; then
		    if [ "`echo \"$LINE\" | grep -i ath | grep \"*\"`" != "" ]; then
		        if [ "`echo \"$LINE\" | grep \"persistent_net_generator_end\"`" != "" ]; then
			    if [ "`echo \"$LINE\" | grep 802`" == "" ]; then
			        break
			    fi
			elif [ "`echo \"$LINE\" | grep KERNEL`" != "" ]; then
			    pom1=true
			fi
		    fi
		fi
	    done < "/etc/udev/persistent-net-generator.rules"
	    if [ $pom1 ]; then
	        echo "Soubor /etc/udev/persistent-net-generator.rules je chybny!"
	        echo "Pro spravnou funkci madwifi ovladcu bude soubor upraven!"
	        rm -f /tmp/persistent-net-generator.rules
		while read LINE2; do
		    if [ "`echo \"$LINE2\" | cut -d, -f1`" == "NAME==\"?*\"" ]; then
		        echo "$LINE2" >> /tmp/persistent-net-generator.rules
		        break
		    else
			echo "$LINE2" >> /tmp/persistent-net-generator.rules
		    fi 
		done < "/etc/udev/persistent-net-generator.rules"
		echo '' >> /tmp/persistent-net-generator.rules
		echo '# ignore interfaces of the madwifi driver' >> /tmp/persistent-net-generator.rules
		echo 'KERNEL=="ath*",                         GOTO="persistent_net_generator_end"' >> /tmp/persistent-net-generator.rules
		while read LINE2; do
		    if [ "`echo \"$LINE2\" | cut -d, -f1`" == "NAME==\"?*\"" ]; then
		        pom2=true
		    elif [ $pom2 ]; then
		        echo "$LINE2" >> /tmp/persistent-net-generator.rules
		    fi
		done < "/etc/udev/persistent-net-generator.rules"
		rm -f "/etc/udev/persistent-net-generator.rules"
		if [ -e "/etc/udev/persistent-net-generator.rules" ]; then
		    /etc/init.d/set_readonly stop
		    mv "/tmp/persistent-net-generator.rules" "/etc/udev/persistent-net-generator.rules"
		    /etc/init.d/set_readonly start
		else
		    mv "/tmp/persistent-net-generator.rules" "/etc/udev/persistent-net-generator.rules"
		fi
		echo > "/etc/udev/rules.d/z25_persistent-net.rules"
	    fi
	fi
	# normalne pokracujeme dal
	case $MODE in
	    ap|master)
	        MODE="ap"
	        ;;
	    sta|managed)
		MODE="sta"
		;;
	    adhoc|ad-hoc)
		MODE="adhoc"
	        ;;
	    *)
		;;
	esac
	# madwifi si s kazdou novou verzi pripravi novou lahudku,
	# takze tento skript muze zpusobit pad PC!
	#
	# nejprve musime overit jestli neni karta v nejakem bridgi
	if [ "`brctl show | grep $dev`" != "" ]; then
	    I="0"
	    # danou kartu odpojime ze vsech bridgu
	    while [ "$I" -lt "10" ]; do
		brctl delif br$I $dev &>/dev/null
		((I++))
	    done
	fi
	# z interfaces zjistime, jestli nektera karta neni v bridgi
	while read LINE; do
	    if [ "`echo $LINE | awk '{print \$1}' | cut -c 1`" != "#" ]; then
		# radek s bridge_ports je vzdy az po rozhrani
	        if [ "`echo $LINE | grep \"bridge_ports\" | grep $dev`" != "" ]; then
		    BR_DEV="$BDEV"
		elif [ "`echo $LINE | awk '{print \$2}' | grep \"br\" | grep -Eo [[:digit:]]+`" != "" ]; then
		    BDEV="`echo $LINE | awk '{print \$2}'`"
		fi
	    fi
	done < /etc/network/interfaces
	# vypneme predchozi rozhrani
	$ifdown $dev &>/dev/null
	$ifconfig $dev down &>/dev/null
	$wlanconfig $dev destroy &>/dev/null
	sleep 0.5
	N=`echo $dev | cut -c4`
	WIFI="`ls -1 /proc/sys/dev/ | grep wifi | sed -n \`expr 1 + $N\`p`"
	$wlanconfig $dev create wlandev $WIFI wlanmode $MODE 1>/dev/null
	sleep 0.5
	if [ "`echo $CHANNEL | cut -d- -f1`" -gt 14 ] && [ "$W_MODE" != "0" ]; then
	    $iwpriv $dev mode 1
	else
	    $iwpriv $dev mode $W_MODE
	fi
	# rezim turbo neni v CR povolen
	if [ "$TURBO" == "1" ]; then
	    $iwpriv $dev turbo 1
	else
	    $iwpriv $dev turbo 0
	fi
	# zlepsuje stabilitu ovladace
	$iwpriv $dev xr 0
	# zlepsuje stabilitu spojeni, tyka se asi jen 802,11g
	$iwpriv $dev protmode 0
	# zlepsuje rychlost spojeni, tim ze neskenujeme na pozadi
	$iwpriv $dev bgscan 0
	# specialni nastaveni zlepsujici rychlost o 100% pro madwifi spoj
	if [ "$CONNECTION" == "madwifi" ]; then
	    # atheros superA/G adaptive radio zlepsuje rychlost i stabilitu spojeni
	    $iwpriv $dev ar 1
	    # zlepsuje pruchod videa/audio a voip
	    $iwpriv $dev wmm 1
	    # rezim burst zlepsuje rychlost spoje
	    $iwpriv $dev burst 1
	    # fast frame zlepsuje rychlost spoje velmi znatelne
	    $iwpriv $dev ff 1
	else
	    $iwpriv $dev ar 0
	    $iwpriv $dev wmm 0
	    $iwpriv $dev burst 0
	    $iwpriv $dev ff 0
	fi
	# rezim doth extremne zhorsuje prenosove rychlosti, pro A je rozdil 3 vs 4 MB/s
	# tento rezim je zapnut az v ovladacich madwifi-ng trunk, neni zapnuty ve stable vetvi
	$iwpriv $dev doth 0
	# wds rezim, pouziti hlavne pro bridge, dovolime bridge jen s ethernetem!
	if [ "$WDS" == "1" ] || [ "$BR_DEV" != "" ]; then
	    $iwpriv $dev wds 1
	else
	    $iwpriv $dev wds 0
	fi
	# essid
	$iwconfig $dev essid $ESSID
	# wep klic
	$iwconfig $dev key $KEY
	# rychlost
	$iwconfig $dev rate $RATE
	# nastaveni anteny na karte
	if [ "$ANTENNA" == "1" ] || [ "$ANTENNA" == "" ]; then
	    echo 0 > /proc/sys/dev/$WIFI/diversity
	    echo 1 > /proc/sys/dev/$WIFI/txantenna
	    echo 1 > /proc/sys/dev/$WIFI/rxantenna
	elif [ "$ANTENNA" == "2" ]; then
	    echo 0 > /proc/sys/dev/$WIFI/diversity
	    echo 2 > /proc/sys/dev/$WIFI/txantenna
	    echo 2 > /proc/sys/dev/$WIFI/rxantenna
	fi
	# nastaveni ack, cts a slottime pro vzdalenejsi spoje
	if [ "`echo $DISTANCE | grep km`" != "" ]; then
	    DISTANCE="`echo $DISTANCE | cut -d \"k\" -f1`"
	    DISTANCE="`expr $DISTANCE \* 1000`"
	elif [ "`echo $DISTANCE | grep m`" != "" ]; then
	    DISTANCE="`echo $DISTANCE | cut -d \"m\" -f1`"
	fi
	SLOTTIME="`expr \( 9 + \( $DISTANCE / 300 \) \) + \( \( $DISTANCE % 300 \)  \> \( 1 / 2 \) \)`"
	ACKTIMEOUT="`expr $SLOTTIME \* 2 + 3`"
	CTSTIMEOUT="`expr $SLOTTIME \* 2 + 3`"
	echo $SLOTTIME > /proc/sys/dev/$WIFI/slottime
	echo $ACKTIMEOUT > /proc/sys/dev/$WIFI/acktimeout
	echo $CTSTIMEOUT > /proc/sys/dev/$WIFI/ctstimeout
	# nastaveni kanalu
	if [ "`echo \"$CHANNEL\" | grep -`" == "" ]; then
	    # pro karty v rezimu sta nenastavujeme kanal
	    if [ "$MODE" != "sta" ]; then
	        $iwconfig $dev channel $CHANNEL
	    fi
	else
	    $athchans -i $dev "$CHANNEL"
	fi
	if [ "$BR_DEV" != "" ]; then
	    # rozhrani pro bridge uz existuje, takze jen pridame kartu
	    if [ "`brctl show | grep $BR_DEV`" != "" ]; then
		brctl addif $BR_DEV $dev
	    fi
	    # podstatne zrychli start bridge
	    brctl setfd $BR_DEV 0
	    $ifconfig $dev up
	else
	    $ifconfig $dev up
	    if [ "`cat /etc/network/interfaces | grep $dev`" != "" ]; then
		$ifup $dev
	    fi
	fi
	# vykon lze nastavit az po nahozeni karty
	$iwconfig $dev txpower $TXPOWER # Velmi problematicke nastaveni
	echo "done."
       

Hodnocení: 100 %

        špatnédobré        

Obrázky

krutý boj s madwifi, obrázek 1 krutý boj s madwifi, obrázek 2 krutý boj s madwifi, obrázek 3

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (3) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

8.9.2007 16:53 Smrádě
Rozbalit Rozbalit vše off topic
Odpovědět | Sbalit | Link | Blokovat | Admin
Proč si neposuneš ten stůl dál od zdi a monitor nedáš naopak ke zdi blíž (do rohu stolu)? Vždyť takhle se nedá pracovat :-)
8.9.2007 16:56 Thunder.m | skóre: 35 | blog: e17
Rozbalit Rozbalit vše Re: off topic
Na tom stole jen mám ta zařízení, všechno ostatní dělám z druhé části pokoje z jiného PC přes SSH, k tomu stolu se jen zajdu podívat když vypadne kernel panic (takže celkem často) a notebook je na pojízdné židli, ten je normálně jinde, jen jsem ho tam přesunul, aby to vypadalo trochu líp :)

PS: Kdo jako první zjistí jak ty stroje startují OS, dostane bombón :)
8.9.2007 17:58 D-Evil | skóre: 25 | Praha
Rozbalit Rozbalit vše Re: off topic
Tipuju síť, ale chtěl bych čokoládu, pokud jsem se trefil. Ideálně oříškovou :-)
8.9.2007 17:58 miso | skóre: 36 | blog: iSCSI_initiator_howto | Praha
Rozbalit Rozbalit vše Re: off topic
PXE + iSCSI?
Project Satan infects Calculon with Werecar virus
8.9.2007 18:07 Thunder.m | skóre: 35 | blog: e17
Rozbalit Rozbalit vše Re: off topic
PXE + ramdisk, celý operační systém je v cca 150MB velkém obrazu, který se stáhne přes tftp po síti...
8.9.2007 20:39 Zdeněk Štěpánek | skóre: 57 | blog: uz_mam_taky_blog | varnsdorf
Rozbalit Rozbalit vše Re: krutý boj s madwifi
Odpovědět | Sbalit | Link | Blokovat | Admin
No ja ted mel taky velice "zabavnou" prihodu s madwifi. V uvozovkach proto, ze se stala kolegovi na 80m vysokem kominu.

Zacalo to nejakym bleskem, komp umrel. Kolega tam vylezl, vytahal co se dalo a zjistil ze je vadnej PCI riser (obsahuje i IDE a ATX konektor), tak ho vymenil a zacal strkat karty. Disk prezil, bootoval. Vse slo az na atheros, jak ho tam dal, komp byl do minuty mrtvy. Karta predtim v tom AP jela a stejne tak i ten disk. Do minuty mrtvy. Zkusil vymenit kartu za jinou, zase do minuty mrtvy. OK, zkusime jiny disk (CF) se slackwarem, opet do minuty mrtvo. Jeden disk, druhej disk, jedna karta, druha karta, vzdy umrel. Zkusili jsme jeste druhou zakladni desku opet s ruznymy kombinacemi. Vzdy do minuty mrtvo.

Zajel jsem pro komp dell (predtim to byly 2 stejne compaqy), v nem sice botnul jen puvodni disk co prezil bourku, ale opet s jakoukoliv kartou do minuty mrtvo.

Druha karta byla zcela nova, ale jak se rika, to jeste neznamena ze je v poradku :-(

Takze 5g ted nejede, nastesti jsme se spolupracojici siti vymysleli zalozni reseni.

Zitra odpoledne se budu snazit slozit komp ve kterym jedna z tech karet neumre.

Zdenek
www.pirati.cz - s piráty do parlamentu i jinam www.gavanet.org - czfree varnsdorf
8.9.2007 21:27 janskyj | skóre: 11 | blog: linuxuv_blog
Rozbalit Rozbalit vše Re: krutý boj s madwifi
Odpovědět | Sbalit | Link | Blokovat | Admin
Ty parametry na tunning spojení pomocí iwpriv mě upoutali. Sice jsem přečetl madwifi-user-guide, ale nebylo tam napsaný, co mam zapnout pro zvýšení rychlosti ;-) Kde jste k nim získal tip, že je máte zapnout? Zítra je mám v plánu vyzkoušet, ale podle dokumentace je většina z nich stejně v default zapnutá (pokud to hw podporuje).
Krystaly, polovodiče, všechno směšné. Co tak konzole z digitronů, to by bylo něco pro pravé muže. :)
8.9.2007 22:36 Thunder.m | skóre: 35 | blog: e17
Rozbalit Rozbalit vše Re: krutý boj s madwifi
Zkušeností (měřením), podle toho co se píše v některých ticketech na webu a také ve wiki. Ano, většina parametrů je předem zapnutá, ale pozor, pokud například spoj nepracuje proti madwifi, tak to může být ve výsledku mnohem horší (parametr CONNECTION v tom skriptu). Myslím, že pokud používáte madwifi-ng trunk, tak pomůže asi jen vypnutí doth, ale hned je to o 35% rychlejší spoj :)

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.