#!/bin/sh IP4="ip -4" IP6="ip -6" SCRIPTNAME="$(basename "$0")" MWAN3_STATUS_DIR="/var/run/mwan3" MWAN3_STATUS_IPTABLES_LOG_DIR="${MWAN3_STATUS_DIR}/iptables_log" MWAN3TRACK_STATUS_DIR="/var/run/mwan3track" MWAN3_INTERFACE_MAX="" MMX_MASK="" MMX_DEFAULT="" MMX_BLACKHOLE="" MM_BLACKHOLE="" MMX_UNREACHABLE="" MM_UNREACHABLE="" MMX_UNKNOWN_WAN="" MM_UNKNOWN_WAN="" MAX_SLEEP=$(((1<<31)-1)) command -v ip6tables > /dev/null NO_IPV6=$? IPS="ipset" IPT4="iptables -t mangle -w" IPT6="ip6tables -t mangle -w" IPT4R="iptables-restore -T mangle -w -n" IPT6R="ip6tables-restore -T mangle -w -n" LOG() { local facility=$1; shift # in development, we want to show 'debug' level logs # when this release is out of beta, the comment in the line below # should be removed [ "$facility" = "debug" ] && return logger -t "${SCRIPTNAME}[$$]" -p $facility "$*" } mwan3_get_true_iface() { local family V _true_iface=$2 config_get family "$2" family ipv4 if [ "$family" = "ipv4" ]; then V=4 elif [ "$family" = "ipv6" ]; then V=6 fi ubus call "network.interface.${2}_${V}" status &>/dev/null && _true_iface="${2}_${V}" export "$1=$_true_iface" } mwan3_get_src_ip() { local family _src_ip interface true_iface device addr_cmd default_ip IP sed_str interface=$2 mwan3_get_true_iface true_iface $interface unset "$1" config_get family "$interface" family ipv4 if [ "$family" = "ipv4" ]; then addr_cmd_1='network_get_ipaddr' addr_cmd_2='false' default_ip="0.0.0.0" sed_str='s/ *inet \([^ \/]*\).*/\1/;T; pq' IP="$IP4" elif [ "$family" = "ipv6" ]; then addr_cmd_1='network_get_preferred_ipaddr6' addr_cmd_2='network_get_ipaddr6' default_ip="::" sed_str='s/ *inet6 \([^ \/]*\).* scope.*/\1/;T; pq' IP="$IP6" fi $addr_cmd_1 _src_ip "$true_iface" 2>&1 || $addr_cmd_2 _src_ip "$true_iface" if [ -z "$_src_ip" ]; then network_get_device device $true_iface _src_ip=$($IP address ls dev $device 2>/dev/null | sed -ne "$sed_str") if [ -n "$_src_ip" ]; then LOG warn "no src $family address found from netifd for interface '$true_iface' dev '$device' guessing $_src_ip" else _src_ip="$default_ip" LOG warn "no src $family address found for interface '$true_iface' dev '$device'" fi fi export "$1=$_src_ip" } mwan3_get_mwan3track_status() { local track_ips pid mwan3_list_track_ips() { track_ips="$1 $track_ips" } config_list_foreach "$1" track_ip mwan3_list_track_ips if [ -n "$track_ips" ]; then pid="$(pgrep -f "mwan3track $1$")" if [ -n "$pid" ]; then if [ "$(cat /proc/"$(pgrep -P $pid)"/cmdline)" = "sleep${MAX_SLEEP}" ]; then tracking="paused" else tracking="active" fi else tracking="down" fi else tracking="disabled" fi echo "$tracking" } mwan3_init() { local bitcnt mmdefault source_routing config_load mwan3 [ -d $MWAN3_STATUS_DIR ] || mkdir -p $MWAN3_STATUS_DIR/iface_state [ -d "$MWAN3_STATUS_IPTABLES_LOG_DIR" ] || mkdir -p "$MWAN3_STATUS_IPTABLES_LOG_DIR" # mwan3's MARKing mask (at least 3 bits should be set) if [ -e "${MWAN3_STATUS_DIR}/mmx_mask" ]; then MMX_MASK=$(cat "${MWAN3_STATUS_DIR}/mmx_mask") MWAN3_INTERFACE_MAX=$(uci_get_state mwan3 globals iface_max) else config_get MMX_MASK globals mmx_mask '0x3F00' echo "$MMX_MASK"| tr 'A-F' 'a-f' > "${MWAN3_STATUS_DIR}/mmx_mask" LOG debug "Using firewall mask ${MMX_MASK}" bitcnt=$(mwan3_count_one_bits MMX_MASK) mmdefault=$(((1<>bit_msk)&1)) = "1" ]; then if [ $((($1>>bit_val)&1)) = "1" ]; then result=$((result|(1</dev/null)" [ -z "${time_u}" ] || [ "${time_u}" = "0" ] || { time_n="$(get_uptime)" echo $((time_n-time_u)) } }