[rdkb][common][config][Add auto generate uci wireless config]

[Description]
Add auto generate uci wireless config
1. add a system service to handle default uci wireless config
2. remove fixed wireless config file

[Release-log]

diff --git a/recipes-devtools/init-filogic/files/init-uci-config.service b/recipes-devtools/init-filogic/files/init-uci-config.service
new file mode 100644
index 0000000..aaa6415
--- /dev/null
+++ b/recipes-devtools/init-filogic/files/init-uci-config.service
@@ -0,0 +1,14 @@
+[Unit]

+Description=Init UCI wireless config

+DefaultDependencies=no

+After=hostapd.service

+Before=RdkWanManager.service

+

+[Service]

+Type=oneshot

+ExecStart=/bin/sh /usr/sbin/mac80211.sh

+RemainAfterExit=yes

+

+[Install]

+WantedBy=multi-user.target

+

diff --git a/recipes-devtools/init-filogic/files/mac80211.sh b/recipes-devtools/init-filogic/files/mac80211.sh
new file mode 100644
index 0000000..437a3cc
--- /dev/null
+++ b/recipes-devtools/init-filogic/files/mac80211.sh
@@ -0,0 +1,206 @@
+#!/bin/sh
+
+#append DRIVERS "mac80211"
+
+lookup_phy() {
+	[ -n "$phy" ] && {
+		[ -d /sys/class/ieee80211/$phy ] && return
+	}
+
+	local devpath
+	config_get devpath "$device" path
+	[ -n "$devpath" ] && {
+		phy="$(iwinfo nl80211 phyname "path=$devpath")"
+		[ -n "$phy" ] && return
+	}
+
+	local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
+	[ -n "$macaddr" ] && {
+		for _phy in /sys/class/ieee80211/*; do
+			[ -e "$_phy" ] || continue
+
+			[ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue
+			phy="${_phy##*/}"
+			return
+		done
+	}
+	phy=
+	return
+}
+
+find_mac80211_phy() {
+	local device="$1"
+
+	config_get phy "$device" phy
+	lookup_phy
+	[ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
+		echo "PHY for wifi device $1 not found"
+		return 1
+	}
+	config_set "$device" phy "$phy"
+
+	config_get macaddr "$device" macaddr
+	[ -z "$macaddr" ] && {
+		config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
+	}
+
+	return 0
+}
+
+check_mac80211_device() {
+	config_get phy "$1" phy
+	[ -z "$phy" ] && {
+		find_mac80211_phy "$1" >/dev/null || return 0
+		config_get phy "$1" phy
+	}
+	[ "$phy" = "$dev" ] && found=1
+}
+
+
+__get_band_defaults() {
+	local phy="$1"
+
+	( iw phy "$phy" info; echo ) | awk '
+BEGIN {
+        bands = ""
+}
+
+($1 == "Band" || $1 == "") && band {
+        if (channel) {
+		mode="NOHT"
+		if (ht) mode="HT20"
+		if (vht && band != "1:") mode="VHT80"
+		if (he) mode="HE80"
+		if (he && band == "1:") mode="HE20"
+                sub("\\[", "", channel)
+                sub("\\]", "", channel)
+                bands = bands band channel ":" mode " "
+        }
+        band=""
+}
+
+$1 == "Band" {
+        band = $2
+        channel = ""
+	vht = ""
+	ht = ""
+	he = ""
+}
+
+$0 ~ "Capabilities:" {
+	ht=1
+}
+
+$0 ~ "VHT Capabilities" {
+	vht=1
+}
+
+$0 ~ "HE Iftypes" {
+	he=1
+}
+
+$1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel {
+        channel = $4
+}
+
+END {
+        print bands
+}'
+}
+
+get_band_defaults() {
+	local phy="$1"
+
+	for c in $(__get_band_defaults "$phy"); do
+		local band="${c%%:*}"
+		c="${c#*:}"
+		local chan="${c%%:*}"
+		c="${c#*:}"
+		local mode="${c%%:*}"
+
+		case "$band" in
+			1) band=2g;;
+			2) band=5g;;
+			3) band=60g;;
+			4) band=6g;;
+			*) band="";;
+		esac
+
+		[ -n "$band" ] || continue
+		[ -n "$mode_band" -a "$band" = "6g" ] && return
+
+		mode_band="$band"
+		channel="$chan"
+		htmode="$mode"
+	done
+}
+
+detect_mac80211() {
+	devidx=0
+	#config_load wireless
+	while :; do
+		#config_get type "radio$devidx" type
+		[ -n "$type" ] || break
+		devidx=$(($devidx + 1))
+	done
+
+	if [ ! -f /etc/config/wireless ]; then
+		mkdir -p /etc/config
+		echo -n > /etc/config/wireless
+	fi
+
+	old_path=""
+	for _dev in /sys/class/ieee80211/*; do
+		[ -e "$_dev" ] || continue
+
+		dev="${_dev##*/}"
+
+		found="$(uci get wireless.radio${devidx})"
+
+
+		if [ "$found" == "wifi-device" ]; then
+			devidx=$(($devidx + 1))
+			continue
+		fi
+
+		mode_band=""
+		channel=""
+		htmode=""
+		ht_capab=""
+		
+		get_band_defaults "$dev"
+
+		path="$(realpath /sys/class/ieee80211/"$dev"/device | cut -d/ -f4-)"
+		if [ -n "$path" ]; then
+			if [ "$path" == "$old_path" ]; then
+				dev_id="set wireless.radio${devidx}.path='$path'+1"
+			else
+				dev_id="set wireless.radio${devidx}.path='$path'"
+			fi	
+		else
+			dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"
+		fi
+
+		uci -q batch <<-EOF
+			set wireless.radio${devidx}=wifi-device
+			set wireless.radio${devidx}.type=mac80211
+			${dev_id}
+			set wireless.radio${devidx}.channel=${channel}
+			set wireless.radio${devidx}.band=${mode_band}
+			set wireless.radio${devidx}.htmode=$htmode
+			set wireless.radio${devidx}.disabled=1
+
+			set wireless.default_radio${devidx}=wifi-iface
+			set wireless.default_radio${devidx}.device=radio${devidx}
+			set wireless.default_radio${devidx}.network=lan
+			set wireless.default_radio${devidx}.mode=ap
+			set wireless.default_radio${devidx}.ssid=Filogic_${mode_band}
+			set wireless.default_radio${devidx}.encryption=none
+EOF
+		uci -q commit wireless
+
+		devidx=$(($devidx + 1))
+		old_path=$path
+	done
+}
+detect_mac80211
\ No newline at end of file
diff --git a/recipes-devtools/init-filogic/init-filogic.bb b/recipes-devtools/init-filogic/init-filogic.bb
index fa3b038..31df79b 100644
--- a/recipes-devtools/init-filogic/init-filogic.bb
+++ b/recipes-devtools/init-filogic/init-filogic.bb
@@ -10,15 +10,23 @@
     file://COPYING \
     file://init-IPv6.sh \
     file://init-IPv6.service \
+    file://mac80211.sh \
+    file://init-uci-config.service \
     "
 
+RDEPENDS_${PN} += "bash"
+
 SYSTEMD_PACKAGES = "${PN}"
 SYSTEMD_SERVICE_${PN} = " init-IPv6.service"
+SYSTEMD_SERVICE_${PN} += " init-uci-config.service"
 FILES_${PN} += "{systemd_unitdir}/system/init-IPv6.service"
+FILES_${PN} += "{systemd_unitdir}/system/init-uci-config.service"
 
 do_install() {
     install -d ${D}${sbindir}
     install -m 0755 ${WORKDIR}/init-IPv6.sh ${D}${sbindir}
+    install -m 0755 ${WORKDIR}/mac80211.sh ${D}${sbindir}
     install -d ${D}${systemd_unitdir}/system/
     install -m 0644 ${S}/init-IPv6.service ${D}${systemd_unitdir}/system
+    install -m 0644 ${S}/init-uci-config.service ${D}${systemd_unitdir}/system
 }