#!/bin/sh /etc/rc.common START=98 STOP=20 USE_PROCD=1 IS_CFG_VALID=1 MAP_DEV="map_dev" MAP_IF="map" create_map() { ip link add lei type veth peer name lei_map 2>/dev/null ip link add link lei name lei_lan type vlan id 1 2>/dev/null uci -q set network.${MAP_DEV}=device uci -q set network.${MAP_DEV}.name=br-map uci -q set network.${MAP_DEV}.type=bridge uci -q show network.${MAP_DEV}.ports | grep -q lei_map || { uci -q add_list network.${MAP_DEV}.ports='lei_map' } uci -q set network.${MAP_IF}=interface uci -q set network.${MAP_IF}.device=br-map uci -q set network.${MAP_IF}.is_lan=1 uci -q show network.br_lan.ports | grep -q lei_lan || { uci -q add_list network.br_lan.ports="lei_lan" } uci -q set mapagent.agent.al_bridge=br-map uci -q commit ubus call network reload ubus -t 5 wait_for network.interface.map brctl addif br-map lei_map 2>/dev/null brctl addif br-lan lei_lan 2>/dev/null ip link set lei up 2>/dev/null ip link set lei_map up 2>/dev/null ip link set lei_lan up 2>/dev/null } remove_map() { ip link delete ${MAP_VETH} &>/dev/null uci -q delete network.${MAP_DEV} uci -q delete network.${MAP_IF} uci -q set mapagent.agent.al_bridge=br-lan uci -q commit ubus call network reload } start_dynbhd_service() { rm -f /tmp/multiap.backhaul procd_open_instance procd_set_param command "/usr/sbin/dynbhd" procd_set_param respawn # procd_set_param stdout 1 # procd_set_param stderr 1 procd_close_instance } validate_agent_section() { uci_validate_section mapagent agent "agent" \ 'enabled:bool:true' \ 'debug:range(0,16)' \ 'profile:range(1,2):2' \ 'brcm_setup:bool:false' \ 'controller_macaddr:macaddr' \ 'al_bridge:string' \ 'netdev:string' \ 'vlan_segregation:bool:false' \ 'resend_num:uinteger:0' \ 'dyn_cntlr_sync:bool:true' \ 'island_prevention:bool:false' \ 'eth_onboards_wifi_bhs:bool:false' [ "$?" -ne 0 ] && { logger -s -t "mapagent" "Validation of agent section failed" IS_CFG_VALID=0 return 1 } return 0 } validate_cs_section() { local section="$1" uci_validate_section mapagent $section "${section}" \ 'local:bool:false' \ 'id:string' \ 'probe_int:range(0,1000):20' \ 'retry_int:range(0,255):3' \ 'autostart:bool:false' [ "$?" -ne 0 ] && { logger -s -t "mapagent" "Validation of controller_select section failed" IS_CFG_VALID=0 return 1 } return 0 } validate_ap_section() { local section="$1" uci_validate_section mapagent $section "${1}" \ 'ifname:string' \ 'device:string' \ 'band:or("2", "5", "6")' \ 'enabled:bool:true' \ 'onboarded:bool:false' \ 'ssid:string' \ 'key:string' \ 'encryption:string' \ 'disallow_bsta_p1:bool:false' \ 'disallow_bsta_p2:bool:false' [ "$?" -ne 0 ] && { logger -s -t "mapagent" "Validation of ap section failed" IS_CFG_VALID=0 return 1 } return 0 } validate_radio_section() { local section="$1" uci_validate_section mapagent $section "${1}" \ 'device:string' \ 'band:or("2", "5")' \ 'configured:bool:false' \ 'onboarded:bool:false' \ 'dedicated_backhaul:bool:false' \ 'steer_policy:range(0,255)' \ 'util_threshold:range(0,255)' \ 'rcpi_threshold:range(0,255)' \ 'report_rcpi_threshold:range(0,255)' \ 'include_sta_stats:bool:false' \ 'include_sta_metric:bool:false' \ 'rcpi_hysteresis_margin:range(0,255)' \ 'report_util_threshold:range(0,255)' \ 'encryption:or("sae", "psk2", "sae-mixed")' [ "$?" -ne 0 ] && { logger -s -t "mapagent" "Validation of radio section failed" IS_CFG_VALID=0 return 1 } return 0 } validate_policy_section() { local section="$1" uci_validate_section mapagent $section "${1}" \ 'report_interval:range(0,255)' \ 'pvid:uinteger' \ 'report_interval:range(0,255)' \ 'pcp_default:range(0,255)' \ 'report_scan:bool' \ 'report_sta_assocfails:bool' \ 'report_sta_assocfails_rate:uinteger' \ 'steer_exclude:list(macaddr)' \ 'steer_exclude_btm:list(macaddr)' \ [ "$?" -ne 0 ] && { logger -s -t "mapagent" "Validation of policy section failed" IS_CFG_VALID=0 return 1 } return 0 } validate_dyn_bh_section() { local section="$1" uci_validate_section mapagent $section "${1}" \ 'missing_bh_timer:range(1,255)' uci_validate_section mapagent $section "${1}" \ 'missing_bh_reconfig_timer:range(0,65535)' [ "$?" -ne 0 ] && { logger -s -t "mapagent" "Validation of dynamic backhaul section failed" IS_CFG_VALID=0 return 1 } return 0 } validate_agent_config() { IS_CFG_VALID=1 validate_agent_section && config_foreach validate_cs_section controller_select && config_foreach validate_ap_section ap && config_foreach validate_radio_section radio && config_foreach validate_policy_section policy && config_foreach validate_dyn_bh_section dynamic_backhaul [ "$IS_CFG_VALID" -ne 1 ] && { logger -s -t "mapagent" "Validation of mapagent UCI file failed" return 1 } return 0 } create_dir() { mkdir -p /var/run/multiap } start_service() { [ -f /usr/sbin/dynbhd ] && start_dynbhd_service config_load "mapagent" validate_agent_config || return 1; ubus -t 5 wait_for wifi sleep 2 local enabled config_get_bool enabled agent enabled 1 [ "$enabled" -eq 0 ] && return 1 local ts config_get_bool ts agent vlan_segregation 0 [ "$ts" -eq 1 ] && create_map #|| remove_map procd_open_instance create_dir procd_set_param command "/usr/sbin/mapagent" "-d" procd_set_param respawn # procd_set_param stdout 1 # procd_set_param stderr 1 procd_close_instance } #stop_service() { # remove_map #} service_triggers() { procd_add_reload_trigger "mapagent" } reload_service() { stop start }