diff options
Diffstat (limited to 'package/broadcom-wl/files/lib')
| -rw-r--r-- | package/broadcom-wl/files/lib/wifi/broadcom.sh | 161 | 
1 files changed, 161 insertions, 0 deletions
| diff --git a/package/broadcom-wl/files/lib/wifi/broadcom.sh b/package/broadcom-wl/files/lib/wifi/broadcom.sh new file mode 100644 index 000000000..33a3ebb8f --- /dev/null +++ b/package/broadcom-wl/files/lib/wifi/broadcom.sh @@ -0,0 +1,161 @@ +scan_broadcom() { +	local device="$1" + +	config_get vifs "$device" vifs +	for vif in $vifs; do +		config_get mode "$vif" mode +		case "$mode" in +			adhoc) +				adhoc=1 +				adhoc_if="$vif" +			;; +			sta) +				sta=1 +				sta_if="$vif" +			;; +			ap) +				ap=1 +				ap_if="${ap_if:+$ap_if }$vif" +			;; +			*) echo "$device($vif): Invalid mode";; +		esac +	done + +	local _c= +	for vif in ${adhoc_if:-$sta_if $ap_if}; do +		config_set "$vif" ifname "wl0${_c:+.$_c}" +		_c=$((${_c:-0} + 1)) +	done + +	ifdown="down" +	for vif in 0 1 2 3; do +		append ifdown "vif $vif" "$N" +		append ifdown "enabled 0" "$N" +	done + +	ap=1 +	infra=1 +	mssid=1 +	apsta=0 +	radio=1 +	case "$adhoc:$sta:$ap" in +		1*) +			ap=0 +			mssid=0 +			infra=0 +		;; +		:1:1) +			apsta=1 +			wet=1 +		;; +		:1:) +			wet=1 +			ap=0 +			mssid=0 +		;; +		::) +			radio=0 +		;; +	esac +} + + +setup_broadcom() { +	local _c +	config_get channel "$device" channel +	config_get country "$device" country +	config_get maxassoc "$device" maxassoc + +	_c=0 +	nas="$(which nas)" +	nas_cmd= +	for vif in ${adhoc_if:-$sta_if $ap_if}; do +		append vif_pre_up "vif $_c" "$N" +		append vif_post_up "vif $_c" "$N" +		 +		[ "$vif" = "$sta_if" ] || { +			config_get_bool hidden "$vif" hidden 1 +			append vif_pre_up "closed $hidden" "$N" +			config_get_bool isolate "$vif" isolate +			append vif_pre_up "ap_isolate $hidden" "$N" +		} + +		wsec_r=0 +		eap_r=0 +		wsec=0 +		auth=0 +		nasopts= +		config_get enc "$vif" encryption +		case "$enc" in +			WEP|wep) +				wsec_r=1 +			;; +			*psk*|*PSK*) +				wsec_r=1 +				config_get key "$vif" key +				case "$enc" in +					wpa2*|WPA2*|PSK2*|psk2*) auth=128; wsec=4;; +					*) auth=4; crypto=2;; +				esac +				eval "${vif}_key=\"\$key\"" +				nasopts="-k \"\$${vif}_key\"" +			;; +			*wpa*|*WPA*) +				wsec_r=1 +				eap_r=1 +				config_get key "$vif" key +				config_get server "$vif" server +				config_get port "$vif" port +				case "$enc" in +					wpa2*|WPA2*) auth=64; wsec=4;; +					*) auth=2; crypto=2;; +				esac +				eval "${vif}_key=\"\$key\"" +				nasopts="-r \"\$${vif}_key\" -h $server -p $port" +			;; +		esac +		append vif_post_up "wsec $wsec" "$N" +		append vif_post_up "wpa_auth $auth" "$N" +		append vif_post_up "wsec_restrict $wsec_r" "$N" +		append vif_post_up "eap_restrict $eap_r" "$N" +		 +		config_get ssid "$vif" ssid +		append vif_post_up "ssid $ssid" "$N" +		append vif_post_up "enabled 1" "$N" +		 +		[ -z "$nasopts" ] || { +			config_get ifname "$vif" ifname +			config_get bridge "$vif" bridge # XXX: integrate with /etc/config/network later +			eval "${vif}_ssid=\"\$ssid\"" +			mode="-A" +			[ "$vif" = "$sta_if" ] && mode="-S" +			[ -z "$nas" ] || nas_cmd="${nas_cmd:+$nas_cmd$N}$nas -P /var/run/nas.$ifname.pid -H 34954 -i $ifname${bridge:+ -l $bridge} $mode -m $auth -w $crypto -s \"\$${vif}_ssid\" -g 3600 $nasopts &" +		} +		_c=$(($_c + 1)) +	done +	killall -KILL nas >&- 2>&- +	cat <<EOF +$ifdown + +mssid $mssid +ap $ap +apsta $apsta +infra $infra +${wet:+wet 1} + +radio ${radio:-1} +macfilter 0 +maclist none +wds none +channel ${channel:-0} +country ${country:-IL0} +maxassoc ${maxassoc:-128} + +$vif_pre_up +up +$vif_post_up +EOF +	eval "$nas_cmd" +} + + | 
