Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| docs:guide-user:network:wifi:iwchan [2023/08/18 07:24] – [Automated] use wget stokito | docs:guide-user:network:wifi:iwchan [2023/09/08 22:57] (current) – deprecated in favor of the default ACS algorithm: https://forum.openwrt.org/t/wi-fi-channel-auto-selection/47776/8 vgaetera | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Wi-Fi automatic channel selection with iwchan ====== | ||
| - | {{section> | ||
| - | |||
| - | ===== Introduction ===== | ||
| - | * This instruction provides a method to automatically select a wireless channel. | ||
| - | * It calculates the load to frequency distribution and selects the channel with the least load. | ||
| - | * The threshold frequency and load parameters help to minimize excessive channel change. | ||
| - | * You can use this in case the [[https:// | ||
| - | |||
| - | ===== Instructions ===== | ||
| - | <code awk iwchan.awk> | ||
| - | # | ||
| - | |||
| - | # Coded by: Vladislav Grigoryev < | ||
| - | # License: GNU General Public License (GPL) version 3+ | ||
| - | # Description: | ||
| - | |||
| - | function get_iwphy() { | ||
| - | cmd = "iw phy" | ||
| - | while(cmd | getline) { | ||
| - | if($0 ~ / | ||
| - | phy = gensub(/ | ||
| - | else if($0 ~ / | ||
| - | band = gensub(/ | ||
| - | else if($0 ~ / | ||
| - | freq = gensub(/ | ||
| - | chan = gensub(/ | ||
| - | iwphy[phy, | ||
| - | iwphy[phy, | ||
| - | } | ||
| - | } | ||
| - | close(cmd) | ||
| - | } | ||
| - | |||
| - | function get_iwdev() { | ||
| - | cmd = "iw dev" | ||
| - | while(cmd | getline) { | ||
| - | if($0 ~ / | ||
| - | phy = gensub(/ | ||
| - | else if($0 ~ / | ||
| - | dev = gensub(/ | ||
| - | else if($0 ~ / | ||
| - | freq = gensub(/ | ||
| - | iwdev[phy, | ||
| - | } | ||
| - | } | ||
| - | close(cmd) | ||
| - | } | ||
| - | |||
| - | function get_iwconf() { | ||
| - | for(iwdev_subs in iwdev) { | ||
| - | split(iwdev_subs, | ||
| - | if(iwdev_sub[3] != " | ||
| - | phy = iwdev_sub[1] | ||
| - | dev = iwdev_sub[2] | ||
| - | if(phy_conf == "" | ||
| - | if(phy_conf != phy) continue | ||
| - | dev_conf = dev | ||
| - | freq_conf = iwdev[phy_conf, | ||
| - | band_conf = iwphy[phy_conf, | ||
| - | } | ||
| - | } | ||
| - | |||
| - | function get_iwscan() { | ||
| - | cmd = "iw dev " | ||
| - | while(cmd | getline) { | ||
| - | if($0 ~ / | ||
| - | bssid = gensub(/ | ||
| - | else if($0 ~ / | ||
| - | freq = gensub(/ | ||
| - | iwscan[bssid, | ||
| - | } | ||
| - | else if($0 ~ / | ||
| - | signal = gensub(/ | ||
| - | iwscan[bssid, | ||
| - | if(signal < - 100) quality = 0 | ||
| - | else if(signal < - 50) quality = 2 * (signal + 100) | ||
| - | else quality = 100 | ||
| - | iwscan[bssid, | ||
| - | } | ||
| - | else if($0 ~ / | ||
| - | ssid = gensub(/ | ||
| - | iwscan[bssid, | ||
| - | } | ||
| - | } | ||
| - | close(cmd) | ||
| - | } | ||
| - | |||
| - | function get_iwload() { | ||
| - | for(iwphy_subs in iwphy) { | ||
| - | split(iwphy_subs, | ||
| - | if(iwphy_sub[3] != " | ||
| - | phy = iwphy_sub[1] | ||
| - | freq = iwphy_sub[2] | ||
| - | band = iwphy[phy, freq, " | ||
| - | load = iwphy[phy, freq, " | ||
| - | if(band != band_conf) continue | ||
| - | for(iwscan_subs in iwscan) { | ||
| - | split(iwscan_subs, | ||
| - | if(iwscan_sub[2] != " | ||
| - | bssid = iwscan_sub[1] | ||
| - | freq_bssid = iwscan[bssid, | ||
| - | signal = iwscan[bssid, | ||
| - | freq_diff = freq - freq_bssid | ||
| - | if(freq_diff < 0) freq_diff = - freq_diff | ||
| - | if(freq_diff < 5) signal_factor = 100 | ||
| - | else if(freq_diff < 10) signal_factor = 95 | ||
| - | else if(freq_diff < 15) signal_factor = 85 | ||
| - | else if(freq_diff < 20) signal_factor = 15 | ||
| - | else if(freq_diff < 25) signal_factor = 5 | ||
| - | else signal_factor = 0 | ||
| - | if(signal < - 100) load += 0 | ||
| - | else load += (signal + 100) * signal_factor | ||
| - | iwphy[phy, | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | |||
| - | function get_iwstatus() { | ||
| - | for(iwphy_subs in iwphy) { | ||
| - | split(iwphy_subs, | ||
| - | if(iwphy_sub[3] != " | ||
| - | phy = iwphy_sub[1] | ||
| - | freq = iwphy_sub[2] | ||
| - | band = iwphy[phy, freq, " | ||
| - | load = iwphy[phy, freq, " | ||
| - | if(band != band_conf) continue | ||
| - | if(load_optim != "" | ||
| - | freq_optim = freq | ||
| - | load_optim = load | ||
| - | } | ||
| - | status_conf = " | ||
| - | iwphy[phy_conf, | ||
| - | status_optim = iwphy[phy_conf, | ||
| - | iwphy[phy_conf, | ||
| - | } | ||
| - | |||
| - | function get_iwchan() { | ||
| - | freq_diff = freq_conf - freq_optim | ||
| - | load_conf = iwphy[phy_conf, | ||
| - | load_optim = iwphy[phy_conf, | ||
| - | load_diff = load_conf - load_optim | ||
| - | if(freq_diff < 0) freq_diff = - freq_diff | ||
| - | if(freq_diff < freq_thr || load_diff < load_thr) return | ||
| - | chan_optim = iwphy[phy_conf, | ||
| - | printf " | ||
| - | } | ||
| - | |||
| - | function print_iwinfo() { | ||
| - | printf " | ||
| - | phy_conf, dev_conf, band_conf, freq_thr, load_thr | ||
| - | } | ||
| - | |||
| - | function print_iwscan() { | ||
| - | cmd = "sort -n" | ||
| - | printf " | ||
| - | for(iwscan_subs in iwscan) { | ||
| - | split(iwscan_subs, | ||
| - | if(iwscan_sub[2] != " | ||
| - | bssid = iwscan_sub[1] | ||
| - | freq = iwscan[bssid, | ||
| - | chan = iwphy[phy_conf, | ||
| - | signal = iwscan[bssid, | ||
| - | quality = iwscan[bssid, | ||
| - | ssid = iwscan[bssid, | ||
| - | printf " | ||
| - | bssid, ssid | cmd | ||
| - | } | ||
| - | close(cmd) | ||
| - | } | ||
| - | |||
| - | function print_iwlist() { | ||
| - | cmd = "sort -n" | ||
| - | printf " | ||
| - | for(iwphy_subs in iwphy) { | ||
| - | split(iwphy_subs, | ||
| - | if(iwphy_sub[3] != " | ||
| - | phy = iwphy_sub[1] | ||
| - | freq = iwphy_sub[2] | ||
| - | band = iwphy[phy, freq, " | ||
| - | chan = iwphy[phy, freq, " | ||
| - | load = iwphy[phy, freq, " | ||
| - | status = iwphy[phy, freq, " | ||
| - | if(band != band_conf) continue | ||
| - | printf " | ||
| - | } | ||
| - | close(cmd) | ||
| - | } | ||
| - | |||
| - | BEGIN { | ||
| - | subcmd = ARGV[1] | ||
| - | phy_conf = ARGV[2] | ||
| - | freq_thr = ARGV[3] | ||
| - | load_thr = ARGV[4] | ||
| - | if(subcmd == "" | ||
| - | if(freq_thr == "" | ||
| - | if(load_thr == "" | ||
| - | if(subcmd == " | ||
| - | printf "awk -f iwchan.awk [show|get|help] [phy] [freq_thr] [load_thr]\n" | ||
| - | else if(subcmd == " | ||
| - | get_iwphy() | ||
| - | get_iwdev() | ||
| - | get_iwconf() | ||
| - | get_iwscan() | ||
| - | get_iwload() | ||
| - | get_iwstatus() | ||
| - | if(subcmd == " | ||
| - | else if(subcmd == " | ||
| - | print_iwinfo() | ||
| - | print_iwscan() | ||
| - | print_iwlist() | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <code bash iwchan.sh> | ||
| - | # Description: | ||
| - | |||
| - | IWCHAN=" | ||
| - | PHYID=" | ||
| - | CHAN=" | ||
| - | |||
| - | if [ -z " | ||
| - | uci set wireless." | ||
| - | wifi reload | ||
| - | </ | ||
| - | |||
| - | ===== Examples ===== | ||
| - | <code bash> | ||
| - | # awk -f iwchan.awk help | ||
| - | awk -f iwchan.awk [show|get|help] [phy] [freq_thr] [load_thr] | ||
| - | |||
| - | # awk -f iwchan.awk get | ||
| - | 5 | ||
| - | |||
| - | # awk -f iwchan.awk show | ||
| - | Phy: phy0 | ||
| - | Dev: wlp2s0 | ||
| - | Band: 1 | ||
| - | FreqTh: 15 | ||
| - | LoadTh: | ||
| - | |||
| - | Freq Channel Signal Quality BSSID SSID | ||
| - | 2412 1 -63 74 90: | ||
| - | 2412 1 -74 52 10: | ||
| - | 2437 6 -72 56 c4: | ||
| - | 2457 10 -65 70 d8: | ||
| - | 2457 10 -83 34 c4: | ||
| - | 2462 11 -57 86 c0: | ||
| - | 2467 12 -58 84 54: | ||
| - | |||
| - | Freq Channel Load Status | ||
| - | 2412 1 6300 - | ||
| - | 2417 2 6125 | ||
| - | 2422 3 5775 | ||
| - | 2427 4 3325 | ||
| - | 2432 5 2975 + | ||
| - | 2437 6 3060 | ||
| - | 2442 7 3655 | ||
| - | 2447 8 7655 | ||
| - | 2452 9 9645 | ||
| - | 2457 10 12995 | ||
| - | 2462 11 13230 | ||
| - | 2467 12 12705 | ||
| - | 2472 13 8425 | ||
| - | </ | ||
| - | |||
| - | ===== Automated ===== | ||
| - | <code bash> | ||
| - | URL=" | ||
| - | wget -O / | ||
| - | wget -O / | ||
| - | cat << EOF >> / | ||
| - | /root | ||
| - | EOF | ||
| - | cat << " | ||
| - | 0 4 * * * . / | ||
| - | EOF | ||
| - | / | ||
| - | </ | ||