Back to the old firmware based on OpenWrt CC. So only file related is /lib/netifd/wireless/ralink.sh
#!/bin/sh . /lib/netifd/netifd-wireless.sh init_wireless_driver "$@" maclist="" force_channel="" drv_ralink_init_device_config() { config_add_string country variant log_level short_preamble config_add_boolean noscan config_add_int channel } drv_ralink_init_iface_config() { config_add_string 'auth_server:host' config_add_string auth_secret config_add_int 'auth_port:port' config_add_string ifname apname mode ssid encryption key key1 key2 key3 key4 wps_pushbutton macfilter led config_add_boolean hidden isolate config_add_array 'maclist:list(macaddr)' } drv_ralink_cleanup() { logger drv_ralink_cleanup } ralink_setup_ap(){ local name="$1" local eap=0 json_select config json_get_vars mode ifname ssid encryption key key1 key2 key3 key4 wps_pushbutton server port hidden isolate macfilter json_get_values maclist maclist ifconfig $ifname up [ -z "$force_channel" ] || iwpriv $ifname set Channel=$force_channel [ "$isolate" = 1 ] || isolate=0 iwpriv $ifname set NoForwarding=$isolate iwpriv $ifname set NoForwardingBTNBSSID=$isolate iwpriv $ifname set NoForwardingMBCast=$isolate [ "$hidden" = 1 ] || hidden=0 iwpriv $ifname set HideSSID=$hidden wsc_methods=0 wsc_mode=0 case "$encryption" in psk*|mixed*) local enc="WPA2PSK" case "$encryption" in psk | psk+*) enc=WPAPSK;; psk2 | psk2*) enc=WPA2PSK;; mixed*) enc=WPAPSKWPA2PSK;; wpa | wpa+*) eap=1; enc=WPA;; wpa2*) eap=1; enc=WPA2;; esac local crypto="AES" case "$encryption" in *tkip+aes*) crypto=TKIPAES;; *tkip*) crypto=TKIP;; esac [ "$eap" = "1" ] && { iwpriv $ifname set RADIUS_Server=$server iwpriv $ifname set RADIUS_Port=$port iwpriv $ifname set RADIUS_Key=$key iwpriv $ifname set own_ip_addr=192.168.1.1 iwpriv $ifname set IEEE8021X=0 iwpriv $ifname set EAPifname=eth0.2 iwpriv $ifname set PreAuthIfname=br-lan } iwpriv $ifname set AuthMode=$enc iwpriv $ifname set EncrypType=$crypto iwpriv $ifname set IEEE8021X=0 iwpriv $ifname set "SSID=${ssid}" [ "$eap" = "1" ] || iwpriv $ifname set "WPAPSK=${key}" iwpriv $ifname set DefaultKeyID=2 iwpriv $ifname set "SSID=${ssid}" if [ "$wps_pushbutton" == "1" ]; then wsc_methods=128 wsc_mode=7 fi ;; wep) iwpriv $ifname set AuthMode=WEPAUTO iwpriv $ifname set EncrypType=WEP iwpriv $ifname set IEEE8021X=0 for idx in 1 2 3 4; do json_get_var keyn key${idx} [ -n "$keyn" ] && iwpriv $ifname set "Key${idx}=${keyn}" done iwpriv $ifname set DefaultKeyID=${key} iwpriv $ifname set "SSID=${ssid}" ;; none) iwpriv $ifname set "SSID=${ssid}" ;; esac iwpriv $ifname set WscConfMode=$wsc_mode iwpriv $ifname set WscConfStatus=2 iwpriv $ifname set WscMode=2 iwpriv $ifname set ACLClearAll=1 [ -n "$maclist" ] && { for m in ${maclist}; do logger iwpriv $ifname set ACLAddEntry="$m" iwpriv $ifname set ACLAddEntry="$m" done } case "$macfilter" in allow) iwpriv $ifname set AccessPolicy=1 ;; deny) iwpriv $ifname set AccessPolicy=2 ;; *) iwpriv $ifname set AccessPolicy=0 ;; esac json_select .. wireless_add_vif "$name" "$ifname" } ralink_setup_sta(){ local name="$1" json_select config json_get_vars mode apname ifname ssid encryption key key1 key2 key3 key4 wps_pushbutton disabled led [ "$disabled" = "1" ] && return key= case "$encryption" in psk*|mixed*) json_get_vars key;; wep) json_get_var key key1;; esac json_select .. /sbin/ap_client "ra0" "$ifname" "${ssid}" "${key}" "${led}" sleep 1 wireless_add_process "$(cat /tmp/apcli-${ifname}.pid)" /sbin/ap_client ra0 "$ifname" "${ssid}" "${key}" "${led}" wireless_add_vif "$name" "$ifname" } drv_ralink_setup() { local ifname="$1" local bcn_active=0 wmode=9 VHT=0 VHT_SGI=0 HT=0 EXTCHA=0 sta_disabled="$(uci get wireless.sta.disabled)" [ "${sta_disabled}" = "1" ] && bcn_active=1 json_select config json_get_vars variant country channel htmode log_level short_preamble noscan:0 json_select .. [ "$short_preamble" = 1 ] || short_preamble=0 case ${htmode:-none} in HT20) wmode=10 HT=0 ;; HT40) wmode=10 HT=1 EXTCHA=1 ;; VHT20) wmode=15 HT=0 VHT=0 VHT_SGI=1 ;; VHT40) wmode=15 HT=1 VHT=0 VHT_SGI=1 EXTCHA=1 ;; VHT80) wmode=15 HT=1 VHT=1 VHT_SGI=1 EXTCHA=1 ;; *) case $hwmode in a) wmode=2;; g) wmode=3;; esac ;; esac if [ "$auto_channel" -gt 0 ]; then force_channel="" channel=0 auto_channel=3 else force_channel=$channel auto_channel=0 fi coex=1 [ "$noscan" -gt 0 ] && coex=0 cat /etc/Wireless/${variant}_tpl.dat > /tmp/${variant}.dat cat >> /tmp/${variant}.dat << EOF Beacon=${bcn_active} BssidNum=4 HT_BW=${HT:-0} HT_EXTCHA=${EXTCHA:-0} CountryCode=${country} WirelessMode=${wmode:-9} Channel=${channel:-8} AutoChannelSelect=$auto_channel Debug=${log_level:-3} SSID1=${ssid:-OpenWrt} HT_BSSCoexistence=$coex WscConfMethods=680 EOF for_each_interface "ap" ralink_setup_ap for_each_interface "sta" ralink_setup_sta wireless_set_up LED="$(uci get wireless.sta.led)" sta_disabled="$(uci get wireless.sta.disabled)" [ "${sta_disabled}" = "1" -a -n "${LED}" -a -f /sys/class/leds/${LED}/trigger ] && ap_client ${LED} set } ralink_teardown() { json_select config json_get_vars ifname json_select .. ifconfig $ifname down LED="$(uci get wireless.sta.led)" [ -n "${LED}" -a -f /sys/class/leds/${LED}/trigger ] && ap_client ${LED} clear } drv_ralink_teardown() { wireless_process_kill_all for_each_interface "ap sta" ralink_teardown } add_driver ralink
This code is using iwpriv setting up the driver, so it should be directly working.
drv_ralink_setup get country, channel, htmode, and setting this in driver.
then enable every ap interface and sta interface by ralink_setup_ap/ralink_setup_sta.
ralink_setup_ap get "mode ifname ssid encryption key key1 key2 key3 key4 wps_pushbutton server port hidden isolate macfilter" and setting up those value in mt7628.ko by iwpriv directly.
ralink_setup_sta is the ap+sta mode, it will call /sbin/ap_client to setup the ap+sta mode.
Everything is clear, I can make my own ralink.sh based on this beautiful script 🙂