From 501a471507d0d6a4cbf3e992e12b0ad9deb4ff1f Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Fri, 6 Oct 2023 21:53:34 +0200 Subject: [PATCH] Fixes for RUTX50/12 with 6.1 kernel --- .../ipq40xx/base-files/etc/board.d/02_network | 249 ++++++ .../base-files/lib/functions/migrate.sh | 196 ----- .../base-files/lib/functions/network.sh | 313 -------- .../base-files/lib/functions/uci-defaults.sh | 726 ------------------ .../base-files/lib/upgrade/platform.sh | 244 ++++++ 5 files changed, 493 insertions(+), 1235 deletions(-) create mode 100644 6.1/target/linux/ipq40xx/base-files/etc/board.d/02_network delete mode 100644 6.1/target/linux/ipq40xx/base-files/lib/functions/migrate.sh delete mode 100644 6.1/target/linux/ipq40xx/base-files/lib/functions/network.sh delete mode 100644 6.1/target/linux/ipq40xx/base-files/lib/functions/uci-defaults.sh create mode 100644 6.1/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh diff --git a/6.1/target/linux/ipq40xx/base-files/etc/board.d/02_network b/6.1/target/linux/ipq40xx/base-files/etc/board.d/02_network new file mode 100644 index 00000000..badea65b --- /dev/null +++ b/6.1/target/linux/ipq40xx/base-files/etc/board.d/02_network @@ -0,0 +1,249 @@ +# +# Copyright (c) 2015 The Linux Foundation. All rights reserved. +# Copyright (c) 2011-2015 OpenWrt.org +# + +. /lib/functions/uci-defaults.sh +. /lib/functions/system.sh + +ipq40xx_setup_interfaces() +{ + local board="$1" + + case "$board" in + 8dev,habanero-dvk|\ + avm,fritzbox-4040|\ + asus,rt-ac42u|\ + asus,rt-ac58u|\ + linksys,ea6350v3|\ + linksys,ea8300|\ + linksys,mr8300|\ + mikrotik,hap-ac2|\ + mikrotik,hap-ac3|\ + mikrotik,hap-ac3-lte6-kit|\ + p2w,r619ac-64m|\ + p2w,r619ac-128m|\ + pakedge,wr-1|\ + teltonika,rutx12|\ + teltonika,rutx50|\ + yyets,le1|\ + zyxel,nbg6617) + ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" "wan" + ;; + 8dev,jalapeno|\ + alfa-network,ap120c-ac|\ + asus,map-ac2200|\ + cilab,meshpoint-one|\ + edgecore,ecw5211|\ + glinet,gl-ap1300|\ + glinet,gl-b2200|\ + google,wifi|\ + linksys,whw03v2|\ + luma,wrtq-329acn|\ + mikrotik,cap-ac|\ + netgear,wac510|\ + sony,ncp-hg100-cellular|\ + wallys,dr40x9|\ + zte,mf18a|\ + zte,mf289f) + ucidef_set_interfaces_lan_wan "lan" "wan" + ;; + aruba,ap-303|\ + aruba,ap-365|\ + avm,fritzrepeater-1200|\ + dlink,dap-2610|\ + extreme-networks,ws-ap3915i|\ + meraki,mr33|\ + meraki,mr74|\ + mikrotik,lhgg-60ad|\ + mikrotik,sxtsq-5-ac|\ + netgear,ex6100v2|\ + netgear,ex6150v2|\ + zte,mf282plus) + ucidef_set_interface_lan "lan" + ;; + avm,fritzbox-7530) + ucidef_set_interface_lan "lan1 lan2 lan3 lan4" + ;; + avm,fritzrepeater-3000|\ + cellc,rtl30vw) + ucidef_set_interface_lan "lan1 lan2" + ;; + compex,wpj428) + ucidef_set_interface_lan "lan1 lan2" + ;; + devolo,magic-2-wifi-next) + ucidef_set_interface_lan "lan1 lan2 ghn" + ;; + extreme-networks,ws-ap391x) + ucidef_set_interfaces_lan_wan "sw-eth1 sw-eth2 sw-eth3 sw-eth5" "sw-eth4" + ;; + linksys,whw01) + ucidef_set_interface_lan "eth1 eth2" + ;; + glinet,gl-a1300|\ + glinet,gl-b1300|\ + mobipromo,cm520-79f) + ucidef_set_interfaces_lan_wan "lan1 lan2" "wan" + ;; + mikrotik,wap-ac|\ + mikrotik,wap-ac-lte|\ + mikrotik,wap-r-ac) + ucidef_set_interface_lan "sw-eth1 sw-eth2" + ;; + aruba,ap-303h|\ + buffalo,wtr-m2133hp|\ + ezviz,cs-w3-wd1200g-eup|\ + netgear,rbr40|\ + netgear,rbs40|\ + netgear,rbr50|\ + netgear,rbs50|\ + netgear,srr60|\ + netgear,srs60) + ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan" + ;; + openmesh,a42|\ + openmesh,a62) + ucidef_set_interfaces_lan_wan "ethernet2" "ethernet1" + ;; + plasmacloud,pa1200|\ + plasmacloud,pa2200) + ucidef_set_interfaces_lan_wan "ethernet1" "ethernet2" + ;; + qxwlan,e2600ac-c1) + ucidef_set_interfaces_lan_wan "sw-eth1" "sw-eth2" + ;; + qxwlan,e2600ac-c2) + ucidef_set_interfaces_lan_wan "sw-eth1 sw-eth2" "sw-eth3" + ;; + zte,mf286d) + ucidef_set_interfaces_lan_wan "lan2 lan3 lan4" "wan" + ;; + zte,mf287|\ + zte,mf287plus|\ + zte,mf287pro) + ucidef_set_interface_lan "lan1 lan2 lan3 lan4" + ucidef_set_interface "wan" device "/dev/cdc-wdm0" protocol "qmi" + ;; + *) + echo "Unsupported hardware. Network interfaces not initialized" + ;; + esac +} + +ipq40xx_setup_dsl() +{ + local board="$1" + local annex="j" + local tone="b" + local xfer_mode="" + + case "$board" in + avm,fritzbox-7530) + ;; + *) + return 0 + ;; + esac + + ucidef_add_atm_bridge "1" "32" "llc" "bridged" "dsl" + ucidef_add_vdsl_modem "$annex" "$tone" "$xfer_mode" + ucidef_set_interface_wan "dsl0" "pppoe" +} + +ipq40xx_setup_macs() +{ + local board="$1" + local lan_mac="" + local wan_mac="" + local label_mac="" + + case "$board" in + 8dev,habanero-dvk) + label_mac=$(mtd_get_mac_binary "ART" 0x1006) + ;; + asus,rt-ac42u) + label_mac=$(mtd_get_mac_binary_ubi Factory 0x1006) + ;; + asus,rt-ac58u) + wan_mac=$(mtd_get_mac_binary_ubi Factory 0x1006) + lan_mac=$(mtd_get_mac_binary_ubi Factory 0x5006) + label_mac=$wan_mac + ;; + avm,fritzbox-7530) + local tffsdev=$(find_mtd_chardev "nand-tffs") + wan_mac=$(/usr/bin/fritz_tffs_nand -b -d $tffsdev -n macdsl) + ;; + cilab,meshpoint-one) + label_mac=$(mtd_get_mac_binary "ART" 0x1006) + ;; + devolo,magic-2-wifi-next) + lan_mac=$(mtd_get_mac_ascii APPSBLENV MacAddress0) + label_mac=$lan_mac + ;; + dlink,dap-2610) + lan_mac=$(mtd_get_mac_ascii bdcfg lanmac) + label_mac=$lan_mac + ;; + engenius,eap2200|\ + engenius,emd1) + lan_mac=$(mtd_get_mac_ascii 0:APPSBLENV ethaddr) + label_mac=$lan_mac + ;; + engenius,emr3500) + wan_mac=$(mtd_get_mac_ascii 0:APPSBLENV wanaddr) + lan_mac=$(mtd_get_mac_ascii 0:APPSBLENV ethaddr) + label_mac=$wan_mac + ;; + engenius,ens620ext) + wan_mac=$(mtd_get_mac_ascii u-boot-env ethaddr) + lan_mac=$(macaddr_add "$wan_mac" 1) + ;; + ezviz,cs-w3-wd1200g-eup) + label_mac=$(mtd_get_mac_binary "ART" 0x6) + ;; + google,wifi) + wan_mac=$(get_mac_label) + lan_mac=$(macaddr_add "$wan_mac" 1) + ;; + linksys,ea6350v3|\ + linksys,ea8300 |\ + linksys,mr8300) + wan_mac=$(mtd_get_mac_ascii devinfo hw_mac_addr) + lan_mac=$(macaddr_add "$wan_mac" 1) + ;; + mikrotik,cap-ac |\ + mikrotik,hap-ac2|\ + mikrotik,hap-ac3|\ + mikrotik,hap-ac3-lte6-kit) + wan_mac=$(cat /sys/firmware/mikrotik/hard_config/mac_base) + lan_mac=$(macaddr_add $wan_mac 1) + label_mac="$wan_mac" + ;; + mikrotik,lhgg-60ad|\ + mikrotik,sxtsq-5-ac) + lan_mac=$(cat /sys/firmware/mikrotik/hard_config/mac_base) + label_mac="$lan_mac" + ;; + netgear,rbr50|\ + netgear,rbs50|\ + netgear,srr60|\ + netgear,srs60|\ + pakedge,wr-1) + wan_mac=$(macaddr_add $(get_mac_label) 1) + ;; + esac + + [ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac + [ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac + [ -n "$label_mac" ] && ucidef_set_label_macaddr $label_mac +} + +board_config_update +board=$(board_name) +ipq40xx_setup_interfaces $board +ipq40xx_setup_dsl $board +ipq40xx_setup_macs $board +board_config_flush + +exit 0 diff --git a/6.1/target/linux/ipq40xx/base-files/lib/functions/migrate.sh b/6.1/target/linux/ipq40xx/base-files/lib/functions/migrate.sh deleted file mode 100644 index 634f9560..00000000 --- a/6.1/target/linux/ipq40xx/base-files/lib/functions/migrate.sh +++ /dev/null @@ -1,196 +0,0 @@ -#!/bin/sh - -. /lib/functions.sh -. /usr/share/libubox/jshn.sh - -CFG_PATH="/etc/config/" - -get_section_name() { - local ___var="$1" - [ "$#" -ge 1 ] && shift - local ___type="$1" - [ "$#" -ge 1 ] && shift - local section cfgtype - - [ -z "$CONFIG_SECTIONS" ] && return 0 - for section in ${CONFIG_SECTIONS}; do - config_get cfgtype "$section" TYPE - [ -n "$___type" -a "x$cfgtype" != "x$___type" ] && continue - eval export "${___var}=\${section}" - return 0 - done -} - -_set_option() { - local option="$1" - local value="$2" - - uci_set "$_NEW_CONFIG" "$_NEW_SEC_NAME" "$option" "$value" -} - -_set_list_option() { - local option="$1" - local value="$2" - - for element in $value; do - uci_add_list "$_NEW_CONFIG" "$_NEW_SEC_NAME" "$option" "$element" - done -} - -_del_uci_element() { - local section="$1" - local option="$2" - - uci_remove "$_OLD_CONFIG" "$section" "$option" -} -_option_cond_cb() { - local value=$3 - - json_select $2 - json_get_var old 1 - json_get_var new 2 - - [ "$old" = "$value" ] && _COND_VALUE="$new" - - json_select .. -} - -_parse_condition(){ - local value="$1" - - _COND_VALUE= - json_for_each_item _option_cond_cb "if" "$value" -} - -_option_rule_cb(){ - local rule="$1" - local option="$2" - local value - - [ -n "$rule" ] || return 0 - - json_select "$option" - json_get_vars new_name "if" default cb type - - if [ -n "$cb" ]; then - eval "$cb \"\$option\" \"\$_OLD_SEC_NAME\" \"\$_NEW_SEC_NAME\"" - [ "$?" -eq 0 ] && { - json_select .. - return 0 - } - - value="$_OPTION_VALUE" - else - config_get value $_OLD_SEC_NAME "$option" "$default" - fi - - [ -n "$if" ] && { - _parse_condition "$value" - value="${_COND_VALUE:-${value:-$default}}" - } - - if [ -n "$type" -a "$type" = "list" ]; then - _set_list_option "${new_name:-$option}" "$value" - else - _set_option "${new_name:-$option}" "$value" - fi - - json_select .. -} - -_init_section() { - local sec_t - - json_get_vars old_name new_name new_type old_type - [ -n "$old_name" -o -n "$old_type" ] || return 1 - - if [ -z "$old_name" ]; then - get_section_name _OLD_SEC_NAME "$old_type" - else - _OLD_SEC_NAME=$old_name - fi - - _NEW_SEC_NAME=$new_name - _OLD_SEC_TYPE=$old_type - _NEW_SEC_TYPE=${new_type:-$old_type} - [ -n "$_NEW_SEC_TYPE" ] || \ - eval "_NEW_SEC_TYPE=\$CONFIG_${_OLD_SEC_NAME}_TYPE" - - if [ -n "$_NEW_SEC_NAME" ]; then - uci set "$_NEW_CONFIG"."$_NEW_SEC_NAME"="$_NEW_SEC_TYPE" - else - _NEW_SEC_NAME="$(uci -q add "$_NEW_CONFIG" "$_NEW_SEC_TYPE")" - fi - - [ -n "$_NEW_SEC_NAME" ] || return 1 -} - -_section_rule_cb(){ - local rule="$1" - local section="$2" - local value - - [ -n "$rule" ] || return 0 - - json_select "$section" - json_get_vars cb old_name new_name new_type old_type remove - [ -n "$cb" ] && { - eval "$cb \"\$old_name\" \"\$new_name\" \"\$old_type\" \"\$new_type\"" - [ "$?" -eq 0 ] && { - json_select .. - return 0 - } - } - - _init_section - [ $? -ne 0 ] && { - logger -t "Migration" "Unable to init section" - json_select .. - - return 1 - } - - json_for_each_item _option_rule_cb options - json_select .. - [ -n "$remove" ] && { - _del_uci_element "$old_name" - uci_commit "$_OLD_CONFIG" - } -} - -_init_config() { - json_select config - json_get_vars old_name new_name - - [ -n "$old_name" ] || return 1 - [ -f "$CFG_PATH$old_name" ] || return 1 - [ -f "$CFG_PATH$new_name" ] || touch $CFG_PATH$new_name - - config_load "$old_name" - _NEW_CONFIG="${new_name:-$old_name}" - _OLD_CONFIG="$old_name" - - json_select .. -} - -migrate() { - local remove - local json_file="$1" - - [ -f "$json_file" ] || return 0 - - json_init - json_load_file "$json_file" - json_select - _init_config - [ $? -ne 0 ] && { - logger -t "Migration" "Unable to load config" - return 1 - } - - json_for_each_item _section_rule_cb sections - uci_commit "$_NEW_CONFIG" - - json_get_vars remove - [ -n "$remove" ] && rm "$CFG_PATH$_OLD_CONFIG" -} diff --git a/6.1/target/linux/ipq40xx/base-files/lib/functions/network.sh b/6.1/target/linux/ipq40xx/base-files/lib/functions/network.sh deleted file mode 100644 index a5d8d263..00000000 --- a/6.1/target/linux/ipq40xx/base-files/lib/functions/network.sh +++ /dev/null @@ -1,313 +0,0 @@ -# 1: destination variable -# 2: interface -# 3: path -# 4: separator -# 5: limit -__network_ifstatus() { - local __tmp - - [ -z "$__NETWORK_CACHE" ] && { - __tmp="$(ubus call network.interface dump 2>&1)" - case "$?" in - 4) : ;; - 0) export __NETWORK_CACHE="$__tmp" ;; - *) echo "$__tmp" >&2 ;; - esac - } - - __tmp="$(jsonfilter ${4:+-F "$4"} ${5:+-l "$5"} -s "${__NETWORK_CACHE:-{}}" -e "$1=@.interface${2:+[@.interface='$2']}$3")" - - [ -z "$__tmp" ] && \ - unset "$1" && \ - return 1 - - eval "$__tmp" -} - -# determine first IPv4 address of given logical interface -# 1: destination variable -# 2: interface -network_get_ipaddr() { - __network_ifstatus "$1" "$2" "['ipv4-address'][0].address"; -} - -# determine first IPv6 address of given logical interface -# 1: destination variable -# 2: interface -network_get_ipaddr6() { - __network_ifstatus "$1" "$2" "['ipv6-address'][0].address" || \ - __network_ifstatus "$1" "$2" "['ipv6-prefix-assignment'][0]['local-address'].address" || \ - return 1 -} - -# determine first IPv4 subnet of given logical interface -# 1: destination variable -# 2: interface -network_get_subnet() { - __network_ifstatus "$1" "$2" "['ipv4-address'][0]['address','mask']" "/" -} - -# determine first IPv6 subnet of given logical interface -# 1: destination variable -# 2: interface -network_get_subnet6() { - local __nets __addr - - if network_get_subnets6 __nets "$2"; then - # Attempt to return first non-fe80::/10, non-fc::/7 range - for __addr in $__nets; do - case "$__addr" in fe[8ab]?:*|f[cd]??:*) - continue - esac - export "$1=$__addr" - return 0 - done - - # Attempt to return first non-fe80::/10 range - for __addr in $__nets; do - case "$__addr" in fe[8ab]?:*) - continue - esac - export "$1=$__addr" - return 0 - done - - # Return first item - for __addr in $__nets; do - export "$1=$__addr" - return 0 - done - fi - - unset "$1" - return 1 -} - -# determine first IPv6 prefix of given logical interface -# 1: destination variable -# 2: interface -network_get_prefix6() { - __network_ifstatus "$1" "$2" "['ipv6-prefix'][0]['address','mask']" "/" -} - -# determine all IPv4 addresses of given logical interface -# 1: destination variable -# 2: interface -network_get_ipaddrs() { - __network_ifstatus "$1" "$2" "['ipv4-address'][*].address" -} - -# determine all IPv6 addresses of given logical interface -# 1: destination variable -# 2: interface -network_get_ipaddrs6() { - local __addr - local __list="" - - if __network_ifstatus "__addr" "$2" "['ipv6-address'][*].address"; then - for __addr in $__addr; do - __list="${__list:+$__list }${__addr}" - done - fi - - if __network_ifstatus "__addr" "$2" "['ipv6-prefix-assignment'][*]['local-address'].address"; then - for __addr in $__addr; do - __list="${__list:+$__list }${__addr}" - done - fi - - if [ -n "$__list" ]; then - export "$1=$__list" - return 0 - fi - - unset "$1" - return 1 -} - -# determine all IP addresses of given logical interface -# 1: destination variable -# 2: interface -network_get_ipaddrs_all() { - local __addr __addr6 - - network_get_ipaddrs __addr "$2" - network_get_ipaddrs6 __addr6 "$2" - - if [ -n "$__addr" -o -n "$__addr6" ]; then - export "$1=${__addr:+$__addr }$__addr6" - return 0 - fi - - unset "$1" - return 1 -} - -# determine all IPv4 subnets of given logical interface -# 1: destination variable -# 2: interface -network_get_subnets() { - __network_ifstatus "$1" "$2" "['ipv4-address'][*]['address','mask']" "/ " -} - -# determine all IPv6 subnets of given logical interface -# 1: destination variable -# 2: interface -network_get_subnets6() { - local __addr __mask - local __list="" - - if __network_ifstatus "__addr" "$2" "['ipv6-address'][*]['address','mask']" "/ "; then - for __addr in $__addr; do - __list="${__list:+$__list }${__addr}" - done - fi - - if __network_ifstatus "__addr" "$2" "['ipv6-prefix-assignment'][*]['local-address'].address" && \ - __network_ifstatus "__mask" "$2" "['ipv6-prefix-assignment'][*].mask"; then - for __addr in $__addr; do - __list="${__list:+$__list }${__addr}/${__mask%% *}" - __mask="${__mask#* }" - done - fi - - if [ -n "$__list" ]; then - export "$1=$__list" - return 0 - fi - - unset "$1" - return 1 -} - -# determine all IPv6 prefixes of given logical interface -# 1: destination variable -# 2: interface -network_get_prefixes6() { - __network_ifstatus "$1" "$2" "['ipv6-prefix'][*]['address','mask']" "/ " -} - -# determine IPv4 gateway of given logical interface -# 1: destination variable -# 2: interface -# 3: consider inactive gateway if "true" (optional) -network_get_gateway() { - __network_ifstatus "$1" "$2" ".route[@.target='0.0.0.0' && !@.table].nexthop" "" 1 && \ - return 0 - - [ "$3" = 1 -o "$3" = "true" ] && \ - __network_ifstatus "$1" "$2" ".inactive.route[@.target='0.0.0.0' && !@.table].nexthop" "" 1 -} - -# determine IPv6 gateway of given logical interface -# 1: destination variable -# 2: interface -# 3: consider inactive gateway if "true" (optional) -network_get_gateway6() { - __network_ifstatus "$1" "$2" ".route[@.target='::' && !@.table].nexthop" "" 1 && \ - return 0 - - [ "$3" = 1 -o "$3" = "true" ] && \ - __network_ifstatus "$1" "$2" ".inactive.route[@.target='::' && !@.table].nexthop" "" 1 -} - -# determine the DNS servers of the given logical interface -# 1: destination variable -# 2: interface -# 3: consider inactive servers if "true" (optional) -network_get_dnsserver() { - __network_ifstatus "$1" "$2" "['dns-server'][*]" && return 0 - - [ "$3" = 1 -o "$3" = "true" ] && \ - __network_ifstatus "$1" "$2" ".inactive['dns-server'][*]" -} - -# determine the domains of the given logical interface -# 1: destination variable -# 2: interface -# 3: consider inactive domains if "true" (optional) -network_get_dnssearch() { - __network_ifstatus "$1" "$2" "['dns-search'][*]" && return 0 - - [ "$3" = 1 -o "$3" = "true" ] && \ - __network_ifstatus "$1" "$2" ".inactive['dns-search'][*]" -} - -# 1: destination variable -# 2: addr -# 3: inactive -# 4: limit -__network_wan() -{ - limit=1 - [ -n "$4" ] && limit="$4" - __network_ifstatus "$1" "" \ - "[@.route[@.target='$2' && !@.table]].interface" "" $limit && \ - return 0 - - [ "$3" = 1 -o "$3" = "true" ] && \ - __network_ifstatus "$1" "" \ - "[@.inactive.route[@.target='$2' && !@.table]].interface" "" $limit -} - -# find the logical interface which holds the current IPv4 default route -# 1: destination variable -# 2: consider inactive default routes if "true" (optional) -network_find_wan() { __network_wan "$1" "0.0.0.0" "$2" "$3"; } - -# find the logical interface which holds the current IPv6 default route -# 1: destination variable -# 2: consider inactive default routes if "true" (optional) -network_find_wan6() { __network_wan "$1" "::" "$2"; } - -# test whether the given logical interface is running -# 1: interface -network_is_up() -{ - local __up - __network_ifstatus "__up" "$1" ".up" && [ "$__up" = 1 ] -} - -# determine the protocol of the given logical interface -# 1: destination variable -# 2: interface -network_get_protocol() { __network_ifstatus "$1" "$2" ".proto"; } - -# determine the uptime of the given logical interface -# 1: destination variable -# 2: interface -network_get_uptime() { __network_ifstatus "$1" "$2" ".uptime"; } - -# determine the metric of the given logical interface -# 1: destination variable -# 2: interface -network_get_metric() { __network_ifstatus "$1" "$2" ".metric"; } - -# determine the layer 3 linux network device of the given logical interface -# 1: destination variable -# 2: interface -network_get_device() { __network_ifstatus "$1" "$2" ".l3_device"; } - -# determine the layer 2 linux network device of the given logical interface -# 1: destination variable -# 2: interface -network_get_physdev() { __network_ifstatus "$1" "$2" ".device"; } - -# defer netifd actions on the given linux network device -# 1: device name -network_defer_device() -{ - ubus call network.device set_state \ - "$(printf '{ "name": "%s", "defer": true }' "$1")" 2>/dev/null -} - -# continue netifd actions on the given linux network device -# 1: device name -network_ready_device() -{ - ubus call network.device set_state \ - "$(printf '{ "name": "%s", "defer": false }' "$1")" 2>/dev/null -} - -# flush the internal value cache to force re-reading values from ubus -network_flush_cache() { unset __NETWORK_CACHE; } diff --git a/6.1/target/linux/ipq40xx/base-files/lib/functions/uci-defaults.sh b/6.1/target/linux/ipq40xx/base-files/lib/functions/uci-defaults.sh deleted file mode 100644 index 8d4ff13e..00000000 --- a/6.1/target/linux/ipq40xx/base-files/lib/functions/uci-defaults.sh +++ /dev/null @@ -1,726 +0,0 @@ -#!/bin/ash - -. /lib/functions.sh -. /usr/share/libubox/jshn.sh - -json_select_array() { - local _json_no_warning=1 - - json_select "$1" - [ $? = 0 ] && return - - json_add_array "$1" - json_close_array - - json_select "$1" -} - -json_select_object() { - local _json_no_warning=1 - - json_select "$1" - [ $? = 0 ] && return - - json_add_object "$1" - json_close_object - - json_select "$1" -} - -ucidef_set_interface() { - local network=$1; shift - - [ -z "$network" ] && return - - json_select_object network - json_select_object "$network" - - while [ -n "$1" ]; do - local opt=$1; shift - local val=$1; shift - - [ -n "$opt" -a -n "$val" ] || break - - [ "$opt" = "device" -a "$val" != "${val/ //}" ] && { - json_select_array "ports" - for e in $val; do json_add_string "" "$e"; done - json_close_array - } || { - json_add_string "$opt" "$val" - } - done - - if ! json_is_a proto string; then - case "$network" in - lan) json_add_string proto static ;; - wan) json_add_string proto dhcp ;; - *) json_add_string proto none ;; - esac - fi - - json_select .. - json_select .. -} - -ucidef_set_interface_default_macaddr() { - local network="$1" ifname - - json_select_object 'network' - json_select_object "$network" - if json_is_a ports array; then - json_select_array 'ports' - json_get_keys port_id - for i in $port_id; do - json_get_var port "$i" - ifname="${ifname} $port" - done - json_select .. - else - json_get_var ifname 'device' - fi - json_select .. - json_select .. - - for i in $ifname; do - local macaddr="$2"; shift - [ -n "$macaddr" ] || break - json_select_object 'network-device' - json_select_object "$i" - json_add_string 'macaddr' "$macaddr" - json_select .. - json_select .. - done -} - -ucidef_set_board_id() { - json_select_object model - json_add_string id "$1" - json_select .. -} - -ucidef_set_board_platform() { - json_select_object model - json_add_string platform "$1" - json_select .. -} - -ucidef_set_model_name() { - json_select_object model - json_add_string name "$1" - json_select .. -} - -ucidef_set_compat_version() { - json_select_object system - json_add_string compat_version "${1:-1.0}" - json_select .. -} - -ucidef_set_interface_lan() { - ucidef_set_interface "lan" device "$1" proto "${2:-static}" -} - -ucidef_set_interface_wan() { - ucidef_set_interface "wan" device "$1" proto "${2:-dhcp}" -} - -ucidef_set_interfaces_lan_wan() { - local lan_if="$1" - local wan_if="$2" - - ucidef_set_interface_lan "$lan_if" - ucidef_set_interface_wan "$wan_if" -} - -_ucidef_add_switch_port() { - # inherited: $num $device $need_tag $want_untag $role $index $prev_role - # inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5 - - n_ports=$((n_ports + 1)) - - json_select_array ports - json_add_object - json_add_int num "$num" - [ -n "$device" ] && json_add_string device "$device" - [ -n "$need_tag" ] && json_add_boolean need_tag "$need_tag" - [ -n "$want_untag" ] && json_add_boolean want_untag "$want_untag" - [ -n "$role" ] && json_add_string role "$role" - [ -n "$index" ] && json_add_int index "$index" - json_close_object - json_select .. - - # record pointer to cpu entry for lookup in _ucidef_finish_switch_roles() - [ -n "$device" ] && { - export "cpu$n_cpu=$n_ports" - n_cpu=$((n_cpu + 1)) - } - - # create/append object to role list - [ -n "$role" ] && { - json_select_array roles - - if [ "$role" != "$prev_role" ]; then - json_add_object - json_add_string role "$role" - json_add_string ports "$num" - json_close_object - - prev_role="$role" - n_vlan=$((n_vlan + 1)) - else - json_select_object "$n_vlan" - json_get_var port ports - json_add_string ports "$port $num" - json_select .. - fi - - json_select .. - } -} - -_ucidef_finish_switch_roles() { - # inherited: $name $n_cpu $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5 - local index role roles num device need_tag want_untag port ports - - json_select switch - json_select "$name" - json_get_keys roles roles - json_select .. - json_select .. - - for index in $roles; do - eval "port=\$cpu$(((index - 1) % n_cpu))" - - json_select switch - json_select "$name" - json_select ports - json_select "$port" - json_get_vars num device need_tag want_untag - json_select .. - json_select .. - - if [ ${need_tag:-0} -eq 1 -o ${want_untag:-0} -ne 1 ]; then - num="${num}t" - device="${device}.${index}" - fi - - json_select roles - json_select "$index" - json_get_vars role ports - json_add_string ports "$ports $num" - json_add_string device "$device" - json_select .. - json_select .. - json_select .. - json_select .. - - json_select_object network - local devices - - json_select_object "$role" - # attach previous interfaces (for multi-switch devices) - json_get_var devices device - if ! list_contains devices "$device"; then - devices="${devices:+$devices }$device" - fi - json_select .. - json_select .. - - ucidef_set_interface "$role" device "$devices" - done -} - -ucidef_set_ar8xxx_switch_mib() { - local name="$1" - local type="$2" - local interval="$3" - - json_select_object switch - json_select_object "$name" - json_add_int ar8xxx_mib_type $type - json_add_int ar8xxx_mib_poll_interval $interval - json_select .. - json_select .. -} - -ucidef_add_switch() { - local enabled=1 - if [ "$1" = "enabled" ]; then - shift - enabled="$1" - shift - fi - - local name="$1"; shift - local port num role device index need_tag prev_role - local cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 - local n_cpu=0 n_vlan=0 n_ports=0 - - json_select_object switch - json_select_object "$name" - json_add_boolean enable "$enabled" - json_add_boolean reset 1 - - for port in "$@"; do - case "$port" in - [0-9]*@*) - num="${port%%@*}" - device="${port##*@}" - need_tag=0 - want_untag=0 - [ "${num%t}" != "$num" ] && { - num="${num%t}" - need_tag=1 - } - [ "${num%u}" != "$num" ] && { - num="${num%u}" - want_untag=1 - } - ;; - [0-9]*:*:[0-9]*) - num="${port%%:*}" - index="${port##*:}" - role="${port#[0-9]*:}"; role="${role%:*}" - ;; - [0-9]*:*) - num="${port%%:*}" - role="${port##*:}" - ;; - esac - - if [ -n "$num" ] && [ -n "$device$role" ]; then - _ucidef_add_switch_port - fi - - unset num device role index need_tag want_untag - done - json_select .. - json_select .. - - _ucidef_finish_switch_roles -} - -ucidef_add_switch_attr() { - local name="$1" - local key="$2" - local val="$3" - - json_select_object switch - json_select_object "$name" - - case "$val" in - true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;; - [0-9]) json_add_int "$key" "$val" ;; - *) json_add_string "$key" "$val" ;; - esac - - json_select .. - json_select .. -} - -ucidef_add_switch_port_attr() { - local name="$1" - local port="$2" - local key="$3" - local val="$4" - local ports i num - - json_select_object switch - json_select_object "$name" - - json_get_keys ports ports - json_select_array ports - - for i in $ports; do - json_select "$i" - json_get_var num num - - if [ -n "$num" ] && [ $num -eq $port ]; then - json_select_object attr - - case "$val" in - true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;; - [0-9]) json_add_int "$key" "$val" ;; - *) json_add_string "$key" "$val" ;; - esac - - json_select .. - fi - - json_select .. - done - - json_select .. - json_select .. - json_select .. -} - -ucidef_set_interface_macaddr() { - local network="$1" - local macaddr="$2" - - ucidef_set_interface "$network" macaddr "$macaddr" -} - -ucidef_add_atm_bridge() { - local vpi="$1" - local vci="$2" - local encaps="$3" - local payload="$4" - local nameprefix="$5" - - json_select_object dsl - json_select_object atmbridge - json_add_int vpi "$vpi" - json_add_int vci "$vci" - json_add_string encaps "$encaps" - json_add_string payload "$payload" - json_add_string nameprefix "$nameprefix" - json_select .. - json_select .. -} - -ucidef_add_adsl_modem() { - local annex="$1" - local firmware="$2" - - json_select_object dsl - json_select_object modem - json_add_string type "adsl" - json_add_string annex "$annex" - json_add_string firmware "$firmware" - json_select .. - json_select .. -} - -ucidef_add_vdsl_modem() { - local annex="$1" - local tone="$2" - local xfer_mode="$3" - - json_select_object dsl - json_select_object modem - json_add_string type "vdsl" - json_add_string annex "$annex" - json_add_string tone "$tone" - json_add_string xfer_mode "$xfer_mode" - json_select .. - json_select .. -} - -ucidef_set_led_ataport() { - _ucidef_set_led_trigger "$1" "$2" "$3" ata"$4" -} - -_ucidef_set_led_common() { - local cfg="led_$1" - local name="$2" - local sysfs="$3" - - json_select_object led - - json_select_object "$1" - json_add_string name "$name" - json_add_string sysfs "$sysfs" -} - -ucidef_set_led_default() { - local default="$4" - - _ucidef_set_led_common "$1" "$2" "$3" - - json_add_string default "$default" - json_select .. - - json_select .. -} - -ucidef_set_led_gpio() { - local gpio="$4" - local inverted="$5" - - _ucidef_set_led_common "$1" "$2" "$3" - - json_add_string trigger "$trigger" - json_add_string type gpio - json_add_int gpio "$gpio" - json_add_boolean inverted "$inverted" - json_select .. - - json_select .. -} - -ucidef_set_led_ide() { - _ucidef_set_led_trigger "$1" "$2" "$3" disk-activity -} - -ucidef_set_led_netdev() { - local dev="$4" - local mode="${5:-link tx rx}" - - _ucidef_set_led_common "$1" "$2" "$3" - - json_add_string type netdev - json_add_string device "$dev" - json_add_string mode "$mode" - json_select .. - - json_select .. -} - -ucidef_set_led_oneshot() { - _ucidef_set_led_timer $1 $2 $3 "oneshot" $4 $5 -} - -ucidef_set_led_portstate() { - local port_state="$4" - - _ucidef_set_led_common "$1" "$2" "$3" - - json_add_string trigger port_state - json_add_string type portstate - json_add_string port_state "$port_state" - json_select .. - - json_select .. -} - -ucidef_set_led_rssi() { - local iface="$4" - local minq="$5" - local maxq="$6" - local offset="${7:-0}" - local factor="${8:-1}" - - _ucidef_set_led_common "$1" "$2" "$3" - - json_add_string type rssi - json_add_string name "$name" - json_add_string iface "$iface" - json_add_string minq "$minq" - json_add_string maxq "$maxq" - json_add_string offset "$offset" - json_add_string factor "$factor" - json_select .. - - json_select .. -} - -ucidef_set_led_switch() { - local trigger_name="$4" - local port_mask="$5" - local speed_mask="$6" - local mode="$7" - - _ucidef_set_led_common "$1" "$2" "$3" - - json_add_string trigger "$trigger_name" - json_add_string type switch - json_add_string mode "$mode" - json_add_string port_mask "$port_mask" - json_add_string speed_mask "$speed_mask" - json_select .. - - json_select .. -} - -_ucidef_set_led_timer() { - local trigger_name="$4" - local delayon="$5" - local delayoff="$6" - - _ucidef_set_led_common "$1" "$2" "$3" - - json_add_string type "$trigger_name" - json_add_string trigger "$trigger_name" - json_add_int delayon "$delayon" - json_add_int delayoff "$delayoff" - json_select .. - - json_select .. -} - -ucidef_set_led_timer() { - _ucidef_set_led_timer $1 $2 $3 "timer" $4 $5 -} - -_ucidef_set_led_trigger() { - local trigger_name="$4" - - _ucidef_set_led_common "$1" "$2" "$3" - - json_add_string trigger "$trigger_name" - json_select .. - - json_select .. -} - -ucidef_set_led_usbdev() { - local dev="$4" - - _ucidef_set_led_common "$1" "$2" "$3" - - json_add_string type usb - json_add_string device "$dev" - json_select .. - - json_select .. -} - -ucidef_set_led_usbhost() { - _ucidef_set_led_trigger "$1" "$2" "$3" usb-host -} - -ucidef_set_led_usbport() { - local obj="$1" - local name="$2" - local sysfs="$3" - shift - shift - shift - - _ucidef_set_led_common "$obj" "$name" "$sysfs" - - json_add_string type usbport - json_select_array ports - for port in "$@"; do - json_add_string port "$port" - done - json_select .. - json_select .. - - json_select .. -} - -ucidef_set_led_wlan() { - _ucidef_set_led_trigger "$1" "$2" "$3" "$4" -} - -ucidef_set_rssimon() { - local dev="$1" - local refresh="$2" - local threshold="$3" - - json_select_object rssimon - - json_select_object "$dev" - [ -n "$refresh" ] && json_add_int refresh "$refresh" - [ -n "$threshold" ] && json_add_int threshold "$threshold" - json_select .. - - json_select .. -} - -ucidef_add_gpio_switch() { - local cfg="$1" - local name="$2" - local pin="$3" - local default="${4:-0}" - - json_select_object gpioswitch - json_select_object "$cfg" - json_add_string name "$name" - json_add_int pin "$pin" - json_add_int default "$default" - json_select .. - json_select .. -} - -ucidef_set_hostname() { - local hostname="$1" - - json_select_object system - json_add_string hostname "$hostname" - json_select .. -} - -ucidef_set_ntpserver() { - local server - - json_select_object system - json_select_array ntpserver - for server in "$@"; do - json_add_string "" "$server" - done - json_select .. - json_select .. -} - -ucidef_set_network_options() { - json_add_object "network_options" - n=$# - - for i in $(seq $((n / 2))); do - opt="$1" - val="$2" - - if [ "$val" -eq "$val" ] 2>/dev/null; then - json_add_int "$opt" "$val" - else - [ "$val" = "true" ] && val=1 || val=0 - json_add_boolean "$opt" "$val" - fi - shift; shift - done - json_close_object -} - -ucidef_set_poe() { - json_add_object poe - json_add_int "chip_count" "$1" - json_add_int "budget" "$2" - json_add_int "poe_ports" "$3" - shift 3 - json_add_array ports - while [ $# -gt 0 ] - do - json_add_object "" - json_add_string "name" "$1" - json_add_string "class" "$2" - json_add_int "budget" "$3" - json_close_object - shift 3 - done - json_close_array - json_add_array poe_chips - json_close_array - json_close_object -} - -ucidef_set_poe_chip() { - json_select_object poe - json_select_array poe_chips - json_add_object "" - for port in "$@"; do - case "$port" in - 0X*) - json_add_string address "$port" - ;; - [0-9]:*) - json_add_string chan"${port%%:*}" "${port##*:}" - ;; - esac - done - json_close_object - json_select .. - json_select .. -} - -board_config_update() { - json_init - [ -f ${CFG} ] && json_load "$(cat ${CFG})" - - # auto-initialize model id and name if applicable - if ! json_is_a model object; then - json_select_object model - [ -f "/tmp/sysinfo/board_name" ] && \ - json_add_string id "$(cat /tmp/sysinfo/board_name)" - [ -f "/tmp/sysinfo/model" ] && \ - json_add_string name "$(cat /tmp/sysinfo/model)" - json_select .. - fi -} - -board_config_flush() { - json_dump -i -o ${CFG} -} diff --git a/6.1/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/6.1/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh new file mode 100644 index 00000000..110b1b40 --- /dev/null +++ b/6.1/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh @@ -0,0 +1,244 @@ +PART_NAME=firmware +REQUIRE_IMAGE_METADATA=1 + +RAMFS_COPY_BIN='fw_printenv fw_setenv' +RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock' + +platform_check_image() { + case "$(board_name)" in + asus,rt-ac42u |\ + asus,rt-ac58u) + local ubidev=$(nand_find_ubi $CI_UBIPART) + local asus_root=$(nand_find_volume $ubidev jffs2) + + [ -n "$asus_root" ] || return 0 + + cat << EOF +jffs2 partition is still present. +There's probably no space left +to install the filesystem. + +You need to delete the jffs2 partition first: +# ubirmvol /dev/ubi0 --name=jffs2 + +Once this is done. Retry. +EOF + return 1 + ;; + zte,mf18a |\ + zte,mf282plus|\ + zte,mf286d |\ + zte,mf287|\ + zte,mf287plus |\ + zte,mf287pro |\ + zte,mf289f) + CI_UBIPART="rootfs" + local mtdnum="$( find_mtd_index $CI_UBIPART )" + [ ! "$mtdnum" ] && return 1 + ubiattach -m "$mtdnum" || true + local ubidev="$( nand_find_ubi $CI_UBIPART )" + local ubi_rootfs=$(nand_find_volume $ubidev ubi_rootfs) + local ubi_rootfs_data=$(nand_find_volume $ubidev ubi_rootfs_data) + + [ -n "$ubi_rootfs" ] || [ -n "$ubi_rootfs_data" ] || return 0 + + cat << EOF +ubi_rootfs partition is still present. + +You need to delete the stock partition first: +# ubirmvol /dev/ubi0 -N ubi_rootfs +Please also delete ubi_rootfs_data, if exist: +# ubirmvol /dev/ubi0 -N ubi_rootfs_data + +Once this is done. Retry. +EOF + return 1 + ;; + esac + return 0; +} + +askey_do_upgrade() { + local tar_file="$1" + + local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$') + board_dir=${board_dir%/} + + tar Oxf $tar_file ${board_dir}/root | mtd write - rootfs + + nand_do_upgrade "$1" +} + +zyxel_do_upgrade() { + local tar_file="$1" + + local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$') + board_dir=${board_dir%/} + + tar Oxf $tar_file ${board_dir}/kernel | mtd write - kernel + + if [ -n "$UPGRADE_BACKUP" ]; then + tar Oxf $tar_file ${board_dir}/root | mtd -j "$UPGRADE_BACKUP" write - rootfs + else + tar Oxf $tar_file ${board_dir}/root | mtd write - rootfs + fi +} + +platform_do_upgrade_mikrotik_nand() { + local fw_mtd=$(find_mtd_part kernel) + fw_mtd="${fw_mtd/block/}" + [ -n "$fw_mtd" ] || return + + local board_dir=$(tar tf "$1" | grep -m 1 '^sysupgrade-.*/$') + board_dir=${board_dir%/} + [ -n "$board_dir" ] || return + + local kernel_len=$(tar xf "$1" ${board_dir}/kernel -O | wc -c) + [ -n "$kernel_len" ] || return + + tar xf "$1" ${board_dir}/kernel -O | ubiformat "$fw_mtd" -y -S $kernel_len -f - + + CI_KERNPART="none" + nand_do_upgrade "$1" +} + +platform_do_upgrade() { + case "$(board_name)" in + 8dev,jalapeno |\ + aruba,ap-303 |\ + aruba,ap-303h |\ + aruba,ap-365 |\ + avm,fritzbox-7530 |\ + avm,fritzrepeater-1200 |\ + avm,fritzrepeater-3000 |\ + buffalo,wtr-m2133hp |\ + cilab,meshpoint-one |\ + edgecore,ecw5211 |\ + edgecore,oap100 |\ + engenius,eap2200 |\ + glinet,gl-a1300 |\ + glinet,gl-ap1300 |\ + luma,wrtq-329acn |\ + mobipromo,cm520-79f |\ + netgear,wac510 |\ + p2w,r619ac-64m |\ + p2w,r619ac-128m |\ + qxwlan,e2600ac-c2 |\ + wallys,dr40x9) + nand_do_upgrade "$1" + ;; + glinet,gl-b2200) + CI_KERNPART="0:HLOS" + CI_ROOTPART="rootfs" + CI_DATAPART="rootfs_data" + emmc_do_upgrade "$1" + ;; + alfa-network,ap120c-ac) + part="$(awk -F 'ubi.mtd=' '{printf $2}' /proc/cmdline | sed -e 's/ .*$//')" + if [ "$part" = "rootfs1" ]; then + fw_setenv active 2 || exit 1 + CI_UBIPART="rootfs2" + else + fw_setenv active 1 || exit 1 + CI_UBIPART="rootfs1" + fi + nand_do_upgrade "$1" + ;; + asus,map-ac2200) + CI_KERNPART="linux" + nand_do_upgrade "$1" + ;; + asus,rt-ac42u |\ + asus,rt-ac58u) + CI_KERNPART="linux" + nand_do_upgrade "$1" + ;; + cellc,rtl30vw) + CI_UBIPART="ubifs" + askey_do_upgrade "$1" + ;; + compex,wpj419) + nand_do_upgrade "$1" + ;; + google,wifi) + export_bootdevice + export_partdevice CI_ROOTDEV 0 + CI_KERNPART="kernel" + CI_ROOTPART="rootfs" + emmc_do_upgrade "$1" + ;; + linksys,ea6350v3 |\ + linksys,ea8300 |\ + linksys,mr8300 |\ + linksys,whw01 |\ + linksys,whw03v2) + platform_do_upgrade_linksys "$1" + ;; + meraki,mr33 |\ + meraki,mr74) + CI_KERNPART="part.safe" + nand_do_upgrade "$1" + ;; + mikrotik,cap-ac|\ + mikrotik,hap-ac2|\ + mikrotik,hap-ac3-lte6-kit|\ + mikrotik,lhgg-60ad|\ + mikrotik,sxtsq-5-ac|\ + mikrotik,wap-ac|\ + mikrotik,wap-ac-lte|\ + mikrotik,wap-r-ac) + [ "$(rootfs_type)" = "tmpfs" ] && mtd erase firmware + default_do_upgrade "$1" + ;; + mikrotik,hap-ac3) + platform_do_upgrade_mikrotik_nand "$1" + ;; + netgear,rbr40|\ + netgear,rbs40|\ + netgear,rbr50 |\ + netgear,rbs50 |\ + netgear,srr60 |\ + netgear,srs60) + platform_do_upgrade_netgear_orbi_upgrade "$1" + ;; + openmesh,a42 |\ + openmesh,a62 |\ + plasmacloud,pa1200 |\ + plasmacloud,pa2200) + PART_NAME="inactive" + platform_do_upgrade_dualboot_datachk "$1" + ;; + sony,ncp-hg100-cellular) + sony_emmc_do_upgrade "$1" + ;; + teltonika,rutx10 |\ + teltonika,rutx12 |\ + teltonika,rutx50 |\ + zte,mf18a |\ + zte,mf282plus |\ + zte,mf286d |\ + zte,mf287 |\ + zte,mf287plus |\ + zte,mf287pro |\ + zte,mf289f) + CI_UBIPART="rootfs" + nand_do_upgrade "$1" + ;; + zyxel,nbg6617) + zyxel_do_upgrade "$1" + ;; + *) + default_do_upgrade "$1" + ;; + esac +} + +platform_copy_config() { + case "$(board_name)" in + glinet,gl-b2200 |\ + google,wifi) + emmc_copy_config + ;; + esac + return 0; +}