Compare commits
10 Commits
83aa9b8d9e
...
84e9229dc1
Author | SHA1 | Date |
---|---|---|
|
84e9229dc1 | |
|
205814a2ea | |
|
b6fe527472 | |
|
94949ba40b | |
|
9df05cd81a | |
|
01c99f8e4c | |
|
3900871977 | |
|
cfeadeb3bd | |
|
702c4f28f5 | |
|
3e23e0bd0c |
|
@ -82,9 +82,9 @@ I'm currently not packaging for any distro. If you do, open a PR and add the lin
|
|||
- iptables (or nftables with `iptables-nft` translation linked)
|
||||
- WiFi hotspot dependencies
|
||||
- hostapd
|
||||
- iw
|
||||
- iwconfig (you only need this if 'iw' can not recognize your adapter)
|
||||
- iw (or iwconfig, when iw can not recognize adapter)
|
||||
- haveged (optional)
|
||||
- crda and wireless-regdb (optional)
|
||||
|
||||
|
||||
|
||||
|
|
152
lnxrouter
152
lnxrouter
|
@ -1,6 +1,6 @@
|
|||
#!/bin/bash
|
||||
|
||||
VERSION=0.7.6
|
||||
VERSION=0.8.0-unstable2
|
||||
PROGNAME="$(basename "$0")"
|
||||
|
||||
export LC_ALL=C
|
||||
|
@ -124,8 +124,24 @@ Options:
|
|||
--vht-seg1-ch <channel> Channel index of VHT center frequency for secondary
|
||||
(second 80MHz) segment. Use with '--vht-ch-width 3'
|
||||
|
||||
WiFi 6 (802.11ax) configs:
|
||||
--wifi6 Enable IEEE 802.11ax (HE)
|
||||
--req-he Require station HE (High Efficiency) mode
|
||||
|
||||
--he-ch-width <index> Index of HE channel width:
|
||||
0 for 20MHz or 40MHz (default)
|
||||
1 for 80MHz
|
||||
2 for 160MHz
|
||||
3 for 80+80MHz (Non-contigous 160MHz)
|
||||
--he-seg0-ch <channel> Channel index of HE center frequency for primary
|
||||
segment. Use with '--he-ch-width'
|
||||
--he-seg1-ch <channel> Channel index of HE center frequency for secondary
|
||||
(second 80MHz) segment. Use with '--he-ch-width 3'
|
||||
|
||||
Instance managing:
|
||||
--daemon Run in background
|
||||
--keep-confdir Don't delete the temporary config dir after exit
|
||||
|
||||
-l, --list-running Show running instances
|
||||
--lc, --list-clients <id|interface>
|
||||
List clients of an instance. Or list neighbors of
|
||||
|
@ -197,11 +213,16 @@ define_global_variables(){
|
|||
REQUIREHT=0
|
||||
IEEE80211AC=0
|
||||
REQUIREVHT=0
|
||||
IEEE80211AX=0
|
||||
REQUIREHE=0
|
||||
HT_CAPAB='[HT40+]'
|
||||
VHT_CAPAB=
|
||||
VHTCHANNELWIDTH=0
|
||||
VHTSEG0CHINDEX=0
|
||||
VHTSEG1CHINDEX=0
|
||||
HECHANNELWIDTH=0
|
||||
HESEG0CHINDEX=0
|
||||
HESEG1CHINDEX=0
|
||||
DRIVER=nl80211
|
||||
NO_VIRT=0 # not use virtual interface
|
||||
COUNTRY=
|
||||
|
@ -213,6 +234,7 @@ define_global_variables(){
|
|||
QR=0 # show wifi qr
|
||||
|
||||
# script variables
|
||||
PHY=
|
||||
VWIFI_IFACE= # virtual wifi interface name, if created
|
||||
VIRT_NAME= # name to use for virtual interface if --virt-name is used
|
||||
AP_IFACE= # can be VWIFI_IFACE or WIFI_IFACE
|
||||
|
@ -231,6 +253,7 @@ define_global_variables(){
|
|||
NM_PID=
|
||||
FIREWALLD_PID=
|
||||
TMP_FIREWALLD_ZONE=
|
||||
KEEP_CONFDIR=
|
||||
}
|
||||
|
||||
parse_user_options(){
|
||||
|
@ -414,6 +437,14 @@ parse_user_options(){
|
|||
shift
|
||||
IEEE80211AC=1
|
||||
;;
|
||||
--wifi6|--ieee80211ax)
|
||||
shift
|
||||
IEEE80211AX=1
|
||||
;;
|
||||
--req-he|--require-he)
|
||||
shift
|
||||
REQUIREHE=1
|
||||
;;
|
||||
--req-vht|--require-vht)
|
||||
shift
|
||||
REQUIREVHT=1
|
||||
|
@ -443,6 +474,21 @@ parse_user_options(){
|
|||
VHTSEG1CHINDEX="$1"
|
||||
shift
|
||||
;;
|
||||
--he-ch-width|--he-channel-width)
|
||||
shift
|
||||
HECHANNELWIDTH="$1"
|
||||
shift
|
||||
;;
|
||||
--he-seg0-ch|--he-seg0-channel)
|
||||
shift
|
||||
HESEG0CHINDEX="$1"
|
||||
shift
|
||||
;;
|
||||
--he-seg1-ch|--he-seg1-channel)
|
||||
shift
|
||||
HESEG1CHINDEX="$1"
|
||||
shift
|
||||
;;
|
||||
--driver)
|
||||
shift
|
||||
DRIVER="$1"
|
||||
|
@ -507,6 +553,10 @@ parse_user_options(){
|
|||
LIST_CLIENTS_ID="$1"
|
||||
shift
|
||||
;;
|
||||
--keep-confdir)
|
||||
shift
|
||||
KEEP_CONFDIR=1
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Invalid parameter: $1" 1>&2
|
||||
|
@ -582,7 +632,6 @@ get_interface_phy_device() { # only for wifi interface
|
|||
return 0
|
||||
fi
|
||||
done
|
||||
echo "Failed to get phy interface" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
|
@ -622,15 +671,22 @@ can_be_ap() {
|
|||
}
|
||||
|
||||
can_transmit_to_channel() {
|
||||
local IFACE CHANNEL_NUM CHANNEL_INFO
|
||||
local IFACE CHANNEL_NUM CHANNEL_INFO CHANNEL_FREQ_FILTER
|
||||
IFACE=$1
|
||||
CHANNEL_NUM=$2
|
||||
if [[ $FREQ_BAND == "2.4" ]]; then
|
||||
CHANNEL_FREQ_FILTER="(24)"
|
||||
elif [[ $FREQ_BAND -eq 5 ]]; then
|
||||
CHANNEL_FREQ_FILTER="(5[1-8])"
|
||||
elif [[ $FREQ_BAND -eq 6 ]]; then
|
||||
CHANNEL_FREQ_FILTER="((59)|(6[0-9])|(7[0-1]))"
|
||||
fi
|
||||
|
||||
if [[ $USE_IWCONFIG -eq 0 ]]; then
|
||||
CHANNEL_INFO=$(get_adapter_info "${IFACE}" | grep -E " [0-9]+(\.[0-9]+){0,1} MHz \[${CHANNEL_NUM}\]")
|
||||
CHANNEL_INFO=$(get_adapter_info "${IFACE}" | grep -E " ${CHANNEL_FREQ_FILTER}[0-9]{2}(\.[0-9]+){0,1} MHz \[${CHANNEL_NUM}\]")
|
||||
[[ -z "${CHANNEL_INFO}" ]] && return 1
|
||||
[[ "${CHANNEL_INFO}" == *no\ IR* ]] && return 1
|
||||
[[ "${CHANNEL_INFO}" == *disabled* ]] && return 1
|
||||
[[ "${CHANNEL_INFO}" == *no\ IR* ]] && return 2
|
||||
[[ "${CHANNEL_INFO}" == *disabled* ]] && return 3
|
||||
return 0
|
||||
else
|
||||
CHANNEL_NUM=$(printf '%02d' ${CHANNEL_NUM})
|
||||
|
@ -640,20 +696,26 @@ can_transmit_to_channel() {
|
|||
fi
|
||||
}
|
||||
|
||||
# taken from iw/util.c
|
||||
ieee80211_frequency_to_channel() {
|
||||
local FREQ=$1
|
||||
if [[ $FREQ -eq 2484 ]]; then
|
||||
|
||||
# 2.4G
|
||||
if [[ $FREQ -ge 2412 && $FREQ -le 2472 ]]; then # 2.4 GHz band: Channels 1-13 (2412~2472 MHz)
|
||||
echo $(( (FREQ - 2407) / 5 ))
|
||||
elif [[ $FREQ -eq 2484 ]]; then # 2.4 GHz Channel 14 (2484 MHz, Japan only)
|
||||
echo 14
|
||||
elif [[ $FREQ -lt 2484 ]]; then
|
||||
echo $(( ($FREQ - 2407) / 5 ))
|
||||
elif [[ $FREQ -ge 4910 && $FREQ -le 4980 ]]; then
|
||||
echo $(( ($FREQ - 4000) / 5 ))
|
||||
elif [[ $FREQ -le 45000 ]]; then
|
||||
echo $(( ($FREQ - 5000) / 5 ))
|
||||
elif [[ $FREQ -ge 58320 && $FREQ -le 64800 ]]; then
|
||||
echo $(( ($FREQ - 56160) / 2160 ))
|
||||
else
|
||||
|
||||
# 5G
|
||||
elif [[ $FREQ -ge 5160 && $FREQ -le 5885 ]]; then # 5 GHz band: Standard Channels 36-165 (5180~5825 MHz) (extra: 32, 169-177)
|
||||
echo $(( (FREQ - 5000) / 5 ))
|
||||
|
||||
# 6G
|
||||
elif [[ $FREQ -ge 5955 && $FREQ -le 7115 ]]; then # 6 GHz band: Channels 1-233 (5955~7115 MHz), Wi-Fi 6E/7
|
||||
echo $(( (FREQ - 5950) / 5 ))
|
||||
elif [[ $FREQ -eq 5935 ]]; then # 6 GHz band: Special case for 5935 MHz (Channel 2, rare)
|
||||
echo 2
|
||||
|
||||
else # Frequency not in supported Wi-Fi bands (2.4/5/6 GHz)
|
||||
echo 0
|
||||
fi
|
||||
}
|
||||
|
@ -1324,7 +1386,7 @@ _cleanup() {
|
|||
|
||||
ip addr flush "${SUBNET_IFACE}"
|
||||
|
||||
rm -rf "$CONFDIR"
|
||||
[[ ! "$KEEP_CONFDIR" -eq 1 ]] && rm -rf "$CONFDIR"
|
||||
|
||||
ip link set down dev "${SUBNET_IFACE}"
|
||||
|
||||
|
@ -1360,6 +1422,7 @@ clean_iptables() {
|
|||
|
||||
cleanup() {
|
||||
trap "" SIGINT SIGUSR1 SIGUSR2 EXIT SIGTERM
|
||||
touch "$CONFDIR/exit_$(date +"%Y-%m-%d_%H:%M:%S.%6N")"
|
||||
echo
|
||||
echo
|
||||
echo "Doing cleanup.. "
|
||||
|
@ -1402,12 +1465,14 @@ init_conf_dirs() {
|
|||
cd "$TMPDIR" || die "Couldn't change directory to linux-router's temporary path"
|
||||
|
||||
CONFDIR="$(mktemp -d $TMPDIR/lnxrouter.${TARGET_IFACE}.conf.XXXXXX)" || die "Instance couldn't make config dir" # config dir for one instance
|
||||
chmod 755 "$CONFDIR"
|
||||
#echo "Config dir: $CONFDIR"
|
||||
echo "Config dir: $CONFDIR"
|
||||
chmod 755 "$CONFDIR" || die "chmod config dir failed"
|
||||
echo $$ > "$CONFDIR/pid"
|
||||
|
||||
touch "$CONFDIR/begin_$(date +"%Y-%m-%d_%H:%M:%S.%6N")"
|
||||
|
||||
COMMON_CONFDIR="$TMPDIR/lnxrouter_common.conf" # config dir for all instances
|
||||
mkdir -p "$COMMON_CONFDIR"
|
||||
mkdir -p "$COMMON_CONFDIR" || die "Failed creating common config dir"
|
||||
}
|
||||
|
||||
#== functions to deal with running instances
|
||||
|
@ -1657,9 +1722,14 @@ daemonizing_check(){
|
|||
|
||||
#============================
|
||||
check_wifi_settings() {
|
||||
PHY="$(get_interface_phy_device "$WIFI_IFACE")"
|
||||
if [[ -z "$PHY" ]]; then
|
||||
echo "ERROR: Can't get phy of wifi interface '$WIFI_IFACE' (Did you spell the interface name right?)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! ( which iw > /dev/null 2>&1 && iw dev "$WIFI_IFACE" info > /dev/null 2>&1 ); then
|
||||
echo "WARN: Can't use 'iw' to operate interfce '$WIFI_IFACE', trying 'iwconfig' (not as good as 'iw') ... (Did you spell the interface name right?)" >&2
|
||||
echo "WARN: Can't use 'iw' to operate interfce '$WIFI_IFACE', trying 'iwconfig' (not as good as 'iw') ..." >&2
|
||||
USE_IWCONFIG=1
|
||||
fi
|
||||
|
||||
|
@ -1846,6 +1916,8 @@ prepare_wifi_interface() {
|
|||
CHANNEL=36
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Freq band: $FREQ_BAND GHz Channel: $CHANNEL"
|
||||
}
|
||||
|
||||
decide_subnet_interface() {
|
||||
|
@ -1930,6 +2002,16 @@ write_hostapd_conf() {
|
|||
echo "require_vht=1" >> "$CONFDIR/hostapd.conf"
|
||||
fi
|
||||
|
||||
if [[ $IEEE80211AX -eq 1 ]]; then
|
||||
echo "ieee80211ax=1" >> "$CONFDIR/hostapd.conf"
|
||||
fi
|
||||
|
||||
if [[ $REQUIREHE -eq 1 ]]; then
|
||||
echo "require_he=1" >> "$CONFDIR/hostapd.conf"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if [[ -n "$VHT_CAPAB" ]]; then
|
||||
echo "vht_capab=${VHT_CAPAB}" >> "$CONFDIR/hostapd.conf"
|
||||
fi
|
||||
|
@ -1952,7 +2034,25 @@ write_hostapd_conf() {
|
|||
EOF
|
||||
fi
|
||||
|
||||
if [[ $IEEE80211N -eq 1 ]] || [[ $IEEE80211AC -eq 1 ]]; then
|
||||
if [[ $HECHANNELWIDTH -gt 0 ]]; then
|
||||
cat <<- EOF >> "$CONFDIR/hostapd.conf"
|
||||
he_oper_chwidth=${HECHANNELWIDTH}
|
||||
EOF
|
||||
fi
|
||||
|
||||
if [[ $HESEG0CHINDEX -gt 0 ]]; then
|
||||
cat <<- EOF >> "$CONFDIR/hostapd.conf"
|
||||
he_oper_centr_freq_seg0_idx=${HESEG0CHINDEX}
|
||||
EOF
|
||||
fi
|
||||
|
||||
if [[ $HESEG1CHINDEX -gt 0 ]]; then
|
||||
cat <<- EOF >> "$CONFDIR/hostapd.conf"
|
||||
he_oper_centr_freq_seg1_idx=${HESEG1CHINDEX}
|
||||
EOF
|
||||
fi
|
||||
|
||||
if [[ $IEEE80211N -eq 1 ]] || [[ $IEEE80211AC -eq 1 ]] || [[ $IEEE80211AX -eq 1 ]]; then
|
||||
echo "wmm_enabled=1" >> "$CONFDIR/hostapd.conf"
|
||||
fi
|
||||
|
||||
|
@ -2132,10 +2232,8 @@ start_dnsmasq() {
|
|||
}
|
||||
|
||||
check_rfkill_unblock_wifi() {
|
||||
local PHY
|
||||
if which rfkill > /dev/null 2>&1 ; then
|
||||
PHY=$(get_interface_phy_device "${SUBNET_IFACE}")
|
||||
[[ -n $PHY ]] && rfkill unblock $(rfkill | grep "$PHY" | awk '{print $1}') >/dev/null 2>&1
|
||||
rfkill unblock $(rfkill | grep "$PHY" | awk '{print $1}') >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -2217,7 +2315,7 @@ fi
|
|||
|
||||
# judge channel availability after changing country code
|
||||
if [[ $WIFI_IFACE ]] ; then
|
||||
can_transmit_to_channel "${AP_IFACE}" ${CHANNEL} || die "Your adapter can not transmit to channel ${CHANNEL}, frequency band ${FREQ_BAND}GHz."
|
||||
can_transmit_to_channel "${AP_IFACE}" ${CHANNEL} || die "Your adapter can not transmit to channel ${CHANNEL}, frequency band ${FREQ_BAND}GHz. (Tips: 1. Check usable channels: 'iw phy $PHY info'. 2. Check country code then check again. )"
|
||||
fi
|
||||
|
||||
[[ $WIFI_IFACE ]] && write_hostapd_conf
|
||||
|
|
Loading…
Reference in New Issue