From ae51caf8a582043600f60051dda5d2e588e6f975 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 1 Jul 2020 15:35:04 +0200 Subject: [PATCH] wlan-ap: initial import based on the develop branch -> 6af07cd39cfa06ec8eb4d6182c7d7923236c2dbf Signed-off-by: John Crispin --- .github/workflows/build.yml | 82 ++ .gitignore | 1 + Dockerfile | 13 + Makefile | 12 + README.md | 32 + build.sh | 48 + config.yml | 8 + dock-run.sh | 9 + feeds/wlan-ap/opensync/Makefile | 96 ++ .../patches/01-add-lib-uci-to-wm2.patch | 21 + .../02-wm2-write-temporary-change.patch | 35 + .../patches/03-sm-add-libiwinfo.patch | 12 + .../opensync/patches/04-honour-copts.patch | 20 + .../patches/04-wm-add-libiwinfo.patch | 22 + feeds/wlan-ap/opensync/patches/05-fixes.patch | 26 + .../opensync/src/platform/openwrt/LICENSE | 23 + .../opensync/src/platform/openwrt/NOTICE | 2 + .../opensync/src/platform/openwrt/README.md | 8 + .../src/platform/openwrt/build/openwrt.mk | 34 + .../platform/openwrt/kconfig/openwrt_generic | 1 + .../openwrt/rootfs/common/etc/init.d/opensync | 51 + .../platform/openwrt/src/lib/osn/override.mk | 41 + .../openwrt/src/lib/osn/src/osn_upnpd.c | 37 + .../src/lib/target/inc/target_OPENWRT.h | 62 + .../openwrt/src/lib/target/inc/uci_helper.h | 139 ++ .../openwrt/src/lib/target/override.mk | 54 + .../openwrt/src/lib/target/src/managers.c | 67 + .../openwrt/src/lib/target/src/radio.c | 506 +++++++ .../openwrt/src/lib/target/src/stats.c | 535 ++++++++ .../openwrt/src/lib/target/src/target.c | 135 ++ .../openwrt/src/lib/target/src/uci_helper.c | 1079 +++++++++++++++ .../platform/openwrt/src/lib/target/src/vif.c | 1176 +++++++++++++++++ .../opensync/src/vendor/ap2220/.version | 1 + .../opensync/src/vendor/ap2220/LICENSE | 23 + .../wlan-ap/opensync/src/vendor/ap2220/NOTICE | 2 + .../opensync/src/vendor/ap2220/README.md | 9 + .../src/vendor/ap2220/build/vendor-arch.mk | 9 + .../ap2220/ovsdb/static_configuration.json | 75 ++ .../rootfs/common/usr/plume/certs/ca.pem | 179 +++ .../rootfs/common/usr/plume/certs/client.pem | 26 + .../common/usr/plume/certs/client_dec.key | 7 + .../ap2220/src/lib/target/inc/target_AP2220.h | 66 + .../vendor/ap2220/src/lib/target/override.mk | 3 + .../vendor/ap2220/src/lib/target/src/entity.c | 203 +++ .../opensync/src/vendor/ecw5211/.version | 1 + .../opensync/src/vendor/ecw5211/LICENSE | 23 + .../opensync/src/vendor/ecw5211/NOTICE | 2 + .../opensync/src/vendor/ecw5211/README.md | 9 + .../src/vendor/ecw5211/build/vendor-arch.mk | 9 + .../ecw5211/ovsdb/static_configuration.json | 104 ++ .../rootfs/common/usr/plume/certs/ca.pem | 179 +++ .../rootfs/common/usr/plume/certs/client.pem | 26 + .../common/usr/plume/certs/client_dec.key | 7 + .../src/lib/target/inc/target_ECW5211.h | 66 + .../vendor/ecw5211/src/lib/target/override.mk | 3 + .../ecw5211/src/lib/target/src/entity.c | 204 +++ .../opensync/src/vendor/ecw5410/.version | 1 + .../opensync/src/vendor/ecw5410/LICENSE | 23 + .../opensync/src/vendor/ecw5410/NOTICE | 2 + .../opensync/src/vendor/ecw5410/README.md | 9 + .../src/vendor/ecw5410/build/vendor-arch.mk | 9 + .../ecw5410/ovsdb/static_configuration.json | 104 ++ .../rootfs/common/usr/plume/certs/ca.pem | 179 +++ .../rootfs/common/usr/plume/certs/client.pem | 26 + .../common/usr/plume/certs/client_dec.key | 7 + .../src/lib/target/inc/target_ECW5410.h | 66 + .../vendor/ecw5410/src/lib/target/override.mk | 3 + .../ecw5410/src/lib/target/src/entity.c | 204 +++ .../opensync/src/vendor/ipq40xx/.version | 1 + .../opensync/src/vendor/ipq40xx/LICENSE | 23 + .../opensync/src/vendor/ipq40xx/NOTICE | 2 + .../opensync/src/vendor/ipq40xx/README.md | 9 + .../src/vendor/ipq40xx/build/vendor-arch.mk | 9 + .../ipq40xx/ovsdb/static_configuration.json | 104 ++ .../rootfs/common/usr/plume/certs/ca.pem | 179 +++ .../rootfs/common/usr/plume/certs/client.pem | 26 + .../common/usr/plume/certs/client_dec.key | 7 + .../src/lib/target/inc/target_IPQ40XX.h | 66 + .../vendor/ipq40xx/src/lib/target/override.mk | 3 + .../ipq40xx/src/lib/target/src/entity.c | 183 +++ feeds/wlan-ap/python3-kconfiglib/Makefile | 41 + ...01-pending-scripts-add-gen_config.py.patch | 206 +++ .../0002-scripts-update-feed-script.patch | 131 ++ ...files-add-the-wlan-ap-board-profiles.patch | 163 +++ ...mware-ipq-wifi-enable-use-on-IPQ806x.patch | 31 + ...02-ipq806x-4.14-enable-AT803X-driver.patch | 28 + .../0003-ipq806x-add-GSBI1-node-to-DTSI.patch | 63 + ...-import-bootargs-append-from-IPQ40xx.patch | 41 + ...ipq806x-add-Edgecore-ECW5410-support.patch | 725 ++++++++++ ...ipq40xx-add-Edgecore-ECW5211-support.patch | 550 ++++++++ .../0007-ipq40xx-TP-Link-AP2220-support.patch | 534 ++++++++ ...q-build.mk-add-ovsdb-tool-dependency.patch | 34 + setup.py | 129 ++ 93 files changed, 9544 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 README.md create mode 100755 build.sh create mode 100644 config.yml create mode 100755 dock-run.sh create mode 100644 feeds/wlan-ap/opensync/Makefile create mode 100644 feeds/wlan-ap/opensync/patches/01-add-lib-uci-to-wm2.patch create mode 100644 feeds/wlan-ap/opensync/patches/02-wm2-write-temporary-change.patch create mode 100644 feeds/wlan-ap/opensync/patches/03-sm-add-libiwinfo.patch create mode 100644 feeds/wlan-ap/opensync/patches/04-honour-copts.patch create mode 100644 feeds/wlan-ap/opensync/patches/04-wm-add-libiwinfo.patch create mode 100644 feeds/wlan-ap/opensync/patches/05-fixes.patch create mode 100644 feeds/wlan-ap/opensync/src/platform/openwrt/LICENSE create mode 100644 feeds/wlan-ap/opensync/src/platform/openwrt/NOTICE create mode 100644 feeds/wlan-ap/opensync/src/platform/openwrt/README.md create mode 100644 feeds/wlan-ap/opensync/src/platform/openwrt/build/openwrt.mk create mode 100644 feeds/wlan-ap/opensync/src/platform/openwrt/kconfig/openwrt_generic create mode 100755 feeds/wlan-ap/opensync/src/platform/openwrt/rootfs/common/etc/init.d/opensync create mode 100644 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/osn/override.mk create mode 100644 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/osn/src/osn_upnpd.c create mode 100644 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/target_OPENWRT.h create mode 100755 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/uci_helper.h create mode 100755 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/override.mk create mode 100755 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/managers.c create mode 100755 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio.c create mode 100755 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/stats.c create mode 100644 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/target.c create mode 100755 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/uci_helper.c create mode 100755 feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/vif.c create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/.version create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/LICENSE create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/NOTICE create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/README.md create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/build/vendor-arch.mk create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/ovsdb/static_configuration.json create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/ca.pem create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/client.pem create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/client_dec.key create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/inc/target_AP2220.h create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/override.mk create mode 100644 feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/src/entity.c create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/.version create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/LICENSE create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/NOTICE create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/README.md create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/build/vendor-arch.mk create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/ovsdb/static_configuration.json create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/ca.pem create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/client.pem create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/client_dec.key create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/inc/target_ECW5211.h create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/override.mk create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/src/entity.c create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/.version create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/LICENSE create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/NOTICE create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/README.md create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/build/vendor-arch.mk create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/ovsdb/static_configuration.json create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/ca.pem create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/client.pem create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/client_dec.key create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/inc/target_ECW5410.h create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/override.mk create mode 100644 feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/src/entity.c create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/.version create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/LICENSE create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/NOTICE create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/README.md create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/build/vendor-arch.mk create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/ovsdb/static_configuration.json create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/ca.pem create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/client.pem create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/client_dec.key create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/inc/target_IPQ40XX.h create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/override.mk create mode 100644 feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/src/entity.c create mode 100644 feeds/wlan-ap/python3-kconfiglib/Makefile create mode 100644 patches/pending/0001-pending-scripts-add-gen_config.py.patch create mode 100644 patches/pending/0002-scripts-update-feed-script.patch create mode 100644 patches/pending/0003-profiles-add-the-wlan-ap-board-profiles.patch create mode 100644 patches/wlan-ap/0001-firmware-ipq-wifi-enable-use-on-IPQ806x.patch create mode 100644 patches/wlan-ap/0002-ipq806x-4.14-enable-AT803X-driver.patch create mode 100644 patches/wlan-ap/0003-ipq806x-add-GSBI1-node-to-DTSI.patch create mode 100644 patches/wlan-ap/0004-ipq806x-import-bootargs-append-from-IPQ40xx.patch create mode 100644 patches/wlan-ap/0005-ipq806x-add-Edgecore-ECW5410-support.patch create mode 100644 patches/wlan-ap/0006-ipq40xx-add-Edgecore-ECW5211-support.patch create mode 100644 patches/wlan-ap/0007-ipq40xx-TP-Link-AP2220-support.patch create mode 100644 patches/wlan-ap/0008-include-prereq-build.mk-add-ovsdb-tool-dependency.patch create mode 100644 setup.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..a9fbe8063 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,82 @@ +name: Build OpenWrt with OpenSync + +on: + push: + branches: [ trunk ] + +jobs: + build-ea8300: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + token: ${{ secrets.GH_BUILD_TOKEN }} + submodules: true + - name: Build Image for EA8300 + env: + GH_BUILD_USERNAME: ${{ secrets.GH_BUILD_USERNAME }} + GH_BUILD_PASSWORD: ${{ secrets.GH_BUILD_PASSWORD }} + run: | + make TARGET=IPQ40XX + TAG=$(date +%Y-%m-%d)-$(git rev-parse --short HEAD) + TAR_NAME="ea8300-$TAG.tar.gz" + tar cfz "$TAR_NAME" -C openwrt/bin/targets/ipq40xx/generic . + curl -u "$GH_BUILD_USERNAME":"$GH_BUILD_PASSWORD" -T "$TAR_NAME" "https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ea8300/"$TAR_NAME"" + + build-ecw5410: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + token: ${{ secrets.GH_BUILD_TOKEN }} + submodules: true + - name: Build Image for ECW5410 + env: + GH_BUILD_USERNAME: ${{ secrets.GH_BUILD_USERNAME }} + GH_BUILD_PASSWORD: ${{ secrets.GH_BUILD_PASSWORD }} + run: | + make TARGET=ECW5410 + TAG=$(date +%Y-%m-%d)-$(git rev-parse --short HEAD) + TAR_NAME="ecw5410-$TAG.tar.gz" + tar cfz "$TAR_NAME" -C openwrt/bin/targets/ipq806x/generic . + curl -u "$GH_BUILD_USERNAME":"$GH_BUILD_PASSWORD" -T "$TAR_NAME" "https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ecw5410/"$TAR_NAME"" + + build-ap2220: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + token: ${{ secrets.GH_BUILD_TOKEN }} + submodules: true + - name: Build Image for AP2220 + env: + GH_BUILD_USERNAME: ${{ secrets.GH_BUILD_USERNAME }} + GH_BUILD_PASSWORD: ${{ secrets.GH_BUILD_PASSWORD }} + run: | + make TARGET=AP2220 + TAG=$(date +%Y-%m-%d)-$(git rev-parse --short HEAD) + TAR_NAME="ap2220-$TAG.tar.gz" + tar cfz "$TAR_NAME" -C openwrt/bin/targets/ipq40xx/generic . + curl -u "$GH_BUILD_USERNAME":"$GH_BUILD_PASSWORD" -T "$TAR_NAME" "https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ap2220/"$TAR_NAME"" + + build-ecw5211: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + token: ${{ secrets.GH_BUILD_TOKEN }} + submodules: true + - name: Build Image for ECW5211 + env: + GH_BUILD_USERNAME: ${{ secrets.GH_BUILD_USERNAME }} + GH_BUILD_PASSWORD: ${{ secrets.GH_BUILD_PASSWORD }} + run: | + make TARGET=ECW5211 + TAG=$(date +%Y-%m-%d)-$(git rev-parse --short HEAD) + TAR_NAME="ecw5211-$TAG.tar.gz" + tar cfz "$TAR_NAME" -C openwrt/bin/targets/ipq40xx/generic . + curl -u "$GH_BUILD_USERNAME":"$GH_BUILD_PASSWORD" -T "$TAR_NAME" "https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ecw5211/"$TAR_NAME"" diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..2fadecdf0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/openwrt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..f9c23c762 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +#FROM ubuntu:18.04 +FROM ubuntu:20.04 + +RUN apt-get update \ + && DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata \ + && apt-get install -y \ + time git-core build-essential gcc-multilib \ + libncurses5-dev zlib1g-dev gawk flex gettext wget unzip python \ + python3 python3-pip python3-yaml openvswitch-common openvswitch-switch libssl-dev \ + && apt-get clean +RUN git config --global user.email "you@example.com" +RUN git config --global user.name "Your Name" +RUN pip3 install kconfiglib diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..ea0a57904 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +.PHONY: all opensync purge + +all: + ./dock-run.sh ./build.sh $(TARGET) + +opensync: + ./dock-run.sh make -j$(nproc) V=s -C openwrt package/feeds/opensync/opensync/clean + ./dock-run.sh make -j$(nproc) V=s -C openwrt package/feeds/opensync/opensync/compile TARGET=$(TARGET) OPENSYNC_SRC=$(shell pwd) +purge: + cd openwrt && rm -rf * && rm -rf .* + rm -rf ./example/build + @echo Done diff --git a/README.md b/README.md new file mode 100644 index 000000000..dfc418e02 --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# Setting up your build machine + +Requires a recent linux installation. Older systems without python 3.7 will have trouble. See this link for details: https://openwrt.org/docs/guide-developer/quickstart-build-images + +Install build packages: sudo apt install build-essential libncurses5-dev gawk git libssl-dev gettext zlib1g-dev swig unzip time rsync python3 python3-setuptools python3-yaml. + +Plus specific for TIP: sudo apt-get install openvswitch-common + +# Doing a native build on Linux +First we need to clone and setup our tree. This will result in an openwrt/. +``` +python3 setup.py --setup +``` +Next we need to select the profile and base package selection. This setup will install the feeds, packages and generate the .config file. The available profiles are ap2220, ea8300, ecw5211, ecw5410. +``` +cd openwrt +./scripts/gen_config.py ap2220 wlan-ap +``` +Finally we can build the tree. +``` +make -j X V=s +``` +Builds for different profiles can co-exist in the same tree. Switching is done by simple calling gen_config.py again. + +# Doing a docker build + +Start by installing docker.io on your host system and ensuring that you can run an unprivileged container. +Once this is done edit the Dockerfile and choose the Ubuntu flavour. This might depend on your host installation. +Then simple call (available targets are AP2220, EA8300, ECW5211, ECW5410) +``` +TARGET=AP2200 make -j 8 +``` diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..eb89c5c2f --- /dev/null +++ b/build.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +set -e +ROOT_PATH=${PWD} +BUILD_DIR=${ROOT_PATH}/openwrt +TARGET=${1} + +if [ -z "$1" ]; then + echo "Error: please specify TARGET" + echo "For example: IPQ40XX, ECW5410, AP2220, ECW5211" + exit 1 +fi + +if [ ! "$(ls -A $BUILD_DIR)" ]; then + python3 setup.py --setup --docker || exit 1 + +else + python3 setup.py --rebase --docker + echo "### OpenWrt repo already setup" +fi + +case "${TARGET}" in +EA8300|\ +IPQ40XX) + TARGET=ea8300 + ;; +ECW5211) + TARGET=ecw5211 + ;; +ECW5410) + TARGET=ecw5410 + ;; +AP2220) + TARGET=ap2220 + ;; +*) + echo "${TARGET} is unknown" + exit 1 + ;; +esac +cd ${BUILD_DIR} +./scripts/gen_config.py ${TARGET} wlan-ap || exit 1 +cd - + +echo "### Building image ..." +cd $BUILD_DIR +make -j$(nproc) V=s 2>&1 | tee build.log +echo "Done" diff --git a/config.yml b/config.yml new file mode 100644 index 000000000..137c615ec --- /dev/null +++ b/config.yml @@ -0,0 +1,8 @@ +repo: https://github.com/openwrt/openwrt.git +branch: openwrt-19.07 +revision: c3e3802a8effd099481cedf669e3a17840612514 +output_dir: ./output + +patch_folders: + - patches/pending + - patches/wlan-ap diff --git a/dock-run.sh b/dock-run.sh new file mode 100755 index 000000000..5dc375424 --- /dev/null +++ b/dock-run.sh @@ -0,0 +1,9 @@ +#!/bin/bash -ex + +tag=$(echo ${PWD} | tr / - | cut -b2- | tr A-Z a-z) +groups=$(id -G | xargs -n1 echo -n " --group-add ") +params="-v ${PWD}:${PWD} --rm -w ${PWD} -u"$(id -u):$(id -g)" $groups -v/etc/passwd:/etc/passwd -v/etc/group:/etc/group ${tag}" + +docker build --tag=${tag} . + +docker run $params $@ diff --git a/feeds/wlan-ap/opensync/Makefile b/feeds/wlan-ap/opensync/Makefile new file mode 100644 index 000000000..a24f8d576 --- /dev/null +++ b/feeds/wlan-ap/opensync/Makefile @@ -0,0 +1,96 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=opensync +PKG_VERSION:=1.4.0.1 +PKG_RELEASE:=1 +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://github.com/plume-design/opensync.git +PKG_SOURCE_DATE:=2019-10-25 +PKG_SOURCE_VERSION:=d46964b2588800e92ac96f562054d6f45cb81147 + +PKG_BUILD_DEPENDS:=python3-kconfiglib/host + +include $(INCLUDE_DIR)/package.mk + +define Package/opensync/default + CATEGORY:=Network + TITLE:=cloud network management system + DEPENDS:=+libev +jansson +protobuf +libprotobuf-c +libmosquitto +libopenssl +openvswitch +libpcap +libuci +libiwinfo +iw +endef + +define Package/opensync-ap2220 + $(call Package/opensync/default) + TITLE += (AP2220) + VARIANT:=AP2220 + DEPENDS+=@TARGET_ipq40xx +endef + +define Package/opensync-ecw5410 + $(call Package/opensync/default) + TITLE += (ECW5410) + VARIANT:=ECW5410 + DEPENDS+=@TARGET_ipq806x +endef + +define Package/opensync-ecw5211 + $(call Package/opensync/default) + TITLE += (ECW5211) + VARIANT:=ECW5211 + DEPENDS+=@TARGET_ipq40xx +endef + +define Package/opensync-ea8300 + $(call Package/opensync/default) + TITLE += (EA8300) + VARIANT:=IPQ40XX + DEPENDS+=@TARGET_ipq40xx +endef + +define Package/opensync/description + OpenSync is a cloud-agnostic software for the delivery, curation, and management of services for the modern home. + For more info please visit: https://opensync.io +endef + +Package/opensync-ap2220/description=$(call Package/opensync/description) +Package/opensync-ecw5410/description=$(call Package/opensync/description) +Package/opensync-ecw5211/description=$(call Package/opensync/description) +Package/opensync-ea8300/description=$(call Package/opensync/description) + +define Build/Prepare + $(PKG_UNPACK) + rm $(PKG_BUILD_DIR)/{vendor,platform} + mkdir $(PKG_BUILD_DIR)/core + [ ! -d ./src/ ] || $(CP) ./src/. $(PKG_BUILD_DIR) + $(Build/Patch) +endef + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR) \ + OWRT_CFLAGS="$(TARGET_CFLAGS)" \ + TARGET=$(BUILD_VARIANT) TOOLCHAIN_DIR="$(TOOLCHAIN_DIR)" \ + TOOLCHAIN_PREFIX="$(TARGET_CROSS)" STAGING_DIR="$(STAGING_DIR)" + $(MAKE) -C $(PKG_BUILD_DIR) rootfs \ + TARGET=$(BUILD_VARIANT) TOOLCHAIN_DIR="$(TOOLCHAIN_DIR)" \ + TOOLCHAIN_PREFIX="$(TARGET_CROSS)" +endef + +define Package/opensync/install + $(INSTALL_DIR) $(1)/usr/plume/bin + $(INSTALL_DIR) $(1)/usr/plume/etc + $(INSTALL_DIR) $(1)/usr/plume/certs + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) $(PKG_BUILD_DIR)/work/$(BUILD_VARIANT)/rootfs//usr/plume/bin/* $(1)/usr/plume/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/work/$(BUILD_VARIANT)/rootfs/usr/plume/etc/* $(1)/usr/plume/etc + $(INSTALL_BIN) $(PKG_BUILD_DIR)/work/$(BUILD_VARIANT)/rootfs/usr/plume/tools/ovsh $(1)/usr/plume/bin + $(MAKE) -C $(PKG_BUILD_DIR)/ TARGET=$(BUILD_VARIANT) rootfs-copy-only INSTALL_ROOTFS_DIR=$(1) +endef + +Package/opensync-ap2220/install=$(call Package/opensync/install,$(1)) +Package/opensync-ecw5410/install=$(call Package/opensync/install,$(1)) +Package/opensync-ecw5211/install=$(call Package/opensync/install,$(1)) +Package/opensync-ea8300/install=$(call Package/opensync/install,$(1)) + +$(eval $(call BuildPackage,opensync-ap2220)) +$(eval $(call BuildPackage,opensync-ecw5410)) +$(eval $(call BuildPackage,opensync-ecw5211)) +$(eval $(call BuildPackage,opensync-ea8300)) diff --git a/feeds/wlan-ap/opensync/patches/01-add-lib-uci-to-wm2.patch b/feeds/wlan-ap/opensync/patches/01-add-lib-uci-to-wm2.patch new file mode 100644 index 000000000..81c68e259 --- /dev/null +++ b/feeds/wlan-ap/opensync/patches/01-add-lib-uci-to-wm2.patch @@ -0,0 +1,21 @@ +diff --git a/src/wm2/tests/unit.mk b/src/wm2/tests/unit.mk +index e98529d..6b67334 100644 +--- a/src/wm2/tests/unit.mk ++++ b/src/wm2/tests/unit.mk +@@ -33,3 +33,4 @@ UNIT_DEPS := src/lib/common + UNIT_DEPS += src/lib/osa + UNIT_DEPS += src/lib/schema + UNIT_DEPS += src/lib/ovsdb ++UNIT_LDFLAGS += -luci +diff --git a/src/wm2/unit.mk b/src/wm2/unit.mk +index 9b27ad9..302b64f 100644 +--- a/src/wm2/unit.mk ++++ b/src/wm2/unit.mk +@@ -44,6 +44,7 @@ UNIT_LDFLAGS += -ljansson + UNIT_LDFLAGS += -ldl + UNIT_LDFLAGS += -lev + UNIT_LDFLAGS += -lrt ++UNIT_LDFLAGS += -luci + + UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS) + UNIT_EXPORT_LDFLAGS := $(UNIT_LDFLAGS) diff --git a/feeds/wlan-ap/opensync/patches/02-wm2-write-temporary-change.patch b/feeds/wlan-ap/opensync/patches/02-wm2-write-temporary-change.patch new file mode 100644 index 000000000..4f5c514b8 --- /dev/null +++ b/feeds/wlan-ap/opensync/patches/02-wm2-write-temporary-change.patch @@ -0,0 +1,35 @@ +diff --git a/src/wm2/src/wm2_radio.c b/src/wm2/src/wm2_radio.c +old mode 100644 +new mode 100755 +index b01a88f..5148636 +--- a/src/wm2/src/wm2_radio.c ++++ b/src/wm2/src/wm2_radio.c +@@ -874,7 +874,7 @@ wm2_vconf_recalc(const char *ifname, bool force) + if (has && strlen(SCHEMA_KEY_VAL(vconf.security, "key")) < 8) { + LOGD("%s: overriding 'ssid' and 'security' for onboarding", ifname); + vconf.ssid_exists = vstate.ssid_exists; +- STRSCPY(vconf.ssid, vstate.ssid); ++// STRSCPY(vconf.ssid, vstate.ssid); +- memcpy(vconf.security, vstate.security, sizeof(vconf.security)); ++// memcpy(vconf.security, vstate.security, sizeof(vconf.security)); + } + +@@ -1109,8 +1109,7 @@ wm2_rconf_recalc(const char *ifname, bool force) + memset(&rstate, 0, sizeof(rstate)); + + if (want) { +- if (!rconf.enabled_exists || !rconf.enabled) { +- LOGW("%s: overriding 'enabled'; conf.db.bck needs fixing, or it's cloud bug PIR-12794", ifname); ++ if (!rconf.enabled_exists) { + rconf.enabled_exists = true; + rconf.enabled = true; + } +@@ -1132,7 +1132,7 @@ wm2_rconf_recalc(const char *ifname, bool force) + if (rconf.channel_exists && rconf.vif_configs_len == 0) { + LOGD("%s: ignoring rconf channel %d: no vifs available yet", + rconf.if_name, rconf.channel); +- rconf.channel = rstate.channel; ++// rconf.channel = rstate.channel; + } + + if (want) { diff --git a/feeds/wlan-ap/opensync/patches/03-sm-add-libiwinfo.patch b/feeds/wlan-ap/opensync/patches/03-sm-add-libiwinfo.patch new file mode 100644 index 000000000..c65599e19 --- /dev/null +++ b/feeds/wlan-ap/opensync/patches/03-sm-add-libiwinfo.patch @@ -0,0 +1,12 @@ +diff --git a/src/sm/unit.mk b/src/sm/unit.mk +index d62bde7..8063c0c 100644 +--- a/src/sm/unit.mk ++++ b/src/sm/unit.mk +@@ -53,6 +53,7 @@ UNIT_LDFLAGS += -ldl + UNIT_LDFLAGS += -lev + UNIT_LDFLAGS += -lrt + UNIT_LDFLAGS += -lz ++UNIT_LDFLAGS += -liwinfo + + UNIT_DEPS := src/lib/ovsdb + UNIT_DEPS += src/lib/pjs diff --git a/feeds/wlan-ap/opensync/patches/04-honour-copts.patch b/feeds/wlan-ap/opensync/patches/04-honour-copts.patch new file mode 100644 index 000000000..7a9363374 --- /dev/null +++ b/feeds/wlan-ap/opensync/patches/04-honour-copts.patch @@ -0,0 +1,20 @@ +Index: opensync-1.4.0.1/build/flags.mk +=================================================================== +--- opensync-1.4.0.1.orig/build/flags.mk ++++ opensync-1.4.0.1/build/flags.mk +@@ -23,12 +23,13 @@ + # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + # C FLAGS +-CFLAGS := -Wall -Wextra -Werror ++CFLAGS ?= ++CFLAGS += -Wall -Wextra -Werror + CFLAGS += -Wno-unused-parameter + CFLAGS += -Wno-unused-label + CFLAGS += -Wno-strict-aliasing + CFLAGS += -fasynchronous-unwind-tables +- ++CFLAGS += $(OWRT_CFLAGS) + DEBUGFLAGS := -g + OPTIMIZE := + diff --git a/feeds/wlan-ap/opensync/patches/04-wm-add-libiwinfo.patch b/feeds/wlan-ap/opensync/patches/04-wm-add-libiwinfo.patch new file mode 100644 index 000000000..dc9b2689b --- /dev/null +++ b/feeds/wlan-ap/opensync/patches/04-wm-add-libiwinfo.patch @@ -0,0 +1,22 @@ +diff --git a/src/wm2/tests/unit.mk b/src/wm2/tests/unit.mk +index 6b67334..66e9679 100644 +--- a/src/wm2/tests/unit.mk ++++ b/src/wm2/tests/unit.mk +@@ -34,3 +34,4 @@ UNIT_DEPS += src/lib/osa + UNIT_DEPS += src/lib/schema + UNIT_DEPS += src/lib/ovsdb + UNIT_LDFLAGS += -luci ++UNIT_LDFLAGS += -liwinfo +diff --git a/src/wm2/unit.mk b/src/wm2/unit.mk +index 302b64f..319c663 100644 +--- a/src/wm2/unit.mk ++++ b/src/wm2/unit.mk +@@ -45,6 +45,7 @@ UNIT_LDFLAGS += -ldl + UNIT_LDFLAGS += -lev + UNIT_LDFLAGS += -lrt + UNIT_LDFLAGS += -luci ++UNIT_LDFLAGS += -liwinfo + + UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS) + UNIT_EXPORT_LDFLAGS := $(UNIT_LDFLAGS) + diff --git a/feeds/wlan-ap/opensync/patches/05-fixes.patch b/feeds/wlan-ap/opensync/patches/05-fixes.patch new file mode 100644 index 000000000..c54020b0e --- /dev/null +++ b/feeds/wlan-ap/opensync/patches/05-fixes.patch @@ -0,0 +1,26 @@ +Index: opensync-1.4.0.1/platform/openwrt/src/lib/target/src/vif.c +=================================================================== +--- opensync-1.4.0.1.orig/platform/openwrt/src/lib/target/src/vif.c ++++ opensync-1.4.0.1/platform/openwrt/src/lib/target/src/vif.c +@@ -1039,7 +1039,7 @@ bool target_vif_config_set2( + int ret; + char tmp[256]; + c_item_t *citem; +- bool bval; ++ bool bval = false; + + const char *ssid_ifname = (char *)vconf->if_name; + +Index: opensync-1.4.0.1/src/wm2/src/wm2_clients.c +=================================================================== +--- opensync-1.4.0.1.orig/src/wm2/src/wm2_clients.c ++++ opensync-1.4.0.1/src/wm2/src/wm2_clients.c +@@ -69,7 +69,7 @@ wm2_clients_oftag_from_key_id(const char + { + struct schema_Wifi_VIF_Config vconf; + ovsdb_table_t table_Wifi_VIF_Config; +- char oftagkey[32]; ++ char oftagkey[38]; + char *ptr; + bool ok; + diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/LICENSE b/feeds/wlan-ap/opensync/src/platform/openwrt/LICENSE new file mode 100644 index 000000000..c1f88e0d4 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/NOTICE b/feeds/wlan-ap/opensync/src/platform/openwrt/NOTICE new file mode 100644 index 000000000..f024b551f --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/NOTICE @@ -0,0 +1,2 @@ +Copyright 2019, Plume Design Inc. All rights reserved. +Licensed under the "3-Clause BSD License" also known as "Revised BSD License" diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/README.md b/feeds/wlan-ap/opensync/src/platform/openwrt/README.md new file mode 100644 index 000000000..ff71339af --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/README.md @@ -0,0 +1,8 @@ +OpenSync platform layer template for OpenWrt +-------------------------------------------- + +OpenSync platform layer template for OpenWrt based targets. + +This repository is a part of the `opensync-openwrt` project. + +For more info please visit: https://opensync.io diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/build/openwrt.mk b/feeds/wlan-ap/opensync/src/platform/openwrt/build/openwrt.mk new file mode 100644 index 000000000..540e37d5c --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/build/openwrt.mk @@ -0,0 +1,34 @@ +# Copyright (c) 2019, Plume Design Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the Plume Design Inc. nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +CFLAGS += -I$(STAGING_DIR)/usr/include/protobuf-c + +BUILD_SHARED_LIB = n + +CONTROLLER_ADDR="ssl:opensync.zone1.art2wave.com:6643" + +CC = $(TOOLCHAIN_DIR)/bin/$(TOOLCHAIN_PREFIX)gcc +CXX = $(TOOLCHAIN_DIR)/bin/$(TOOLCHAIN_PREFIX)g++ +AR = $(TOOLCHAIN_DIR)/bin/$(TOOLCHAIN_PREFIX)ar +STRIP = $(TOOLCHAIN_DIR)/bin/$(TOOLCHAIN_PREFIX)strip -g diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/kconfig/openwrt_generic b/feeds/wlan-ap/opensync/src/platform/openwrt/kconfig/openwrt_generic new file mode 100644 index 000000000..efd5bf7ea --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/kconfig/openwrt_generic @@ -0,0 +1 @@ +CONFIG_USE_KCONFIG=y diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/rootfs/common/etc/init.d/opensync b/feeds/wlan-ap/opensync/src/platform/openwrt/rootfs/common/etc/init.d/opensync new file mode 100755 index 000000000..364ad3992 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/rootfs/common/etc/init.d/opensync @@ -0,0 +1,51 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 +START=90 +STOP=90 + +PROG="/usr/plume/bin/dm" +OPENSYNC_DB=/usr/plume/etc/conf.db.bck +OPENSYNC_SCHEMA=/usr/plume/etc/plume.ovsschema +OVS_DB_DIR=/var/run/openvswitch +OVS_DB=/var/run/openvswitch/conf.db +CERTS_DEST_PATH=/var/run/openvswitch/certs +CERTS_SRC_PATH=/usr/plume/certs + +start_ovs() { + echo "Starting OVS" + if [ ! -d ${OVS_DB_DIR} ]; then + mkdir -p ${OVS_DB_DIR} + fi + cp ${OPENSYNC_DB} ${OVS_DB} + procd_open_instance + procd_set_param command /bin/sh + procd_append_param command /usr/share/openvswitch/scripts/ovs-ctl + procd_append_param command start --db-file=${OVS_DB} --db-schema=${OPENSYNC_SCHEMA} --system-id=1 + procd_close_instance +} + +stop_ovs() { + echo "Stopping OVS" + /usr/share/openvswitch/scripts/ovs-ctl stop +} + +start_service() { + stop_ovs + start_ovs + procd_open_instance + echo "Setting certificates" + mkdir -p ${CERTS_DEST_PATH} + cp ${CERTS_SRC_PATH}/* ${CERTS_DEST_PATH}/ + echo "Starting OpenSync" + procd_set_param command ${PROG} + procd_close_instance +} + +stop_service() { + stop_ovs + echo "Removing certificates" + rm -rf ${CERTS_DEST_PATH} + echo "Killing managers" + killall cm nm wm lm sm qm +} diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/osn/override.mk b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/osn/override.mk new file mode 100644 index 000000000..8f7053f75 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/osn/override.mk @@ -0,0 +1,41 @@ +# Copyright (c) 2019, Plume Design Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the Plume Design Inc. nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +############################################################################## +# +# OpenSync low level API +# +############################################################################## +UNIT_SRC := src/osn_dnsmasq.c +UNIT_SRC += src/osn_dnsmasq6.c +UNIT_SRC += src/osn_inet.c +UNIT_SRC += src/osn_inet6.c +UNIT_SRC += src/osn_odhcp6c.c +UNIT_SRC += src/osn_priv_netlink.c +UNIT_SRC += src/osn_route.c +UNIT_SRC += src/osn_types.c +UNIT_SRC += src/osn_udhcpc.c +UNIT_SRC += src/osn_fw.c + +UNIT_SRC_TOP := $(OVERRIDE_DIR)/src/osn_upnpd.c diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/osn/src/osn_upnpd.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/osn/src/osn_upnpd.c new file mode 100644 index 000000000..3e1935cbe --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/osn/src/osn_upnpd.c @@ -0,0 +1,37 @@ +#include +#include "osn_upnp.h" + +static int dummy_osn_upnp; + +osn_upnp_t *osn_upnp_new(const char *ifname) +{ + return (osn_upnp_t *)&dummy_osn_upnp; +} + +bool osn_upnp_del(osn_upnp_t *self) +{ + return true; +} + +bool osn_upnp_set(osn_upnp_t *self, enum osn_upnp_mode mode) +{ + return true; +} + +bool osn_upnp_get(osn_upnp_t *self, enum osn_upnp_mode *mode) +{ + *mode = 0; + + return true; +} + +bool osn_upnp_start(osn_upnp_t *self) +{ + return false; +} + +bool osn_upnp_stop(osn_upnp_t *self) +{ + return true; +} + diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/target_OPENWRT.h b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/target_OPENWRT.h new file mode 100644 index 000000000..87cb4b7fe --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/target_OPENWRT.h @@ -0,0 +1,62 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef TARGET_OPENWRT_H_INCLUDED +#define TARGET_OPEMWRT_H_INCLUDED + +#include "dpp_client.h" +#include "dpp_survey.h" + +#define TARGET_CERT_PATH "/var/run/openvswitch/certs" +#define TARGET_MANAGERS_PID_PATH "/tmp/dmpid" +#define TARGET_OVSDB_SOCK_PATH "/var/run/openvswitch/db.sock" +#define TARGET_LOGREAD_FILENAME "messages" + +typedef struct +{ + DPP_TARGET_CLIENT_RECORD_COMMON_STRUCT; + dpp_client_stats_t stats; +} target_client_record_t; + +typedef struct +{ + DPP_TARGET_SURVEY_RECORD_COMMON_STRUCT; +} target_survey_record_t; + +typedef void target_capacity_data_t; + +/****************************************************************************** + * MANAGERS definitions + *****************************************************************************/ +#if !defined(CONFIG_TARGET_MANAGER) +#define TARGET_MANAGER_PATH(X) "/usr/plume/bin/"X +#endif + +#define TARGET_TOOLS_PATH "/usr/plume/tools" + +#include "target_common.h" + +#endif /* TARGET_OPENWRT_H_INCLUDED */ diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/uci_helper.h b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/uci_helper.h new file mode 100755 index 000000000..795a61e49 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/uci_helper.h @@ -0,0 +1,139 @@ +#ifndef TARGET_UCI_HELPER_H_INCLUDED +#define TARGET_UCI_HELPER_H_INCLUDED + +#include "target.h" +#include "uci.h" +#include "schema_consts.h" + +#define UCI_WRITE(type, section, index, option, value) ({ \ + if(!uci_write(type, section, index, option, value)) \ + { \ + return false; \ + } \ +}) + +#define UCI_READ(type, section, index, option, result, length) ({ \ + if(uci_read(type, section, index, option, result, length) != UCI_OK) \ + {\ + return false; \ + } \ +}) + +#define UCI_REMOVE(type, section, index, option) ({ \ + if(uci_remove(type, section, index, option) != UCI_OK) \ + { \ + return false; \ + } \ +}) + +#define UCI_BUFFER_SIZE 80 +#define DEFAULT_ENC_MODE "TKIPandAESEncryption" +#define UCI_MAX_RADIOS 4 + +typedef enum { + eFreqBand_24G = 0, + eFreqBand_5G, + eFreqBand_5GL, + eFreqBand_5GU +} eFreqBand; + +#define HWMODE_11a "11a" +#define HWMODE_11b "11b" +#define HWMODE_11g "11g" + +#define HTMODE_noht "NOHT" +#define HTMODE_ht20 "HT20" +#define HTMODE_ht40m "HT40-" +#define HTMODE_ht40p "HT40+" +#define HTMODE_ht40 "HT40" +#define HTMODE_vht20 "VHT20" +#define HTMODE_vht40 "VHT40" +#define HTMODE_vht80 "VHT80" +#define HTMODE_vht160 "VHT160" + +#define OVSDB_SECURITY_KEY "key" +#define OVSDB_SECURITY_OFTAG "oftag" +#define OVSDB_SECURITY_MODE "mode" +#define OVSDB_SECURITY_MODE_WEP64 "64" +#define OVSDB_SECURITY_MODE_WEP128 "128" +#define OVSDB_SECURITY_MODE_WPA1 "1" +#define OVSDB_SECURITY_MODE_WPA2 "2" +#define OVSDB_SECURITY_MODE_MIXED "mixed" +#define OVSDB_SECURITY_ENCRYPTION "encryption" +#define OVSDB_SECURITY_ENCRYPTION_OPEN "OPEN" +#define OVSDB_SECURITY_ENCRYPTION_WEP "WEP" +#define OVSDB_SECURITY_ENCRYPTION_WPA_PSK "WPA-PSK" +#define OVSDB_SECURITY_ENCRYPTION_WPA_EAP "WPA-EAP" +#define OVSDB_SECURITY_RADIUS_SERVER_IP "radius_server_ip" +#define OVSDB_SECURITY_RADIUS_SERVER_PORT "radius_server_port" +#define OVSDB_SECURITY_RADIUS_SERVER_SECRET "radius_server_secret" +/* + * Functions to retrieve Radio parameters + */ +int wifi_getRadioNumberOfEntries( int *numberOfEntries ); +int wifi_getRadioIfName(int radio_idx, char *radio_ifname, size_t radio_ifname_len); +int wifi_getRadioChannel(int radio_idx, int *channel); +int wifi_getRadioEnable(int radio_idx, bool *enabled); +int wifi_getRadioTxPower(int radio_idx, int *txpower ); +int wifi_getRadioBeaconInterval(int radio_idx, int *beacon_int); +int wifi_getRadioFreqBand(int *allowedChannels, int numberOfChannels, char *freq_band); +int wifi_getRadioHtMode(int radio_idx, char *ht_mode); +int wifi_getRadioHwMode(int radio_idx, char *hw_mode); +int wifi_getTxChainMask(int radioIndex, int *txChainMask); +int wifi_getRadioAllowedChannel(int radioIndex, int *allowedChannelList, int *allowedChannelListLen); +int wifi_getRadioMacaddress(int radio_idx, char *mac); + +/* + * Functions to set Radio parameters + */ +bool wifi_setRadioChannel(int radioIndex, int channel, const char *ht_mode); +bool wifi_setRadioEnabled(int radioIndex, bool enabled); +bool wifi_setRadioTxPower(int radioIndex, int txpower); +bool wifi_setRadioBeaconInterval(int radioIndex, int beacon_int); +bool wifi_setRadioModes(int radioIndex, const char *freq_band, const char *ht_mode, const char *hw_mode); + +/* + * Functions to retrieve SSID parameters + */ +int wifi_getSSIDNumberOfEntries( int *numberOfEntries); +int wifi_getVIFName(int ssid_index, char *ssid_ifname, size_t ssid_ifname_len); +int wifi_getSSIDName(int ssid_index, char *ssid_name, size_t ssid_name_len); +int wifi_getSSIDRadioIndex(int ssid_index, int *radio_index); +int wifi_getSSIDRadioIfName(int ssid_index, char *radio_ifname, size_t radio_ifname_len); +int wifi_getSsidEnabled(int ssid_index, bool *enabled); +int wifi_getApBridgeInfo(int ssid_index, char *bridge_info, char *tmp1, char *tmp2, size_t bridge_info_len); +int wifi_getApIsolationEnable(int ssid_index, bool *enabled); +int wifi_getApSsidAdvertisementEnable(int ssid_index, bool *enabled); +int wifi_getBaseBSSID(int ssid_index,char *buf, size_t buf_len,int radio_idx); +int wifi_getApSecurityKeyPassphrase(int ssid_index, char *buf, size_t buf_len); +bool wifi_getApSecurityModeEnabled(int ssid_index, char *buf, size_t buf_len); +bool wifi_getApSecurityRadiusServer(int ssid_index, char *radius_ip, char *radius_port, char *radius_secret); +bool wifi_setFtMode(int ssid_index, const struct schema_Wifi_VIF_Config *vconf); +bool wifi_getApVlanId(int ssidIndex, int *vlan_id); + +/* + * Functions to set SSID parameters + */ +bool wifi_setSSIDName(int ssis_index, char* ssidName); +bool wifi_setApSecurityModeEnabled(int ssid_index, const struct schema_Wifi_VIF_Config *vconf); +bool wifi_setApSsidAdvertisementEnable(int ssid_index, bool enabled); +bool wifi_setApIsolationEnable(int ssid_index, bool enabled); +bool wifi_setSsidEnabled(int ssid_index, bool enabled); +bool wifi_setApBridgeInfo(int ssid_index, char *bridge_info); +bool wifi_setApVlanNetwork(int ssid_index, int vlan_id); + +/* + * Functions to access OVSDB callbacks + */ +bool radio_rops_vstate(struct schema_Wifi_VIF_State *vstate); +bool radio_rops_vconfig( struct schema_Wifi_VIF_Config *vconf, const char *radio_ifname); + +/* + * VIF functions + */ + +bool vif_state_update(int ssidIndex); +bool vif_state_get(int ssidIndex, struct schema_Wifi_VIF_State *vstate); +bool vif_copy_to_config(int ssidIndex, struct schema_Wifi_VIF_State *vstate, struct schema_Wifi_VIF_Config *vconf); + +#endif diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/override.mk b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/override.mk new file mode 100755 index 000000000..e0aba5e4e --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/override.mk @@ -0,0 +1,54 @@ +# Copyright (c) 2019, Plume Design Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the Plume Design Inc. nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +$(info xxx $(OVERRIDE_DIR)) +UNIT_CFLAGS += -I$(OVERRIDE_DIR)/inc + +UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS) + +UNIT_SRC_TOP := $(OVERRIDE_DIR)/src/radio.c +UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/managers.c +UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/stats.c +UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/uci_helper.c +UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/target.c +UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/vif.c + +CONFIG_USE_KCONFIG=y +CONFIG_INET_ETH_LINUX=y +CONFIG_INET_VIF_LINUX=y +CONFIG_INET_GRE_LINUX=y +CONFIG_INET_FW_NULL=y +CONFIG_INET_DHCPC_NULL=y +CONFIG_INET_DHCPS_NULL=y +CONFIG_INET_UPNP_NULL=y +CONFIG_INET_DNS_NULL=y +CONFIG_INET_DHSNIFF_NULL=y + +UNIT_SRC := $(filter-out src/target_inet.c,$(UNIT_SRC)) +UNIT_SRC := $(filter-out src/target_dhcp.c,$(UNIT_SRC)) +UNIT_DEPS := $(filter-out src/lib/inet,$(UNIT_DEPS)) +UNIT_DEPS += src/lib/evsched +UNIT_LDFLAGS += -luci +UNIT_LDFLAGS += -libiwinfo +UNIT_DEPS_CFLAGS += src/lib/inet diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/managers.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/managers.c new file mode 100755 index 000000000..0bd6aa0c0 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/managers.c @@ -0,0 +1,67 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "target.h" +#include "const.h" + +/****************************************************************************** + * MANAGERS definitions + *****************************************************************************/ + +target_managers_config_t target_managers_config[] = +{ + { + .name = TARGET_MANAGER_PATH("wm"), + .needs_plan_b = true, + }, + + { + .name = TARGET_MANAGER_PATH("nm"), + .needs_plan_b = true, + }, + + { + .name = TARGET_MANAGER_PATH("cm"), + .needs_plan_b = true, + }, + + { + .name = TARGET_MANAGER_PATH("lm"), + .needs_plan_b = true, + }, + + { + .name = TARGET_MANAGER_PATH("sm"), + .needs_plan_b = false, + }, + + { + .name = TARGET_MANAGER_PATH("qm"), + .needs_plan_b = false, + }, +}; + +int target_managers_num = ARRAY_SIZE(target_managers_config); diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio.c new file mode 100755 index 000000000..1152370fb --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio.c @@ -0,0 +1,506 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include "log.h" +#include "evsched.h" +#include "uci_helper.h" + +static bool needReset = true; /* On start-up, we need to initialize DB from the UCI */ + +static struct target_radio_ops g_rops; +static bool g_resync_ongoing = false; + + +static bool radio_state_get( + int radioIndex, + struct schema_Wifi_Radio_State *rstate) +{ + memset(rstate, 0, sizeof(*rstate)); + schema_Wifi_Radio_State_mark_all_present(rstate); + rstate->_partial_update = true; + rstate->channel_sync_present = false; + rstate->channel_mode_present = false; + rstate->radio_config_present = false; + rstate->vif_states_present = false; + + if (UCI_OK == wifi_getRadioIfName(radioIndex, rstate->if_name, sizeof(rstate->if_name))) { + rstate->if_name_exists = true; + LOGN("radio if_name: %s", rstate->if_name); + } + + if (UCI_OK == wifi_getRadioChannel(radioIndex, &(rstate->channel))) { + rstate->channel_exists = true; + LOGN("radio channel: %d", rstate->channel); + } + + if (UCI_OK == wifi_getRadioEnable(radioIndex, &(rstate->enabled))) { + rstate->enabled_exists = true; + LOGN("radio enabled %d", rstate->enabled); + } + + /* tx_power gets boundary checked between 1 .. 32 */ + if (UCI_OK == wifi_getRadioTxPower(radioIndex, &(rstate->tx_power))) { + rstate->tx_power_exists = true; + LOGN("radio tx_power: %d", rstate->tx_power); + /* 0 means max in UCI, 32 is max in OVSDB */ + if (rstate->tx_power == 0) rstate->tx_power = 32; + } else { + rstate->tx_power = 32; + rstate->tx_power_exists = true; + } + + if (UCI_OK == wifi_getRadioBeaconInterval(radioIndex, &(rstate->bcn_int))) { + rstate->bcn_int_exists = true; + LOGN("radio beacon interval: %d", rstate->bcn_int); + } else { + rstate->bcn_int = 100; + rstate->bcn_int_exists = true; + } + +#if 0 + switch (radioIndex) { + case 0: + snprintf(rstate->ht_mode, sizeof(rstate->ht_mode),"HT80"); + snprintf(rstate->hw_mode, sizeof(rstate->hw_mode),"11a"); + snprintf(rstate->freq_band, sizeof(rstate->freq_band),"5GU"); + break; + case 1: + snprintf(rstate->ht_mode, sizeof(rstate->ht_mode),"HT20"); + snprintf(rstate->hw_mode, sizeof(rstate->hw_mode),"11g"); + snprintf(rstate->freq_band, sizeof(rstate->freq_band),"5GU"); + break; + case 2: + snprintf(rstate->ht_mode, sizeof(rstate->ht_mode),"HT80"); + snprintf(rstate->hw_mode, sizeof(rstate->hw_mode),"11a"); + snprintf(rstate->freq_band, sizeof(rstate->freq_band),"5GU"); + break; + } + rstate->ht_mode_exists = true; + rstate->freq_band_exists = true; + rstate->hw_mode_exists = true; +#endif + wifi_getRadioAllowedChannel(radioIndex, rstate->allowed_channels, &(rstate->allowed_channels_len)); + + if (UCI_OK == wifi_getRadioFreqBand(rstate->allowed_channels, rstate->allowed_channels_len, rstate->freq_band)) { + rstate->freq_band_exists = true; + LOGN("radio freq band: %s", rstate->freq_band); + } + + if(wifi_getTxChainMask(radioIndex, &(rstate->tx_chainmask))) { + rstate->tx_chainmask_exists = true; + LOGN("tx_chainmask: %d", rstate->tx_chainmask); + } + + if (UCI_OK == wifi_getRadioHtMode(radioIndex, rstate->ht_mode)) { + rstate->ht_mode_exists = true; + LOGN("radio ht mode: %s", rstate->ht_mode); + } + + if (UCI_OK == wifi_getRadioHwMode(radioIndex, rstate->hw_mode)) { + rstate->hw_mode_exists = true; + LOGN("radio hw mode: %s", rstate->hw_mode); + } + if(UCI_OK == wifi_getRadioMacaddress(radioIndex, rstate->mac)){ + rstate->mac_exists = true; + LOGN("radio mac address:%s", rstate->mac); + } + snprintf(rstate->country, sizeof(rstate->country),"CA"); + rstate->country_exists = true; + + return true; +} + +static bool radio_state_update(unsigned int radioIndex) +{ + struct schema_Wifi_Radio_State rstate; + + if (!radio_state_get(radioIndex, &rstate)) + { + LOGE("%s: Radio state update failed -- unable to get state for idx %d", + __func__, radioIndex); + return false; + } + LOGN("Updating state for radio index %d...", radioIndex); + g_rops.op_rstate(&rstate); + + return true; +} + +static bool radio_copy_config_from_state( + int radioIndex, + struct schema_Wifi_Radio_State *rstate, + struct schema_Wifi_Radio_Config *rconf) +{ + memset(rconf, 0, sizeof(*rconf)); + schema_Wifi_Radio_Config_mark_all_present(rconf); + rconf->_partial_update = true; + rconf->vif_configs_present = false; + + SCHEMA_SET_STR(rconf->if_name, rstate->if_name); + LOGT("rconf->ifname = %s", rconf->if_name); + SCHEMA_SET_STR(rconf->freq_band, rstate->freq_band); + LOGT("rconf->freq_band = %s", rconf->freq_band); + SCHEMA_SET_STR(rconf->hw_type, rstate->hw_type); + LOGT("rconf->hw_type = %s", rconf->hw_type); + SCHEMA_SET_INT(rconf->enabled, rstate->enabled); + LOGT("rconf->enabled = %d", rconf->enabled); + SCHEMA_SET_INT(rconf->channel, rstate->channel); + LOGT("rconf->channel = %d", rconf->channel); + SCHEMA_SET_INT(rconf->tx_power, rstate->tx_power); + LOGT("rconf->tx_power = %d", rconf->tx_power); + SCHEMA_SET_STR(rconf->country, rstate->country); + LOGT("rconf->country = %s", rconf->country); + SCHEMA_SET_STR(rconf->ht_mode, rstate->ht_mode); + LOGT("rconf->ht_mode = %s", rconf->ht_mode); + SCHEMA_SET_STR(rconf->hw_mode, rstate->hw_mode); + LOGT("rconf->hw_mode = %s", rconf->hw_mode); + + return true; +} + +static void radio_resync_all_task(void *arg) +{ + int r, rnum; + int ret; + int s, snum; + char ssid_ifname[128]; + + LOGT("Re-sync started"); + +#if 1 + ret = wifi_getRadioNumberOfEntries(&rnum); + if (ret != UCI_OK) + { + LOGE("%s: failed to get radio count", __func__); + goto out; + } +#else + rnum = 3; +#endif + + for(r = 0; r < rnum; r++) + { + if (!radio_state_update(r)) + { + LOGW("Cannot update radio state for radio index %d", r); + continue; + } + } + +#if 1 + ret = wifi_getSSIDNumberOfEntries(&snum); + if (ret != UCI_OK) + { + LOGE("%s: failed to get SSID count", __func__); + goto out; + } + + if (snum == 0) + { + LOGE("%s: no SSIDs detected", __func__); + goto out; + } +#else + snum = 5; +#endif + + for (s = 0; s < snum; s++) + { + memset(ssid_ifname, 0, sizeof(ssid_ifname)); + ret = wifi_getVIFName(s, ssid_ifname, sizeof(ssid_ifname)); + if (ret != UCI_OK) + { + continue; + } + +#if 0 + // Filter SSID's that we don't have mappings for + if (!target_unmap_ifname_exists(ssid_ifname)) + { + continue; + } + + // Fetch existing clients + if (!clients_hal_fetch_existing(s)) + { + LOGW("Fetching existing clients for %s failed", ssid_ifname); + } +#endif + + if (!vif_state_update(s)) + { + LOGW("Cannot update VIF state for SSID index %d", s); + continue; + } + } +out: + LOGT("Re-sync completed"); + g_resync_ongoing = false; +} + +void radio_trigger_resync() +{ + if (!g_resync_ongoing) + { + g_resync_ongoing = true; + LOGI("Radio re-sync scheduled"); + evsched_task(&radio_resync_all_task, NULL, + EVSCHED_SEC(2)); + } else + { + LOGT("Radio re-sync already ongoing!"); + } +} + +static void healthcheck_task(void *arg) +{ + LOGI("Healthcheck re-sync"); + radio_trigger_resync(); + evsched_task_reschedule_ms(EVSCHED_SEC(15)); +} + +bool target_radio_init(const struct target_radio_ops *ops) +{ + g_rops = *ops; + evsched_task(&healthcheck_task, NULL, EVSCHED_SEC(5)); + + return true; +} + +bool target_radio_config_init2() +{ + int r; + int rnum; + int s; + int snum; + int ssid_radio_idx; + char ssid_ifname[128]; + int ret; + + struct schema_Wifi_VIF_Config vconfig; + struct schema_Wifi_VIF_State vstate; + struct schema_Wifi_Radio_Config rconfig; + struct schema_Wifi_Radio_State rstate; + + target_ifname_map_init(); + +#if 1 + ret = wifi_getRadioNumberOfEntries(&rnum); + if (ret != UCI_OK) + { + LOGE("%s: failed to get radio count", __func__); + return false; + } +#else + rnum = 3; +#endif + + for (r = 0; r < rnum; r++) + { + radio_state_get(r, &rstate); + radio_copy_config_from_state(r, &rstate, &rconfig); + g_rops.op_rconf(&rconfig); + g_rops.op_rstate(&rstate); + +#if 1 + ret = wifi_getSSIDNumberOfEntries(&snum); + + if (ret != UCI_OK) + { + LOGE("%s: failed to get SSID count", __func__); + return false; + } + + if (snum == 0) + { + LOGE("%s: no SSIDs detected", __func__); + continue; + } +#else + snum = 5; +#endif + + for (s = 0; s < snum; s++) + { + memset(ssid_ifname, 0, sizeof(ssid_ifname)); + ret = wifi_getVIFName(s, ssid_ifname, sizeof(ssid_ifname)); + if (ret != UCI_OK) + { + LOGW("%s: failed to get AP name for index %d. Skipping.\n", __func__, s); + continue; + } + +#if 0 + // Filter SSID's that we don't have mappings for + if (!target_unmap_ifname_exists(ssid_ifname)) + { + continue; + } +#endif + + ret = wifi_getSSIDRadioIndex(s, &ssid_radio_idx); + if (ret != UCI_OK) + { + LOGW("Cannot get radio index for SSID %d", s); + continue; + } + + if (ssid_radio_idx != r) + { + continue; + } + + LOGI("Found SSID index %d: %s", s, ssid_ifname); + if (!vif_state_get(s, &vstate)) + { + LOGE("%s: cannot get vif state for SSID index %d", __func__, s); + continue; + } + if (!vif_copy_to_config(s, &vstate, &vconfig)) + { + LOGE("%s: cannot copy VIF state to config for SSID index %d", __func__, s); + continue; + } + g_rops.op_vconf(&vconfig, rconfig.if_name); + g_rops.op_vstate(&vstate); + } + } +/* + if (!dfs_event_cb_registered) + { + if (wifi_chan_eventRegister(chan_event_cb) != RETURN_OK) + { + LOGE("Failed to register chan event callback\n"); + } + + dfs_event_cb_registered = true; + } +*/ + return true; +} + +bool target_radio_config_need_reset() +{ + return needReset; +} + +static void radio_ifname_to_idx(char* if_name, int* radioIndex) +{ + // TODO: Quick hack. This needs to be improved. + *radioIndex = atoi(strndup(if_name + 5, 5)); +} + +bool target_radio_config_set2( + const struct schema_Wifi_Radio_Config *rconf, + const struct schema_Wifi_Radio_Config_flags *changed) + { + int radioIndex; + bool rc = true; + + radio_ifname_to_idx(target_map_ifname((char*)rconf->if_name), &radioIndex); + + if (changed->channel || changed->ht_mode) + { + if (!wifi_setRadioChannel(radioIndex, rconf->channel, rconf->ht_mode)) + { + LOGE("%s: cannot change radio channel for %s", __func__, rconf->if_name); + rc = false; + } + } + + if (changed->enabled) + { + if (!wifi_setRadioEnabled(radioIndex, rconf->enabled)) + { + LOGE("%s: cannot enable/disable radio for %s", __func__, rconf->if_name); + rc = false; + } + } + + if (changed->tx_power) + { + if (!wifi_setRadioTxPower(radioIndex, rconf->tx_power)) + { + LOGE("%s: cannot set radio tx power for %s", __func__, rconf->if_name); + rc = false; + } + } + + + if (changed->bcn_int) + { + int beacon_interval = rconf->bcn_int; + if ((rconf->bcn_int < 50) || (rconf->bcn_int > 400)) beacon_interval = 100; + if (!wifi_setRadioBeaconInterval(radioIndex, beacon_interval)) + { + LOGE("%s: cannot set beacon interval radio for %s", __func__, rconf->if_name); + rc = false; + } + } + + if ((changed->ht_mode) || (changed->hw_mode) || (changed->freq_band)) + { + if (!wifi_setRadioModes(radioIndex, rconf->freq_band, rconf->ht_mode, rconf->hw_mode)) + { + LOGE("%s: cannot set radio mode and bw for %s", __func__, rconf->if_name); + rc = false; + } + } + + if (rc==false) LOGE("Radio config partially applied for %s", rconf->if_name); + + return radio_state_update(radioIndex); + } + +bool radio_rops_vstate(struct schema_Wifi_VIF_State *vstate) +{ + if (!g_rops.op_vstate) + { + LOGE("%s: op_vstate not set", __func__); + return false; + } + + g_rops.op_vstate(vstate); + return true; +} + +bool radio_rops_vconfig( + struct schema_Wifi_VIF_Config *vconf, + const char *radio_ifname) +{ + if (!g_rops.op_vconf) + { + LOGE("%s: op_vconf not set", __func__); + return false; + } + + g_rops.op_vconf(vconf, radio_ifname); + return true; +} + diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/stats.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/stats.c new file mode 100755 index 000000000..7e0437fd2 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/stats.c @@ -0,0 +1,535 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "target.h" +#include +#include +#include "iwinfo.h" + +#define NUM_MAX_CLIENTS 10 + +/***************************************************************************** + * INTERFACE definitions + *****************************************************************************/ + +bool target_is_radio_interface_ready(char *phy_name) +{ + return true; +} + +bool target_is_interface_ready(char *if_name) +{ + return true; +} + +/****************************************************************************** + * STATS definitions + *****************************************************************************/ + +bool target_radio_tx_stats_enable(radio_entry_t *radio_cfg, bool enable) +{ + return true; +} + +bool target_radio_fast_scan_enable(radio_entry_t *radio_cfg, ifname_t if_name) +{ + return true; +} + + +/****************************************************************************** + * CLIENT definitions + *****************************************************************************/ + +target_client_record_t* target_client_record_alloc() +{ + target_client_record_t *record = NULL; + + record = malloc(sizeof(target_client_record_t)); + if (record == NULL) return NULL; + + memset(record, 0, sizeof(target_client_record_t)); + + return record; +} + +void target_client_record_free(target_client_record_t *record) +{ + if (record != NULL) + { + free(record); + } +} + +bool target_stats_clients_get( + radio_entry_t *radio_cfg, + radio_essid_t *essid, + target_stats_clients_cb_t *client_cb, + ds_dlist_t *client_list, + void *client_ctx) +{ + char buf[IWINFO_BUFSIZE]; + int len; + struct iwinfo_assoclist_entry *assoc_client = NULL; + target_client_record_t *client_entry = NULL; + char stats_if_name[15]; + radio_type_t radio_type; + + memset(stats_if_name, '\0', sizeof(stats_if_name)); + + if(!target_map_cloud_to_iw(radio_cfg->if_name, stats_if_name, sizeof(stats_if_name))) + { + return false; + } + + if(strcmp(radio_cfg->if_name, "home-ap-24") == 0) + { + radio_type = RADIO_TYPE_2G; + } + else if(strcmp(radio_cfg->if_name, "home-ap-l50") == 0) + { + radio_type = RADIO_TYPE_5GL; + } + else if(strcmp(radio_cfg->if_name, "home-ap-u50") == 0) + { + radio_type = RADIO_TYPE_5GU; + } + else + { + return true; + } + + // find iwinfo type + const char *if_type = iwinfo_type(stats_if_name); + const struct iwinfo_ops *winfo_ops = iwinfo_backend_by_name(if_type); + + if(0 != winfo_ops->assoclist(stats_if_name, buf, &len)) + { + return false; + } + + assoc_client = (struct iwinfo_assoclist_entry *)buf; + + LOGN("%s:%d radiocfg.ifname.%s len.%d", __func__, __LINE__, radio_cfg->if_name, len); + + //add a for loop to traverse through the lists + for(int i = 0; i < len; i += sizeof(struct iwinfo_assoclist_entry)) + { + //do all the copy stuff + client_entry = target_client_record_alloc(); + client_entry->info.type = radio_type; + memcpy(client_entry->info.mac, assoc_client->mac, sizeof(assoc_client->mac)); + memcpy(client_entry->info.ifname, radio_cfg->if_name, sizeof(radio_cfg->if_name)); + client_entry->stats.bytes_tx = assoc_client->tx_bytes; + client_entry->stats.bytes_rx = assoc_client->rx_bytes; + client_entry->stats.rssi = assoc_client->signal; + client_entry->stats.rate_tx = assoc_client->tx_rate.rate; + client_entry->stats.rate_rx = assoc_client->tx_rate.rate; + + ds_dlist_insert_tail(client_list, client_entry); + + LOGN("%s:%d mac.%02x:%02x:%02x:%02x:%02x:%02x", __func__, __LINE__, + assoc_client->mac[0], + assoc_client->mac[1], + assoc_client->mac[2], + assoc_client->mac[3], + assoc_client->mac[4], + assoc_client->mac[5]); + //move to next client + assoc_client++; + } + + (*client_cb)(client_list, client_ctx, true); + + return true; +} + +bool target_stats_clients_convert( + radio_entry_t *radio_cfg, + target_client_record_t *data_new, + target_client_record_t *data_old, + dpp_client_record_t *client_record) +{ + memcpy(client_record->info.mac, data_new->info.mac, sizeof(data_new->info.mac)); + + client_record->stats.bytes_tx = data_new->stats.bytes_tx; + client_record->stats.bytes_rx = data_new->stats.bytes_rx; + client_record->stats.rssi = data_new->stats.rssi; + client_record->stats.rate_tx = data_new->stats.rate_tx; + client_record->stats.rate_rx = data_new->stats.rate_rx; + + return true; +} + + +/****************************************************************************** + * SURVEY definitions + *****************************************************************************/ + +target_survey_record_t* target_survey_record_alloc() +{ + target_survey_record_t *record = NULL; + + record = malloc(sizeof(target_survey_record_t)); + if (record == NULL) return NULL; + + memset(record, 0, sizeof(target_survey_record_t)); + + return record; +} + +void target_survey_record_free(target_survey_record_t *result) +{ + if (result != NULL) + { + free(result); + } +} + +bool target_stats_survey_get( + radio_entry_t *radio_cfg, + uint32_t *chan_list, + uint32_t chan_num, + radio_scan_type_t scan_type, + target_stats_survey_cb_t *survey_cb, + ds_dlist_t *survey_list, + void *survey_ctx) +{ + target_survey_record_t *survey_record; + + survey_record = target_survey_record_alloc(); + survey_record->info.chan = 1; + ds_dlist_insert_tail(survey_list, survey_record); + + (*survey_cb)(survey_list, survey_ctx, true); + + return true; +} + +bool target_stats_survey_convert( + radio_entry_t *radio_cfg, + radio_scan_type_t scan_type, + target_survey_record_t *data_new, + target_survey_record_t *data_old, + dpp_survey_record_t *survey_record) +{ + survey_record->chan_tx = 30; + survey_record->chan_self = 30; + survey_record->chan_rx = 40; + survey_record->chan_busy_ext = 50; + survey_record->duration_ms = 60; + survey_record->chan_busy = 70; + + return true; +} + + +/****************************************************************************** + * NEIGHBORS definitions + *****************************************************************************/ + +static uint32_t channel_to_freq(uint32_t chan) +{ + uint32_t channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 144, 149, 153, 157, 161, 165}; + uint32_t freq[] = {2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 5180, 5200, 5220, 5240, 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5660, 5680, 5700, 5720, 5745, 5765, 5785, 5805, 5825 }; + + for(int i = 0; i<33; i++) + { + if(channel[i] == chan) + return freq[i]; + } + + return 0; +} + + +bool target_stats_scan_start( + radio_entry_t *radio_cfg, + uint32_t *chan_list, + uint32_t chan_num, + radio_scan_type_t scan_type, + int32_t dwell_time, + target_scan_cb_t *scan_cb, + void *scan_ctx) +{ + + char command[64]; + uint32_t frequency; + char scan_if_name[15]; + memset(command, 0, strlen(command)); + memset(scan_if_name, '\0', strlen(scan_if_name)); + //sprintf(command,"iw %s scan duration %d", radio_cfg->if_name, dwell_time); + //sprintf(command,"iw wlan0 scan duration 30"); + + if(!target_map_cloud_to_iw(radio_cfg->if_name, scan_if_name, sizeof(scan_if_name))) + { + return false; + } + + frequency = channel_to_freq(chan_list[0]); + sprintf(command,"iw %s scan duration 30 freq %d", scan_if_name, frequency); + LOGN("Freq: %d %d", frequency, chan_list[0]); + LOGN("scanning command : %s", command); + LOGN("channel num: %d", chan_num); + LOGN("scan_type : %d", scan_type); + if(system(command) == -1) + { + (*scan_cb)(scan_ctx, false); + LOGN("SCAN FAILED"); + return false; + } + + (*scan_cb)(scan_ctx, true); + + return true; +} + +bool target_stats_scan_stop( + radio_entry_t *radio_cfg, + radio_scan_type_t scan_type) +{ + char command[64]; + char scan_if_name[15]; + + memset(scan_if_name, '\0', strlen(scan_if_name)); + memset(command, 0, strlen(command)); + + if(!target_map_cloud_to_iw(radio_cfg->if_name, scan_if_name, sizeof(scan_if_name))) + { + return false; + } + + sprintf(command,"iw %s scan abort", scan_if_name); + LOGN("stop scan command : %s", command); + + if(system(command) == -1) + { + return false; + } + + return true; +} + +bool target_stats_scan_get( + radio_entry_t *radio_cfg, + uint32_t *chan_list, + uint32_t chan_num, + radio_scan_type_t scan_type, + dpp_neighbor_report_data_t *scan_results) +{ + char command[128]; + FILE *fp=NULL; + long int fsize; + char *buffer=NULL; + char *tmp=NULL; + char sig[4]; + char lastseen[12]; + char ssid[32]; + //char channwidth[4]; + char TSF[20]; + char scan_if_name[15]; + + memset(scan_if_name, '\0', strlen(scan_if_name)); + memset(command, 0, strlen(command)); + // sprintf(command,"iw %s scan dump > /tmp/scan%s.dump", radio_cfg->if_name, radio_cfg->if_name); + // LOGN("dump scan command : %s", command); + + if(!target_map_cloud_to_iw(radio_cfg->if_name, scan_if_name, sizeof(scan_if_name))) + { + return false; + } + + sprintf(command,"iw %s scan dump > /tmp/scan.dump", scan_if_name); + LOGN("dump scan command : %s", command); + if(system(command) != -1) + { + fp = fopen("/tmp/scan.dump","r"); + } + + if(fp == NULL) + return false; + + fseek(fp, 0, SEEK_END); + fsize = ftell(fp); + fseek(fp, 0, SEEK_SET); + buffer = malloc(fsize+1); + fread(buffer, 1, fsize, fp); + buffer[fsize] = 0; + fclose(fp); + tmp = buffer; + + while(strstr(tmp,"BSS") != NULL) + { + dpp_neighbor_record_list_t *neighbor; + + neighbor = dpp_neighbor_record_alloc(); + if (neighbor == NULL) return false; + + neighbor->entry.type = radio_cfg->type; + + tmp = strstr(tmp,"BSS"); + if(tmp!=NULL) + { + tmp = tmp + 4; + strncpy(neighbor->entry.bssid, tmp, 17); + } + + tmp = strstr(tmp,"TSF"); + if(tmp!=NULL) + { + tmp = tmp + 4; + sscanf(tmp, "%s", TSF); + neighbor->entry.tsf = atoll(TSF); + } + + tmp = strstr(tmp,"signal"); + if(tmp!=NULL) + { + tmp = tmp + 8; + strncpy(sig, tmp, 3); + neighbor->entry.sig = atoi(sig); + } + + tmp = strstr(tmp,"last seen"); + if(tmp!=NULL) + { + tmp = tmp + 11; + sscanf(tmp, "%s", lastseen); + neighbor->entry.lastseen = atoi(lastseen); + } + + tmp = strstr(tmp,"SSID"); + if(tmp!=NULL) + { + tmp = tmp + 6; + sscanf(tmp, "%s", ssid); + strncpy(neighbor->entry.ssid, ssid, 32); + } + /* In some cases channel width is missing so causes a crash + tmp = strstr(tmp,"STA channel width"); + if(tmp!=NULL) + { + tmp = tmp + 19; + sscanf(tmp, "%s", channwidth); + neighbor->entry.chanwidth = atoi(channwidth); + } + */ + neighbor->entry.chan = chan_list[0]; + + ds_dlist_insert_tail(&scan_results->list, neighbor); + } + + free(buffer); + + return true; +} + + +/****************************************************************************** + * DEVICE definitions + *****************************************************************************/ + +bool target_stats_device_temp_get( + radio_entry_t *radio_cfg, + dpp_device_temp_t *temp_entry) +{ + int32_t temperature; + FILE *fp = NULL; + + if(strcmp(radio_cfg->if_name, "home-ap-24") == 0) + { + fp = fopen("/sys/class/hwmon/hwmon1/temp1_input","r"); + } + else if(strcmp(radio_cfg->if_name, "home-ap-l50") == 0) + { + fp = fopen("/sys/class/hwmon/hwmon2/temp1_input","r"); + } + else if(strcmp(radio_cfg->if_name, "home-ap-u50") == 0) + { + fp = fopen("/sys/class/hwmon/hwmon0/temp1_input","r"); + } + + if(fp==NULL) + { + LOG(ERR,"Failed to open temp input files"); + return false; + } + + if(fscanf(fp,"%d",&temperature) == EOF) + { + LOG(ERR,"Temperature reading failed"); + fclose(fp); + return false; + } + + LOGN("temperature : %d", temperature); + + fclose(fp); + temp_entry->type = radio_cfg->type; + temp_entry->value = (temperature/1000); + + return true; +} + +bool target_stats_device_txchainmask_get( + radio_entry_t *radio_cfg, + dpp_device_txchainmask_t *txchainmask_entry) +{ + txchainmask_entry->type = radio_cfg->type; + txchainmask_entry->value = 2; + + return true; +} + +bool target_stats_device_fanrpm_get(uint32_t *fan_rpm) +{ + return true; +} + +/****************************************************************************** + * CAPACITY definitions + *****************************************************************************/ + +bool target_stats_capacity_enable(radio_entry_t *radio_cfg, bool enabled) +{ + return true; +} + +bool target_stats_capacity_get( + radio_entry_t *radio_cfg, + target_capacity_data_t *capacity_new) +{ + return true; +} + +bool target_stats_capacity_convert( + target_capacity_data_t *capacity_new, + target_capacity_data_t *capacity_old, + dpp_capacity_record_t *capacity_entry) +{ + return true; +} + diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/target.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/target.c new file mode 100644 index 000000000..a72eca699 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/target.c @@ -0,0 +1,135 @@ +/* +Copyright (c) 2017, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "evsched.h" +#include "os.h" +#include "os_nif.h" +#include "log.h" +#include "const.h" + +#include "target.h" + +struct ev_loop *wifihal_evloop = NULL; + +/****************************************************************************** + * TARGET definitions + *****************************************************************************/ + +bool target_ready(struct ev_loop *loop) +{ + wifihal_evloop = loop; + return true; +} + +bool target_init(target_init_opt_t opt, struct ev_loop *loop) +{ +#if 0 + if (!target_map_ifname_init()) + { + LOGE("Target init failed to initialize interface mapping"); + return false; + } +#endif + + wifihal_evloop = loop; + + switch (opt) + { + case TARGET_INIT_MGR_SM: + break; + + case TARGET_INIT_MGR_WM: + if (evsched_init(loop) == false) + { + LOGE("Initializing WM " + "(Failed to initialize EVSCHED)"); + return -1; + } + +// sync_init(SYNC_MGR_WM, NULL); + break; + + case TARGET_INIT_MGR_CM: +// sync_init(SYNC_MGR_CM, cloud_config_mode_init); + break; + + case TARGET_INIT_MGR_BM: + break; + + default: + break; + } + + return true; +} + +bool target_close(target_init_opt_t opt, struct ev_loop *loop) +{ + switch (opt) + { + case TARGET_INIT_MGR_WM: +// sync_cleanup(); + /* fall through */ + + case TARGET_INIT_MGR_SM: + break; + + default: + break; + } + + target_map_close(); + + return true; +} +#if 0 +const char* target_persistent_storage_dir(void) +{ + return TARGET_PERSISTENT_STORAGE; +} + +const char* target_scripts_dir(void) +{ + return TARGET_SCRIPTS_PATH; +} + +const char* target_tools_dir(void) +{ + return TARGET_TOOLS_PATH; +} + +const char* target_bin_dir(void) +{ + return TARGET_BIN_PATH; +} + +const char* target_speedtest_dir(void) +{ + return target_tools_dir(); +} +#endif diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/uci_helper.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/uci_helper.c new file mode 100755 index 000000000..51fe1be3a --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/uci_helper.c @@ -0,0 +1,1079 @@ +#include +#include "log.h" +#include "uci_helper.h" +#include "iwinfo.h" + +static int g_nRadios = -1; +static int g_nVIFs = -1; + +int uci_read(char* type, char* section, int section_index, char* option, char* result, size_t result_len) +{ + struct uci_ptr ptr; + struct uci_context *ctx; + char uci_cmd[80]; + int rc; + + if (!result) return UCI_ERR_MEM; + if (!result_len) return UCI_ERR_MEM; + + snprintf(uci_cmd,sizeof(uci_cmd),"%s.@%s[%d].%s", type, section, section_index, option); + LOGD("UCI command read: %s", uci_cmd ); + + ctx = uci_alloc_context(); + if (!ctx) return false; + + if ((rc = uci_lookup_ptr(ctx, &ptr, uci_cmd, true)) != UCI_OK || + (ptr.o == NULL || ptr.o->v.string == NULL)) + { + LOGN("UCI read %s.@%s[%d].%s failed: %d", type, section, section_index, option, rc); + uci_free_context(ctx); + return UCI_ERR_NOTFOUND; + } + + if (ptr.flags & UCI_LOOKUP_COMPLETE) + { + strncpy(result, ptr.o->v.string, result_len); + } else { + LOGN("UCI read %s.@%s[%d].%s not complete: %d", type, section, section_index, option, rc); + } + + uci_free_context(ctx); + return rc; +} + +int uci_read_name(char* type, char* section, int section_index, char * option, char* result, size_t result_len) +{ + struct uci_ptr ptr; + struct uci_context *ctx; + char uci_cmd[80]; + int rc; + + if (!result) return UCI_ERR_MEM; + if (!result_len) return UCI_ERR_MEM; + + snprintf(uci_cmd,sizeof(uci_cmd),"%s.@%s[%d].%s", type, section, section_index, option); + LOGD("UCI command read name %s", uci_cmd ); + + ctx = uci_alloc_context(); + if (!ctx) return false; + + if ((rc = uci_lookup_ptr(ctx, &ptr, uci_cmd, true)) != UCI_OK || + (ptr.o == NULL || ptr.o->v.string == NULL)) + { + LOGN("UCI read name %s.@%s[%d].%s failed: %d", type, section, section_index, option, rc); + uci_free_context(ctx); + return UCI_ERR_NOTFOUND; + } + + if (ptr.flags & UCI_LOOKUP_COMPLETE) + { + strncpy(result, ptr.s->e.name, result_len); + LOGN("UCI section name: %s", result ); + } else { + LOGN("UCI section name lookup not COMPLETE"); + } + + uci_free_context(ctx); + return rc; +} + +bool uci_write(char* type, char* section, int section_index, char * option, char *uci_value) +{ + struct uci_ptr ptr; + struct uci_context *ctx; + char uci_cmd[80]; + int rc; + + if (!uci_value) return UCI_ERR_MEM; + + snprintf(uci_cmd,sizeof(uci_cmd),"%s.@%s[%d].%s", type, section, section_index, option); + LOGN("UCI command write: %s value: %s", uci_cmd, uci_value ); + + ctx = uci_alloc_context(); + if (!ctx) return false; + + if ((rc = uci_lookup_ptr(ctx, &ptr, uci_cmd, true)) != UCI_OK || + (ptr.o == NULL || ptr.o->v.string == NULL)) + { + /* Handle new option creation case */ + ptr.option = option; + } + + ptr.value = uci_value; + + if ((rc = uci_set(ctx, &ptr)) != UCI_OK) + { + LOGN("UCI write %s.@%s[%d].%s error: %d", type, section, section_index, option, rc); + uci_free_context(ctx); + return false; + } + + // TODO: Might want to put commit in its own function + if ((rc = uci_commit(ctx, &ptr.p, false)) != UCI_OK) + { + LOGN("UCI write %s.@%s[%d].%s commit error: %d", type, section, section_index, option, rc); + uci_free_context(ctx); + return false; + } + + uci_free_context(ctx); + return true; +} + +int uci_remove(char* type, char* section, int section_index, char* option) +{ + struct uci_ptr ptr; + struct uci_context *ctx; + char uci_cmd[80]; + int rc; + + snprintf(uci_cmd,sizeof(uci_cmd),"%s.@%s[%d].%s", type, section, section_index, option); + LOGD("UCI command remove: %s", uci_cmd ); + + ctx = uci_alloc_context(); + if (!ctx) return false; + + if ((rc = uci_lookup_ptr(ctx, &ptr, uci_cmd, true)) != UCI_OK || + (ptr.o == NULL || ptr.o->v.string == NULL)) + { + LOGN("UCI remove %s.@%s[%d].%s not found: %d", type, section, section_index, option, rc); + uci_free_context(ctx); + return UCI_OK; + } + + if (ptr.flags & UCI_LOOKUP_COMPLETE) + { + rc = uci_delete(ctx, &ptr); + } else { + LOGN("UCI lookup %s.@%s[%d].%s not complete: %d", type, section, section_index, option, rc); + } + + // TODO: Might want to put commit in its own function + if ((rc = uci_commit(ctx, &ptr.p, false)) != UCI_OK) + { + LOGN("UCI remove %s.@%s[%d].%s commit error: %d", type, section, section_index, option, rc); + uci_free_context(ctx); + return false; + } + + uci_free_context(ctx); + return rc; +} + +bool uci_add_write(char* type, char* section) +{ + struct uci_ptr ptr; + struct uci_context *ctx = NULL; + struct uci_package *pkg = NULL; + int rc = 0; + + ctx = uci_alloc_context(); + if (!ctx) return false; + + if(UCI_OK != uci_load(ctx, type, &pkg)) + return false; + + if((pkg = uci_lookup_package(ctx, type)) != NULL) + { + ptr.p = pkg; + uci_add_section(ctx, pkg, section, &ptr.s); + } + + if ((rc = uci_commit(ctx, &ptr.p, false)) != UCI_OK) + { + LOGN("UCI Add %s.@%s commit error: %d", type, section, rc); + uci_free_context(ctx); + return false; + } + + uci_free_context(ctx); + + return true; + +} + +bool uci_write_nw(char* type, char* section, char * option, char *uci_value) +{ + struct uci_ptr ptr; + struct uci_context *ctx; + char uci_cmd[80]; + int rc; + + if (!uci_value) return UCI_ERR_MEM; + + if (!option) + snprintf(uci_cmd,sizeof(uci_cmd),"%s.%s", type, section); + else + snprintf(uci_cmd,sizeof(uci_cmd),"%s.%s.%s", type, section, option); + + LOGN("UCI command write: %s value: %s", uci_cmd, uci_value ); + + ctx = uci_alloc_context(); + if (!ctx) return false; + + if ((rc = uci_lookup_ptr(ctx, &ptr, uci_cmd, true)) != UCI_OK || + (ptr.o == NULL || ptr.o->v.string == NULL)) + { + /* Handle new option creation case */ + ptr.option = option; + } + + ptr.value = uci_value; + + if ((rc = uci_set(ctx, &ptr)) != UCI_OK) + { + LOGN("UCI write %s.%s.%s error: %d", type, section, option, rc); + uci_free_context(ctx); + return false; + } + + // TODO: Might want to put commit in its own function + if ((rc = uci_commit(ctx, &ptr.p, false)) != UCI_OK) + { + LOGN("UCI write %s.%s.%s commit error: %d", type, section, option, rc); + uci_free_context(ctx); + return false; + } + + uci_free_context(ctx); + return true; +} + +/* + * WiFi UCI interface - definitions + */ + +#define WIFI_TYPE "wireless" +#define WIFI_RADIO_SECTION "wifi-device" +#define WIFI_VIF_SECTION "wifi-iface" + +#define NETWORK_TYPE "network" +#define NETWORK_IFACE_SECTION "interface" + +/* + * WiFi Radio UCI interface + */ + +int wifi_getRadioNumberOfEntries( int *numberOfEntries) +{ + int rnum=0; + char buf[20]; + + if (g_nRadios == -1) { + while ((UCI_OK == uci_read_name(WIFI_TYPE, WIFI_RADIO_SECTION, rnum, "type", buf, sizeof(buf))) && (rnum < 8)) + { + rnum++; + } + g_nRadios = rnum; + } + *numberOfEntries = g_nRadios; + return UCI_OK; +} + +int wifi_getRadioIfName(int radio_idx, char *radio_ifname, size_t radio_ifname_len) +{ + bool rc; + char if_name[128]; + memset(if_name, 0, sizeof(if_name)); + rc = uci_read_name(WIFI_TYPE, WIFI_RADIO_SECTION, radio_idx, "type", if_name, sizeof(if_name)); + if (rc == UCI_OK) + { + strncpy(radio_ifname, target_unmap_ifname(if_name), radio_ifname_len); + } + return rc; +} + +int wifi_getRadioChannel(int radio_idx, int *channel) +{ + int rc; + char buf[20]; + + rc = uci_read(WIFI_TYPE, WIFI_RADIO_SECTION, radio_idx, "channel", buf, 20); + if (rc == UCI_OK ) + { + *channel = strtol(buf,NULL,10); + } + return rc; +} + +int wifi_getRadioEnable(int radio_idx, bool *enabled ) +{ + int rc; + char result[20]; + + *enabled = true; + rc = uci_read(WIFI_TYPE, WIFI_RADIO_SECTION, radio_idx, "disabled", result, 20); + if (( rc == UCI_OK ) && (strcmp(result,"1") == 0)) + { + *enabled = false; + } + return UCI_OK; +} + +int wifi_getRadioTxPower(int radio_idx, int *txpower ) +{ + int rc; + char buf[20]; + + rc = uci_read(WIFI_TYPE, WIFI_RADIO_SECTION, radio_idx, "txpower", buf, 20); + if (rc == UCI_OK ) + { + *txpower = strtol(buf,NULL,10); + } + return rc; +} + +int wifi_getRadioBeaconInterval(int radio_idx, int *beacon_int) +{ + int rc; + char buf[20]; + + rc = uci_read(WIFI_TYPE, WIFI_RADIO_SECTION, radio_idx, "beacon_int", buf, 20); + if (rc == UCI_OK ) + { + *beacon_int = strtol(buf,NULL,10); + } + return rc; +} + +int wifi_getTxChainMask(int radioIndex, int *txChainMask) +{ + char command[64]; + FILE *fp = NULL; + int fsize = 0; + char *buffer=NULL; + char *point=NULL; + + memset(command, 0, 64); + + sprintf(command,"iw phy%d info | grep 'Available Antennas' > /tmp/antennainfo.txt", radioIndex); + + if(system(command) == -1) + { + return false; + } + + fp = fopen("/tmp/antennainfo.txt","r"); + + if(fp != NULL) + { + fseek(fp, 0, SEEK_END); + fsize = ftell(fp); + fseek(fp, 0, SEEK_SET); + buffer = malloc(fsize+1); + fread(buffer, 1, fsize, fp); + buffer[fsize] = 0; + fclose(fp); + + point = strstr(buffer, "0x"); + point = point + 2; + sscanf(point, "%d", txChainMask); + + return true; + } + + return false; +} + +int wifi_getRadioAllowedChannel(int radioIndex, int *allowedChannelList, int *allowedChannelListLen) +{ + + char radio_if_name[6]; + char buf[IWINFO_BUFSIZE]; + int buflen; + int numberOfChannels=0; + int rc=false; + struct iwinfo_freqlist_entry *freq_list = NULL; + + memset(radio_if_name, 0, sizeof(radio_if_name)); + + if(radioIndex == 0) + { + strncpy(radio_if_name, "phy0", sizeof(radio_if_name)); + } + else if(radioIndex == 1) + { + strncpy(radio_if_name, "phy1", sizeof(radio_if_name)); + } + else if(radioIndex == 2) + { + strncpy(radio_if_name, "phy2", sizeof(radio_if_name)); + } + else + { + return rc; + } + + // find iwinfo type + const char *if_type = iwinfo_type(radio_if_name); + const struct iwinfo_ops *winfo_ops = iwinfo_backend_by_name(if_type); + + if(0 != winfo_ops->freqlist(radio_if_name, buf, &buflen)) + { + return rc; + } + + freq_list = (struct iwinfo_freqlist_entry *)buf; + + for(int i = 0; i < buflen; i += sizeof(struct iwinfo_freqlist_entry)) + { + allowedChannelList[numberOfChannels] = freq_list->channel; + + LOGN("iwinfo :radio channel: %d", freq_list->channel); + LOGN("iwinfo : state: radio channel: %d", allowedChannelList[numberOfChannels]); + freq_list++; + numberOfChannels++; + } + + *allowedChannelListLen = numberOfChannels; + + if(numberOfChannels != 0) + rc = true; + + return rc; + +} + +static eFreqBand freqBand_capture[UCI_MAX_RADIOS] = {eFreqBand_5GU,eFreqBand_24G,eFreqBand_5GL}; + +int wifi_getRadioFreqBand(int *allowedChannels, int numberOfChannels, char *freq_band) +{ + int rc = false; + + if(numberOfChannels == 0) + return rc; + + if(allowedChannels[0] >= 1 && allowedChannels[numberOfChannels -1] <= 11){ + strcpy(freq_band, "2.4G"); + rc = true; + } + if(allowedChannels[0] >= 36 && allowedChannels[numberOfChannels -1] <= 64){ + strcpy(freq_band, "5GL"); + rc = true; + } + if(allowedChannels[0] >= 100 && allowedChannels[numberOfChannels -1] <= 165){ + strcpy(freq_band, "5GU"); + rc = true; + } + if(allowedChannels[0] <= 64 && allowedChannels[numberOfChannels -1] >= 100){ + strcpy(freq_band, "5G"); + rc = true; + } + + return rc; +} +int wifi_getRadioMacaddress(int radio_idx, char *mac) +{ + int rc = UCI_OK; + FILE *fd=NULL; + char buff[18]; + char file_name[30]; + if(radio_idx >= UCI_MAX_RADIOS) + { + LOG(ERR,"Maximum Radios Exceeded"); + return rc = UCI_ERR_UNKNOWN; + } + snprintf(file_name,sizeof(file_name),"/sys/class/net/wlan%d/address",radio_idx); + fd=fopen(file_name,"r"); + if(fd == NULL) + { + LOG(ERR,"Failed to open mac address input files"); + return rc=UCI_ERR_UNKNOWN; + } + if(fscanf(fd,"%s",buff) == EOF) + { + LOG(ERR,"Mac Address reading failed"); + fclose(fd); + return rc = UCI_ERR_UNKNOWN; + } + fclose(fd); + strcpy(mac,buff); + return rc; +} + +int wifi_getRadioHtMode(int radio_idx, char *ht_mode) +{ + int rc = true; + char htmode[8]; + + rc = uci_read(WIFI_TYPE, WIFI_RADIO_SECTION, radio_idx, "htmode", htmode, 8); + if (rc == UCI_OK ) + { + if (!strcmp(htmode, HTMODE_noht)) { + strcpy(ht_mode, "HT20" ); /* should be ignored based on hw_mode */ + } else if (!strcmp(htmode, HTMODE_ht20)) { + strcpy(ht_mode, "HT20"); + } else if (!strcmp(htmode, HTMODE_ht40m)) { + strcpy(ht_mode, "HT40-"); + } else if (!strcmp(htmode, HTMODE_ht40p)) { + strcpy(ht_mode, "HT40+"); + } else if (!strcmp(htmode, HTMODE_ht40)) { + strcpy(ht_mode, "HT40"); + } else if (!strcmp(htmode, HTMODE_vht20)) { + strcpy(ht_mode, "HT20"); + } else if (!strcmp(htmode, HTMODE_vht40)) { + strcpy(ht_mode, "HT40"); + } else if (!strcmp(htmode, HTMODE_vht80)) { + strcpy(ht_mode, "HT80"); + } else if (!strcmp(htmode, HTMODE_vht160)) { + strcpy(ht_mode, "HT160"); + } + } else { + rc = false; + } + return rc; +} + +int wifi_getRadioHwMode(int radio_idx, char * hw_mode) +{ + int rc1, rc2; + char htmode[8]; + char hwmode[6]; + + rc1 = uci_read(WIFI_TYPE, WIFI_RADIO_SECTION, radio_idx, "htmode", htmode, 8); + rc2 = uci_read(WIFI_TYPE, WIFI_RADIO_SECTION, radio_idx, "hwmode", hwmode, 6); + if ((rc1 == UCI_OK ) && (rc2 == UCI_OK )) + { + if (!strcmp(htmode, HTMODE_noht)) { + if (!strcmp(hwmode, HWMODE_11a)) { + strcpy(hw_mode, "11a"); + } else if (!strcmp(hwmode, HWMODE_11b)) { + strcpy(hw_mode, "11b"); + } else if (!strcmp(hwmode, HWMODE_11g)) { + strcpy(hw_mode, "11g"); + } else { + rc1 = UCI_ERR_UNKNOWN; + } + } else if ((!strcmp(htmode, HTMODE_ht20)) || (!strcmp(htmode, HTMODE_ht40m)) || + (!strcmp(htmode, HTMODE_ht40p)) || (!strcmp(htmode, HTMODE_ht40))) { + strcpy(hw_mode, "11n"); + } else if ((!strcmp(htmode, HTMODE_vht20)) || (!strcmp(htmode, HTMODE_vht40)) || + (!strcmp(htmode, HTMODE_vht80)) || (!strcmp(htmode, HTMODE_vht160))) { + strcpy(hw_mode, "11ac"); + } else { + rc1 = UCI_ERR_UNKNOWN; + } + } + return rc1; +} + + +bool wifi_setRadioChannel(int radioIndex, int channel, const char *ht_mode) +{ + char str[4]; + + sprintf(str, "%d", channel); + return uci_write(WIFI_TYPE, WIFI_RADIO_SECTION, radioIndex, "channel", str); +} + +bool wifi_setRadioEnabled(int radioIndex, bool enabled) +{ + char disabled[4]; + + if (enabled) { + sprintf(disabled, "%d", 0); + } else { + sprintf(disabled, "%d", 1); + } + + return uci_write(WIFI_TYPE, WIFI_RADIO_SECTION, radioIndex, "disabled", disabled); +} + +bool wifi_setRadioTxPower(int radioIndex, int txpower ) +{ + char str[4]; + + sprintf(str, "%d", txpower); + return uci_write(WIFI_TYPE, WIFI_RADIO_SECTION, radioIndex, "txpower", str); +} + +bool wifi_setRadioBeaconInterval(int radioIndex, int beacon_int) +{ + char str[4]; + + sprintf(str, "%d", beacon_int); + return uci_write(WIFI_TYPE, WIFI_RADIO_SECTION, radioIndex, "beacon_int", str); +} + +bool wifi_setRadioModes(int radioIndex, const char *freq_band, const char *ht_mode, const char *hw_mode) +{ + char chanbw[4] = "20"; + char hwmode[4]; + char htmode[8]; + bool rc1, rc2, rc3; + + if (! strcmp(hw_mode, "11a")) { + strcpy(hwmode, HWMODE_11a); + strcpy(htmode, HTMODE_noht); + } else if (!strcmp(hw_mode, "11b")) { + strcpy(hwmode, HWMODE_11b); + strcpy(htmode, HTMODE_noht); + } else if (!strcmp(hw_mode, "11g")) { + strcpy(hwmode, HWMODE_11g); + strcpy(htmode, HTMODE_noht); + } else if (!strcmp(hw_mode, "11n")) { + if (!strcmp(freq_band, "2.4G")) { + strcpy(hwmode, HWMODE_11g); + } else { + strcpy(hwmode, HWMODE_11a); + } + if (!strcmp(ht_mode, "HT20")) { + strcpy(htmode, HTMODE_ht20); + } else if (!strcmp(ht_mode, "HT40-")) { + strcpy(htmode, HTMODE_ht40m); + } else if (!strcmp(ht_mode, "HT40+")) { + strcpy(htmode, HTMODE_ht40p); + } else if ((!strcmp(ht_mode, "HT40")) | (!strcmp(ht_mode, "HT80")) || (!strcmp(ht_mode, "HT160"))) { + strcpy(htmode, HTMODE_ht40); + } else { + return UCI_ERR_UNKNOWN; + } + } else if (!strcmp(hw_mode, "11ac")) { + strcpy(hwmode, HWMODE_11a); + if (!strcmp(ht_mode, "HT20")) { + strcpy(htmode, HTMODE_vht20); + } else if ((!strcmp(ht_mode, "HT40")) || (!strcmp(ht_mode, "HT40+")) || (!strcmp(ht_mode, "HT40-"))) { + strcpy(htmode, HTMODE_vht40); + } else if (!strcmp(ht_mode, "HT80")) { + strcpy(htmode, HTMODE_vht80); + } else if (!strcmp(ht_mode, "HT160")) { + strcpy(htmode, HTMODE_vht160); + } else { + return UCI_ERR_UNKNOWN; + } + } + + if (!strcmp(freq_band, "2.4G")) { + freqBand_capture[radioIndex] = eFreqBand_24G; + } else if (!strcmp(freq_band, "5G")) { + freqBand_capture[radioIndex] = eFreqBand_5G; + } else if (!strcmp(freq_band, "5GL")) { + freqBand_capture[radioIndex] = eFreqBand_5GL; + } else if (!strcmp(freq_band, "5GU")) { + freqBand_capture[radioIndex] = eFreqBand_5GU; + } + + rc1 = uci_write(WIFI_TYPE, WIFI_RADIO_SECTION, radioIndex,"chanbw", chanbw); + rc2 = uci_write(WIFI_TYPE, WIFI_RADIO_SECTION, radioIndex,"hwmode", hwmode); + rc3 = uci_write(WIFI_TYPE, WIFI_RADIO_SECTION, radioIndex,"htmode", htmode); + + return (rc1 && rc2 && rc3); +} + +/* + * SSID UCI interfaces + */ + +int wifi_getSSIDNumberOfEntries( int *numberOfEntries) +{ + int rnum=0; + char buf[20]; + int nVifMax = 24; + + if (g_nRadios > 0) nVifMax = g_nRadios * 8; + + if (g_nVIFs == -1) { + if (g_nRadios > 0) nVifMax = g_nRadios * 8; + + while ((UCI_OK == uci_read_name(WIFI_TYPE, WIFI_VIF_SECTION, rnum, "ssid", buf, sizeof(buf))) && (rnum < nVifMax)) + { + rnum++; + } + g_nVIFs = rnum; + } + *numberOfEntries = g_nVIFs; + return UCI_OK; +} + +int wifi_getVIFName(int ssid_index, char *ssid_ifname, size_t ssid_ifname_len) +{ + bool rc; + char if_name[128]; + memset(if_name, 0, sizeof(if_name)); + rc = uci_read_name(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ssid", if_name, sizeof(if_name)); + if (rc == UCI_OK) + { + strncpy(ssid_ifname, target_unmap_ifname(if_name), ssid_ifname_len); + } + return rc; +} + +int wifi_getSSIDName(int ssid_index, char *ssid_name, size_t ssid_name_len) +{ + return( uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ssid", ssid_name, ssid_name_len)); +} + +int wifi_getSSIDRadioIndex(int ssid_index, int *radio_index) +{ + int rc; + char radio_ifname[20]; + + rc = uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "device", radio_ifname, 20); + if (rc == UCI_OK ) + { + sscanf( radio_ifname, "radio%d", radio_index ); + } + return rc; +} + +int wifi_getSSIDRadioIfName(int ssid_index, char *radio_ifname, size_t radio_ifname_len) +{ + bool rc; + char if_name[128]; + memset(if_name, 0, sizeof(if_name)); + rc = uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "device", if_name, 20); + if (rc == UCI_OK) + { + strncpy(radio_ifname, target_unmap_ifname(if_name), radio_ifname_len); + } + return rc; +} + +int wifi_getSsidEnabled(int ssid_index, bool *enabled ) +{ + int rc; + char result[20]; + + *enabled = true; + rc = uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "disabled", result, 20); + if (( rc == UCI_OK ) && (strcmp(result,"1") == 0)) + { + *enabled = false; + } + return UCI_OK; +} + + +bool wifi_setSsidEnabled(int ssid_index, bool enabled) +{ + char val[4]; + + if (enabled) { + sprintf(val, "%d", 0); + } else { + sprintf(val, "%d", 1); + } + + LOGN("wifi_setSsidEnabled = %s", val); + + return uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "disabled", val); +} + +bool wifi_setFtMode(int ssid_index, + const struct schema_Wifi_VIF_Config *vconf) +{ + int rc; + char mobilityDdomain[5]; + char ft_psk[2]; + const char *encryption = SCHEMA_KEY_VAL(vconf->security, SCHEMA_CONSTS_SECURITY_ENCRYPT); + + if(vconf->ft_mobility_domain != 0 && (strcmp(encryption,OVSDB_SECURITY_ENCRYPTION_OPEN) !=0) ) + { + sprintf(mobilityDdomain, "%02x", vconf->ft_mobility_domain); + sprintf(ft_psk, "%d", vconf->ft_psk); + rc = uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ieee80211r", "1") && + uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "mobility_domain", mobilityDdomain) && + uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ft_psk_generate_local", ft_psk) && + uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ft_over_ds", "0") && + uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "reassociation_deadline", "1"); + } + else + { + rc = uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ieee80211r", "0"); + } + + return rc; +} + +int wifi_getApBridgeInfo(int ssid_index, char *bridge_info, char *tmp1, char *tmp2, size_t bridge_info_len) +{ + return( uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "network", bridge_info, bridge_info_len)); +} + +int wifi_getApIsolationEnable(int ssid_index, bool *enabled) +{ + int rc; + char result[20]; + + *enabled = false; + rc = uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "isolate", result, 20); + if (( rc == UCI_OK ) && (strcmp(result,"1") == 0)) + { + *enabled = true; + } + return UCI_OK; +} + +bool wifi_setApIsolationEnable(int ssid_index, bool enabled) +{ + char val[4]; + + if (enabled) { + sprintf(val, "%d", 0); + } else { + sprintf(val, "%d", 1); + } + + LOGN("wifi_setApIsolationEnable = %s", val); + + return uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "isolate", val); +} + +int wifi_getApSsidAdvertisementEnable(int ssid_index, bool *enabled) +{ + int rc; + char result[20]; + + *enabled = true; + rc = uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "hidden", result, 20); + if (( rc == UCI_OK ) && (strcmp(result,"1") == 0)) + { + *enabled = false; + } + return UCI_OK; +} + +bool wifi_setApSsidAdvertisementEnable(int ssid_index, bool enabled) +{ + char val[4]; + + if (enabled) { + sprintf(val, "%d", 0); + } else { + sprintf(val, "%d", 1); + } + + LOGN("wifi_setApSsidAdvertisementEnable = %s", val); + + return uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "hidden", val); +} + +int wifi_getBaseBSSID(int ssid_index,char *buf, size_t buf_len, int radio_idx) +{ + int rc=uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "bssid", buf, buf_len); + + if(UCI_OK != rc) + { + int rc = UCI_OK; + FILE *fd=NULL; + char addr[18]; + char file_name[30]; + + if(radio_idx >= UCI_MAX_RADIOS) + { + LOG(ERR,"Maximum Radios Exceeded"); + return rc = UCI_ERR_UNKNOWN; + } + snprintf(file_name,sizeof(file_name),"/sys/class/net/wlan%d/address",radio_idx); + fd=fopen(file_name,"r"); + + if(fd == NULL) + { + LOG(ERR,"Failed to open mac address input files"); + return rc=UCI_ERR_UNKNOWN; + } + + if(fscanf(fd,"%s",addr) == EOF) + { + LOG(ERR,"Mac Address reading failed"); + fclose(fd); + return rc = UCI_ERR_UNKNOWN; + } + fclose(fd); + strcpy(buf,addr); + return rc; + } + return rc; +} + +bool wifi_setSSIDName(int ssid_index, char* ssidName) +{ + return uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ssid", ssidName); +} + +bool wifi_setApSecurityModeEnabled(int ssid_index, + const struct schema_Wifi_VIF_Config *vconf) +{ + bool rc = true; + const char *encryption = SCHEMA_KEY_VAL(vconf->security, SCHEMA_CONSTS_SECURITY_ENCRYPT); + + if (strcmp(encryption, OVSDB_SECURITY_ENCRYPTION_OPEN) == 0) + { + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "encryption", "none"); + UCI_REMOVE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "key"); + UCI_REMOVE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ieee80211w"); + } + else if (strcmp(encryption, OVSDB_SECURITY_ENCRYPTION_WPA_PSK) == 0) + { + char key[128]; + const char *mode = SCHEMA_KEY_VAL(vconf->security, SCHEMA_CONSTS_SECURITY_MODE); + memset(key, 0, sizeof(key)); + snprintf(key, sizeof(key) - 1, "%s", (char *)SCHEMA_KEY_VAL(vconf->security, SCHEMA_CONSTS_SECURITY_KEY)); + + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "key", key); + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ieee80211w", "1"); + + if (strcmp(mode, OVSDB_SECURITY_MODE_WPA2) == 0) + { + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "encryption", "psk2"); + } + else if (strcmp(mode, OVSDB_SECURITY_MODE_WPA1) == 0) + { + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "encryption", "psk"); + } + else if (strcmp(mode, OVSDB_SECURITY_MODE_MIXED) == 0) + { + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "encryption", "psk-mixed"); + } + else + { + return false; + } + } + else if (strcmp(encryption, OVSDB_SECURITY_ENCRYPTION_WPA_EAP) == 0) + { + const char *mode = SCHEMA_KEY_VAL(vconf->security, SCHEMA_CONSTS_SECURITY_MODE); + + if (strcmp(mode, OVSDB_SECURITY_MODE_WPA2) == 0) + { + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "encryption", "wpa2"); + } + else if (strcmp(mode, OVSDB_SECURITY_MODE_WPA1) == 0) + { + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "encryption", "wpa"); + } + else if (strcmp(mode, OVSDB_SECURITY_MODE_MIXED) == 0) + { + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "encryption", "wpa-mixed"); + } + else + { + return false; + } + + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "server", + (char *)SCHEMA_KEY_VAL(vconf->security, SCHEMA_CONSTS_SECURITY_RADIUS_IP)); + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "port", + (char *)SCHEMA_KEY_VAL(vconf->security, SCHEMA_CONSTS_SECURITY_RADIUS_PORT)); + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "auth_secret", + (char *)SCHEMA_KEY_VAL(vconf->security, SCHEMA_CONSTS_SECURITY_RADIUS_SECRET)); + UCI_WRITE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "ieee80211w", "1"); + UCI_REMOVE(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "key"); + } + + return rc; +} + +bool wifi_getApSecurityModeEnabled(int ssid_index, char *buf, size_t buf_len) +{ + return(uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "encryption", buf, buf_len)); +} + +int wifi_getApSecurityKeyPassphrase(int ssid_index, char *buf, size_t buf_len) +{ + return(uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "key", buf, buf_len)); +} + +bool wifi_getApSecurityRadiusServer( + int ssid_index, char *radius_ip, char *radius_port, char *radius_secret) +{ + UCI_READ(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "server", radius_ip, UCI_BUFFER_SIZE); + UCI_READ(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "port", radius_port, UCI_BUFFER_SIZE); + UCI_READ(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "auth_secret", radius_secret, UCI_BUFFER_SIZE); + + return true; +} + + +bool wifi_setApBridgeInfo(int ssid_index, char *bridge_info) +{ + return( uci_write(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "network", bridge_info)); +} + +bool wifi_getApVlanId(int ssid_index, int *vlan_id) +{ + char result[10]; + char *p = NULL; + *vlan_id = 1; + + memset(result, 0, sizeof(result)); + uci_read(WIFI_TYPE, WIFI_VIF_SECTION, ssid_index, "network", result, 10); + + if ((p = strstr(result, "vlan")) != NULL) + { + long int v = strtol(&p[4], NULL, 10); + + *vlan_id = (int) v; + LOGN("wifi_getApVlanId: %d", *vlan_id); + return UCI_OK; + } + + return false; +} + +#define MAX_VLANS 200 +struct vlan_list +{ + int vlan[MAX_VLANS]; + int index; +} vlist; + +bool wifi_setApVlanNetwork(int ssid_index, int vlan_id) +{ + char tmp[10]; + char eth[10]; + char vlan[10]; + char vendor[128]; + int index = 0; + + if (vlan_id > 2) + { + for (index = 0; index < vlist.index; index++) + { + if (vlist.vlan[index] == vlan_id) + return true; + } + vlist.vlan[vlist.index++] = vlan_id; + + memset(vlan, 0, sizeof(vlan)); + snprintf(vlan, sizeof(vlan) - 1, "%d", vlan_id); + + LOGI("wifi_setApVlanNetwork = %d", vlan_id); + memset(tmp, 0, sizeof(tmp)); + snprintf(tmp, sizeof(tmp) - 1, "vlan%d", vlan_id); + + memset(eth, 0, sizeof(eth)); + if (target_platform_version_get(vendor, 128)) + { + if (!strncmp(vendor, "OPENWRT_ECW5410", 14) || + !strncmp(vendor, "OPENWRT_ECW5211", 14)) + snprintf(eth, sizeof(eth) - 1, "eth0.%d", vlan_id); + else if (!strncmp(vendor, "OPENWRT_EA8300", 14)) + snprintf(eth, sizeof(eth) - 1, "eth1.%d", vlan_id); + else if (!strncmp(vendor, "OPENWRT_AP2220", 14)) + snprintf(eth, sizeof(eth) - 1, "eth0.%d", vlan_id); + else + snprintf(eth, sizeof(eth) - 1, "eth1.%d", vlan_id); + } + uci_write_nw(NETWORK_TYPE, tmp, NULL, NETWORK_IFACE_SECTION); + uci_write_nw(NETWORK_TYPE, tmp, "type", "bridge"); + uci_write_nw(NETWORK_TYPE, tmp, "ifname", eth); + uci_write_nw(NETWORK_TYPE, tmp, "proto", "dhcp"); + + memset(vendor, 0, sizeof(vendor)); + + if (target_platform_version_get(vendor, 128)) + { + if (!strncmp(vendor, "OPENWRT_EA8300", 14)) + { + uci_add_write("network", "switch_vlan"); + uci_write("network", "switch_vlan", -1, "device", "switch0"); + uci_write("network", "switch_vlan", -1, "ports", "0t 5t"); + uci_write("network", "switch_vlan", -1, "vlan", vlan); + } + } + return wifi_setApBridgeInfo(ssid_index, tmp); + } + + return false; +} diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/vif.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/vif.c new file mode 100755 index 000000000..2f89fb095 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/vif.c @@ -0,0 +1,1176 @@ +/* +Copyright (c) 2017, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "const.h" +#include "target.h" +#include "evsched.h" +#include "uci_helper.h" + +#define MODULE_ID LOG_MODULE_ID_VIF +#define UCI_BUFFER_SIZE 80 + +typedef enum +{ + HW_MODE_11B = 0, + HW_MODE_11G, + HW_MODE_11A, + HW_MODE_11N, + HW_MODE_11AC +} hw_mode_t; + +#if 0 +static c_item_t map_hw_mode[] = +{ + C_ITEM_STR(HW_MODE_11B, "11b"), + C_ITEM_STR(HW_MODE_11G, "11g"), + C_ITEM_STR(HW_MODE_11A, "11a"), + C_ITEM_STR(HW_MODE_11N, "11n"), + C_ITEM_STR(HW_MODE_11AC, "11ac") +}; +#endif + +static c_item_t map_enable_disable[] = +{ + C_ITEM_STR(true, "enabled"), + C_ITEM_STR(false, "disabled") +}; + +#if 0 +#define ACL_BUF_SIZE 1024 + +enum +{ + WEXT_ACL_MODE_DISABLE = 0, + WEXT_ACL_MODE_WHITELIST, + WEXT_ACL_MODE_BLACKLIST, + WEXT_ACL_MODE_FLUSH +}; + +static c_item_t map_acl_modes[] = +{ + C_ITEM_STR(WEXT_ACL_MODE_DISABLE, "none"), + C_ITEM_STR(WEXT_ACL_MODE_WHITELIST, "whitelist"), + C_ITEM_STR(WEXT_ACL_MODE_BLACKLIST, "blacklist"), + C_ITEM_STR(WEXT_ACL_MODE_FLUSH, "flush") +}; +#endif +typedef enum +{ + SEC_NONE = 0, + SEC_WPA_PERSONAL, + SEC_WPA_ENTERPRISE, + SEC_WPA2_PERSONAL, + SEC_WPA2_ENTERPRISE, + SEC_WPA_WPA2_PERSONAL, + SEC_WPA_WPA2_ENTERPRISE +} sec_type_t; + +static c_item_t map_security[] = +{ + C_ITEM_STR(SEC_NONE, "none"), + C_ITEM_STR(SEC_WPA_PERSONAL, "psk"), + C_ITEM_STR(SEC_WPA_ENTERPRISE, "wpa"), + C_ITEM_STR(SEC_WPA2_PERSONAL, "psk2"), + C_ITEM_STR(SEC_WPA2_ENTERPRISE, "wpa2"), + C_ITEM_STR(SEC_WPA_WPA2_PERSONAL, "psk-mixed"), + C_ITEM_STR(SEC_WPA_WPA2_ENTERPRISE, "wpa-mixed") +}; + +#if 0 +static bool acl_to_state( + INT ssid_index, + char *ssid_ifname, + struct schema_Wifi_VIF_State *vstate) +{ + char acl_buf[ACL_BUF_SIZE]; + char *p; + char *s = NULL; + INT acl_mode; + INT status = RETURN_ERR; + INT i; + + status = wifi_getApMacAddressControlMode(ssid_index, &acl_mode); + if (status != RETURN_OK) + { + LOGE("%s: Failed to get ACL mode", ssid_ifname); + return false; + } + + STRSCPY(vstate->mac_list_type, + c_get_str_by_key(map_acl_modes, acl_mode)); + if (strlen(vstate->mac_list_type) == 0) + { + LOGE("%s: Unknown ACL mode (%u)", ssid_ifname, acl_mode); + return false; + } + vstate->mac_list_type_exists = true; + + status = wifi_getApAclDevices(ssid_index, acl_buf, sizeof(acl_buf)); + if (status == RETURN_OK) + { + if ((strlen(acl_buf) + 2) > sizeof(acl_buf)) + { + LOGE("%s: ACL List too long for buffer size!", ssid_ifname); + return false; + } + strcat(acl_buf, ","); + + i = 0; + p = strtok_r(acl_buf, ",\n", &s); + while (p) + { + if (strlen(p) == 0) + { + break; + } + else if (strlen(p) != 17) + { + LOGW("%s: ACL has malformed MAC \"%s\"", ssid_ifname, p); + } + else + { + STRSCPY(vstate->mac_list[i], p); + i++; + } + + p = strtok_r(NULL, ",\n", &s); + } + vstate->mac_list_len = i; + } + + return true; +} + +static bool acl_apply( + INT ssid_index, + const char *ssid_ifname, + const struct schema_Wifi_VIF_Config *vconf) +{ + c_item_t *citem; + INT acl_mode; + INT ret; + INT i; + + // !!! XXX: Cannot touch ACL for home interfaces, since they are currently + // used for band steering. + if (!strncmp(ssid_ifname, "home-ap-", 8)) + { + // Don't touch ACL + return true; + } + + // Set ACL type from mac_list_type + if (vconf->mac_list_type_exists) + { + if (!(citem = c_get_item_by_str(map_acl_modes, vconf->mac_list_type))) + { + LOGE("%s: Failed to set ACL type (mac_list_type '%s' unknown)", + ssid_ifname, vconf->mac_list_type); + return false; + } + acl_mode = (INT)citem->key; + + ret = wifi_setApMacAddressControlMode(ssid_index, acl_mode); + LOGD("[WIFI_HAL SET] wifi_setApMacAddressControlMode(%d, %d) = %d", + ssid_index, acl_mode, ret); + if (ret != RETURN_OK) + { + LOGE("%s: Failed to set ACL Mode (%d)", ssid_ifname, acl_mode); + return false; + } + } + + if (vconf->mac_list_len > 0) + { + // First, flush the table + ret = wifi_delApAclDevices(ssid_index); + LOGD("[WIFI_HAL SET] wifi_delApAclDevices(%d) = %d", + ssid_index, ret); + + // Set ACL list + for (i = 0; i < vconf->mac_list_len; i++) + { + ret = wifi_addApAclDevice(ssid_index, (char *)vconf->mac_list[i]); + LOGD("[WIFI_HAL SET] wifi_addApAclDevice(%d, \"%s\") = %d", + ssid_index, vconf->mac_list[i], ret); + if (ret != RETURN_OK) + { + LOGW("%s: Failed to add \"%s\" to ACL", ssid_ifname, vconf->mac_list[i]); + } + } + } + + return true; +} + + +static const char* security_conf_find_by_key( + const struct schema_Wifi_VIF_Config *vconf, + char *key) +{ + int i; + + for (i = 0; i < vconf->security_len; i++) + { + if (!strcmp(vconf->security_keys[i], key)) + { + return vconf->security[i]; + } + } + + return NULL; +} +#endif +static int set_security_key_value( + struct schema_Wifi_VIF_State *vstate, + int index, + const char *key, + const char *value) +{ + STRSCPY(vstate->security_keys[index], key); + STRSCPY(vstate->security[index], value); + + index += 1; + vstate->security_len = index; + + return index; +} + +static bool set_personal_credentials( + struct schema_Wifi_VIF_State *vstate, + int index, + int ssid_index) +{ + int ret; + char buf[UCI_BUFFER_SIZE]; + + memset(buf, 0, sizeof(buf)); + ret = wifi_getApSecurityKeyPassphrase(ssid_index, buf, sizeof(buf)); + if (ret != UCI_OK) + { + LOGE("%s: Failed to retrieve security passphrase", vstate->if_name); + return false; + } + + if (strlen(buf) == 0) + { + LOGW("%s: wifi_getApSecurityKeyPassphrase returned empty SSID string", vstate->if_name); + } + + set_security_key_value(vstate, index, OVSDB_SECURITY_KEY, buf); + + // TODO: We temporary removed multi-psk support from generic RDK platform. + // The multi-psk support will be added back when proper + // Wifi HAL API is created. We don't support direct hostapd-based + // multi-psk (it should be handled within the vendor layer). + + return true; +} + +static bool set_enterprise_credentials( + struct schema_Wifi_VIF_State *vstate, + int index, + int ssid_index) +{ + char radius_ip[UCI_BUFFER_SIZE]; + char radius_secret[UCI_BUFFER_SIZE]; + char radius_port_str[UCI_BUFFER_SIZE]; + + memset(radius_ip, 0, sizeof(radius_ip)); + memset(radius_secret, 0, sizeof(radius_secret)); + memset(radius_port_str, 0, sizeof(radius_port_str)); + + if (!wifi_getApSecurityRadiusServer(ssid_index, radius_ip, radius_port_str, radius_secret)) + { + LOGE("%s: Failed to retrieve radius settings", vstate->if_name); + return false; + } + + index = set_security_key_value(vstate, index, OVSDB_SECURITY_RADIUS_SERVER_IP, radius_ip); + + index = set_security_key_value(vstate, index, OVSDB_SECURITY_RADIUS_SERVER_PORT, radius_port_str); + + set_security_key_value(vstate, index, OVSDB_SECURITY_RADIUS_SERVER_SECRET, radius_secret); + + return true; +} + +static bool set_enc_mode( + struct schema_Wifi_VIF_State *vstate, + int ssid_index, + const char *encryption, + const char *mode, + bool enterprise) +{ + int index = 0; + + index = set_security_key_value(vstate, index, OVSDB_SECURITY_ENCRYPTION, encryption); + + index = set_security_key_value(vstate, index, OVSDB_SECURITY_MODE, mode); + + if (enterprise) + { + return set_enterprise_credentials(vstate, index, ssid_index); + } + + return set_personal_credentials(vstate, index, ssid_index); +} + +static bool security_to_state( + int ssid_index, + char *ssid_ifname, + struct schema_Wifi_VIF_State *vstate) +{ + sec_type_t stype; + c_item_t *citem; + char buf[UCI_BUFFER_SIZE]; + int ret; + + memset(buf, 0, sizeof(buf)); + ret = wifi_getApSecurityModeEnabled(ssid_index, buf, sizeof(buf)); + if (ret != UCI_OK) + { + LOGE("%s: Failed to get security mode", ssid_ifname); + return false; + } + + if (!(citem = c_get_item_by_str(map_security, buf))) + { + LOGE("%s: Failed to decode security mode (%s)", ssid_ifname, buf); + return false; + } + stype = (sec_type_t)citem->key; + + switch (stype) + { + case SEC_NONE: + set_security_key_value(vstate, 0, OVSDB_SECURITY_ENCRYPTION, OVSDB_SECURITY_ENCRYPTION_OPEN); + return true; + + case SEC_WPA_PERSONAL: + return set_enc_mode(vstate, ssid_index, OVSDB_SECURITY_ENCRYPTION_WPA_PSK, OVSDB_SECURITY_MODE_WPA1, false); + + case SEC_WPA2_PERSONAL: + return set_enc_mode(vstate, ssid_index, OVSDB_SECURITY_ENCRYPTION_WPA_PSK, OVSDB_SECURITY_MODE_WPA2, false); + + case SEC_WPA_WPA2_PERSONAL: + return set_enc_mode(vstate, ssid_index, OVSDB_SECURITY_ENCRYPTION_WPA_PSK, OVSDB_SECURITY_MODE_MIXED, false); + + case SEC_WPA_ENTERPRISE: + return set_enc_mode(vstate, ssid_index, OVSDB_SECURITY_ENCRYPTION_WPA_EAP, OVSDB_SECURITY_MODE_WPA1, true); + + case SEC_WPA2_ENTERPRISE: + return set_enc_mode(vstate, ssid_index, OVSDB_SECURITY_ENCRYPTION_WPA_EAP, OVSDB_SECURITY_MODE_WPA2, true); + + case SEC_WPA_WPA2_ENTERPRISE: + return set_enc_mode(vstate, ssid_index, OVSDB_SECURITY_ENCRYPTION_WPA_EAP, OVSDB_SECURITY_MODE_MIXED, true); + + default: + LOGE("%s: Unsupported security type (%d = %s)", ssid_ifname, stype, buf); + return false; + } + + return true; +} +#if 0 +static bool security_to_syncmsg( + const struct schema_Wifi_VIF_Config *vconf, + MeshWifiAPSecurity *dest) +{ + const char *val; + char *sec_str; + int sec_type; + int i; + + val = security_conf_find_by_key(vconf, OVSDB_SECURITY_ENCRYPTION); + if (val == NULL) + { + LOGW("%s: Security-to-MSGQ failed -- No encryption type", vconf->if_name); + LOGT("%s: Dumping %d security elements:", vconf->if_name, vconf->security_len); + for (i = 0; i < vconf->security_len; i++) + { + LOGT("%s: ... \"%s\" = \"%s\"", + vconf->if_name, + vconf->security_keys[i], + vconf->security[i]); + } + return false; + } + + if (strcmp(val, OVSDB_SECURITY_ENCRYPTION_WPA_PSK)) + { + LOGW("%s: Security-to-MSGQ failed -- Encryption '%s' not supported", + vconf->if_name, val); + return false; + } + + val = security_conf_find_by_key(vconf, OVSDB_SECURITY_MODE); + if (val == NULL) + { + LOGW("%s: Security-to-MSGQ failed -- No mode found", vconf->if_name); + return false; + } + + if (!strcmp(val, OVSDB_SECURITY_MODE_WPA1)) + { + sec_type = SEC_WPA_PERSONAL; + } + else if (!strcmp(val, OVSDB_SECURITY_MODE_WPA2)) + { + sec_type = SEC_WPA2_PERSONAL; + } + else if (!strcmp(val, OVSDB_SECURITY_MODE_MIXED)) + { + sec_type = SEC_WPA_WPA2_PERSONAL; + } + else + { + LOGW("%s: Security-to-MSGQ failed -- Mode '%s' unsupported", + vconf->if_name, val); + return false; + } + + if (!(sec_str = c_get_str_by_key(map_security, sec_type))) + { + LOGW("%s: Security-to-MSGQ failed -- Sec type '%d' not found", + vconf->if_name, sec_type); + return false; + } + + val = security_conf_find_by_key(vconf, OVSDB_SECURITY_KEY); + if (val == NULL) + { + LOGW("%s: Security-to-MSGQ failed -- No key found", vconf->if_name); + return false; + } + + STRSCPY(dest->passphrase, val); + STRSCPY(dest->secMode, sec_str); + STRSCPY(dest->encryptMode, DEFAULT_ENC_MODE); + + return true; +} +#endif + +bool vif_external_ssid_update(const char *ssid, int ssid_index) +{ + int ret; + int radio_idx; + char radio_ifname[128]; + char ssid_ifname[128]; + struct schema_Wifi_VIF_Config vconf; + + memset(&vconf, 0, sizeof(vconf)); + vconf._partial_update = true; + + memset(ssid_ifname, 0, sizeof(ssid_ifname)); + ret = wifi_getVIFName(ssid_index, ssid_ifname, sizeof(ssid_ifname)); + if (ret != UCI_OK) + { + LOGE("%s: cannot get ap name for index %d rc %d", __func__, ssid_index, ret); + return false; + } +#if 0 + if (!target_unmap_ifname_exists(ssid_ifname)) + { + LOGD("%s in not in map - ignoring", ssid_ifname); + return true; + } +#endif + + ret = wifi_getSSIDRadioIndex(ssid_index, &radio_idx); + if (ret != UCI_OK) + { + LOGE("%s: cannot get radio idx for SSID %s\n", __func__, ssid); + return false; + } + + memset(radio_ifname, 0, sizeof(radio_ifname)); + ret = wifi_getSSIDRadioIfName(radio_idx, radio_ifname, sizeof(radio_ifname)); + if (ret != UCI_OK) + { + LOGE("%s: cannot get radio ifname for idx %d", __func__, + radio_idx); + return false; + } + + SCHEMA_SET_STR(vconf.if_name, ssid_ifname); + SCHEMA_SET_STR(vconf.ssid, ssid); + + radio_rops_vconfig(&vconf, radio_ifname); + + return true; +} + +#if 0 +bool vif_external_security_update( + int ssid_index, + const char *passphrase, + const char *secMode) +{ + int ret; + int radio_idx; + char radio_ifname[128]; + char ssid_ifname[128]; + struct schema_Wifi_VIF_Config vconf; + sec_type_t stype; + c_item_t *citem; + const char *enc; + const char *mode; + + memset(&vconf, 0, sizeof(vconf)); + vconf._partial_update = true; + + memset(ssid_ifname, 0, sizeof(ssid_ifname)); + ret = wifi_getApName(ssid_index, ssid_ifname); + if (ret != RETURN_OK) + { + LOGE("%s: cannot get ap name for index %d", __func__, ssid_index); + return false; + } + + if (!target_unmap_ifname_exists(ssid_ifname)) + { + LOGD("%s in not in map - ignoring", ssid_ifname); + return true; + } + + ret = wifi_getSSIDRadioIndex(ssid_index, &radio_idx); + if (ret != RETURN_OK) + { + LOGE("%s: cannot get radio idx for SSID %s", __func__, ssid_ifname); + return false; + } + + memset(radio_ifname, 0, sizeof(radio_ifname)); + ret = wifi_getRadioIfName(radio_idx, radio_ifname); + if (ret != RETURN_OK) + { + LOGE("%s: cannot get radio ifname for idx %d", __func__, + radio_idx); + return false; + } + + if (!(citem = c_get_item_by_str(map_security, secMode))) + { + LOGE("%s: Failed to decode security mode (%s)", ssid_ifname, secMode); + return false; + } + stype = (sec_type_t)citem->key; + + switch (stype) + { + case SEC_NONE: + enc = OVSDB_SECURITY_ENCRYPTION; + mode = OVSDB_SECURITY_ENCRYPTION_OPEN; + break; + + case SEC_WEP_64: + enc = OVSDB_SECURITY_ENCRYPTION_WEP; + mode = OVSDB_SECURITY_MODE_WEP64; + break; + + case SEC_WEP_128: + enc = OVSDB_SECURITY_ENCRYPTION_WEP; + mode = OVSDB_SECURITY_MODE_WEP128; + break; + + case SEC_WPA_PERSONAL: + enc = OVSDB_SECURITY_ENCRYPTION_WPA_PSK; + mode = OVSDB_SECURITY_MODE_WPA1; + break; + + case SEC_WPA2_PERSONAL: + enc = OVSDB_SECURITY_ENCRYPTION_WPA_PSK; + mode = OVSDB_SECURITY_MODE_WPA2; + break; + + case SEC_WPA_WPA2_PERSONAL: + enc = OVSDB_SECURITY_ENCRYPTION_WPA_PSK; + mode = OVSDB_SECURITY_MODE_MIXED; + break; + + case SEC_WPA_ENTERPRISE: + enc = OVSDB_SECURITY_ENCRYPTION_WPA_EAP; + mode = OVSDB_SECURITY_MODE_WPA1; + break; + + case SEC_WPA2_ENTERPRISE: + enc = OVSDB_SECURITY_ENCRYPTION_WPA_EAP; + mode = OVSDB_SECURITY_MODE_WPA2; + break; + + case SEC_WPA_WPA2_ENTERPRISE: + enc = OVSDB_SECURITY_ENCRYPTION_WPA_EAP; + mode = OVSDB_SECURITY_MODE_MIXED; + break; + + default: + LOGE("%s: Unsupported security type (%d = %s)", ssid_ifname, stype, secMode); + return false; + } + + STRSCPY(vconf.security_keys[0], OVSDB_SECURITY_ENCRYPTION); + STRSCPY(vconf.security[0], enc); + STRSCPY(vconf.security_keys[1], OVSDB_SECURITY_KEY); + STRSCPY(vconf.security[1], passphrase); + STRSCPY(vconf.security_keys[2], OVSDB_SECURITY_MODE); + STRSCPY(vconf.security[2], mode); + vconf.security_len = 3; + vconf.security_present = true; + + SCHEMA_SET_STR(vconf.if_name, target_unmap_ifname(ssid_ifname)); + + LOGD("Updating VIF for new security"); + radio_rops_vconfig(&vconf, radio_ifname); + + return true; +} +#endif + +bool vif_copy_to_config( + int ssidIndex, + struct schema_Wifi_VIF_State *vstate, + struct schema_Wifi_VIF_Config *vconf) +{ + int i; + + memset(vconf, 0, sizeof(*vconf)); + schema_Wifi_VIF_Config_mark_all_present(vconf); + vconf->_partial_update = true; + + SCHEMA_SET_STR(vconf->if_name, vstate->if_name); + LOGT("vconf->ifname = %s", vconf->if_name); + SCHEMA_SET_STR(vconf->mode, vstate->mode); + LOGT("vconf->mode = %s", vconf->mode); + SCHEMA_SET_INT(vconf->enabled, vstate->enabled); + LOGT("vconf->enabled = %d", vconf->enabled); + if (vstate->bridge_exists) + { + SCHEMA_SET_STR(vconf->bridge, vstate->bridge); + } + LOGT("vconf->bridge = %s", vconf->bridge); + if (vstate->vlan_id_exists) + { + SCHEMA_SET_INT(vconf->vlan_id, vstate->vlan_id); + } + LOGT("vconf->vlan_id = %d", vconf->vlan_id); + SCHEMA_SET_INT(vconf->ap_bridge, vstate->ap_bridge); + LOGT("vconf->ap_bridge = %d", vconf->ap_bridge); + SCHEMA_SET_INT(vconf->wds, vstate->wds); + LOGT("vconf->wds = %d", vconf->wds); + SCHEMA_SET_INT(vconf->vif_radio_idx, vstate->vif_radio_idx); + LOGT("vconf->vif_radio_idx = %d", vconf->vif_radio_idx); + SCHEMA_SET_STR(vconf->ssid_broadcast, vstate->ssid_broadcast); + LOGT("vconf->ssid_broadcast = %s", vconf->ssid_broadcast); + SCHEMA_SET_STR(vconf->min_hw_mode, vstate->min_hw_mode); + LOGT("vconf->min_hw_mode = %s", vconf->min_hw_mode); + SCHEMA_SET_STR(vconf->ssid, vstate->ssid); + LOGT("vconf->ssid = %s", vconf->ssid); + SCHEMA_SET_INT(vconf->rrm, vstate->rrm); + LOGT("vconf->rrm = %d", vconf->rrm); + SCHEMA_SET_INT(vconf->btm, vstate->btm); + LOGT("vconf->btm = %d", vconf->btm); + + // security, security_keys, security_len + for (i = 0; i < vstate->security_len; i++) + { + STRSCPY(vconf->security_keys[i], vstate->security_keys[i]); + STRSCPY(vconf->security[i], vstate->security[i]); + } + vconf->security_len = vstate->security_len; + + // mac_list, mac_list_len + SCHEMA_SET_STR(vconf->mac_list_type, vstate->mac_list_type); + for (i = 0; i < vstate->mac_list_len; i++) + { + STRSCPY(vconf->mac_list[i], vstate->mac_list[i]); + } + vconf->mac_list_len = vstate->mac_list_len; + + return true; +} + +bool vif_state_get(int ssidIndex, struct schema_Wifi_VIF_State *vstate) +{ + int channel; + char buf[128]; + char tmp[128]; +// bool bval, gOnly, nOnly, acOnly; + bool bval; +// hw_mode_t min_hw_mode; + int ret; + int radio_idx; + char ssid_ifname[128]; +// char band[128]; +// bool rrm; +// bool btm; + int vlan_id; + + memset(vstate, 0, sizeof(*vstate)); + schema_Wifi_VIF_State_mark_all_present(vstate); + vstate->_partial_update = true; + vstate->associated_clients_present = false; + vstate->vif_config_present = false; + + memset(ssid_ifname, 0, sizeof(ssid_ifname)); + ret = wifi_getVIFName(ssidIndex, ssid_ifname, sizeof(ssid_ifname)); + if (ret != UCI_OK) + { + LOGE("%s: cannot get ap name for index %d", __func__, ssidIndex); + return false; + } + + SCHEMA_SET_STR(vstate->if_name, ssid_ifname); + + // mode (w/ exists) + SCHEMA_SET_STR(vstate->mode, "ap"); + + // enabled (w/ exists) + ret = wifi_getSsidEnabled(ssidIndex, &bval); + if (ret == UCI_OK) + { + SCHEMA_SET_INT(vstate->enabled, bval); + } else { + LOGW("Cannot getSsidEnabled for SSID index %d", ssidIndex ); + vstate->enabled_exists = false; + } + + // bridge (w/ exists) + memset(buf, 0, sizeof(buf)); + ret = wifi_getApBridgeInfo(ssidIndex, buf, tmp, tmp, sizeof(buf)); + if (ret == UCI_OK) + { + SCHEMA_SET_STR(vstate->bridge, buf); + } else + { + LOGW("Cannot getApBridgeInfo for SSID index %d", ssidIndex); + vstate->bridge_exists = false; + } + + // vlan_id (w/ exists) + ret = wifi_getApVlanId(ssidIndex, &vlan_id); + if (ret == UCI_OK) + { + SCHEMA_SET_INT(vstate->vlan_id, vlan_id); + } + else + { + LOGW("Cannot get VlanId for SSID index %d", ssidIndex); + vstate->vlan_id_exists = false; + } + + // wds (w/ exists) + SCHEMA_SET_INT(vstate->wds, false); + + // ap_bridge (w/ exists) + ret = wifi_getApIsolationEnable(ssidIndex, &bval); + if (ret == UCI_OK) + { + SCHEMA_SET_INT(vstate->ap_bridge, bval ? false : true); + } else + { + LOGW("Cannot getApIsolationEnable for SSID index %d", ssidIndex); + } + + // vif_radio_idx (w/ exists) + (void) wifi_getSSIDRadioIndex( ssidIndex, &radio_idx ); + SCHEMA_SET_INT(vstate->vif_radio_idx, radio_idx); + + // ssid_broadcast (w/ exists) + ret = wifi_getApSsidAdvertisementEnable(ssidIndex, &bval); + if (ret == UCI_OK) + { + SCHEMA_SET_STR(vstate->ssid_broadcast, bval ? "enabled" : "disabled"); + } + else + { + LOGW("Cannot getApSsidAdvertisementEnable for SSID Index %d", ssidIndex); + } + + // SSID (w/ exists) + memset(buf, 0, sizeof(buf)); + ret = wifi_getSSIDName(ssidIndex, buf, sizeof(buf)); + if (ret != UCI_OK) + { + LOGW("%s: failed to get SSID", ssid_ifname); + } + else + { + SCHEMA_SET_STR(vstate->ssid, buf); + } + + + // security, security_keys, security_len + if (!security_to_state(ssidIndex, ssid_ifname, vstate)) + { + LOGW("%s: cannot get security for %s", __func__, ssid_ifname); + } +#if 0 + // mac_list_type (w/ exists) + // mac_list, mac_list_len + if (!acl_to_state(ssidIndex, ssid_ifname, vstate)) + { + LOGW("%s: cannot get ACL for %s", __func__, ssid_ifname); + } + + ret = wifi_getSSIDRadioIndex(ssidIndex, &radio_idx); + if (ret != UCI_OK) + { + LOGE("%s: cannot get radio idx for SSID %s\n", __func__, ssid_ifname); + return false; + } +#endif + + strscpy(vstate->mac_list_type, "none", sizeof(vstate->mac_list_type)); + vstate->mac_list_len = 0; + vstate->mac_list_type_exists = true; + +#if 0 + memset(band, 0, sizeof(band)); + ret = wifi_getRadioOperatingFrequencyBand(radio_idx, band); + if (ret != UCI_OK) + { + LOGE("%s: cannot get radio band for idx %d", __func__, radio_idx); + return false; + } + + // min_hw_mode (w/ exists) + if (band[0] == '5') + { + min_hw_mode = HW_MODE_11A; + } else + { + min_hw_mode = HW_MODE_11B; + } + ret = wifi_getRadioStandard(radio_idx, buf, &gOnly, &nOnly, &acOnly); + if (ret != UCI_OK) + { + LOGW("%s: Failed to get min_hw_mode from %d", ssid_ifname, radio_idx); + } + else + { + if (gOnly) + { + min_hw_mode = HW_MODE_11G; + } + else if (nOnly) + { + min_hw_mode = HW_MODE_11N; + } + else if (acOnly) + { + min_hw_mode = HW_MODE_11AC; + } + } + + str = c_get_str_by_key(map_hw_mode, min_hw_mode); + if (strlen(str) == 0) + { + LOGW("%s: failed to encode min_hw_mode (%d)", + ssid_ifname, min_hw_mode); + } + else + { + SCHEMA_SET_STR(vstate->min_hw_mode, str); + } +#endif + memset(buf, 0, sizeof(buf)); + switch (radio_idx) { + case 0: + snprintf(buf, sizeof(buf),"11a"); + break; + case 1: + snprintf(buf, sizeof(buf),"11g"); + break; + case 2: + snprintf(buf, sizeof(buf),"11a"); + break; + } + SCHEMA_SET_STR(vstate->min_hw_mode, buf); + + // mac (w/ exists) + memset(buf, 0, sizeof(buf)); + ret = wifi_getBaseBSSID(ssidIndex, buf, sizeof(buf),radio_idx); + if (ret != UCI_OK) + { + LOGN("%s: Failed to get base BSSID (mac)", ssid_ifname); + } + else + { + SCHEMA_SET_STR(vstate->mac, buf); + } + + // channel (w/ exists) + ret = wifi_getRadioChannel(radio_idx, &channel); + if (ret != UCI_OK) + { + LOGW("%s: Failed to get channel from radio idx %d", ssid_ifname, radio_idx); + } + else + { + SCHEMA_SET_INT(vstate->channel, channel); + } + +#if 0 + ret = wifi_getNeighborReportActivation(ssidIndex, &rrm); + if (ret != UCI_OK) + { + LOGW("%s: failed to get RRM", ssid_ifname); + } + else + { + SCHEMA_SET_INT(vstate->rrm, rrm); + } + + ret = wifi_getBSSTransitionActivation(ssidIndex, &btm); + if (ret != UCI_OK) + { + LOGW("%s: failed to get BTM", ssid_ifname); + } + else + { + SCHEMA_SET_INT(vstate->btm, btm); + } +#endif + + return true; +} + +static bool vif_ifname_to_idx(const char *ifname, int *outSsidIndex) +{ + + + int ret; + int s; + int snum; + int ssid_index = -1; + char ssid_ifname[128]; + + ret = wifi_getSSIDNumberOfEntries(&snum); + if (ret != UCI_OK) + { + LOGE("%s: failed to get SSID count", __func__); + return false; + } + + for (s = 0; s < snum; s++) + { + memset(ssid_ifname, 0, sizeof(ssid_ifname)); + ret = wifi_getVIFName(s, ssid_ifname, sizeof(ssid_ifname)); + if (ret != UCI_OK) + { + LOGE("%s: cannot get ap name for index %d", __func__, s); + return false; + } + + if (!strcmp(ssid_ifname, ifname)) + { + ssid_index = s; + break; + } + } + + if (ssid_index == -1) + { + LOGE("%s: cannot find SSID index for %s", __func__, ifname); + return false; + } + + *outSsidIndex = ssid_index; + return true; + +} + +#if 0 +/* Returns true if any of the fields that need explicit applying changed */ +static bool should_apply(const struct schema_Wifi_VIF_Config_flags *changed) +{ + return ( changed->if_name + || changed->enabled + || changed->mode + || changed->ssid_broadcast + || changed->security + || changed->mac_list + || changed->mac_list_type + || changed->vlan_id + || changed->ap_bridge + || changed->rrm + || changed->btm + ); +} +#endif + +bool target_vif_config_set2( + const struct schema_Wifi_VIF_Config *vconf, + const struct schema_Wifi_Radio_Config *rconf, + const struct schema_Wifi_Credential_Config *cconfs, + const struct schema_Wifi_VIF_Config_flags *changed, + int num_cconfs) +{ + int ssid_index; + int ret; + char tmp[256]; + c_item_t *citem; + bool bval; + + const char *ssid_ifname = (char *)vconf->if_name; + + if (!vif_ifname_to_idx(ssid_ifname, &ssid_index)) + { + LOGE("%s: cannot get index for %s", __func__, ssid_ifname); + return false; + } + + if (changed->enabled) + { + ret = wifi_setSsidEnabled(ssid_index, vconf->enabled); + if (ret != true) + { + LOGE("%s: Failed to enable/disable SSID", ssid_ifname); + } + } + + if (strlen(vconf->ssid) == 0) + { + LOGW("%s: vconf->ssid string is empty", ssid_ifname); + } + else if (changed->ssid) + { + memset(tmp, 0, sizeof(tmp)); + snprintf(tmp, sizeof(tmp) - 1, "%s", vconf->ssid); + ret = wifi_setSSIDName(ssid_index, tmp); + if (ret != true) + { + LOGE("%s: Failed to set new SSID '%s'", ssid_ifname, tmp); + } + } + + if (changed->ssid_broadcast) + { + if ((citem = c_get_item_by_str(map_enable_disable, vconf->ssid_broadcast))) + { + bval = citem->key ? true : false; + ret = wifi_setApSsidAdvertisementEnable(ssid_index, bval); + LOGI("[WIFI_HAL SET] wifi_setApSsidAdvertisementEnable(%d, %d) = %d", + ssid_index, bval, ret); + if (ret != true) + { + LOGW("%s: Failed to set SSID Broadcast to '%d'", ssid_ifname, bval); + } + else + { + LOGN("%s: Updated SSID Broadcast to %d", ssid_ifname, bval); + } + } + else + { + LOGW("%s: Failed to decode ssid_broadcast \"%s\"", + ssid_ifname, vconf->ssid_broadcast); + } + } + + if (changed->security) + { + ret = wifi_setApSecurityModeEnabled(ssid_index, vconf); + if (ret != true) + { + LOGE("%s: Failed to set new encryption", ssid_ifname); + } + } + + if (changed->ft_psk || changed->ft_mobility_domain || changed->security) + { + ret = wifi_setFtMode(ssid_index, vconf); + if (ret != true) + { + LOGE("%s: Failed to set Ft paramerters", ssid_ifname); + } + } + + if (changed->ap_bridge) + { + ret = wifi_setApIsolationEnable(ssid_index, vconf->ap_bridge); + LOGI("[WIFI_HAL SET] wifi_setApIsolationEnable(%d, %d) = %d", + ssid_index, vconf->ap_bridge, ret); + if (ret != true) + { + LOGW("%s: Failed to set AP bridge to '%d'", ssid_ifname, bval); + } + else + { + LOGN("%s: Updated AP bridge to %d", ssid_ifname, bval); + } + } + + if (changed->bridge) { + memset(tmp, 0, sizeof(tmp)); + snprintf(tmp, sizeof(tmp) - 1, "%s", vconf->bridge); + + ret = wifi_setApBridgeInfo(ssid_index, tmp); + if (ret != true) + { + LOGE("%s: Failed to set new bridge '%s'", ssid_ifname, tmp); + } + + } + + if (changed->vlan_id) { + ret = wifi_setApVlanNetwork(ssid_index, vconf->vlan_id); + if (ret != true) + { + LOGE("%s: Failed to set new vlan Network %d", ssid_ifname, vconf->vlan_id); + } + } + + return vif_state_update(ssid_index); +} + +bool vif_state_update(int ssidIndex) +{ + struct schema_Wifi_VIF_State vstate; + + if (!vif_state_get(ssidIndex, &vstate)) + { + LOGE("%s: cannot update VIF state for SSID index %d", __func__, ssidIndex); + return false; + } + + system("reload_config"); + + LOGN("Updating VIF state for SSID index %d", ssidIndex); + return radio_rops_vstate(&vstate); +} + diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/.version b/feeds/wlan-ap/opensync/src/vendor/ap2220/.version new file mode 100644 index 000000000..6e8bf73aa --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/.version @@ -0,0 +1 @@ +0.1.0 diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/LICENSE b/feeds/wlan-ap/opensync/src/vendor/ap2220/LICENSE new file mode 100644 index 000000000..c1f88e0d4 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/NOTICE b/feeds/wlan-ap/opensync/src/vendor/ap2220/NOTICE new file mode 100644 index 000000000..f024b551f --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/NOTICE @@ -0,0 +1,2 @@ +Copyright 2019, Plume Design Inc. All rights reserved. +Licensed under the "3-Clause BSD License" also known as "Revised BSD License" diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/README.md b/feeds/wlan-ap/opensync/src/vendor/ap2220/README.md new file mode 100644 index 000000000..42fb3fdda --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/README.md @@ -0,0 +1,9 @@ +OpenSync vendor layer example for armvirt +----------------------------------------- + +This is an example vendor layer for the OpenWrt `armvirt` target. +It can be used as a template for other targets. + +This repository is a part of the `opensync-openwrt` project. + +For more info please visit: https://opensync.io diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/build/vendor-arch.mk b/feeds/wlan-ap/opensync/src/vendor/ap2220/build/vendor-arch.mk new file mode 100644 index 000000000..c6dd1002b --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/build/vendor-arch.mk @@ -0,0 +1,9 @@ +OS_TARGETS +=AP2220 + +ifeq ($(TARGET),AP2220) +PLATFORM=openwrt +VENDOR=ap2220 +PLATFORM_DIR := platform/$(PLATFORM) +KCONFIG_TARGET ?= $(PLATFORM_DIR)/kconfig/openwrt_generic +ARCH_MK := $(PLATFORM_DIR)/build/$(PLATFORM).mk +endif diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/ovsdb/static_configuration.json b/feeds/wlan-ap/opensync/src/vendor/ap2220/ovsdb/static_configuration.json new file mode 100644 index 000000000..09099d679 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/ovsdb/static_configuration.json @@ -0,0 +1,75 @@ +[ + "Open_vSwitch", + { + "op":"insert", + "table":"Wifi_Inet_State", + "row": { + "if_name": "br-lan", + "ip_assign_scheme": "static", + "inet_addr": "192.168.1.1", + "netmask": "255.255.255.0", + "if_type": "bridge", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": false + } + }, + { + "op":"insert", + "table":"Wifi_Inet_Config", + "row": { + "if_name": "br-lan", + "ip_assign_scheme": "dhcp", + "if_type": "bridge", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": false + } + }, + { + "op": "insert", + "table": "Wifi_Radio_Config", + "row": { + "if_name": "wlan0", + "freq_band": "2.4G", + "hw_type": "AR9382", + "hw_mode": "11n", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_Config", + "row": { + "if_name": "wlan1", + "freq_band": "5G", + "hw_type": "qca9880", + "hw_mode": "11ac", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_State", + "row": { + "if_name": "wlan0", + "freq_band": "2.4G", + "hw_type": "AR9382", + "hw_mode": "11n", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_State", + "row": { + "if_name": "wlan1", + "freq_band": "5G", + "hw_type": "qca9880", + "hw_mode": "11ac", + "channel_mode": "cloud" + } + } +] diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/ca.pem b/feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/ca.pem new file mode 100644 index 000000000..4567e3e46 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/ca.pem @@ -0,0 +1,179 @@ +-----BEGIN CERTIFICATE----- +MIIGSTCCBDGgAwIBAgIEEAAABDANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJV +UzEaMBgGA1UECgwRUGx1bWUgRGVzaWduIEluYy4xKzApBgNVBAsMIlBsdW1lIERl +c2lnbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHTAbBgNVBAMMFFBsdW1lIERlc2ln +biBSb290IENBMB4XDTE4MDEyMjIzMjMzOVoXDTI4MDEyMjIzMjMzOVowbTELMAkG +A1UEBhMCVVMxGjAYBgNVBAoMEVBsdW1lIERlc2lnbiBJbmMuMSswKQYDVQQLDCJQ +bHVtZSBEZXNpZ24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRUwEwYDVQQDDAxQbHVt +ZSBUTFMgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDSDVhBzdBE +OM7oi7YzRevbzmM5dJhYKC+l44lFnltTIObbFk4QGN/sGQmgtZybEHtBnFgbamb5 +sIJsBVCkNFojFjg/HQwDc7TpwWN339t3Ih7iXmReiEfp8h1msWQRBpP3+d3E56ZP +PlJwivbw3ywfXSv7QlxSZ5iJeC6amPohvj3/VJeqM5c8hiiDuuZsZMAaW2Yl9gm/ +keM//Z7AfIGjbidUmJ9nfDftNPexqzx82RROATONIglk3PXjZxAyKSEuYS0djuPK +XXu5j8w222efdS6ARufpEZAO5LH/MVPdZpT1Emzh+uKjTQYlL0Flu8PyP30Do/cK +KBGMwZYAV4op8or8ntK7ndDTu3Xr6tq6g6KduxUjVukXpAmQhbwoGRUzJj4zC3oM +QkIYLlM1JOUrIlSw0s/E2ONNaWhL89bNFw3/LOhG6yAjbeJvjsebB/iQEvVJQfmV +i73QNwQQ93kCj+/unIkc+hi1/Vjuhkx3Q+LV4wjG4iaUoPlf49K1SqV9xDcc+2KF +0K8sVQ4Tqb2UQYp63C44HEZzRS3fhBp7xmEBTncCOckttqz1zCZQ0dcuyYm3bovf +NO5ur7OvvNL7ALJz9ah56v5KUDDqeH+aRm8i/rYdDSpcNm5kA9Ct2Q7/RSCCqFlO +bk+1yEkgAm9Jkebvi5L05dJryhXw31cXVwIDAQABo4HoMIHlMA4GA1UdDwEB/wQE +AwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTKifKsuPwRxf+47Nsr +UHqivPBIkTAfBgNVHSMEGDAWgBQivhNIgc2MBY9u64p9MYFvWmDNOTBEBggrBgEF +BQcBAQQ4MDYwNAYIKwYBBQUHMAKGKGh0dHBzOi8vd3d3LnBsdW1ld2lmaS5jb20v +Y2Evcm9vdC1jYS5jZXIwOQYDVR0fBDIwMDAuoCygKoYoaHR0cHM6Ly93d3cucGx1 +bWV3aWZpLmNvbS9jYS9yb290LWNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAjG4R +nkcVdO4oQqjJeWLIdNu48V3T7CB08t3sqjQaxu4gAXfYm8a+tdubff6Dg0PuTFzh +edogXQchaEiYeEFTPNrz4hf5NhS+9t2PKcEpAKCbY6vjpfT9F5gUDrXmfUZnLIUV +SVXZ6NC+/jI56cAykbCv5ytYxSE0LxSgA3OLZyd4QESJdSJIkCw7s3nDx7rv05Np +UjQuFu1+WbXxUkrKYZBCTwczuKsDc2syiscC2sBUydDbK1jySV1og3nY6JXojNSa +V8OtnsnAUdD8Gbg38UNFb3SN7VmE1RIYgXgj7tVEKW/Rhyf49LCchAl+CO2m9TKW +ZPA2NcQ94b++VoreAdkpH3eOkko12RofWQo+wHT/g6qm668L7exONawjmU+Or2Wj +TXJFz5xb57kEnZjyXX4GgCxVSr8hHPA0+gFRPS4mkUZAQaH5XkODvcLAJ6CCSYIp +78B89VI8lkSji0wanlGcrSbUVHg6bVNw++gW//N4DRfqURRqYwDLQt6BXi11vgSu +l8NrrzBLU7leb1+IcY5p8g+z9HE4PM7uxd9fcP/P3Rldq7EW9V1NIXTn0kPHJd2C +zDReVg7t/tCFWM6wyXL1KKuXd36Py1XxATsgEwkmfXJn4QjOn60NK/SxTDKIBfvZ +9iWfWz/J3JLDRMk5Y/5CFuC6lm+6cHkbT4WR3wA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +cg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGxzCCBK+gAwIBAgIJAIyLecDrnpzeMA0GCSqGSIb3DQEBCwUAMIGdMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJUGFsbyBBbHRv +MRswGQYDVQQKExJQbHVtZSBEZXNpZ24sIEluYy4xJDAiBgkqhkiG9w0BCQEWFXN1 +cHBvcnRAcGx1bWV3aWZpLmNvbTEiMCAGA1UEAxMZUGx1bWUgRGVzaWduIEF1dGhv +cml0eSBBMTAeFw0xNjAzMDMyMjQwMTRaFw0yMTAzMDIyMjQwMTRaMIGdMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJUGFsbyBBbHRv +MRswGQYDVQQKExJQbHVtZSBEZXNpZ24sIEluYy4xJDAiBgkqhkiG9w0BCQEWFXN1 +cHBvcnRAcGx1bWV3aWZpLmNvbTEiMCAGA1UEAxMZUGx1bWUgRGVzaWduIEF1dGhv +cml0eSBBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALo0cr8ZyiLs +CUyp4P4JFXkU6Ymx6QhN1DZ1SCuDgiMkX8A7/QCDMKz7Q70qqM022NwYW3Ff5VJG +El/epXmcaPx7vzfXpsy023mtyaLcwovCwr+IRDM5LgKlW9v3wcaWBWLEXbbv8are +a9q1eXW5jJjAyDMPdkrUqCwdJy3Gjnwy16mRiBnaY6A2+wVr5mTzkrtNGzJiEzhX +MECnal7T16sOC8HeaJZ4BVYJzxAnyU+wlf0ygzQeF4WaYXTDgcRs8g1D62LHcr7f +ioAT2Z69V5CVHFX7VJoE1PJeU867GwZDtM+osZ0WJFkeMA8cJgrs7ujKTl9nmiVp +Q2qt6BDABrd9ibZkjHj5XcXQz7o+z3zwL9v9x/1bilmY/yBz2rlozR+xbNwTM6Ra +D+FXpcv2caj2851Ci59eh+5eCJJkMNzGKdZZ9wyMaPqk2bynGDf6glhJc2cML9L3 ++L/iLq63yiYDOmDwKXiAjPVCPPgMPxp+Y4gwfiZdop2ou8W7xzFxOEwKuS8qK6Qp +9j8Mq1ritAFa4WIiVsuHjrEkmykCzHvb9z5ujsrZ4hJzBDNqfjXkazpR2wb4o895 +YfBQIHdoQy2H+wsOEaNatUkFuSE5uw2nMS+SDf8J2ouAG0U51n/SnWKd636WC4s+ +Mn5Bd8nwNP1H1DXCUf8TS7iow+Bt0A+VAgMBAAGjggEGMIIBAjAdBgNVHQ4EFgQU +CBK8rxUUByBBgsU0VXsOLjVIWiEwgdIGA1UdIwSByjCBx4AUCBK8rxUUByBBgsU0 +VXsOLjVIWiGhgaOkgaAwgZ0xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9y +bmlhMRIwEAYDVQQHEwlQYWxvIEFsdG8xGzAZBgNVBAoTElBsdW1lIERlc2lnbiwg +SW5jLjEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBwbHVtZXdpZmkuY29tMSIwIAYD +VQQDExlQbHVtZSBEZXNpZ24gQXV0aG9yaXR5IEExggkAjIt5wOuenN4wDAYDVR0T +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAsTLMCgl/1rSf/+/14y0FWyj2yvOq +X5hgd/+kIRfIp/5Ib1wWdpWGY5sTV3Vy1rQvWHF/PijP9qMWE5QKfxHh/l2+HKv0 +gyRPW3I4QgK3Qr/u75nNFizYhI2L2n1+2MQmoejcu6TI9Kk5n7oVo3dGn2KxkrKC +WiB0QZmJgD6iIrJQt6oXB/oG4gSHqTIaTawflIvFgr5S94rKjVm+ZBtz6nOO184s +fDGXNOfw8zOXkGB5gAtxF5oX+XQ9s/2y0nrDbT/Oup3MzzrZ2zAEXqIUvb6cP8z6 +IqYGiwtzzhD8F/4jA6dUI/pnlPMnT670sy4YO7GsJaZi/Af/pvdRh342FFUpV3HF ++jJJxuejI+yehI2y0S1M4idmJLaCS5EldJF1GB3DU5CjSOhCeZKpIrkWEAIEXf4f +VTffDmOn/5SAcdKwe9v7tzJ2knNME0BPhVei/cSmU3VI6sAY04HzPtC498BLyaUJ +Nj+70iQ3tvNjegwfRI4CIgn0/Y90W6NcEd9Ihg/MTImH5uQag7ftupFqp7wP882N +SJGjWsd/oMDbB8kcyLKZ8z05nYhxG8v0/D6esu51SAXhnC2G2jybjuk3QHvMRTBo +jMnFwM/u3cRLzWwsHP3dSkY1NsnfMKA+ivUEXslq+8R0EH02Js4OUTrscDKPJSWo +YDLIkv5E8HWLVoc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFyDCCA7CgAwIBAgIJAJ78fVrF1kYwMA0GCSqGSIb3DQEBCwUAMHgxCzAJBgNV +BAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRUGx1bWUgRGVzaWduIEluYy4x +JzAlBgNVBAsMHk9wZW5TeW5jIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UE +AwwOT3BlblN5bmMgQ0EgQTEwIBcNMTkwMzI4MTI0ODIwWhgPMjA2OTAzMTUxMjQ4 +MjBaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRUGx1bWUg +RGVzaWduIEluYy4xJzAlBgNVBAsMHk9wZW5TeW5jIENlcnRpZmljYXRlIEF1dGhv +cml0eTEXMBUGA1UEAwwOT3BlblN5bmMgQ0EgQTEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDZOu6RWVfAJy10izzsgcSVTPqkIK84Jhy02ZxEx+XUOLJg +G6d75a2X2Qdb0xyu4vIr/zAnsFcm8L/w9J5MZh+IRvW1c9f5P7ROjzivM9vfub2I +CJ+4acoN0ErWX5qqNPx1FvL5gM7TzsgbvmUMYKcRxRUKmo9CCO1uJy/zjvr8jDNZ +ZvrI2cPA70UHjwzP3LPANH8gnQTZMdFM3W/K6vyRIJdIYGmsGRYdzrqI2jP7z5Ex +5tiqthZQPlXhwj8QFk8vONbuUEdWq/dPlY4LKDgg4qE0t9eV3kLwC8WPTcly2KwZ +FaFdrQFpeLQh3H3CcaN8O++lv5BlCNEbOkEE9CUaUHbAVSNDv4tePpHp0pFJGkl4 +io6OkJ20hywjyJ71RY+qxgw/oyTii5mDTcqIVYJ3nkblrHKlQihnZ7+uHSJzhioO +JEv0t/eBetG62N4GzuiUH6MUARsDf7sd8anFf+pk4zUEwTVkdkYb2j/tp+g0WV08 +kvnNJ/wRuT9mYO+PKS9HXHwG1brBEwAepN524FgncopTwm+VglsHqrH9c91c5bbC +GwHKlEUEhRy45+2OACIhqhaoPqolFXNLSXGJFAkA7hYzbXrCs7kc8tzrqFj7kUQn +uMQj8TtVM1+gFOfy0J0nGOV7hs/ya30obLGYa8MHXD2cR3GK6Xpl8ZDHeCmQvwID +AQABo1MwUTAdBgNVHQ4EFgQU3Ji6Gbgbvie8gFgWEJNd1OzU31QwHwYDVR0jBBgw +FoAU3Ji6Gbgbvie8gFgWEJNd1OzU31QwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQsFAAOCAgEAkjs7a0eHLLRuzt6+WKA/Q0/MD01H0r9ZaY9LC4WfyY49qsF+ +CYK/7pYPJVc7YbO8hlnxKfCkJlCxP7i4lNN91BW+Lw4keI0J/VKa0GdSnPy88Ps/ +5QtSXn+Yix1VHXfu7q45ORra2ZpuESNxXOCobbLBE6ow8lKNapCYkuex9wE2iMlA +Z72Wul8K8X7oX1yIzNrnBc89b7vbMAc6F0iseE9eINmQpp5sqhk347/dLKOMVVNX +lDqrw1bOgbDLW4aQdkws4fUnH8m7DjeOxSiJhR9jZRimtFdQ9VVv5wuQswGPOXue +7vBDeHP8td3pZrsQygFzprOUvREKSJcle3xgiYxhbtVUfi/nBBgxLPM7+ga4jol6 +AByOCa6nPcMGbWikFTbO+bQgwka7V54RBXjKhBx1XBtpZHAooRm8PPDmesLbUWc1 +SB21o+8Kfm9+kVxup2udDrXo0cQpLskHKNCQOZbiIW/TCF+6cnQGSCCzgcMazgGS +pm5oJskK3/z30xvKphU4o6CZzJocdIX5xS7lX+iQIYZNT42U31juEbhOpGUmg3xO +lBGhysfYkR2AzDifN11uuy8uWca+4JDA6qutieEoNqY2gBMkyBe7qsvlsYphvnCM +gIOXqPD3c4IGS6uxP+hzqn0na/b5Ai4I3iSAh5IvXr5pm+ZaQISq0WFBPIk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/client.pem b/feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/client.pem new file mode 100644 index 000000000..4010e61cc --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/client.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIENDCCAhygAwIBAgIRAJ4QsQE9nHsbpnVHhkAKw2MwDQYJKoZIhvcNAQELBQAw +eDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRowGAYDVQQKDBFQbHVtZSBEZXNp +Z24gSW5jLjEnMCUGA1UECwweT3BlblN5bmMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MRcwFQYDVQQDDA5PcGVuU3luYyBDQSBBMTAeFw03MDAxMDEwMDAwMDBaFw0yOTAz +MjYxMzI5MTNaMIGEMRIwEAYDVQQDDAlQUDMwMlgtRVgxCzAJBgNVBAYTAlVTMRow +GAYDVQQKDBFQbHVtZSBEZXNpZ24gSW5jLjESMBAGA1UEBwwJUGFsbyBBbHRvMQsw +CQYDVQQIDAJDQTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBwbHVtZXdpZmkuY29t +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9nFC6TPcsnh0+fscQaYEKevb0uR95nao +mDehTalGMwqt9BcOlDBahODfFhMu5SVw1ZmmmHo+ZIJ3ujK1VdrAgRRSh91k7dQv +MVgeXT2se1rc1L8oKvTnIPF2UwsSo3+5o1owWDAfBgNVHSMEGDAWgBTcmLoZuBu+ +J7yAWBYQk13U7NTfVDAdBgNVHQ4EFgQUxecQdoP09CyFbUJUdeLj/R3Ah2AwFgYD +VR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAH23KQlxb2Du +9XvHlq+AC5bF3cEFHxXS181qX+v61hMJm8VjugCzWuLuzc2bXEYFB+ZIVIPyTdAJ +tP7EizrUxWUgBbbsgHRFdy/jPXj5XF6PE7GhSgRi3FbYwxrzuIasEaAziagHr7ep +Hn3rJiNAo/KYhGyBpFYU7tJRmkpx1xaX8C5pTunR7jbyqOXM/h+rLlZJj2OHObN6 +xsFpcIJdT24pGTo9q5hhJUgxPlDnhrSB6yHoweO1FVgztsdjZKGou3RuKldVgunG +m/KyYP9oAQYRX0QRvRrDTOzVb2ezPd/KUwNMprLanXu0lu2T++H8xiQt41BdgMsl +63lkFDkFmeRgmaQUuiGMjU/Sac+kFhnkd/hoGigHYrgETd0FuqlWVE2VBsyv3/Pw +3126SXL1spbl+/apVioH9Nl24fUQKbv5Bnyhd5IIjzgG8SMzPQ4CbSHAWqUqkdUZ +bprS3nwLnE29zPULCg7Q1JfDsbf1+xe+r5xXVpUuca2kb4VnnNQ/z/jJCdP/3gy9 +jawfPNl0fwIHywLzaec1jtBmPFEPul7baRPCQdB3JF/WeuRuV3zakSs8XB8YyJaq +Lq3KtNBJDcSEKn/Tc5wLRaEOCiRoQtVhtX7Cer9JUYcRWsLvO1e/N3z7LxFcv8/w +glSwr3kI080u6Fx4QjxQWVWZiYL+3v01 +-----END CERTIFICATE----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/client_dec.key b/feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/client_dec.key new file mode 100644 index 000000000..64ef309da --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/rootfs/common/usr/plume/certs/client_dec.key @@ -0,0 +1,7 @@ +-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDCyrVlkcE5QLYWpNyRTSo8zhjZ3ksrLzhdFgfIPDDO0HGTk/08aTGGM +VrEvui9yLBmgBwYFK4EEACKhZANiAAT2cULpM9yyeHT5+xxBpgQp69vS5H3mdqiY +N6FNqUYzCq30Fw6UMFqE4N8WEy7lJXDVmaaYej5kgne6MrVV2sCBFFKH3WTt1C8x +WB5dPax7WtzUvygq9Ocg8XZTCxKjf7k= +-----END EC PRIVATE KEY----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/inc/target_AP2220.h b/feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/inc/target_AP2220.h new file mode 100644 index 000000000..bea4179c4 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/inc/target_AP2220.h @@ -0,0 +1,66 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef TARGET_AP2220_H_INCLUDED +#define TARGET_AP2220_H_INCLUDED + +#include "dpp_client.h" +#include "dpp_survey.h" + +#define TARGET_CERT_PATH "/var/run/openvswitch/certs" +#define TARGET_MANAGERS_PID_PATH "/tmp/dmpid" +#define TARGET_OVSDB_SOCK_PATH "/var/run/openvswitch/db.sock" +#define TARGET_LOGREAD_FILENAME "messages" + +void target_ifname_map_init(); +bool target_map_cloud_to_iw(const char *ifname, char *iw_name, size_t length); +bool target_map_cloud_to_phy(const char *ifname, char *phy_name, size_t length); + +typedef struct +{ + DPP_TARGET_CLIENT_RECORD_COMMON_STRUCT; + dpp_client_stats_t stats; +} target_client_record_t; + +typedef struct +{ + DPP_TARGET_SURVEY_RECORD_COMMON_STRUCT; +} target_survey_record_t; + +typedef void target_capacity_data_t; + +/****************************************************************************** + * MANAGERS definitions + *****************************************************************************/ +#if !defined(CONFIG_TARGET_MANAGER) +#define TARGET_MANAGER_PATH(X) "/usr/plume/bin/"X +#endif + +#define TARGET_TOOLS_PATH "/usr/plume/tools" + +#include "target_common.h" + +#endif /* TARGET_AP2220_H_INCLUDED */ diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/override.mk b/feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/override.mk new file mode 100644 index 000000000..913a3a51b --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/override.mk @@ -0,0 +1,3 @@ +UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/entity.c +UNIT_CFLAGS += -I$(OVERRIDE_DIR)/inc +UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS) diff --git a/feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/src/entity.c b/feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/src/entity.c new file mode 100644 index 000000000..c9f345b0d --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ap2220/src/lib/target/src/entity.c @@ -0,0 +1,203 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include +#include +#include "log.h" + +/* devinfo is /dev/mtd9 for AP2220*/ +static char devInfoFileName[] = "/dev/mtd9"; +#define DEV_INFO_RECORD_SZ 40 +static char devInfoModelNumber[DEV_INFO_RECORD_SZ]; +static char devInfoSerialNumber[DEV_INFO_RECORD_SZ]; +static bool devInfoModelNumber_saved = false; +static bool devInfoSerialNumber_saved = false; + +typedef struct +{ + char *cloud_ifname; + char *iw_ifname; + char *iw_phyname; +} ifmap_t; + +ifmap_t stats_ifmap[] = { + { "home-ap-24", "wlan1", "phy1" }, + { "home-ap-u50", "wlan0", "phy0" }, + { NULL, NULL, NULL } +}; + +void target_ifname_map_init() +{ + target_map_init(); + + //Radio mappings + target_map_insert("wifi0", "radio1"); + target_map_insert("wifi1", "radio2"); + target_map_insert("wifi2", "radio0"); + + //VIF mappings + target_map_insert("home-ap-u50", "default_radio0"); + target_map_insert("home-ap-24", "default_radio1"); + target_map_insert("home-ap-l50", "default_radio2"); +} + +bool target_map_cloud_to_iw(const char *ifname, char *iw_name, size_t length) +{ + ifmap_t *mp; + + mp = stats_ifmap; + while (mp->cloud_ifname) + { + if (!strcmp(mp->cloud_ifname, ifname)) + { + strscpy(iw_name, mp->iw_ifname, length); + return true; + } + + mp++; + } + + return false; +} + +bool target_map_cloud_to_phy(const char *ifname, char *phy_name, size_t length) +{ + ifmap_t *mp; + + mp = stats_ifmap; + while (mp->cloud_ifname) + { + if (!strcmp(mp->cloud_ifname, ifname)) + { + strscpy(phy_name, mp->iw_phyname, length); + return true; + } + + mp++; + } + + return false; +} + +char *get_devinfo_record( char * tag, char * payload, size_t payloadsz ) +{ + FILE *devInfoFn = NULL; + char buffer[80]; + char *tagPtr, *payloadPtr; + int bytesRead = 0; + bool record_found = false; + + if (tag == NULL) return NULL; + + devInfoFn = fopen(devInfoFileName, "r"); + if (devInfoFn == NULL) { + LOGE("File open failed %s %s", devInfoFileName, tag ); + return NULL; + } + memset(buffer, 0, 80); + payload[0] = 0; + + while ( bytesRead < 0x300 && !feof(devInfoFn)) { + fgets( buffer, 80, devInfoFn); + tagPtr = strstr(buffer, tag); + if (tagPtr != NULL) { + strtok(tagPtr,"="); + payloadPtr = strtok(NULL, " \n\r"); + LOGN ("devInfo %s %s", tag, payloadPtr); + strncpy(payload, payloadPtr, payloadsz); + record_found = true; + break; + } else { + bytesRead += strlen(buffer); + } + } + + fclose(devInfoFn); + if (record_found) { + return payload; + } else { + return NULL; + } +} + +bool target_model_get(void *buff, size_t buffsz) +{ + if (!devInfoModelNumber_saved) { + if ( NULL == get_devinfo_record( "modelNumber=", devInfoModelNumber, DEV_INFO_RECORD_SZ)) + snprintf(devInfoModelNumber, DEV_INFO_RECORD_SZ, "%s", "AP2220"); + devInfoModelNumber_saved = true; + } + strncpy(buff, devInfoModelNumber, buffsz); + return true; +} + +bool target_serial_get(void *buff, size_t buffsz) +{ + os_macaddr_t mac; + char mac_buff[TARGET_BUFF_SZ]; + int n; + + if (!devInfoSerialNumber_saved) { + if ( NULL == get_devinfo_record( "serial_number=", devInfoSerialNumber, DEV_INFO_RECORD_SZ)) + { + if (true == os_nif_macaddr("br-lan", &mac)) + { + memset(mac_buff, 0, sizeof(mac_buff)); + n = snprintf(mac_buff, sizeof(mac_buff), PRI(os_macaddr_plain_t), FMT(os_macaddr_t, mac)); + if (n == OS_MACSTR_PLAIN_SZ) { + LOG(ERR, "buffer not large enough"); + return false; + } + strncpy(devInfoSerialNumber, mac_buff, buffsz); + } + } + else + { + snprintf(devInfoSerialNumber, DEV_INFO_RECORD_SZ, "%s", "AP2220-TIP-01"); + } + + devInfoSerialNumber_saved = true; + } + strncpy(buff, devInfoSerialNumber, buffsz); + return true; +} + +bool target_sw_version_get(void *buff, size_t buffsz) +{ + snprintf(buff, buffsz, "%s", "0.1.0"); + + return true; +} + +bool target_platform_version_get(void *buff, size_t buffsz) +{ + snprintf(buff, buffsz, "%s", "OPENWRT_AP2220"); + + return true; +} diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/.version b/feeds/wlan-ap/opensync/src/vendor/ecw5211/.version new file mode 100644 index 000000000..6e8bf73aa --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/.version @@ -0,0 +1 @@ +0.1.0 diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/LICENSE b/feeds/wlan-ap/opensync/src/vendor/ecw5211/LICENSE new file mode 100644 index 000000000..c1f88e0d4 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/NOTICE b/feeds/wlan-ap/opensync/src/vendor/ecw5211/NOTICE new file mode 100644 index 000000000..f024b551f --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/NOTICE @@ -0,0 +1,2 @@ +Copyright 2019, Plume Design Inc. All rights reserved. +Licensed under the "3-Clause BSD License" also known as "Revised BSD License" diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/README.md b/feeds/wlan-ap/opensync/src/vendor/ecw5211/README.md new file mode 100644 index 000000000..42fb3fdda --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/README.md @@ -0,0 +1,9 @@ +OpenSync vendor layer example for armvirt +----------------------------------------- + +This is an example vendor layer for the OpenWrt `armvirt` target. +It can be used as a template for other targets. + +This repository is a part of the `opensync-openwrt` project. + +For more info please visit: https://opensync.io diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/build/vendor-arch.mk b/feeds/wlan-ap/opensync/src/vendor/ecw5211/build/vendor-arch.mk new file mode 100644 index 000000000..18a10423e --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/build/vendor-arch.mk @@ -0,0 +1,9 @@ +OS_TARGETS +=ECW5211 + +ifeq ($(TARGET),ECW5211) +PLATFORM=openwrt +VENDOR=ecw5211 +PLATFORM_DIR := platform/$(PLATFORM) +KCONFIG_TARGET ?= $(PLATFORM_DIR)/kconfig/openwrt_generic +ARCH_MK := $(PLATFORM_DIR)/build/$(PLATFORM).mk +endif diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/ovsdb/static_configuration.json b/feeds/wlan-ap/opensync/src/vendor/ecw5211/ovsdb/static_configuration.json new file mode 100644 index 000000000..275136c22 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/ovsdb/static_configuration.json @@ -0,0 +1,104 @@ +[ + "Open_vSwitch", + { + "op":"insert", + "table":"Wifi_Inet_State", + "row": { + "if_name": "br-lan", + "ip_assign_scheme": "static", + "inet_addr": "192.168.1.1", + "netmask": "255.255.255.0", + "if_type": "bridge", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": false + } + }, + { + "op":"insert", + "table":"Wifi_Inet_State", + "row": { + "if_name": "eth0", + "ip_assign_scheme": "dhcp", + "if_type": "eth", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": true + } + + }, + { + "op":"insert", + "table":"Wifi_Inet_Config", + "row": { + "if_name": "br-lan", + "ip_assign_scheme": "static", + "inet_addr": "192.168.1.1", + "netmask": "255.255.255.0", + "if_type": "bridge", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": false + } + }, + { + "op":"insert", + "table":"Wifi_Inet_Config", + "row": { + "if_name": "eth0", + "ip_assign_scheme": "dhcp", + "if_type": "eth", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": true + } + }, + { + "op": "insert", + "table": "Wifi_Radio_Config", + "row": { + "if_name": "wlan0", + "freq_band": "2.4G", + "hw_type": "AR9382", + "hw_mode": "11n", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_Config", + "row": { + "if_name": "wlan1", + "freq_band": "5G", + "hw_type": "qca9880", + "hw_mode": "11ac", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_State", + "row": { + "if_name": "wlan0", + "freq_band": "2.4G", + "hw_type": "AR9382", + "hw_mode": "11n", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_State", + "row": { + "if_name": "wlan1", + "freq_band": "5G", + "hw_type": "qca9880", + "hw_mode": "11ac", + "channel_mode": "cloud" + } + } +] diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/ca.pem b/feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/ca.pem new file mode 100644 index 000000000..4567e3e46 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/ca.pem @@ -0,0 +1,179 @@ +-----BEGIN CERTIFICATE----- +MIIGSTCCBDGgAwIBAgIEEAAABDANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJV +UzEaMBgGA1UECgwRUGx1bWUgRGVzaWduIEluYy4xKzApBgNVBAsMIlBsdW1lIERl +c2lnbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHTAbBgNVBAMMFFBsdW1lIERlc2ln +biBSb290IENBMB4XDTE4MDEyMjIzMjMzOVoXDTI4MDEyMjIzMjMzOVowbTELMAkG +A1UEBhMCVVMxGjAYBgNVBAoMEVBsdW1lIERlc2lnbiBJbmMuMSswKQYDVQQLDCJQ +bHVtZSBEZXNpZ24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRUwEwYDVQQDDAxQbHVt +ZSBUTFMgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDSDVhBzdBE +OM7oi7YzRevbzmM5dJhYKC+l44lFnltTIObbFk4QGN/sGQmgtZybEHtBnFgbamb5 +sIJsBVCkNFojFjg/HQwDc7TpwWN339t3Ih7iXmReiEfp8h1msWQRBpP3+d3E56ZP +PlJwivbw3ywfXSv7QlxSZ5iJeC6amPohvj3/VJeqM5c8hiiDuuZsZMAaW2Yl9gm/ +keM//Z7AfIGjbidUmJ9nfDftNPexqzx82RROATONIglk3PXjZxAyKSEuYS0djuPK +XXu5j8w222efdS6ARufpEZAO5LH/MVPdZpT1Emzh+uKjTQYlL0Flu8PyP30Do/cK +KBGMwZYAV4op8or8ntK7ndDTu3Xr6tq6g6KduxUjVukXpAmQhbwoGRUzJj4zC3oM +QkIYLlM1JOUrIlSw0s/E2ONNaWhL89bNFw3/LOhG6yAjbeJvjsebB/iQEvVJQfmV +i73QNwQQ93kCj+/unIkc+hi1/Vjuhkx3Q+LV4wjG4iaUoPlf49K1SqV9xDcc+2KF +0K8sVQ4Tqb2UQYp63C44HEZzRS3fhBp7xmEBTncCOckttqz1zCZQ0dcuyYm3bovf +NO5ur7OvvNL7ALJz9ah56v5KUDDqeH+aRm8i/rYdDSpcNm5kA9Ct2Q7/RSCCqFlO +bk+1yEkgAm9Jkebvi5L05dJryhXw31cXVwIDAQABo4HoMIHlMA4GA1UdDwEB/wQE +AwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTKifKsuPwRxf+47Nsr +UHqivPBIkTAfBgNVHSMEGDAWgBQivhNIgc2MBY9u64p9MYFvWmDNOTBEBggrBgEF +BQcBAQQ4MDYwNAYIKwYBBQUHMAKGKGh0dHBzOi8vd3d3LnBsdW1ld2lmaS5jb20v +Y2Evcm9vdC1jYS5jZXIwOQYDVR0fBDIwMDAuoCygKoYoaHR0cHM6Ly93d3cucGx1 +bWV3aWZpLmNvbS9jYS9yb290LWNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAjG4R +nkcVdO4oQqjJeWLIdNu48V3T7CB08t3sqjQaxu4gAXfYm8a+tdubff6Dg0PuTFzh +edogXQchaEiYeEFTPNrz4hf5NhS+9t2PKcEpAKCbY6vjpfT9F5gUDrXmfUZnLIUV +SVXZ6NC+/jI56cAykbCv5ytYxSE0LxSgA3OLZyd4QESJdSJIkCw7s3nDx7rv05Np +UjQuFu1+WbXxUkrKYZBCTwczuKsDc2syiscC2sBUydDbK1jySV1og3nY6JXojNSa +V8OtnsnAUdD8Gbg38UNFb3SN7VmE1RIYgXgj7tVEKW/Rhyf49LCchAl+CO2m9TKW +ZPA2NcQ94b++VoreAdkpH3eOkko12RofWQo+wHT/g6qm668L7exONawjmU+Or2Wj +TXJFz5xb57kEnZjyXX4GgCxVSr8hHPA0+gFRPS4mkUZAQaH5XkODvcLAJ6CCSYIp +78B89VI8lkSji0wanlGcrSbUVHg6bVNw++gW//N4DRfqURRqYwDLQt6BXi11vgSu +l8NrrzBLU7leb1+IcY5p8g+z9HE4PM7uxd9fcP/P3Rldq7EW9V1NIXTn0kPHJd2C +zDReVg7t/tCFWM6wyXL1KKuXd36Py1XxATsgEwkmfXJn4QjOn60NK/SxTDKIBfvZ +9iWfWz/J3JLDRMk5Y/5CFuC6lm+6cHkbT4WR3wA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +cg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGxzCCBK+gAwIBAgIJAIyLecDrnpzeMA0GCSqGSIb3DQEBCwUAMIGdMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJUGFsbyBBbHRv +MRswGQYDVQQKExJQbHVtZSBEZXNpZ24sIEluYy4xJDAiBgkqhkiG9w0BCQEWFXN1 +cHBvcnRAcGx1bWV3aWZpLmNvbTEiMCAGA1UEAxMZUGx1bWUgRGVzaWduIEF1dGhv +cml0eSBBMTAeFw0xNjAzMDMyMjQwMTRaFw0yMTAzMDIyMjQwMTRaMIGdMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJUGFsbyBBbHRv +MRswGQYDVQQKExJQbHVtZSBEZXNpZ24sIEluYy4xJDAiBgkqhkiG9w0BCQEWFXN1 +cHBvcnRAcGx1bWV3aWZpLmNvbTEiMCAGA1UEAxMZUGx1bWUgRGVzaWduIEF1dGhv +cml0eSBBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALo0cr8ZyiLs +CUyp4P4JFXkU6Ymx6QhN1DZ1SCuDgiMkX8A7/QCDMKz7Q70qqM022NwYW3Ff5VJG +El/epXmcaPx7vzfXpsy023mtyaLcwovCwr+IRDM5LgKlW9v3wcaWBWLEXbbv8are +a9q1eXW5jJjAyDMPdkrUqCwdJy3Gjnwy16mRiBnaY6A2+wVr5mTzkrtNGzJiEzhX +MECnal7T16sOC8HeaJZ4BVYJzxAnyU+wlf0ygzQeF4WaYXTDgcRs8g1D62LHcr7f +ioAT2Z69V5CVHFX7VJoE1PJeU867GwZDtM+osZ0WJFkeMA8cJgrs7ujKTl9nmiVp +Q2qt6BDABrd9ibZkjHj5XcXQz7o+z3zwL9v9x/1bilmY/yBz2rlozR+xbNwTM6Ra +D+FXpcv2caj2851Ci59eh+5eCJJkMNzGKdZZ9wyMaPqk2bynGDf6glhJc2cML9L3 ++L/iLq63yiYDOmDwKXiAjPVCPPgMPxp+Y4gwfiZdop2ou8W7xzFxOEwKuS8qK6Qp +9j8Mq1ritAFa4WIiVsuHjrEkmykCzHvb9z5ujsrZ4hJzBDNqfjXkazpR2wb4o895 +YfBQIHdoQy2H+wsOEaNatUkFuSE5uw2nMS+SDf8J2ouAG0U51n/SnWKd636WC4s+ +Mn5Bd8nwNP1H1DXCUf8TS7iow+Bt0A+VAgMBAAGjggEGMIIBAjAdBgNVHQ4EFgQU +CBK8rxUUByBBgsU0VXsOLjVIWiEwgdIGA1UdIwSByjCBx4AUCBK8rxUUByBBgsU0 +VXsOLjVIWiGhgaOkgaAwgZ0xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9y +bmlhMRIwEAYDVQQHEwlQYWxvIEFsdG8xGzAZBgNVBAoTElBsdW1lIERlc2lnbiwg +SW5jLjEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBwbHVtZXdpZmkuY29tMSIwIAYD +VQQDExlQbHVtZSBEZXNpZ24gQXV0aG9yaXR5IEExggkAjIt5wOuenN4wDAYDVR0T +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAsTLMCgl/1rSf/+/14y0FWyj2yvOq +X5hgd/+kIRfIp/5Ib1wWdpWGY5sTV3Vy1rQvWHF/PijP9qMWE5QKfxHh/l2+HKv0 +gyRPW3I4QgK3Qr/u75nNFizYhI2L2n1+2MQmoejcu6TI9Kk5n7oVo3dGn2KxkrKC +WiB0QZmJgD6iIrJQt6oXB/oG4gSHqTIaTawflIvFgr5S94rKjVm+ZBtz6nOO184s +fDGXNOfw8zOXkGB5gAtxF5oX+XQ9s/2y0nrDbT/Oup3MzzrZ2zAEXqIUvb6cP8z6 +IqYGiwtzzhD8F/4jA6dUI/pnlPMnT670sy4YO7GsJaZi/Af/pvdRh342FFUpV3HF ++jJJxuejI+yehI2y0S1M4idmJLaCS5EldJF1GB3DU5CjSOhCeZKpIrkWEAIEXf4f +VTffDmOn/5SAcdKwe9v7tzJ2knNME0BPhVei/cSmU3VI6sAY04HzPtC498BLyaUJ +Nj+70iQ3tvNjegwfRI4CIgn0/Y90W6NcEd9Ihg/MTImH5uQag7ftupFqp7wP882N +SJGjWsd/oMDbB8kcyLKZ8z05nYhxG8v0/D6esu51SAXhnC2G2jybjuk3QHvMRTBo +jMnFwM/u3cRLzWwsHP3dSkY1NsnfMKA+ivUEXslq+8R0EH02Js4OUTrscDKPJSWo +YDLIkv5E8HWLVoc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFyDCCA7CgAwIBAgIJAJ78fVrF1kYwMA0GCSqGSIb3DQEBCwUAMHgxCzAJBgNV +BAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRUGx1bWUgRGVzaWduIEluYy4x +JzAlBgNVBAsMHk9wZW5TeW5jIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UE +AwwOT3BlblN5bmMgQ0EgQTEwIBcNMTkwMzI4MTI0ODIwWhgPMjA2OTAzMTUxMjQ4 +MjBaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRUGx1bWUg +RGVzaWduIEluYy4xJzAlBgNVBAsMHk9wZW5TeW5jIENlcnRpZmljYXRlIEF1dGhv +cml0eTEXMBUGA1UEAwwOT3BlblN5bmMgQ0EgQTEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDZOu6RWVfAJy10izzsgcSVTPqkIK84Jhy02ZxEx+XUOLJg +G6d75a2X2Qdb0xyu4vIr/zAnsFcm8L/w9J5MZh+IRvW1c9f5P7ROjzivM9vfub2I +CJ+4acoN0ErWX5qqNPx1FvL5gM7TzsgbvmUMYKcRxRUKmo9CCO1uJy/zjvr8jDNZ +ZvrI2cPA70UHjwzP3LPANH8gnQTZMdFM3W/K6vyRIJdIYGmsGRYdzrqI2jP7z5Ex +5tiqthZQPlXhwj8QFk8vONbuUEdWq/dPlY4LKDgg4qE0t9eV3kLwC8WPTcly2KwZ +FaFdrQFpeLQh3H3CcaN8O++lv5BlCNEbOkEE9CUaUHbAVSNDv4tePpHp0pFJGkl4 +io6OkJ20hywjyJ71RY+qxgw/oyTii5mDTcqIVYJ3nkblrHKlQihnZ7+uHSJzhioO +JEv0t/eBetG62N4GzuiUH6MUARsDf7sd8anFf+pk4zUEwTVkdkYb2j/tp+g0WV08 +kvnNJ/wRuT9mYO+PKS9HXHwG1brBEwAepN524FgncopTwm+VglsHqrH9c91c5bbC +GwHKlEUEhRy45+2OACIhqhaoPqolFXNLSXGJFAkA7hYzbXrCs7kc8tzrqFj7kUQn +uMQj8TtVM1+gFOfy0J0nGOV7hs/ya30obLGYa8MHXD2cR3GK6Xpl8ZDHeCmQvwID +AQABo1MwUTAdBgNVHQ4EFgQU3Ji6Gbgbvie8gFgWEJNd1OzU31QwHwYDVR0jBBgw +FoAU3Ji6Gbgbvie8gFgWEJNd1OzU31QwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQsFAAOCAgEAkjs7a0eHLLRuzt6+WKA/Q0/MD01H0r9ZaY9LC4WfyY49qsF+ +CYK/7pYPJVc7YbO8hlnxKfCkJlCxP7i4lNN91BW+Lw4keI0J/VKa0GdSnPy88Ps/ +5QtSXn+Yix1VHXfu7q45ORra2ZpuESNxXOCobbLBE6ow8lKNapCYkuex9wE2iMlA +Z72Wul8K8X7oX1yIzNrnBc89b7vbMAc6F0iseE9eINmQpp5sqhk347/dLKOMVVNX +lDqrw1bOgbDLW4aQdkws4fUnH8m7DjeOxSiJhR9jZRimtFdQ9VVv5wuQswGPOXue +7vBDeHP8td3pZrsQygFzprOUvREKSJcle3xgiYxhbtVUfi/nBBgxLPM7+ga4jol6 +AByOCa6nPcMGbWikFTbO+bQgwka7V54RBXjKhBx1XBtpZHAooRm8PPDmesLbUWc1 +SB21o+8Kfm9+kVxup2udDrXo0cQpLskHKNCQOZbiIW/TCF+6cnQGSCCzgcMazgGS +pm5oJskK3/z30xvKphU4o6CZzJocdIX5xS7lX+iQIYZNT42U31juEbhOpGUmg3xO +lBGhysfYkR2AzDifN11uuy8uWca+4JDA6qutieEoNqY2gBMkyBe7qsvlsYphvnCM +gIOXqPD3c4IGS6uxP+hzqn0na/b5Ai4I3iSAh5IvXr5pm+ZaQISq0WFBPIk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/client.pem b/feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/client.pem new file mode 100644 index 000000000..4010e61cc --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/client.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIENDCCAhygAwIBAgIRAJ4QsQE9nHsbpnVHhkAKw2MwDQYJKoZIhvcNAQELBQAw +eDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRowGAYDVQQKDBFQbHVtZSBEZXNp +Z24gSW5jLjEnMCUGA1UECwweT3BlblN5bmMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MRcwFQYDVQQDDA5PcGVuU3luYyBDQSBBMTAeFw03MDAxMDEwMDAwMDBaFw0yOTAz +MjYxMzI5MTNaMIGEMRIwEAYDVQQDDAlQUDMwMlgtRVgxCzAJBgNVBAYTAlVTMRow +GAYDVQQKDBFQbHVtZSBEZXNpZ24gSW5jLjESMBAGA1UEBwwJUGFsbyBBbHRvMQsw +CQYDVQQIDAJDQTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBwbHVtZXdpZmkuY29t +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9nFC6TPcsnh0+fscQaYEKevb0uR95nao +mDehTalGMwqt9BcOlDBahODfFhMu5SVw1ZmmmHo+ZIJ3ujK1VdrAgRRSh91k7dQv +MVgeXT2se1rc1L8oKvTnIPF2UwsSo3+5o1owWDAfBgNVHSMEGDAWgBTcmLoZuBu+ +J7yAWBYQk13U7NTfVDAdBgNVHQ4EFgQUxecQdoP09CyFbUJUdeLj/R3Ah2AwFgYD +VR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAH23KQlxb2Du +9XvHlq+AC5bF3cEFHxXS181qX+v61hMJm8VjugCzWuLuzc2bXEYFB+ZIVIPyTdAJ +tP7EizrUxWUgBbbsgHRFdy/jPXj5XF6PE7GhSgRi3FbYwxrzuIasEaAziagHr7ep +Hn3rJiNAo/KYhGyBpFYU7tJRmkpx1xaX8C5pTunR7jbyqOXM/h+rLlZJj2OHObN6 +xsFpcIJdT24pGTo9q5hhJUgxPlDnhrSB6yHoweO1FVgztsdjZKGou3RuKldVgunG +m/KyYP9oAQYRX0QRvRrDTOzVb2ezPd/KUwNMprLanXu0lu2T++H8xiQt41BdgMsl +63lkFDkFmeRgmaQUuiGMjU/Sac+kFhnkd/hoGigHYrgETd0FuqlWVE2VBsyv3/Pw +3126SXL1spbl+/apVioH9Nl24fUQKbv5Bnyhd5IIjzgG8SMzPQ4CbSHAWqUqkdUZ +bprS3nwLnE29zPULCg7Q1JfDsbf1+xe+r5xXVpUuca2kb4VnnNQ/z/jJCdP/3gy9 +jawfPNl0fwIHywLzaec1jtBmPFEPul7baRPCQdB3JF/WeuRuV3zakSs8XB8YyJaq +Lq3KtNBJDcSEKn/Tc5wLRaEOCiRoQtVhtX7Cer9JUYcRWsLvO1e/N3z7LxFcv8/w +glSwr3kI080u6Fx4QjxQWVWZiYL+3v01 +-----END CERTIFICATE----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/client_dec.key b/feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/client_dec.key new file mode 100644 index 000000000..64ef309da --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/rootfs/common/usr/plume/certs/client_dec.key @@ -0,0 +1,7 @@ +-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDCyrVlkcE5QLYWpNyRTSo8zhjZ3ksrLzhdFgfIPDDO0HGTk/08aTGGM +VrEvui9yLBmgBwYFK4EEACKhZANiAAT2cULpM9yyeHT5+xxBpgQp69vS5H3mdqiY +N6FNqUYzCq30Fw6UMFqE4N8WEy7lJXDVmaaYej5kgne6MrVV2sCBFFKH3WTt1C8x +WB5dPax7WtzUvygq9Ocg8XZTCxKjf7k= +-----END EC PRIVATE KEY----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/inc/target_ECW5211.h b/feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/inc/target_ECW5211.h new file mode 100644 index 000000000..2daa187b5 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/inc/target_ECW5211.h @@ -0,0 +1,66 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef TARGET_ECW5211_H_INCLUDED +#define TARGET_ECW5211_H_INCLUDED + +#include "dpp_client.h" +#include "dpp_survey.h" + +#define TARGET_CERT_PATH "/var/run/openvswitch/certs" +#define TARGET_MANAGERS_PID_PATH "/tmp/dmpid" +#define TARGET_OVSDB_SOCK_PATH "/var/run/openvswitch/db.sock" +#define TARGET_LOGREAD_FILENAME "messages" + +void target_ifname_map_init(); +bool target_map_cloud_to_iw(const char *ifname, char *iw_name, size_t length); +bool target_map_cloud_to_phy(const char *ifname, char *phy_name, size_t length); + +typedef struct +{ + DPP_TARGET_CLIENT_RECORD_COMMON_STRUCT; + dpp_client_stats_t stats; +} target_client_record_t; + +typedef struct +{ + DPP_TARGET_SURVEY_RECORD_COMMON_STRUCT; +} target_survey_record_t; + +typedef void target_capacity_data_t; + +/****************************************************************************** + * MANAGERS definitions + *****************************************************************************/ +#if !defined(CONFIG_TARGET_MANAGER) +#define TARGET_MANAGER_PATH(X) "/usr/plume/bin/"X +#endif + +#define TARGET_TOOLS_PATH "/usr/plume/tools" + +#include "target_common.h" + +#endif /* TARGET_ECW5211_H_INCLUDED */ diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/override.mk b/feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/override.mk new file mode 100644 index 000000000..913a3a51b --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/override.mk @@ -0,0 +1,3 @@ +UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/entity.c +UNIT_CFLAGS += -I$(OVERRIDE_DIR)/inc +UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS) diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/src/entity.c b/feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/src/entity.c new file mode 100644 index 000000000..7fa712696 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5211/src/lib/target/src/entity.c @@ -0,0 +1,204 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include +#include +#include "log.h" + +/* devinfo is /dev/mtd9 for ECW5211 */ +static char devInfoFileName[] = "/dev/mtd9"; +#define DEV_INFO_RECORD_SZ 40 +static char devInfoModelNumber[DEV_INFO_RECORD_SZ]; +static char devInfoSerialNumber[DEV_INFO_RECORD_SZ]; +static bool devInfoModelNumber_saved = false; +static bool devInfoSerialNumber_saved = false; + +typedef struct +{ + char *cloud_ifname; + char *iw_ifname; + char *iw_phyname; +} ifmap_t; + +ifmap_t stats_ifmap[] = { + { "home-ap-24", "wlan0", "phy0" }, + { "home-ap-u50", "wlan1", "phy1" }, + { NULL, NULL, NULL } +}; + +void target_ifname_map_init() +{ + target_map_init(); + + //Radio mappings + target_map_insert("wifi0", "radio0"); + target_map_insert("wifi1", "radio2"); + target_map_insert("wifi2", "radio1"); + + //VIF mappings + target_map_insert("home-ap-u50", "default_radio1"); + target_map_insert("home-ap-24", "default_radio0"); + target_map_insert("home-ap-l50", "default_radio2"); +} + +bool target_map_cloud_to_iw(const char *ifname, char *iw_name, size_t length) +{ + ifmap_t *mp; + + mp = stats_ifmap; + while (mp->cloud_ifname) + { + if (!strcmp(mp->cloud_ifname, ifname)) + { + strscpy(iw_name, mp->iw_ifname, length); + return true; + } + + mp++; + } + + return false; +} + +bool target_map_cloud_to_phy(const char *ifname, char *phy_name, size_t length) +{ + ifmap_t *mp; + + mp = stats_ifmap; + while (mp->cloud_ifname) + { + if (!strcmp(mp->cloud_ifname, ifname)) + { + strscpy(phy_name, mp->iw_phyname, length); + return true; + } + + mp++; + } + + return false; +} + +char *get_devinfo_record( char * tag, char * payload, size_t payloadsz ) +{ + FILE *devInfoFn = NULL; + char buffer[80]; + char *tagPtr, *payloadPtr; + int bytesRead = 0; + bool record_found = false; + + if (tag == NULL) return NULL; + + devInfoFn = fopen(devInfoFileName, "r"); + if (devInfoFn == NULL) { + LOGE("File open failed %s %s", devInfoFileName, tag ); + return NULL; + } + memset(buffer, 0, 80); + payload[0] = 0; + + while ( bytesRead < 0x300 && !feof(devInfoFn)) { + fgets( buffer, 80, devInfoFn); + tagPtr = strstr(buffer, tag); + if (tagPtr != NULL) { + strtok(tagPtr,"="); + payloadPtr = strtok(NULL, " \n\r"); + LOGN ("devInfo %s %s", tag, payloadPtr); + strncpy(payload, payloadPtr, payloadsz); + record_found = true; + break; + } else { + bytesRead += strlen(buffer); + } + } + + fclose(devInfoFn); + if (record_found) { + return payload; + } else { + return NULL; + } +} + +bool target_model_get(void *buff, size_t buffsz) +{ + if (!devInfoModelNumber_saved) { + if ( NULL == get_devinfo_record( "modelNumber=", devInfoModelNumber, DEV_INFO_RECORD_SZ)) + snprintf(devInfoModelNumber, DEV_INFO_RECORD_SZ, "%s", "ECW5211"); + devInfoModelNumber_saved = true; + } + strncpy(buff, devInfoModelNumber, buffsz); + return true; +} + +bool target_serial_get(void *buff, size_t buffsz) +{ + os_macaddr_t mac; + char mac_buff[TARGET_BUFF_SZ]; + int n; + + if (!devInfoSerialNumber_saved) { + if ( NULL == get_devinfo_record( "serial_number=", devInfoSerialNumber, DEV_INFO_RECORD_SZ)) + { + if (true == os_nif_macaddr("eth0", &mac)) + { + memset(mac_buff, 0, sizeof(mac_buff)); + n = snprintf(mac_buff, sizeof(mac_buff), PRI(os_macaddr_plain_t), FMT(os_macaddr_t, mac)); + if (n == OS_MACSTR_PLAIN_SZ) { + LOG(ERR, "buffer not large enough"); + return false; + } + strncpy(devInfoSerialNumber, mac_buff, buffsz); + } + } + else + { + snprintf(devInfoSerialNumber, DEV_INFO_RECORD_SZ, "%s", "ECW5211-TIP-01"); + } + + devInfoSerialNumber_saved = true; + } + strncpy(buff, devInfoSerialNumber, buffsz); + return true; +} + +bool target_sw_version_get(void *buff, size_t buffsz) +{ + snprintf(buff, buffsz, "%s", "0.1.0"); + + return true; +} + +bool target_platform_version_get(void *buff, size_t buffsz) +{ + snprintf(buff, buffsz, "%s", "OPENWRT_ECW5211"); + + return true; +} + diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/.version b/feeds/wlan-ap/opensync/src/vendor/ecw5410/.version new file mode 100644 index 000000000..6e8bf73aa --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/.version @@ -0,0 +1 @@ +0.1.0 diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/LICENSE b/feeds/wlan-ap/opensync/src/vendor/ecw5410/LICENSE new file mode 100644 index 000000000..c1f88e0d4 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/NOTICE b/feeds/wlan-ap/opensync/src/vendor/ecw5410/NOTICE new file mode 100644 index 000000000..f024b551f --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/NOTICE @@ -0,0 +1,2 @@ +Copyright 2019, Plume Design Inc. All rights reserved. +Licensed under the "3-Clause BSD License" also known as "Revised BSD License" diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/README.md b/feeds/wlan-ap/opensync/src/vendor/ecw5410/README.md new file mode 100644 index 000000000..42fb3fdda --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/README.md @@ -0,0 +1,9 @@ +OpenSync vendor layer example for armvirt +----------------------------------------- + +This is an example vendor layer for the OpenWrt `armvirt` target. +It can be used as a template for other targets. + +This repository is a part of the `opensync-openwrt` project. + +For more info please visit: https://opensync.io diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/build/vendor-arch.mk b/feeds/wlan-ap/opensync/src/vendor/ecw5410/build/vendor-arch.mk new file mode 100644 index 000000000..9789785e8 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/build/vendor-arch.mk @@ -0,0 +1,9 @@ +OS_TARGETS +=ECW5410 + +ifeq ($(TARGET),ECW5410) +PLATFORM=openwrt +VENDOR=ecw5410 +PLATFORM_DIR := platform/$(PLATFORM) +KCONFIG_TARGET ?= $(PLATFORM_DIR)/kconfig/openwrt_generic +ARCH_MK := $(PLATFORM_DIR)/build/$(PLATFORM).mk +endif diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/ovsdb/static_configuration.json b/feeds/wlan-ap/opensync/src/vendor/ecw5410/ovsdb/static_configuration.json new file mode 100644 index 000000000..9954bc9ba --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/ovsdb/static_configuration.json @@ -0,0 +1,104 @@ +[ + "Open_vSwitch", + { + "op":"insert", + "table":"Wifi_Inet_State", + "row": { + "if_name": "br-lan", + "ip_assign_scheme": "static", + "inet_addr": "192.168.1.1", + "netmask": "255.255.255.0", + "if_type": "bridge", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": false + } + }, + { + "op":"insert", + "table":"Wifi_Inet_State", + "row": { + "if_name": "eth0", + "ip_assign_scheme": "dhcp", + "if_type": "eth", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": true + } + + }, + { + "op":"insert", + "table":"Wifi_Inet_Config", + "row": { + "if_name": "br-lan", + "ip_assign_scheme": "static", + "inet_addr": "192.168.1.1", + "netmask": "255.255.255.0", + "if_type": "bridge", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": false + } + }, + { + "op":"insert", + "table":"Wifi_Inet_Config", + "row": { + "if_name": "eth0", + "ip_assign_scheme": "dhcp", + "if_type": "eth", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": true + } + }, + { + "op": "insert", + "table": "Wifi_Radio_Config", + "row": { + "if_name": "wlan0", + "freq_band": "2.4G", + "hw_type": "AR9382", + "hw_mode": "11n", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_Config", + "row": { + "if_name": "wlan1", + "freq_band": "5G", + "hw_type": "qca9880", + "hw_mode": "11ac", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_State", + "row": { + "if_name": "wlan0", + "freq_band": "2.4G", + "hw_type": "AR9382", + "hw_mode": "11n", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_State", + "row": { + "if_name": "wlan1", + "freq_band": "5G", + "hw_type": "qca9880", + "hw_mode": "11ac", + "channel_mode": "cloud" + } + } +] diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/ca.pem b/feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/ca.pem new file mode 100644 index 000000000..4567e3e46 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/ca.pem @@ -0,0 +1,179 @@ +-----BEGIN CERTIFICATE----- +MIIGSTCCBDGgAwIBAgIEEAAABDANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJV +UzEaMBgGA1UECgwRUGx1bWUgRGVzaWduIEluYy4xKzApBgNVBAsMIlBsdW1lIERl +c2lnbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHTAbBgNVBAMMFFBsdW1lIERlc2ln +biBSb290IENBMB4XDTE4MDEyMjIzMjMzOVoXDTI4MDEyMjIzMjMzOVowbTELMAkG +A1UEBhMCVVMxGjAYBgNVBAoMEVBsdW1lIERlc2lnbiBJbmMuMSswKQYDVQQLDCJQ +bHVtZSBEZXNpZ24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRUwEwYDVQQDDAxQbHVt +ZSBUTFMgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDSDVhBzdBE +OM7oi7YzRevbzmM5dJhYKC+l44lFnltTIObbFk4QGN/sGQmgtZybEHtBnFgbamb5 +sIJsBVCkNFojFjg/HQwDc7TpwWN339t3Ih7iXmReiEfp8h1msWQRBpP3+d3E56ZP +PlJwivbw3ywfXSv7QlxSZ5iJeC6amPohvj3/VJeqM5c8hiiDuuZsZMAaW2Yl9gm/ +keM//Z7AfIGjbidUmJ9nfDftNPexqzx82RROATONIglk3PXjZxAyKSEuYS0djuPK +XXu5j8w222efdS6ARufpEZAO5LH/MVPdZpT1Emzh+uKjTQYlL0Flu8PyP30Do/cK +KBGMwZYAV4op8or8ntK7ndDTu3Xr6tq6g6KduxUjVukXpAmQhbwoGRUzJj4zC3oM +QkIYLlM1JOUrIlSw0s/E2ONNaWhL89bNFw3/LOhG6yAjbeJvjsebB/iQEvVJQfmV +i73QNwQQ93kCj+/unIkc+hi1/Vjuhkx3Q+LV4wjG4iaUoPlf49K1SqV9xDcc+2KF +0K8sVQ4Tqb2UQYp63C44HEZzRS3fhBp7xmEBTncCOckttqz1zCZQ0dcuyYm3bovf +NO5ur7OvvNL7ALJz9ah56v5KUDDqeH+aRm8i/rYdDSpcNm5kA9Ct2Q7/RSCCqFlO +bk+1yEkgAm9Jkebvi5L05dJryhXw31cXVwIDAQABo4HoMIHlMA4GA1UdDwEB/wQE +AwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTKifKsuPwRxf+47Nsr +UHqivPBIkTAfBgNVHSMEGDAWgBQivhNIgc2MBY9u64p9MYFvWmDNOTBEBggrBgEF +BQcBAQQ4MDYwNAYIKwYBBQUHMAKGKGh0dHBzOi8vd3d3LnBsdW1ld2lmaS5jb20v +Y2Evcm9vdC1jYS5jZXIwOQYDVR0fBDIwMDAuoCygKoYoaHR0cHM6Ly93d3cucGx1 +bWV3aWZpLmNvbS9jYS9yb290LWNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAjG4R +nkcVdO4oQqjJeWLIdNu48V3T7CB08t3sqjQaxu4gAXfYm8a+tdubff6Dg0PuTFzh +edogXQchaEiYeEFTPNrz4hf5NhS+9t2PKcEpAKCbY6vjpfT9F5gUDrXmfUZnLIUV +SVXZ6NC+/jI56cAykbCv5ytYxSE0LxSgA3OLZyd4QESJdSJIkCw7s3nDx7rv05Np +UjQuFu1+WbXxUkrKYZBCTwczuKsDc2syiscC2sBUydDbK1jySV1og3nY6JXojNSa +V8OtnsnAUdD8Gbg38UNFb3SN7VmE1RIYgXgj7tVEKW/Rhyf49LCchAl+CO2m9TKW +ZPA2NcQ94b++VoreAdkpH3eOkko12RofWQo+wHT/g6qm668L7exONawjmU+Or2Wj +TXJFz5xb57kEnZjyXX4GgCxVSr8hHPA0+gFRPS4mkUZAQaH5XkODvcLAJ6CCSYIp +78B89VI8lkSji0wanlGcrSbUVHg6bVNw++gW//N4DRfqURRqYwDLQt6BXi11vgSu +l8NrrzBLU7leb1+IcY5p8g+z9HE4PM7uxd9fcP/P3Rldq7EW9V1NIXTn0kPHJd2C +zDReVg7t/tCFWM6wyXL1KKuXd36Py1XxATsgEwkmfXJn4QjOn60NK/SxTDKIBfvZ +9iWfWz/J3JLDRMk5Y/5CFuC6lm+6cHkbT4WR3wA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +cg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGxzCCBK+gAwIBAgIJAIyLecDrnpzeMA0GCSqGSIb3DQEBCwUAMIGdMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJUGFsbyBBbHRv +MRswGQYDVQQKExJQbHVtZSBEZXNpZ24sIEluYy4xJDAiBgkqhkiG9w0BCQEWFXN1 +cHBvcnRAcGx1bWV3aWZpLmNvbTEiMCAGA1UEAxMZUGx1bWUgRGVzaWduIEF1dGhv +cml0eSBBMTAeFw0xNjAzMDMyMjQwMTRaFw0yMTAzMDIyMjQwMTRaMIGdMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJUGFsbyBBbHRv +MRswGQYDVQQKExJQbHVtZSBEZXNpZ24sIEluYy4xJDAiBgkqhkiG9w0BCQEWFXN1 +cHBvcnRAcGx1bWV3aWZpLmNvbTEiMCAGA1UEAxMZUGx1bWUgRGVzaWduIEF1dGhv +cml0eSBBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALo0cr8ZyiLs +CUyp4P4JFXkU6Ymx6QhN1DZ1SCuDgiMkX8A7/QCDMKz7Q70qqM022NwYW3Ff5VJG +El/epXmcaPx7vzfXpsy023mtyaLcwovCwr+IRDM5LgKlW9v3wcaWBWLEXbbv8are +a9q1eXW5jJjAyDMPdkrUqCwdJy3Gjnwy16mRiBnaY6A2+wVr5mTzkrtNGzJiEzhX +MECnal7T16sOC8HeaJZ4BVYJzxAnyU+wlf0ygzQeF4WaYXTDgcRs8g1D62LHcr7f +ioAT2Z69V5CVHFX7VJoE1PJeU867GwZDtM+osZ0WJFkeMA8cJgrs7ujKTl9nmiVp +Q2qt6BDABrd9ibZkjHj5XcXQz7o+z3zwL9v9x/1bilmY/yBz2rlozR+xbNwTM6Ra +D+FXpcv2caj2851Ci59eh+5eCJJkMNzGKdZZ9wyMaPqk2bynGDf6glhJc2cML9L3 ++L/iLq63yiYDOmDwKXiAjPVCPPgMPxp+Y4gwfiZdop2ou8W7xzFxOEwKuS8qK6Qp +9j8Mq1ritAFa4WIiVsuHjrEkmykCzHvb9z5ujsrZ4hJzBDNqfjXkazpR2wb4o895 +YfBQIHdoQy2H+wsOEaNatUkFuSE5uw2nMS+SDf8J2ouAG0U51n/SnWKd636WC4s+ +Mn5Bd8nwNP1H1DXCUf8TS7iow+Bt0A+VAgMBAAGjggEGMIIBAjAdBgNVHQ4EFgQU +CBK8rxUUByBBgsU0VXsOLjVIWiEwgdIGA1UdIwSByjCBx4AUCBK8rxUUByBBgsU0 +VXsOLjVIWiGhgaOkgaAwgZ0xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9y +bmlhMRIwEAYDVQQHEwlQYWxvIEFsdG8xGzAZBgNVBAoTElBsdW1lIERlc2lnbiwg +SW5jLjEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBwbHVtZXdpZmkuY29tMSIwIAYD +VQQDExlQbHVtZSBEZXNpZ24gQXV0aG9yaXR5IEExggkAjIt5wOuenN4wDAYDVR0T +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAsTLMCgl/1rSf/+/14y0FWyj2yvOq +X5hgd/+kIRfIp/5Ib1wWdpWGY5sTV3Vy1rQvWHF/PijP9qMWE5QKfxHh/l2+HKv0 +gyRPW3I4QgK3Qr/u75nNFizYhI2L2n1+2MQmoejcu6TI9Kk5n7oVo3dGn2KxkrKC +WiB0QZmJgD6iIrJQt6oXB/oG4gSHqTIaTawflIvFgr5S94rKjVm+ZBtz6nOO184s +fDGXNOfw8zOXkGB5gAtxF5oX+XQ9s/2y0nrDbT/Oup3MzzrZ2zAEXqIUvb6cP8z6 +IqYGiwtzzhD8F/4jA6dUI/pnlPMnT670sy4YO7GsJaZi/Af/pvdRh342FFUpV3HF ++jJJxuejI+yehI2y0S1M4idmJLaCS5EldJF1GB3DU5CjSOhCeZKpIrkWEAIEXf4f +VTffDmOn/5SAcdKwe9v7tzJ2knNME0BPhVei/cSmU3VI6sAY04HzPtC498BLyaUJ +Nj+70iQ3tvNjegwfRI4CIgn0/Y90W6NcEd9Ihg/MTImH5uQag7ftupFqp7wP882N +SJGjWsd/oMDbB8kcyLKZ8z05nYhxG8v0/D6esu51SAXhnC2G2jybjuk3QHvMRTBo +jMnFwM/u3cRLzWwsHP3dSkY1NsnfMKA+ivUEXslq+8R0EH02Js4OUTrscDKPJSWo +YDLIkv5E8HWLVoc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFyDCCA7CgAwIBAgIJAJ78fVrF1kYwMA0GCSqGSIb3DQEBCwUAMHgxCzAJBgNV +BAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRUGx1bWUgRGVzaWduIEluYy4x +JzAlBgNVBAsMHk9wZW5TeW5jIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UE +AwwOT3BlblN5bmMgQ0EgQTEwIBcNMTkwMzI4MTI0ODIwWhgPMjA2OTAzMTUxMjQ4 +MjBaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRUGx1bWUg +RGVzaWduIEluYy4xJzAlBgNVBAsMHk9wZW5TeW5jIENlcnRpZmljYXRlIEF1dGhv +cml0eTEXMBUGA1UEAwwOT3BlblN5bmMgQ0EgQTEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDZOu6RWVfAJy10izzsgcSVTPqkIK84Jhy02ZxEx+XUOLJg +G6d75a2X2Qdb0xyu4vIr/zAnsFcm8L/w9J5MZh+IRvW1c9f5P7ROjzivM9vfub2I +CJ+4acoN0ErWX5qqNPx1FvL5gM7TzsgbvmUMYKcRxRUKmo9CCO1uJy/zjvr8jDNZ +ZvrI2cPA70UHjwzP3LPANH8gnQTZMdFM3W/K6vyRIJdIYGmsGRYdzrqI2jP7z5Ex +5tiqthZQPlXhwj8QFk8vONbuUEdWq/dPlY4LKDgg4qE0t9eV3kLwC8WPTcly2KwZ +FaFdrQFpeLQh3H3CcaN8O++lv5BlCNEbOkEE9CUaUHbAVSNDv4tePpHp0pFJGkl4 +io6OkJ20hywjyJ71RY+qxgw/oyTii5mDTcqIVYJ3nkblrHKlQihnZ7+uHSJzhioO +JEv0t/eBetG62N4GzuiUH6MUARsDf7sd8anFf+pk4zUEwTVkdkYb2j/tp+g0WV08 +kvnNJ/wRuT9mYO+PKS9HXHwG1brBEwAepN524FgncopTwm+VglsHqrH9c91c5bbC +GwHKlEUEhRy45+2OACIhqhaoPqolFXNLSXGJFAkA7hYzbXrCs7kc8tzrqFj7kUQn +uMQj8TtVM1+gFOfy0J0nGOV7hs/ya30obLGYa8MHXD2cR3GK6Xpl8ZDHeCmQvwID +AQABo1MwUTAdBgNVHQ4EFgQU3Ji6Gbgbvie8gFgWEJNd1OzU31QwHwYDVR0jBBgw +FoAU3Ji6Gbgbvie8gFgWEJNd1OzU31QwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQsFAAOCAgEAkjs7a0eHLLRuzt6+WKA/Q0/MD01H0r9ZaY9LC4WfyY49qsF+ +CYK/7pYPJVc7YbO8hlnxKfCkJlCxP7i4lNN91BW+Lw4keI0J/VKa0GdSnPy88Ps/ +5QtSXn+Yix1VHXfu7q45ORra2ZpuESNxXOCobbLBE6ow8lKNapCYkuex9wE2iMlA +Z72Wul8K8X7oX1yIzNrnBc89b7vbMAc6F0iseE9eINmQpp5sqhk347/dLKOMVVNX +lDqrw1bOgbDLW4aQdkws4fUnH8m7DjeOxSiJhR9jZRimtFdQ9VVv5wuQswGPOXue +7vBDeHP8td3pZrsQygFzprOUvREKSJcle3xgiYxhbtVUfi/nBBgxLPM7+ga4jol6 +AByOCa6nPcMGbWikFTbO+bQgwka7V54RBXjKhBx1XBtpZHAooRm8PPDmesLbUWc1 +SB21o+8Kfm9+kVxup2udDrXo0cQpLskHKNCQOZbiIW/TCF+6cnQGSCCzgcMazgGS +pm5oJskK3/z30xvKphU4o6CZzJocdIX5xS7lX+iQIYZNT42U31juEbhOpGUmg3xO +lBGhysfYkR2AzDifN11uuy8uWca+4JDA6qutieEoNqY2gBMkyBe7qsvlsYphvnCM +gIOXqPD3c4IGS6uxP+hzqn0na/b5Ai4I3iSAh5IvXr5pm+ZaQISq0WFBPIk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/client.pem b/feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/client.pem new file mode 100644 index 000000000..4010e61cc --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/client.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIENDCCAhygAwIBAgIRAJ4QsQE9nHsbpnVHhkAKw2MwDQYJKoZIhvcNAQELBQAw +eDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRowGAYDVQQKDBFQbHVtZSBEZXNp +Z24gSW5jLjEnMCUGA1UECwweT3BlblN5bmMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MRcwFQYDVQQDDA5PcGVuU3luYyBDQSBBMTAeFw03MDAxMDEwMDAwMDBaFw0yOTAz +MjYxMzI5MTNaMIGEMRIwEAYDVQQDDAlQUDMwMlgtRVgxCzAJBgNVBAYTAlVTMRow +GAYDVQQKDBFQbHVtZSBEZXNpZ24gSW5jLjESMBAGA1UEBwwJUGFsbyBBbHRvMQsw +CQYDVQQIDAJDQTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBwbHVtZXdpZmkuY29t +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9nFC6TPcsnh0+fscQaYEKevb0uR95nao +mDehTalGMwqt9BcOlDBahODfFhMu5SVw1ZmmmHo+ZIJ3ujK1VdrAgRRSh91k7dQv +MVgeXT2se1rc1L8oKvTnIPF2UwsSo3+5o1owWDAfBgNVHSMEGDAWgBTcmLoZuBu+ +J7yAWBYQk13U7NTfVDAdBgNVHQ4EFgQUxecQdoP09CyFbUJUdeLj/R3Ah2AwFgYD +VR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAH23KQlxb2Du +9XvHlq+AC5bF3cEFHxXS181qX+v61hMJm8VjugCzWuLuzc2bXEYFB+ZIVIPyTdAJ +tP7EizrUxWUgBbbsgHRFdy/jPXj5XF6PE7GhSgRi3FbYwxrzuIasEaAziagHr7ep +Hn3rJiNAo/KYhGyBpFYU7tJRmkpx1xaX8C5pTunR7jbyqOXM/h+rLlZJj2OHObN6 +xsFpcIJdT24pGTo9q5hhJUgxPlDnhrSB6yHoweO1FVgztsdjZKGou3RuKldVgunG +m/KyYP9oAQYRX0QRvRrDTOzVb2ezPd/KUwNMprLanXu0lu2T++H8xiQt41BdgMsl +63lkFDkFmeRgmaQUuiGMjU/Sac+kFhnkd/hoGigHYrgETd0FuqlWVE2VBsyv3/Pw +3126SXL1spbl+/apVioH9Nl24fUQKbv5Bnyhd5IIjzgG8SMzPQ4CbSHAWqUqkdUZ +bprS3nwLnE29zPULCg7Q1JfDsbf1+xe+r5xXVpUuca2kb4VnnNQ/z/jJCdP/3gy9 +jawfPNl0fwIHywLzaec1jtBmPFEPul7baRPCQdB3JF/WeuRuV3zakSs8XB8YyJaq +Lq3KtNBJDcSEKn/Tc5wLRaEOCiRoQtVhtX7Cer9JUYcRWsLvO1e/N3z7LxFcv8/w +glSwr3kI080u6Fx4QjxQWVWZiYL+3v01 +-----END CERTIFICATE----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/client_dec.key b/feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/client_dec.key new file mode 100644 index 000000000..64ef309da --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/rootfs/common/usr/plume/certs/client_dec.key @@ -0,0 +1,7 @@ +-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDCyrVlkcE5QLYWpNyRTSo8zhjZ3ksrLzhdFgfIPDDO0HGTk/08aTGGM +VrEvui9yLBmgBwYFK4EEACKhZANiAAT2cULpM9yyeHT5+xxBpgQp69vS5H3mdqiY +N6FNqUYzCq30Fw6UMFqE4N8WEy7lJXDVmaaYej5kgne6MrVV2sCBFFKH3WTt1C8x +WB5dPax7WtzUvygq9Ocg8XZTCxKjf7k= +-----END EC PRIVATE KEY----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/inc/target_ECW5410.h b/feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/inc/target_ECW5410.h new file mode 100644 index 000000000..c92ded895 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/inc/target_ECW5410.h @@ -0,0 +1,66 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef TARGET_ECW5410_H_INCLUDED +#define TARGET_ECW5410_H_INCLUDED + +#include "dpp_client.h" +#include "dpp_survey.h" + +#define TARGET_CERT_PATH "/var/run/openvswitch/certs" +#define TARGET_MANAGERS_PID_PATH "/tmp/dmpid" +#define TARGET_OVSDB_SOCK_PATH "/var/run/openvswitch/db.sock" +#define TARGET_LOGREAD_FILENAME "messages" + +void target_ifname_map_init(); +bool target_map_cloud_to_iw(const char *ifname, char *iw_name, size_t length); +bool target_map_cloud_to_phy(const char *ifname, char *phy_name, size_t length); + +typedef struct +{ + DPP_TARGET_CLIENT_RECORD_COMMON_STRUCT; + dpp_client_stats_t stats; +} target_client_record_t; + +typedef struct +{ + DPP_TARGET_SURVEY_RECORD_COMMON_STRUCT; +} target_survey_record_t; + +typedef void target_capacity_data_t; + +/****************************************************************************** + * MANAGERS definitions + *****************************************************************************/ +#if !defined(CONFIG_TARGET_MANAGER) +#define TARGET_MANAGER_PATH(X) "/usr/plume/bin/"X +#endif + +#define TARGET_TOOLS_PATH "/usr/plume/tools" + +#include "target_common.h" + +#endif /* TARGET_ECW5410_H_INCLUDED */ diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/override.mk b/feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/override.mk new file mode 100644 index 000000000..913a3a51b --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/override.mk @@ -0,0 +1,3 @@ +UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/entity.c +UNIT_CFLAGS += -I$(OVERRIDE_DIR)/inc +UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS) diff --git a/feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/src/entity.c b/feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/src/entity.c new file mode 100644 index 000000000..0481a1338 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ecw5410/src/lib/target/src/entity.c @@ -0,0 +1,204 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include +#include +#include "log.h" + +/* devinfo is /dev/mtd9 for ECW5410*/ +static char devInfoFileName[] = "/dev/mtd9"; +#define DEV_INFO_RECORD_SZ 40 +static char devInfoModelNumber[DEV_INFO_RECORD_SZ]; +static char devInfoSerialNumber[DEV_INFO_RECORD_SZ]; +static bool devInfoModelNumber_saved = false; +static bool devInfoSerialNumber_saved = false; + +typedef struct +{ + char *cloud_ifname; + char *iw_ifname; + char *iw_phyname; +} ifmap_t; + +ifmap_t stats_ifmap[] = { + { "home-ap-24", "wlan1", "phy1" }, + { "home-ap-u50", "wlan0", "phy0" }, + { NULL, NULL, NULL } +}; + +void target_ifname_map_init() +{ + target_map_init(); + + //Radio mappings + target_map_insert("wifi0", "radio1"); + target_map_insert("wifi1", "radio2"); + target_map_insert("wifi2", "radio0"); + + //VIF mappings + target_map_insert("home-ap-u50", "default_radio0"); + target_map_insert("home-ap-24", "default_radio1"); + target_map_insert("home-ap-l50", "default_radio2"); +} + +bool target_map_cloud_to_iw(const char *ifname, char *iw_name, size_t length) +{ + ifmap_t *mp; + + mp = stats_ifmap; + while (mp->cloud_ifname) + { + if (!strcmp(mp->cloud_ifname, ifname)) + { + strscpy(iw_name, mp->iw_ifname, length); + return true; + } + + mp++; + } + + return false; +} + +bool target_map_cloud_to_phy(const char *ifname, char *phy_name, size_t length) +{ + ifmap_t *mp; + + mp = stats_ifmap; + while (mp->cloud_ifname) + { + if (!strcmp(mp->cloud_ifname, ifname)) + { + strscpy(phy_name, mp->iw_phyname, length); + return true; + } + + mp++; + } + + return false; +} + +char *get_devinfo_record( char * tag, char * payload, size_t payloadsz ) +{ + FILE *devInfoFn = NULL; + char buffer[80]; + char *tagPtr, *payloadPtr; + int bytesRead = 0; + bool record_found = false; + + if (tag == NULL) return NULL; + + devInfoFn = fopen(devInfoFileName, "r"); + if (devInfoFn == NULL) { + LOGE("File open failed %s %s", devInfoFileName, tag ); + return NULL; + } + memset(buffer, 0, 80); + payload[0] = 0; + + while ( bytesRead < 0x300 && !feof(devInfoFn)) { + fgets( buffer, 80, devInfoFn); + tagPtr = strstr(buffer, tag); + if (tagPtr != NULL) { + strtok(tagPtr,"="); + payloadPtr = strtok(NULL, " \n\r"); + LOGN ("devInfo %s %s", tag, payloadPtr); + strncpy(payload, payloadPtr, payloadsz); + record_found = true; + break; + } else { + bytesRead += strlen(buffer); + } + } + + fclose(devInfoFn); + if (record_found) { + return payload; + } else { + return NULL; + } +} + +bool target_model_get(void *buff, size_t buffsz) +{ + if (!devInfoModelNumber_saved) { + if ( NULL == get_devinfo_record( "modelNumber=", devInfoModelNumber, DEV_INFO_RECORD_SZ)) + snprintf(devInfoModelNumber, DEV_INFO_RECORD_SZ, "%s", "ECW5410"); + devInfoModelNumber_saved = true; + } + strncpy(buff, devInfoModelNumber, buffsz); + return true; +} + +bool target_serial_get(void *buff, size_t buffsz) +{ + os_macaddr_t mac; + char mac_buff[TARGET_BUFF_SZ]; + int n; + + if (!devInfoSerialNumber_saved) { + if ( NULL == get_devinfo_record( "serial_number=", devInfoSerialNumber, DEV_INFO_RECORD_SZ)) + { + if (true == os_nif_macaddr("eth0", &mac)) + { + memset(mac_buff, 0, sizeof(mac_buff)); + n = snprintf(mac_buff, sizeof(mac_buff), PRI(os_macaddr_plain_t), FMT(os_macaddr_t, mac)); + if (n == OS_MACSTR_PLAIN_SZ) { + LOG(ERR, "buffer not large enough"); + return false; + } + strncpy(devInfoSerialNumber, mac_buff, buffsz); + } + } + else + { + snprintf(devInfoSerialNumber, DEV_INFO_RECORD_SZ, "%s", "ECW5410-TIP-01"); + } + + devInfoSerialNumber_saved = true; + } + strncpy(buff, devInfoSerialNumber, buffsz); + return true; +} + +bool target_sw_version_get(void *buff, size_t buffsz) +{ + snprintf(buff, buffsz, "%s", "0.1.0"); + + return true; +} + +bool target_platform_version_get(void *buff, size_t buffsz) +{ + snprintf(buff, buffsz, "%s", "OPENWRT_ECW5410"); + + return true; +} + diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/.version b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/.version new file mode 100644 index 000000000..6e8bf73aa --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/.version @@ -0,0 +1 @@ +0.1.0 diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/LICENSE b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/LICENSE new file mode 100644 index 000000000..c1f88e0d4 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/NOTICE b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/NOTICE new file mode 100644 index 000000000..f024b551f --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/NOTICE @@ -0,0 +1,2 @@ +Copyright 2019, Plume Design Inc. All rights reserved. +Licensed under the "3-Clause BSD License" also known as "Revised BSD License" diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/README.md b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/README.md new file mode 100644 index 000000000..42fb3fdda --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/README.md @@ -0,0 +1,9 @@ +OpenSync vendor layer example for armvirt +----------------------------------------- + +This is an example vendor layer for the OpenWrt `armvirt` target. +It can be used as a template for other targets. + +This repository is a part of the `opensync-openwrt` project. + +For more info please visit: https://opensync.io diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/build/vendor-arch.mk b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/build/vendor-arch.mk new file mode 100644 index 000000000..a555ee1d1 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/build/vendor-arch.mk @@ -0,0 +1,9 @@ +OS_TARGETS +=IPQ40XX + +ifeq ($(TARGET),IPQ40XX) +PLATFORM=openwrt +VENDOR=ipq40xx +PLATFORM_DIR := platform/$(PLATFORM) +KCONFIG_TARGET ?= $(PLATFORM_DIR)/kconfig/openwrt_generic +ARCH_MK := $(PLATFORM_DIR)/build/$(PLATFORM).mk +endif diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/ovsdb/static_configuration.json b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/ovsdb/static_configuration.json new file mode 100644 index 000000000..7ce47b83c --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/ovsdb/static_configuration.json @@ -0,0 +1,104 @@ +[ + "Open_vSwitch", + { + "op":"insert", + "table":"Wifi_Inet_State", + "row": { + "if_name": "br-lan", + "ip_assign_scheme": "static", + "inet_addr": "192.168.1.1", + "netmask": "255.255.255.0", + "if_type": "bridge", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": false + } + }, + { + "op":"insert", + "table":"Wifi_Inet_State", + "row": { + "if_name": "eth1", + "ip_assign_scheme": "dhcp", + "if_type": "eth", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": true + } + + }, + { + "op":"insert", + "table":"Wifi_Inet_Config", + "row": { + "if_name": "br-lan", + "ip_assign_scheme": "static", + "inet_addr": "192.168.1.1", + "netmask": "255.255.255.0", + "if_type": "bridge", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": false + } + }, + { + "op":"insert", + "table":"Wifi_Inet_Config", + "row": { + "if_name": "eth1", + "ip_assign_scheme": "dhcp", + "if_type": "eth", + "enabled": true, + "network": true, + "mtu": 1500, + "NAT": true + } + }, + { + "op": "insert", + "table": "Wifi_Radio_Config", + "row": { + "if_name": "wlan0", + "freq_band": "2.4G", + "hw_type": "AR9382", + "hw_mode": "11n", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_Config", + "row": { + "if_name": "wlan1", + "freq_band": "5G", + "hw_type": "qca9880", + "hw_mode": "11ac", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_State", + "row": { + "if_name": "wlan0", + "freq_band": "2.4G", + "hw_type": "AR9382", + "hw_mode": "11n", + "channel_mode": "cloud" + } + }, + { + "op": "insert", + "table": "Wifi_Radio_State", + "row": { + "if_name": "wlan1", + "freq_band": "5G", + "hw_type": "qca9880", + "hw_mode": "11ac", + "channel_mode": "cloud" + } + } +] diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/ca.pem b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/ca.pem new file mode 100644 index 000000000..4567e3e46 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/ca.pem @@ -0,0 +1,179 @@ +-----BEGIN CERTIFICATE----- +MIIGSTCCBDGgAwIBAgIEEAAABDANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJV +UzEaMBgGA1UECgwRUGx1bWUgRGVzaWduIEluYy4xKzApBgNVBAsMIlBsdW1lIERl +c2lnbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHTAbBgNVBAMMFFBsdW1lIERlc2ln +biBSb290IENBMB4XDTE4MDEyMjIzMjMzOVoXDTI4MDEyMjIzMjMzOVowbTELMAkG +A1UEBhMCVVMxGjAYBgNVBAoMEVBsdW1lIERlc2lnbiBJbmMuMSswKQYDVQQLDCJQ +bHVtZSBEZXNpZ24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRUwEwYDVQQDDAxQbHVt +ZSBUTFMgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDSDVhBzdBE +OM7oi7YzRevbzmM5dJhYKC+l44lFnltTIObbFk4QGN/sGQmgtZybEHtBnFgbamb5 +sIJsBVCkNFojFjg/HQwDc7TpwWN339t3Ih7iXmReiEfp8h1msWQRBpP3+d3E56ZP +PlJwivbw3ywfXSv7QlxSZ5iJeC6amPohvj3/VJeqM5c8hiiDuuZsZMAaW2Yl9gm/ +keM//Z7AfIGjbidUmJ9nfDftNPexqzx82RROATONIglk3PXjZxAyKSEuYS0djuPK +XXu5j8w222efdS6ARufpEZAO5LH/MVPdZpT1Emzh+uKjTQYlL0Flu8PyP30Do/cK +KBGMwZYAV4op8or8ntK7ndDTu3Xr6tq6g6KduxUjVukXpAmQhbwoGRUzJj4zC3oM +QkIYLlM1JOUrIlSw0s/E2ONNaWhL89bNFw3/LOhG6yAjbeJvjsebB/iQEvVJQfmV +i73QNwQQ93kCj+/unIkc+hi1/Vjuhkx3Q+LV4wjG4iaUoPlf49K1SqV9xDcc+2KF +0K8sVQ4Tqb2UQYp63C44HEZzRS3fhBp7xmEBTncCOckttqz1zCZQ0dcuyYm3bovf +NO5ur7OvvNL7ALJz9ah56v5KUDDqeH+aRm8i/rYdDSpcNm5kA9Ct2Q7/RSCCqFlO +bk+1yEkgAm9Jkebvi5L05dJryhXw31cXVwIDAQABo4HoMIHlMA4GA1UdDwEB/wQE +AwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTKifKsuPwRxf+47Nsr +UHqivPBIkTAfBgNVHSMEGDAWgBQivhNIgc2MBY9u64p9MYFvWmDNOTBEBggrBgEF +BQcBAQQ4MDYwNAYIKwYBBQUHMAKGKGh0dHBzOi8vd3d3LnBsdW1ld2lmaS5jb20v +Y2Evcm9vdC1jYS5jZXIwOQYDVR0fBDIwMDAuoCygKoYoaHR0cHM6Ly93d3cucGx1 +bWV3aWZpLmNvbS9jYS9yb290LWNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAjG4R +nkcVdO4oQqjJeWLIdNu48V3T7CB08t3sqjQaxu4gAXfYm8a+tdubff6Dg0PuTFzh +edogXQchaEiYeEFTPNrz4hf5NhS+9t2PKcEpAKCbY6vjpfT9F5gUDrXmfUZnLIUV +SVXZ6NC+/jI56cAykbCv5ytYxSE0LxSgA3OLZyd4QESJdSJIkCw7s3nDx7rv05Np +UjQuFu1+WbXxUkrKYZBCTwczuKsDc2syiscC2sBUydDbK1jySV1og3nY6JXojNSa +V8OtnsnAUdD8Gbg38UNFb3SN7VmE1RIYgXgj7tVEKW/Rhyf49LCchAl+CO2m9TKW +ZPA2NcQ94b++VoreAdkpH3eOkko12RofWQo+wHT/g6qm668L7exONawjmU+Or2Wj +TXJFz5xb57kEnZjyXX4GgCxVSr8hHPA0+gFRPS4mkUZAQaH5XkODvcLAJ6CCSYIp +78B89VI8lkSji0wanlGcrSbUVHg6bVNw++gW//N4DRfqURRqYwDLQt6BXi11vgSu +l8NrrzBLU7leb1+IcY5p8g+z9HE4PM7uxd9fcP/P3Rldq7EW9V1NIXTn0kPHJd2C +zDReVg7t/tCFWM6wyXL1KKuXd36Py1XxATsgEwkmfXJn4QjOn60NK/SxTDKIBfvZ +9iWfWz/J3JLDRMk5Y/5CFuC6lm+6cHkbT4WR3wA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +cg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGxzCCBK+gAwIBAgIJAIyLecDrnpzeMA0GCSqGSIb3DQEBCwUAMIGdMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJUGFsbyBBbHRv +MRswGQYDVQQKExJQbHVtZSBEZXNpZ24sIEluYy4xJDAiBgkqhkiG9w0BCQEWFXN1 +cHBvcnRAcGx1bWV3aWZpLmNvbTEiMCAGA1UEAxMZUGx1bWUgRGVzaWduIEF1dGhv +cml0eSBBMTAeFw0xNjAzMDMyMjQwMTRaFw0yMTAzMDIyMjQwMTRaMIGdMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJUGFsbyBBbHRv +MRswGQYDVQQKExJQbHVtZSBEZXNpZ24sIEluYy4xJDAiBgkqhkiG9w0BCQEWFXN1 +cHBvcnRAcGx1bWV3aWZpLmNvbTEiMCAGA1UEAxMZUGx1bWUgRGVzaWduIEF1dGhv +cml0eSBBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALo0cr8ZyiLs +CUyp4P4JFXkU6Ymx6QhN1DZ1SCuDgiMkX8A7/QCDMKz7Q70qqM022NwYW3Ff5VJG +El/epXmcaPx7vzfXpsy023mtyaLcwovCwr+IRDM5LgKlW9v3wcaWBWLEXbbv8are +a9q1eXW5jJjAyDMPdkrUqCwdJy3Gjnwy16mRiBnaY6A2+wVr5mTzkrtNGzJiEzhX +MECnal7T16sOC8HeaJZ4BVYJzxAnyU+wlf0ygzQeF4WaYXTDgcRs8g1D62LHcr7f +ioAT2Z69V5CVHFX7VJoE1PJeU867GwZDtM+osZ0WJFkeMA8cJgrs7ujKTl9nmiVp +Q2qt6BDABrd9ibZkjHj5XcXQz7o+z3zwL9v9x/1bilmY/yBz2rlozR+xbNwTM6Ra +D+FXpcv2caj2851Ci59eh+5eCJJkMNzGKdZZ9wyMaPqk2bynGDf6glhJc2cML9L3 ++L/iLq63yiYDOmDwKXiAjPVCPPgMPxp+Y4gwfiZdop2ou8W7xzFxOEwKuS8qK6Qp +9j8Mq1ritAFa4WIiVsuHjrEkmykCzHvb9z5ujsrZ4hJzBDNqfjXkazpR2wb4o895 +YfBQIHdoQy2H+wsOEaNatUkFuSE5uw2nMS+SDf8J2ouAG0U51n/SnWKd636WC4s+ +Mn5Bd8nwNP1H1DXCUf8TS7iow+Bt0A+VAgMBAAGjggEGMIIBAjAdBgNVHQ4EFgQU +CBK8rxUUByBBgsU0VXsOLjVIWiEwgdIGA1UdIwSByjCBx4AUCBK8rxUUByBBgsU0 +VXsOLjVIWiGhgaOkgaAwgZ0xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9y +bmlhMRIwEAYDVQQHEwlQYWxvIEFsdG8xGzAZBgNVBAoTElBsdW1lIERlc2lnbiwg +SW5jLjEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBwbHVtZXdpZmkuY29tMSIwIAYD +VQQDExlQbHVtZSBEZXNpZ24gQXV0aG9yaXR5IEExggkAjIt5wOuenN4wDAYDVR0T +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAsTLMCgl/1rSf/+/14y0FWyj2yvOq +X5hgd/+kIRfIp/5Ib1wWdpWGY5sTV3Vy1rQvWHF/PijP9qMWE5QKfxHh/l2+HKv0 +gyRPW3I4QgK3Qr/u75nNFizYhI2L2n1+2MQmoejcu6TI9Kk5n7oVo3dGn2KxkrKC +WiB0QZmJgD6iIrJQt6oXB/oG4gSHqTIaTawflIvFgr5S94rKjVm+ZBtz6nOO184s +fDGXNOfw8zOXkGB5gAtxF5oX+XQ9s/2y0nrDbT/Oup3MzzrZ2zAEXqIUvb6cP8z6 +IqYGiwtzzhD8F/4jA6dUI/pnlPMnT670sy4YO7GsJaZi/Af/pvdRh342FFUpV3HF ++jJJxuejI+yehI2y0S1M4idmJLaCS5EldJF1GB3DU5CjSOhCeZKpIrkWEAIEXf4f +VTffDmOn/5SAcdKwe9v7tzJ2knNME0BPhVei/cSmU3VI6sAY04HzPtC498BLyaUJ +Nj+70iQ3tvNjegwfRI4CIgn0/Y90W6NcEd9Ihg/MTImH5uQag7ftupFqp7wP882N +SJGjWsd/oMDbB8kcyLKZ8z05nYhxG8v0/D6esu51SAXhnC2G2jybjuk3QHvMRTBo +jMnFwM/u3cRLzWwsHP3dSkY1NsnfMKA+ivUEXslq+8R0EH02Js4OUTrscDKPJSWo +YDLIkv5E8HWLVoc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFyDCCA7CgAwIBAgIJAJ78fVrF1kYwMA0GCSqGSIb3DQEBCwUAMHgxCzAJBgNV +BAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRUGx1bWUgRGVzaWduIEluYy4x +JzAlBgNVBAsMHk9wZW5TeW5jIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UE +AwwOT3BlblN5bmMgQ0EgQTEwIBcNMTkwMzI4MTI0ODIwWhgPMjA2OTAzMTUxMjQ4 +MjBaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEaMBgGA1UECgwRUGx1bWUg +RGVzaWduIEluYy4xJzAlBgNVBAsMHk9wZW5TeW5jIENlcnRpZmljYXRlIEF1dGhv +cml0eTEXMBUGA1UEAwwOT3BlblN5bmMgQ0EgQTEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDZOu6RWVfAJy10izzsgcSVTPqkIK84Jhy02ZxEx+XUOLJg +G6d75a2X2Qdb0xyu4vIr/zAnsFcm8L/w9J5MZh+IRvW1c9f5P7ROjzivM9vfub2I +CJ+4acoN0ErWX5qqNPx1FvL5gM7TzsgbvmUMYKcRxRUKmo9CCO1uJy/zjvr8jDNZ +ZvrI2cPA70UHjwzP3LPANH8gnQTZMdFM3W/K6vyRIJdIYGmsGRYdzrqI2jP7z5Ex +5tiqthZQPlXhwj8QFk8vONbuUEdWq/dPlY4LKDgg4qE0t9eV3kLwC8WPTcly2KwZ +FaFdrQFpeLQh3H3CcaN8O++lv5BlCNEbOkEE9CUaUHbAVSNDv4tePpHp0pFJGkl4 +io6OkJ20hywjyJ71RY+qxgw/oyTii5mDTcqIVYJ3nkblrHKlQihnZ7+uHSJzhioO +JEv0t/eBetG62N4GzuiUH6MUARsDf7sd8anFf+pk4zUEwTVkdkYb2j/tp+g0WV08 +kvnNJ/wRuT9mYO+PKS9HXHwG1brBEwAepN524FgncopTwm+VglsHqrH9c91c5bbC +GwHKlEUEhRy45+2OACIhqhaoPqolFXNLSXGJFAkA7hYzbXrCs7kc8tzrqFj7kUQn +uMQj8TtVM1+gFOfy0J0nGOV7hs/ya30obLGYa8MHXD2cR3GK6Xpl8ZDHeCmQvwID +AQABo1MwUTAdBgNVHQ4EFgQU3Ji6Gbgbvie8gFgWEJNd1OzU31QwHwYDVR0jBBgw +FoAU3Ji6Gbgbvie8gFgWEJNd1OzU31QwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQsFAAOCAgEAkjs7a0eHLLRuzt6+WKA/Q0/MD01H0r9ZaY9LC4WfyY49qsF+ +CYK/7pYPJVc7YbO8hlnxKfCkJlCxP7i4lNN91BW+Lw4keI0J/VKa0GdSnPy88Ps/ +5QtSXn+Yix1VHXfu7q45ORra2ZpuESNxXOCobbLBE6ow8lKNapCYkuex9wE2iMlA +Z72Wul8K8X7oX1yIzNrnBc89b7vbMAc6F0iseE9eINmQpp5sqhk347/dLKOMVVNX +lDqrw1bOgbDLW4aQdkws4fUnH8m7DjeOxSiJhR9jZRimtFdQ9VVv5wuQswGPOXue +7vBDeHP8td3pZrsQygFzprOUvREKSJcle3xgiYxhbtVUfi/nBBgxLPM7+ga4jol6 +AByOCa6nPcMGbWikFTbO+bQgwka7V54RBXjKhBx1XBtpZHAooRm8PPDmesLbUWc1 +SB21o+8Kfm9+kVxup2udDrXo0cQpLskHKNCQOZbiIW/TCF+6cnQGSCCzgcMazgGS +pm5oJskK3/z30xvKphU4o6CZzJocdIX5xS7lX+iQIYZNT42U31juEbhOpGUmg3xO +lBGhysfYkR2AzDifN11uuy8uWca+4JDA6qutieEoNqY2gBMkyBe7qsvlsYphvnCM +gIOXqPD3c4IGS6uxP+hzqn0na/b5Ai4I3iSAh5IvXr5pm+ZaQISq0WFBPIk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/client.pem b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/client.pem new file mode 100644 index 000000000..4010e61cc --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/client.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIENDCCAhygAwIBAgIRAJ4QsQE9nHsbpnVHhkAKw2MwDQYJKoZIhvcNAQELBQAw +eDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRowGAYDVQQKDBFQbHVtZSBEZXNp +Z24gSW5jLjEnMCUGA1UECwweT3BlblN5bmMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MRcwFQYDVQQDDA5PcGVuU3luYyBDQSBBMTAeFw03MDAxMDEwMDAwMDBaFw0yOTAz +MjYxMzI5MTNaMIGEMRIwEAYDVQQDDAlQUDMwMlgtRVgxCzAJBgNVBAYTAlVTMRow +GAYDVQQKDBFQbHVtZSBEZXNpZ24gSW5jLjESMBAGA1UEBwwJUGFsbyBBbHRvMQsw +CQYDVQQIDAJDQTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBwbHVtZXdpZmkuY29t +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9nFC6TPcsnh0+fscQaYEKevb0uR95nao +mDehTalGMwqt9BcOlDBahODfFhMu5SVw1ZmmmHo+ZIJ3ujK1VdrAgRRSh91k7dQv +MVgeXT2se1rc1L8oKvTnIPF2UwsSo3+5o1owWDAfBgNVHSMEGDAWgBTcmLoZuBu+ +J7yAWBYQk13U7NTfVDAdBgNVHQ4EFgQUxecQdoP09CyFbUJUdeLj/R3Ah2AwFgYD +VR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAH23KQlxb2Du +9XvHlq+AC5bF3cEFHxXS181qX+v61hMJm8VjugCzWuLuzc2bXEYFB+ZIVIPyTdAJ +tP7EizrUxWUgBbbsgHRFdy/jPXj5XF6PE7GhSgRi3FbYwxrzuIasEaAziagHr7ep +Hn3rJiNAo/KYhGyBpFYU7tJRmkpx1xaX8C5pTunR7jbyqOXM/h+rLlZJj2OHObN6 +xsFpcIJdT24pGTo9q5hhJUgxPlDnhrSB6yHoweO1FVgztsdjZKGou3RuKldVgunG +m/KyYP9oAQYRX0QRvRrDTOzVb2ezPd/KUwNMprLanXu0lu2T++H8xiQt41BdgMsl +63lkFDkFmeRgmaQUuiGMjU/Sac+kFhnkd/hoGigHYrgETd0FuqlWVE2VBsyv3/Pw +3126SXL1spbl+/apVioH9Nl24fUQKbv5Bnyhd5IIjzgG8SMzPQ4CbSHAWqUqkdUZ +bprS3nwLnE29zPULCg7Q1JfDsbf1+xe+r5xXVpUuca2kb4VnnNQ/z/jJCdP/3gy9 +jawfPNl0fwIHywLzaec1jtBmPFEPul7baRPCQdB3JF/WeuRuV3zakSs8XB8YyJaq +Lq3KtNBJDcSEKn/Tc5wLRaEOCiRoQtVhtX7Cer9JUYcRWsLvO1e/N3z7LxFcv8/w +glSwr3kI080u6Fx4QjxQWVWZiYL+3v01 +-----END CERTIFICATE----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/client_dec.key b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/client_dec.key new file mode 100644 index 000000000..64ef309da --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/rootfs/common/usr/plume/certs/client_dec.key @@ -0,0 +1,7 @@ +-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDCyrVlkcE5QLYWpNyRTSo8zhjZ3ksrLzhdFgfIPDDO0HGTk/08aTGGM +VrEvui9yLBmgBwYFK4EEACKhZANiAAT2cULpM9yyeHT5+xxBpgQp69vS5H3mdqiY +N6FNqUYzCq30Fw6UMFqE4N8WEy7lJXDVmaaYej5kgne6MrVV2sCBFFKH3WTt1C8x +WB5dPax7WtzUvygq9Ocg8XZTCxKjf7k= +-----END EC PRIVATE KEY----- + diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/inc/target_IPQ40XX.h b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/inc/target_IPQ40XX.h new file mode 100644 index 000000000..436f89013 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/inc/target_IPQ40XX.h @@ -0,0 +1,66 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef TARGET_IPQ40XX_H_INCLUDED +#define TARGET_IPQ40XX_H_INCLUDED + +#include "dpp_client.h" +#include "dpp_survey.h" + +#define TARGET_CERT_PATH "/var/run/openvswitch/certs" +#define TARGET_MANAGERS_PID_PATH "/tmp/dmpid" +#define TARGET_OVSDB_SOCK_PATH "/var/run/openvswitch/db.sock" +#define TARGET_LOGREAD_FILENAME "messages" + +void target_ifname_map_init(); +bool target_map_cloud_to_iw(const char *ifname, char *iw_name, size_t length); +bool target_map_cloud_to_phy(const char *ifname, char *phy_name, size_t length); + +typedef struct +{ + DPP_TARGET_CLIENT_RECORD_COMMON_STRUCT; + dpp_client_stats_t stats; +} target_client_record_t; + +typedef struct +{ + DPP_TARGET_SURVEY_RECORD_COMMON_STRUCT; +} target_survey_record_t; + +typedef void target_capacity_data_t; + +/****************************************************************************** + * MANAGERS definitions + *****************************************************************************/ +#if !defined(CONFIG_TARGET_MANAGER) +#define TARGET_MANAGER_PATH(X) "/usr/plume/bin/"X +#endif + +#define TARGET_TOOLS_PATH "/usr/plume/tools" + +#include "target_common.h" + +#endif /* TARGET_IPQ40XX_H_INCLUDED */ diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/override.mk b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/override.mk new file mode 100644 index 000000000..913a3a51b --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/override.mk @@ -0,0 +1,3 @@ +UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/entity.c +UNIT_CFLAGS += -I$(OVERRIDE_DIR)/inc +UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS) diff --git a/feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/src/entity.c b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/src/entity.c new file mode 100644 index 000000000..fea933666 --- /dev/null +++ b/feeds/wlan-ap/opensync/src/vendor/ipq40xx/src/lib/target/src/entity.c @@ -0,0 +1,183 @@ +/* +Copyright (c) 2019, Plume Design Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the Plume Design Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include "log.h" + +/* devinfo is /dev/mtd9 for IPQ40xx */ +static char devInfoFileName[] = "/dev/mtd9"; +#define DEV_INFO_RECORD_SZ 40 +static char devInfoModelNumber[DEV_INFO_RECORD_SZ]; +static char devInfoSerialNumber[DEV_INFO_RECORD_SZ]; +static bool devInfoModelNumber_saved = false; +static bool devInfoSerialNumber_saved = false; + +typedef struct +{ + char *cloud_ifname; + char *iw_ifname; + char *iw_phyname; +} ifmap_t; + +ifmap_t stats_ifmap[] = { + { "home-ap-24", "wlan1", "phy1" }, + { "home-ap-u50", "wlan0", "phy0" }, + { "home-ap-l50", "wlan2", "phy2" }, + { NULL, NULL, NULL } +}; + +void target_ifname_map_init() +{ + target_map_init(); + + //Radio mappings + target_map_insert("wifi0", "radio1"); + target_map_insert("wifi1", "radio2"); + target_map_insert("wifi2", "radio0"); + + //VIF mappings + target_map_insert("home-ap-u50", "default_radio0"); + target_map_insert("home-ap-24", "default_radio1"); + target_map_insert("home-ap-l50", "default_radio2"); +} + +bool target_map_cloud_to_iw(const char *ifname, char *iw_name, size_t length) +{ + ifmap_t *mp; + + mp = stats_ifmap; + while (mp->cloud_ifname) + { + if (!strcmp(mp->cloud_ifname, ifname)) + { + strscpy(iw_name, mp->iw_ifname, length); + return true; + } + + mp++; + } + + return false; +} + +bool target_map_cloud_to_phy(const char *ifname, char *phy_name, size_t length) +{ + ifmap_t *mp; + + mp = stats_ifmap; + while (mp->cloud_ifname) + { + if (!strcmp(mp->cloud_ifname, ifname)) + { + strscpy(phy_name, mp->iw_phyname, length); + return true; + } + + mp++; + } + + return false; +} + +char *get_devinfo_record( char * tag, char * payload, size_t payloadsz ) +{ + FILE *devInfoFn = NULL; + char buffer[80]; + char *tagPtr, *payloadPtr; + int bytesRead = 0; + bool record_found = false; + + if (tag == NULL) return NULL; + + devInfoFn = fopen(devInfoFileName, "r"); + if (devInfoFn == NULL) { + LOGE("File open failed %s %s", devInfoFileName, tag ); + return NULL; + } + memset(buffer, 0, 80); + payload[0] = 0; + + while ( bytesRead < 0x300 && !feof(devInfoFn)) { + fgets( buffer, 80, devInfoFn); + tagPtr = strstr(buffer, tag); + if (tagPtr != NULL) { + strtok(tagPtr,"="); + payloadPtr = strtok(NULL, " \n\r"); + LOGN ("devInfo %s %s", tag, payloadPtr); + strncpy(payload, payloadPtr, payloadsz); + record_found = true; + break; + } else { + bytesRead += strlen(buffer); + } + } + + fclose(devInfoFn); + if (record_found) { + return payload; + } else { + return NULL; + } +} + +bool target_model_get(void *buff, size_t buffsz) +{ + if (!devInfoModelNumber_saved) { + if ( NULL == get_devinfo_record( "modelNumber=", devInfoModelNumber, DEV_INFO_RECORD_SZ)) + snprintf(devInfoModelNumber, DEV_INFO_RECORD_SZ, "%s", "TIP_AP"); + devInfoModelNumber_saved = true; + } + strncpy(buff, devInfoModelNumber, buffsz); + return true; +} + +bool target_serial_get(void *buff, size_t buffsz) +{ + if (!devInfoSerialNumber_saved) { + if ( NULL == get_devinfo_record( "serial_number=", devInfoSerialNumber, DEV_INFO_RECORD_SZ)) + snprintf(devInfoSerialNumber, DEV_INFO_RECORD_SZ, "%s", "LinkSys-TIP-01"); + devInfoSerialNumber_saved = true; + } + strncpy(buff, devInfoSerialNumber, buffsz); + return true; +} + +bool target_sw_version_get(void *buff, size_t buffsz) +{ + snprintf(buff, buffsz, "%s", "0.1.0"); + + return true; +} + +bool target_platform_version_get(void *buff, size_t buffsz) +{ + snprintf(buff, buffsz, "%s", "OPENWRT_EA8300"); + + return true; +} + diff --git a/feeds/wlan-ap/python3-kconfiglib/Makefile b/feeds/wlan-ap/python3-kconfiglib/Makefile new file mode 100644 index 000000000..c1ed8abf6 --- /dev/null +++ b/feeds/wlan-ap/python3-kconfiglib/Makefile @@ -0,0 +1,41 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=python3-kconfiglib +PKG_RELEASE:=1 +PKG_VERSION:=13.1.1 +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://github.com/ulfalizer/Kconfiglib.git +PKG_SOURCE_VERSION:=bf01114a0ce09b891ed04609ea7e9cc6f3ef3df2 +PKG_BUILD_DIR:=$(BUILD_DIR)/python3-kconfiglib-$(PKG_VERSION) +HOST_BUILD_DEPENDS:=python3/host + +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-host.mk + +define Package/python3-kconfiglib + SECTION:=language-python + CATEGORY:=Languages + SUBMENU:=Python + TITLE:=kconfiglib + URL:=https://github.com/ulfalizer/Kconfiglib +endef + +define Package/python3-kconfiglib/description + Kconfiglib is a Kconfig implementation in Python 2/3. +endef + +define Host/Compile + $(call Build/Compile/HostPy3Mod,,\ + install --prefix="" --root="$(STAGING_DIR_HOSTPKG)" \ + ) +endef + +Host/Install:= + + +$(eval $(call HostBuild)) + +$(eval $(call Py3Package,python3-kconfiglib)) +$(eval $(call BuildPackage,python3-kconfiglib)) diff --git a/patches/pending/0001-pending-scripts-add-gen_config.py.patch b/patches/pending/0001-pending-scripts-add-gen_config.py.patch new file mode 100644 index 000000000..54c29042f --- /dev/null +++ b/patches/pending/0001-pending-scripts-add-gen_config.py.patch @@ -0,0 +1,206 @@ +From 4c6e17ce63c1da986237cc368a3085e19c7947c6 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Fri, 19 Jun 2020 10:45:22 +0200 +Subject: [PATCH 1/3] pending: scripts: add gen_config.py + +This script is used to setup the tree based on the profiles/. + +Signed-off-by: John Crispin +--- + scripts/gen_config.py | 185 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 185 insertions(+) + create mode 100755 scripts/gen_config.py + +diff --git a/scripts/gen_config.py b/scripts/gen_config.py +new file mode 100755 +index 0000000000..f55787ee1a +--- /dev/null ++++ b/scripts/gen_config.py +@@ -0,0 +1,184 @@ ++#!/usr/bin/env python3 ++ ++from os import getenv ++from pathlib import Path ++from shutil import rmtree ++from subprocess import run ++import sys ++import yaml ++ ++profile_folder = Path(getenv("PROFILES", "./profiles")).absolute() ++ ++ ++def die(msg: str): ++ """Quit script with error message ++ ++ msg (str): Error message to print ++ """ ++ print(msg) ++ sys.exit(1) ++ ++ ++def usage(code: int = 0): ++ """Print script usage ++ ++ Args: ++ code (int): exit code ++ """ ++ print( ++ f"""Usage: {sys.argv[0]} [options...] ++ ++ clean Remove feeds before setup ++ list List available profiles ++ help Print this message ++ """ ++ ) ++ sys.exit(code) ++ ++ ++def load_yaml(fname: str, profile: dict): ++ profile_file = (profile_folder / fname).with_suffix(".yml") ++ ++ if not profile_file.is_file(): ++ die(f"Profile {fname} not found") ++ ++ new = yaml.safe_load(profile_file.read_text()) ++ for n in new: ++ if n in {"profile", "target", "subtarget", "external_target"}: ++ if profile.get(n): ++ die(f"Duplicate tag found {n}") ++ profile.update({n: new.get(n)}) ++ elif n in {"description"}: ++ profile["description"].append(new.get(n)) ++ elif n in {"packages"}: ++ profile["packages"].extend(new.get(n)) ++ elif n in {"diffconfig"}: ++ profile["diffconfig"] += new.get(n) ++ elif n in {"feeds"}: ++ for f in new.get(n): ++ if f.get("name", "") == "" or (f.get("uri", "") == "" and f.get("path", "") == ""): ++ die(f"Found bad feed {f}") ++ profile["feeds"][f.get("name")] = f ++ return profile ++ ++ ++def clean_tree(): ++ print("Cleaning tree") ++ rmtree("./tmp", ignore_errors=True) ++ rmtree("./packages/feeds/", ignore_errors=True) ++ rmtree("./tmp/", ignore_errors=True) ++ rmtree(".git/rebase-apply/", ignore_errors=True) ++ if Path("./feeds.conf").is_file(): ++ Path("./feeds.conf").unlink() ++ if Path("./.config").is_file(): ++ Path("./.config").unlink() ++ ++ ++def merge_profiles(profiles): ++ profile = {"packages": [], "description": [], "diffconfig": "", "feeds": {}} ++ ++ for p in profiles: ++ profile = load_yaml(p, profile) ++ ++ return profile ++ ++ ++def setup_feeds(profile): ++ feeds_conf = Path("feeds.conf") ++ if feeds_conf.is_file(): ++ feeds_conf.unlink() ++ ++ feeds = [] ++ for p in profile.get("feeds", []): ++ try: ++ f = profile["feeds"].get(p) ++ if all(k in f for k in ("branch", "revision", "path")): ++ die(f"Please specify either a branch, a revision or a path: {f}") ++ if "path" in f: ++ feeds.append( ++ f'{f.get("method", "src-link")},{f["name"]},{f["path"]}' ++ ) ++ elif "revision" in f: ++ feeds.append( ++ f'{f.get("method", "src-git")},{f["name"]},{f["uri"]}^{f.get("revision")}' ++ ) ++ else: ++ feeds.append( ++ f'{f.get("method", "src-git")},{f["name"]},{f["uri"]};{f.get("branch", "master")}' ++ ) ++ ++ except: ++ print(f"Badly configured feed: {f}") ++ ++ if run(["./scripts/feeds", "setup", "-b", *feeds]).returncode: ++ die(f"Error setting up feeds") ++ ++ if run(["./scripts/feeds", "update"]).returncode: ++ die(f"Error updating feeds") ++ ++ for p in profile.get("feeds", []): ++ f = profile["feeds"].get(p) ++ if run( ++ ["./scripts/feeds", "install", "-a", "-f", "-p", f.get("name")] ++ ).returncode: ++ die(f"Error installing {feed}") ++ ++ packages = ["./scripts/feeds", "install" ] ++ for package in profile.get("packages", []): ++ packages.append(package) ++ if len(packages) > 2: ++ if run(packages).returncode: ++ die(f"Error installing packages") ++ ++ if profile.get("external_target", False): ++ if run(["./scripts/feeds", "install", profile["target"]]).returncode: ++ die(f"Error installing external target {profile['target']}") ++ ++ ++def generate_config(profile): ++ config_output = f"""CONFIG_TARGET_{profile["target"]}=y ++CONFIG_TARGET_{profile["target"]}_{profile["subtarget"]}=y ++CONFIG_TARGET_{profile["target"]}_{profile["subtarget"]}_DEVICE_{profile["profile"]}=y ++""" ++ ++ config_output += f"{profile.get('diffconfig', '')}" ++ ++ for package in profile.get("packages", []): ++ print(f"Add package to .config: {package}") ++ config_output += f"CONFIG_PACKAGE_{package}=y\n" ++ ++ Path(".config").write_text(config_output) ++ print("Configuration written to .config") ++ ++ ++if __name__ == "__main__": ++ if "list" in sys.argv: ++ print(f"Profiles in {profile_folder}") ++ ++ print("\n".join(map(lambda p: str(p.stem), profile_folder.glob("*.yml")))) ++ quit(0) ++ ++ if "help" in sys.argv: ++ usage() ++ ++ if len(sys.argv) < 2: ++ usage(1) ++ ++ if "clean" in sys.argv: ++ clean_tree() ++ print("Tree is now clean") ++ quit(0) ++ ++ profile = merge_profiles(sys.argv[1:]) ++ ++ print("Using the following profiles:") ++ for d in profile.get("description"): ++ print(f" - {d}") ++ ++ clean_tree() ++ setup_feeds(profile) ++ generate_config(profile) ++ ++ print("Running make defconfig") ++ if run(["make", "defconfig"]).returncode: ++ die(f"Error running make defconfig") +-- +2.25.1 + diff --git a/patches/pending/0002-scripts-update-feed-script.patch b/patches/pending/0002-scripts-update-feed-script.patch new file mode 100644 index 000000000..936c6a351 --- /dev/null +++ b/patches/pending/0002-scripts-update-feed-script.patch @@ -0,0 +1,131 @@ +From 732f0992ad36a6d9f6aa459ce0899891422b65f0 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Fri, 19 Jun 2020 13:25:27 +0200 +Subject: [PATCH 2/3] scripts: update feed script + +gen_config.py requires the latest version of the feeds script. + +Signed-off-by: John Crispin +--- + scripts/feeds | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 77 insertions(+) + +diff --git a/scripts/feeds b/scripts/feeds +index 69ab60278a..46c5f5cb9f 100755 +--- a/scripts/feeds ++++ b/scripts/feeds +@@ -644,6 +644,35 @@ sub refresh_config { + } + } + ++sub install_profiles { ++ my $feed = shift; ++ my $dir = sprintf('feeds/%s/', $feed->[1]); ++ ++ -d "./feeds/profiles" or mkdir "./feeds/profiles" or return 1; ++ ++ opendir (DIR, $dir) or return 0; ++ while (my $file = readdir(DIR)) { ++ next unless (-f "$dir/$file"); ++ next unless ($file =~ m/\.profile$/); ++ -e "./feeds/profiles/$file" or system("ln -s ../$feed->[1]/$file ./feeds/profiles/"); ++ } ++ closedir(DIR); ++} ++ ++sub install_dl { ++ my $feed = shift; ++ my $dir = sprintf('feeds/%s/dl/', $feed->[1]); ++ ++ -d "./dl" or mkdir "./dl" or return 1; ++ ++ opendir (DIR, $dir) or return 0; ++ while (my $file = readdir(DIR)) { ++ next unless (-f "$dir/$file"); ++ -e "./dl/$file" or system("ln -s ../feeds/$feed->[1]/dl/$file ./dl/"); ++ } ++ closedir(DIR); ++} ++ + sub install { + my $name; + my %opts; +@@ -676,6 +705,8 @@ sub install { + install_src($feed, $name, exists($opts{f})) == 0 or $ret = 1; + get_feed($f->[1]); + } ++ install_profiles($f); ++ install_dl($f); + } + } + } else { +@@ -846,6 +877,47 @@ sub update { + return $failed; + } + ++sub setup { ++ my %opts; ++ ++ getopts('bh', \%opts); ++ ++ if ($opts{h}) { ++ usage(); ++ return 0; ++ } ++ ++ if (-e "feeds.conf") { ++ warn "The file feeds.conf already exists.\n"; ++ return 1; ++ } ++ ++ open(my $fd, ">>feeds.conf"); ++ ++ if ($opts{b}) { ++ printf $fd "src-include defaults feeds.conf.default\n"; ++ } ++ ++ while (my $entry = shift @ARGV) { ++ my ($type, $name, $src) = split /,/, $entry; ++ ++ $update_method{$type} or do { ++ warn "Unknown type '$type' in parameter $entry\n"; ++ unlink "feeds.conf"; ++ return 1; ++ }; ++ ++ if ($name =~ /[\s-]/) { ++ warn "Feed names or sources may not contain whitespace or - characters in parameter $entry\n"; ++ unlink "feeds.conf"; ++ return 1; ++ } ++ printf $fd "%s %s %s\n", $type, $name, $src; ++ } ++ ++ return 0; ++} ++ + sub feed_config() { + foreach my $feed (@feeds) { + my $installed = (-f "feeds/$feed->[1].index"); +@@ -897,6 +969,10 @@ Commands: + -i : Recreate the index only. No feed update from repository is performed. + -f : Force updating feeds even if there are changed, uncommitted files. + ++ setup [options] ...: generate feeds.conf ++ Options: ++ -b : Use feeds.conf.default as base for new feeds.conf. ++ + clean: Remove downloaded/generated files. + + EOF +@@ -910,6 +986,7 @@ my %commands = ( + 'search' => \&search, + 'uninstall' => \&uninstall, + 'feed_config' => \&feed_config, ++ 'setup' => \&setup, + 'clean' => sub { + system("rm -rf ./feeds ./package/feeds"); + } +-- +2.25.1 + diff --git a/patches/pending/0003-profiles-add-the-wlan-ap-board-profiles.patch b/patches/pending/0003-profiles-add-the-wlan-ap-board-profiles.patch new file mode 100644 index 000000000..a19d690ec --- /dev/null +++ b/patches/pending/0003-profiles-add-the-wlan-ap-board-profiles.patch @@ -0,0 +1,163 @@ +From 93a25b8fd76b7868e82d8d88036541da46081052 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Fri, 19 Jun 2020 13:26:05 +0200 +Subject: [PATCH 3/3] profiles: add the wlan-ap board profiles + +These are the profiles describing the boards and feature sets that we need +to build wlan-ap packages. + +Signed-off-by: John Crispin +--- + profiles/ap2220.yml | 7 ++++ + profiles/ea8300.yml | 7 ++++ + profiles/ecw5211.yml | 7 ++++ + profiles/ecw5410.yml | 7 ++++ + profiles/wlan-ap.yml | 80 ++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 108 insertions(+) + create mode 100644 profiles/ap2220.yml + create mode 100644 profiles/ea8300.yml + create mode 100644 profiles/ecw5211.yml + create mode 100644 profiles/ecw5410.yml + create mode 100644 profiles/wlan-ap.yml + +diff --git a/profiles/ap2220.yml b/profiles/ap2220.yml +new file mode 100644 +index 0000000000..3c2608b113 +--- /dev/null ++++ b/profiles/ap2220.yml +@@ -0,0 +1,7 @@ ++--- ++profile: tp-link_ap2220 ++target: ipq40xx ++subtarget: generic ++description: Build image for the TP-Link AP2220 ++packages: ++ - opensync-ap2220 +diff --git a/profiles/ea8300.yml b/profiles/ea8300.yml +new file mode 100644 +index 0000000000..0c42881e3d +--- /dev/null ++++ b/profiles/ea8300.yml +@@ -0,0 +1,7 @@ ++--- ++profile: linksys_ea8300 ++target: ipq40xx ++subtarget: generic ++description: Build image for the Linksys EA8300 ++packages: ++ - opensync-ea8300 +diff --git a/profiles/ecw5211.yml b/profiles/ecw5211.yml +new file mode 100644 +index 0000000000..02c72f02a1 +--- /dev/null ++++ b/profiles/ecw5211.yml +@@ -0,0 +1,7 @@ ++--- ++profile: edgecore_ecw5211 ++target: ipq40xx ++subtarget: generic ++description: Build image for the Edgecore ECW5211 ++packages: ++ - opensync-ecw5211 +diff --git a/profiles/ecw5410.yml b/profiles/ecw5410.yml +new file mode 100644 +index 0000000000..f1f0327bb3 +--- /dev/null ++++ b/profiles/ecw5410.yml +@@ -0,0 +1,7 @@ ++--- ++profile: edgecore_ecw5410 ++target: ipq806x ++subtarget: generic ++description: Build image for the Edgecore ECW5410 ++packages: ++ - opensync-ecw5410 +diff --git a/profiles/wlan-ap.yml b/profiles/wlan-ap.yml +new file mode 100644 +index 0000000000..b3668bec5d +--- /dev/null ++++ b/profiles/wlan-ap.yml +@@ -0,0 +1,80 @@ ++--- ++description: Add the wlan-ap dependencies ++feeds: ++ - name: wlan_ap ++ path: ../../feeds/wlan-ap ++ ++packages: ++ - cgi-io ++ - coreutils ++ - coreutils-sleep ++ - jansson ++ - kmod-crypto-crc32c ++ - kmod-crypto-hash ++ - kmod-lib-crc32c ++ - kmod-mpls ++ - kmod-nf-nat6 ++ - kmod-openvswitch ++ - libatomic ++ - libcares ++ - libev ++ - libiwinfo-lua ++ - liblua ++ - liblucihttp ++ - liblucihttp-lua ++ - libmosquitto-ssl ++ - libopenssl ++ - libpcap ++ - libprotobuf-c ++ - librt ++ - libstdcpp ++ - libubus-lua ++ - libunbound-light ++ - libuuid ++ - lua ++ - luci ++ - luci-app-firewall ++ - luci-app-opkg ++ - luci-base ++ - luci-lib-ip ++ - luci-lib-jsonc ++ - luci-lib-nixio ++ - luci-mod-admin-full ++ - luci-mod-network ++ - luci-mod-status ++ - luci-mod-system ++ - luci-proto-ipv6 ++ - luci-proto-ppp ++ - luci-theme-bootstrap ++ - openvswitch ++ - openvswitch-common ++ - openvswitch-libofproto ++ - openvswitch-libopenvswitch ++ - openvswitch-libovsdb ++ - openvswitch-ovsdb ++ - openvswitch-vswitchd ++ - protobuf ++ - protobuf-lite ++ - rpcd ++ - rpcd-mod-file ++ - rpcd-mod-iwinfo ++ - rpcd-mod-luci ++ - rpcd-mod-rrdns ++ - uhttpd ++ - uuidgen ++ - zlib ++ - opensync ++ - wpad-openssl ++ ++diffconfig: | ++ CONFIG_OPENSSL_ENGINE=y ++ CONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM=y ++ CONFIG_OPENSSL_WITH_ASM=y ++ CONFIG_OPENSSL_WITH_CHACHA_POLY1305=y ++ CONFIG_OPENSSL_WITH_CMS=y ++ CONFIG_OPENSSL_WITH_DEPRECATED=y ++ CONFIG_OPENSSL_WITH_ERROR_MESSAGES=y ++ CONFIG_OPENSSL_WITH_PSK=y ++ CONFIG_OPENSSL_WITH_SRP=y ++ CONFIG_OPENSSL_WITH_TLS13=y ++ +-- +2.25.1 + diff --git a/patches/wlan-ap/0001-firmware-ipq-wifi-enable-use-on-IPQ806x.patch b/patches/wlan-ap/0001-firmware-ipq-wifi-enable-use-on-IPQ806x.patch new file mode 100644 index 000000000..155f78844 --- /dev/null +++ b/patches/wlan-ap/0001-firmware-ipq-wifi-enable-use-on-IPQ806x.patch @@ -0,0 +1,31 @@ +From f46ac3c1bc7e84ba3f09d79c4ba1ddd49122d306 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Mon, 18 May 2020 12:34:06 +0200 +Subject: [PATCH 1/7] firmware: ipq-wifi: enable use on IPQ806x + +This enables the ipq-wifi package to be used on IPQ806x target. +Its needed for boards using a different BDF than one shipped in the upstream board-2.bin. + +Currently needed for Edgecore ECW5410. + +Signed-off-by: Robert Marko +--- + package/firmware/ipq-wifi/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile +index eb7c2df1aa..4b90a3397f 100644 +--- a/package/firmware/ipq-wifi/Makefile ++++ b/package/firmware/ipq-wifi/Makefile +@@ -41,7 +41,7 @@ define Package/ipq-wifi-default + SUBMENU:=ath10k Board-Specific Overrides + SECTION:=firmware + CATEGORY:=Firmware +- DEPENDS:=@TARGET_ipq40xx ++ DEPENDS:=@(TARGET_ipq40xx||TARGET_ipq806x) + TITLE:=Custom Board + endef + +-- +2.25.1 + diff --git a/patches/wlan-ap/0002-ipq806x-4.14-enable-AT803X-driver.patch b/patches/wlan-ap/0002-ipq806x-4.14-enable-AT803X-driver.patch new file mode 100644 index 000000000..e6d3151bf --- /dev/null +++ b/patches/wlan-ap/0002-ipq806x-4.14-enable-AT803X-driver.patch @@ -0,0 +1,28 @@ +From cb0b442df7dd7b03bbda6344ecfe8799595e81db Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Mon, 18 May 2020 12:25:20 +0200 +Subject: [PATCH 2/7] ipq806x: 4.14: enable AT803X driver + +Its needed for Edgecore ECW5410 which does not use QCA8337 switch, +but rather 2x AR8033 PHY-s directly connected to GMAC-s. + +Signed-off-by: Robert Marko +--- + target/linux/ipq806x/config-4.14 | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/target/linux/ipq806x/config-4.14 b/target/linux/ipq806x/config-4.14 +index 38f5c94507..2a89ad8778 100644 +--- a/target/linux/ipq806x/config-4.14 ++++ b/target/linux/ipq806x/config-4.14 +@@ -58,6 +58,7 @@ CONFIG_ARM_THUMB=y + # CONFIG_ARM_THUMBEE is not set + CONFIG_ARM_UNWIND=y + CONFIG_ARM_VIRT_EXT=y ++CONFIG_AT803X_PHY=y + # CONFIG_BINFMT_FLAT is not set + CONFIG_BLK_DEV_LOOP=y + CONFIG_BLK_MQ_PCI=y +-- +2.25.1 + diff --git a/patches/wlan-ap/0003-ipq806x-add-GSBI1-node-to-DTSI.patch b/patches/wlan-ap/0003-ipq806x-add-GSBI1-node-to-DTSI.patch new file mode 100644 index 000000000..ba8bff862 --- /dev/null +++ b/patches/wlan-ap/0003-ipq806x-add-GSBI1-node-to-DTSI.patch @@ -0,0 +1,63 @@ +From 18b22a37bf37e661824ff8fe9bf4d3ab9df2d940 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Mon, 18 May 2020 12:28:37 +0200 +Subject: [PATCH 3/7] ipq806x: add GSBI1 node to DTSI + +IPQ806x series also has a GSBI1 with UART and I2C peripherals, so lets add the node for it. + +Its needed for Edgecore ECW5410 which uses the UART from GSBI1 as second UART for Bluetooth. + +Signed-off-by: Robert Marko +--- + .../arch/arm/boot/dts/qcom-ipq8064.dtsi | 35 +++++++++++++++++++ + 1 file changed, 35 insertions(+) + +diff --git a/target/linux/ipq806x/files-4.14/arch/arm/boot/dts/qcom-ipq8064.dtsi b/target/linux/ipq806x/files-4.14/arch/arm/boot/dts/qcom-ipq8064.dtsi +index d850553000..1af6353ee4 100644 +--- a/target/linux/ipq806x/files-4.14/arch/arm/boot/dts/qcom-ipq8064.dtsi ++++ b/target/linux/ipq806x/files-4.14/arch/arm/boot/dts/qcom-ipq8064.dtsi +@@ -721,6 +721,41 @@ + reg = <0x12100000 0x10000>; + }; + ++ gsbi1: gsbi@12440000 { ++ compatible = "qcom,gsbi-v1.0.0"; ++ cell-index = <1>; ++ reg = <0x12440000 0x100>; ++ clocks = <&gcc GSBI1_H_CLK>; ++ clock-names = "iface"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ranges; ++ status = "disabled"; ++ ++ syscon-tcsr = <&tcsr>; ++ ++ gsbi1_serial: serial@12450000 { ++ compatible = "qcom,msm-uartdm-v1.3", "qcom,msm-uartdm"; ++ reg = <0x12450000 0x100>, ++ <0x12400000 0x03>; ++ interrupts = ; ++ clocks = <&gcc GSBI1_UART_CLK>, <&gcc GSBI1_H_CLK>; ++ clock-names = "core", "iface"; ++ status = "disabled"; ++ }; ++ ++ gsbi1_i2c: i2c@12460000 { ++ compatible = "qcom,i2c-qup-v1.1.1"; ++ reg = <0x12460000 0x1000>; ++ interrupts = ; ++ clocks = <&gcc GSBI1_QUP_CLK>, <&gcc GSBI1_H_CLK>; ++ clock-names = "core", "iface"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ }; ++ + gsbi2: gsbi@12480000 { + compatible = "qcom,gsbi-v1.0.0"; + cell-index = <2>; +-- +2.25.1 + diff --git a/patches/wlan-ap/0004-ipq806x-import-bootargs-append-from-IPQ40xx.patch b/patches/wlan-ap/0004-ipq806x-import-bootargs-append-from-IPQ40xx.patch new file mode 100644 index 000000000..bcd378649 --- /dev/null +++ b/patches/wlan-ap/0004-ipq806x-import-bootargs-append-from-IPQ40xx.patch @@ -0,0 +1,41 @@ +From a7dd83202c73e8dec2963d97d1a0580dcd4add7a Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Mon, 18 May 2020 12:35:15 +0200 +Subject: [PATCH 4/7] ipq806x: import bootargs-append from IPQ40xx + +This imports the patch that adds bootargs-append support from IPQ40xx. + +This way we can append additional boot arguments from DTS instead of only being able to overwrite them. + +This way dual firmware devices can use the rootfs number that bootloader passes to decide from what to boot. +But we still need to append console info and ubi root info. + +This is used by Edgecore ECW5410. + +Signed-off-by: Robert Marko +--- + .../patches-4.14/997-device_tree_cmdline.patch | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + create mode 100644 target/linux/ipq806x/patches-4.14/997-device_tree_cmdline.patch + +diff --git a/target/linux/ipq806x/patches-4.14/997-device_tree_cmdline.patch b/target/linux/ipq806x/patches-4.14/997-device_tree_cmdline.patch +new file mode 100644 +index 0000000000..8b5e64a2d4 +--- /dev/null ++++ b/target/linux/ipq806x/patches-4.14/997-device_tree_cmdline.patch +@@ -0,0 +1,12 @@ ++--- a/drivers/of/fdt.c +++++ b/drivers/of/fdt.c ++@@ -1130,6 +1130,9 @@ int __init early_init_dt_scan_chosen(uns ++ p = of_get_flat_dt_prop(node, "bootargs", &l); ++ if (p != NULL && l > 0) ++ strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE)); +++ p = of_get_flat_dt_prop(node, "bootargs-append", &l); +++ if (p != NULL && l > 0) +++ strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE)); ++ ++ /* ++ * CONFIG_CMDLINE is meant to be a default in case nothing else +-- +2.25.1 + diff --git a/patches/wlan-ap/0005-ipq806x-add-Edgecore-ECW5410-support.patch b/patches/wlan-ap/0005-ipq806x-add-Edgecore-ECW5410-support.patch new file mode 100644 index 000000000..427070cf0 --- /dev/null +++ b/patches/wlan-ap/0005-ipq806x-add-Edgecore-ECW5410-support.patch @@ -0,0 +1,725 @@ +From 85b302d3f5423d54378a178602a8097dac50d9d0 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Mon, 18 May 2020 12:45:47 +0200 +Subject: [PATCH 5/7] ipq806x: add Edgecore ECW5410 support + +This patch adds support for the Edgecore ECW5410 indoor AP. + +Specification: +- SoC: Qualcomm Atheros IPQ8068 ARMv7 2x Cortex A-15 +- RAM: 256MB(225 usable) DDR3 +- NOR Flash: 16MB SPI NOR +- NAND Flash: 128MB S34MS01G2 Parallel NAND +- Ethernet: 2 x 1G via 2x AR8033 PHY-s connected directly to GMAC2 and GMAC3 via SGMII (802.3af POE IN on eth0) +- USB: 1 x USB 3.0 SuperSpeed +- WLAN: 2x QCA9994 AC Wawe 2 (1x 2GHz bgn, 1x 5GHz acn) +- CC2540 BLE +- UART console on RJ45 next to ethernet ports exposed. +Its Cisco pin compatible, 115200 8n1 baud. + +Installation instructions: +Through stock firmware or initramfs. + +1.Connect to console +2. Login with root account, if password is unknown then interrupt the boot with f and reset it in failsafe. +3. Transfer factory image +4. Flash the image with ubiformat /dev/mtd1 -y -f + +This will replace the rootfs2 with OpenWrt, if you are currently running from rootfs2 then simply change /dev/mtd1 to /dev/mtd0 + +Note + +Initramfs: +1. Connect to console +2. Transfer the image from TFTP server with tftpboot, +or by using DHCP advertised image with dhcp command. +3. bootm +4. Run ubiformat /dev/mtd1 + +You need to interrupt the bootloader after rebooting and run: +run altbootcmd + +This will switch your active rootfs partition to one you wrote to and boot from it. + +So if rootfs1 is active, then it will change it to rootfs2. + +This will format the rootfs2 partition, if your active partition is 2 then simply change /dev/mtd1 with /dev/mtd0 +If you dont format the partition you will be writing too, then sysupgrade will find existing UBI rootfs and kernel volumes and update those. +This will result in wrong ordering and OpenWrt will panic on boot. + +5. Transfer sysupgrade image +6. Flash with sysupgrade -n. + +Note that sysupgrade will write the image to rootfs partition that is not currently in use. + +Signed-off-by: Robert Marko +--- + package/boot/uboot-envtools/files/ipq806x | 3 + + package/firmware/ipq-wifi/Makefile | 2 + + .../ipq-wifi/board-edgecore_ecw5410.qca9984 | Bin 0 -> 24324 bytes + .../ipq806x/base-files/etc/board.d/01_leds | 4 + + .../ipq806x/base-files/etc/board.d/02_network | 5 + + .../etc/hotplug.d/firmware/11-ath10k-caldata | 10 + + .../ipq806x/base-files/etc/init.d/bootcount | 3 + + .../base-files/lib/upgrade/platform.sh | 11 + + .../arm/boot/dts/qcom-ipq8068-ecw5410.dts | 400 ++++++++++++++++++ + target/linux/ipq806x/image/Makefile | 12 + + .../0069-arm-boot-add-dts-files.patch | 3 +- + 11 files changed, 452 insertions(+), 1 deletion(-) + create mode 100644 package/firmware/ipq-wifi/board-edgecore_ecw5410.qca9984 + create mode 100644 target/linux/ipq806x/files-4.14/arch/arm/boot/dts/qcom-ipq8068-ecw5410.dts + +diff --git a/package/boot/uboot-envtools/files/ipq806x b/package/boot/uboot-envtools/files/ipq806x +index c27bea71c1..9da2b5b6bd 100644 +--- a/package/boot/uboot-envtools/files/ipq806x ++++ b/package/boot/uboot-envtools/files/ipq806x +@@ -31,6 +31,9 @@ ubootenv_mtdinfo () { + } + + case "$board" in ++edgecore,ecw5410) ++ ubootenv_add_uci_config "/dev/mtd11" "0x0" "0x10000" "0x10000" ++ ;; + linksys,ea8500) + ubootenv_add_uci_config "/dev/mtd10" "0x0" "0x20000" "0x20000" + ;; +diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile +index 4b90a3397f..25731ddc56 100644 +--- a/package/firmware/ipq-wifi/Makefile ++++ b/package/firmware/ipq-wifi/Makefile +@@ -29,6 +29,7 @@ ALLWIFIBOARDS:= \ + avm_fritzbox-7530 \ + avm_fritzrepeater-1200 \ + avm_fritzrepeater-3000 \ ++ edgecore_ecw5410 \ + engenius_eap1300 \ + engenius_ens620ext \ + linksys_ea6350v3 \ +@@ -101,6 +102,7 @@ $(eval $(call generate-ipq-wifi-package,asus_map-ac2200,ASUS MAP-AC2200)) + $(eval $(call generate-ipq-wifi-package,avm_fritzbox-7530,AVM FRITZ!Box 7530)) + $(eval $(call generate-ipq-wifi-package,avm_fritzrepeater-1200,AVM FRITZRepeater 1200)) + $(eval $(call generate-ipq-wifi-package,avm_fritzrepeater-3000,AVM FRITZ!Repeater 3000)) ++$(eval $(call generate-ipq-wifi-package,edgecore_ecw5410,Edgecore ECW5410)) + $(eval $(call generate-ipq-wifi-package,engenius_eap1300,EnGenius EAP1300)) + $(eval $(call generate-ipq-wifi-package,engenius_ens620ext,EnGenius ENS620EXT)) + $(eval $(call generate-ipq-wifi-package,linksys_ea6350v3,Linksys EA6350v3)) +diff --git a/package/firmware/ipq-wifi/board-edgecore_ecw5410.qca9984 b/package/firmware/ipq-wifi/board-edgecore_ecw5410.qca9984 +new file mode 100644 +index 0000000000000000000000000000000000000000..2c1992001d86268e0483b9e53ed4b563e224ada4 +GIT binary patch +literal 24324 +zcmeHPeN+=y7JnH)J}sG$q9`3c1goeK0|h^#2wJq7)|7S8P(=c$7>lM6tOyq5L#PH# +zk)SOLQb{PbK*6Pj7KMm{+M}HAIX$P{t+nl*ZU5Mw_MEnR+HQ}{?0YkrWC%pV*W$JNMrA-pycU-uvP6t6~?#Zd|)4eEovB4Y3KUL1tzqfTUW8Y5-zjNzLB3T$Q$K +zero2f1!)<(R10>cFAt}Bse2Xbbktomf4@S#OR*QzO-Pm;3Ch`U8Q?PT|IdJt8qx?-$yCb& +zRu}o9MFyajB?G|Nr;+IveG}PZkpVc!k^%S=)e9usOy^DCo9Oi|C6|)7|Da_6BFHMr +zCWrio>2p(}**lp`CSNq$0}x9}DZLAsY05O^Q}Sx^oavm&aDoTics$J64gNrZiF&tI +znv$;3e*DR2$mTP$6-N7z6vBd-@yjCP$N@5i^Z@Ok4l+X?pp~qGB@x;-kQEktt#*IX +z#*NbW#emOuGaE0S8#*gEH~{v3`TC3BOs2=7MC*|9w{LD^&dw+euJADu`lrzTUS7^- +z{~bG$5^3F?J3pFr0EFmN)Tr~x_e}4Z{%Ow9LUJM5PU-iN-hy=c8O +zf{6Gb0$)Zf6D^a{9|F6khN4qH;WfHtRj<}Gu}kO}NxC^hQ`dg+ruFS&u*CW`8CJY~ +zrKh3haPAhx%B#kfbDAP$s%*tTZ%e%eJp1z3vrtl05o1NE)5?1o+h0aaNbB +zPLzwUUT$gDlql1n!{rveCQm7sMM4JybdbxVEDi&GEe2hYdW$@&r{D07Mx)#*i$$(F +zje5I0X5eZ|qwa`$n|uj!IEF^(=&jKgl_+=1R(D)Nl49%H`Ep9kk$TZ_C@d!rT-^Oh-R-C|B=R +zJl}K0V9*q*74ju0bMUG{vC`u3>E({bnu4OO%9x(3FmACrMG@cA+tON7QM6YngIC{z +zSCf^LLwS`}JM3p;PszQm*vkxC&t-|74SO<|C3~4+>$xnkv%$%ZW&oqNu?Lwu_O3F> +z<$>)Sy^_``X_$M;_i%B?3+Ey#i6UIp*{f=Mwmz(UW^Ut!jCa=5JXtzDyQTk7*RyZ? +z7vt*su073?Qz0e3FBP2Mqz^ytpU2PWx|rRxp>|&BjQv%8$?vT&1ZV^YFZIWrc~ay1 +zviHuK3mMH(y1*hlv$}I(ChhiRwh@?UJZvb8z-jeruL +zY*lmI>!HQdvOE(@uWjm_SL=6lYSvrV_Iwak7jO*EuIyfK2&s@hbR*}z(UR&C(@4v9_?Z9%u +zfs;M)^|Q-`Szf8vt}HthRER4*Q(GmqGYTHt{lI?k+{C#Ia2WtDuI`>wy>Xw%r}@o%V(^O@)kE(K +zcOzFe4U%yv3Y--b6daW3;$}Ic9LCQv6%TWA!2ssuJjK-s +zdSI?o&^DW^EBaD%b#Oi0kXmu}{AG5{y!wx< +z9XbX&J)~&d#$a+L@J0NTs{nFa1qPTx_-*8GX?WGvDY5K!r2X +zBWlRU0Mbjm2kX&wI{tds5Xeky)Y9=qo&zoe!^B?=x7XQ++Rd}FB4rZ!tKjn;hlkWXpOo% +zB#Cs5aLJ4g>3^pfN!FOVoSaE#n|R(XaR1aM9*<`NXycQa2Wr!ttn*{$vYfY$S7siU +zvF*a@Anyg)kO64M{tD$%P=clbda*)S@1f*IN`3{-TMzjxXn+hrJJya>fGWs{S}~;4 +z04;VJ@?$(4G5}>*8Ro~sApbmsC^u^btsSEAwsUCE@iWp=IWOcP9>1ugk0jlap=rMf +z0BjGyZL^!Ut%#!eVRPn~rP;y3obKVt0d>eR2a#EVpYQ#o8~vTlc|PbFAX~kJ&d%vz +z^XbMubgp>{(wmT&b#+1-i;jsiQLS_{{KvJf{kpyO$=RVHlUeAKJNm4SKAn@wHg4XM +zlAfW_R-XP#oxZWDwY~G=rM~MoM}C2IjyJL=*9XQLQ0JghK^b!rN}Yj926d +zLa^Gj8kZ7MkyN@GM4BRT2_X?lq>DuhE*mP}-ZMrtbHr-*SVo{9{cQ1Afci-a) +z&mo-hA@m*%6!sOYQULIn23trlMP7E{L-6`g+`ZR$;qGrx6JS+i#oe<)Q6k)Ui?P+g +zziJo>xPGX+MPtR?2LhVmB?|A)m-CG3XXBS`C +zXP3Ks554LMX{h$W)IgjYYu9z~8gBP?>#GZLk`ki2FB=*Q3zCv!V+Q(~8%~zKqYXwNpSm8cYXEYoUI9qyRTFma`F>i2#@UVHPja#N=k~A^cyKj +zPUBKe=qfA0ZDaSF&|zD`(r#mQLr!5ra`=+|O9p*mVN&wq#RGi?L*Zd4QP`RjRl3T- +z^SeinJCeRff~d=nWR@IB%)M;j$u;_(oHVM`Csjlj1n%}p$~zN(bneSDGK9&+4I3)v +z9rD}dopees*M{f%XZXmE)&Kdm=)-}T!mZ_o=U-ctAFy}&_7hDnR7aKuWC_!ons!&O +zI1-XIJ-w?f=gnue0egJ5^`B2X8C4jv&u{0kcNDctj?FqaP5Ew9PVJhb^K$%^leS=P +z;4x)jtS4=7aO#GKkaBeE!`jISel1TildJWlZSaF#aH8`#oV1N;=@a5SkBWNdj@W|N +zr-wnfdz2mucMkQjKSFE`EJOBRI +zS6_aKfc{q8z5A~}e*fKf-$0!=e7+sdpB>*Sdw6|KJqn*Soq?$)rAm_h1?Axnc6 +z#C5m~a2en-z-55T0GEMBI0Hj5@eJ(VZQRc6hmOI(?%l_2j0f!_EciQO-Hlwxc}Fn7 +z6#q}Yz4h&_-jDzI=#P((PF6w}+WzL>zJScwqV|3w_@^F-2jT9I{C>;zmMg7eaQ6(h +zpTXRtb|Ti%gLOf6=XpW~K<%maoJ##=z!2E|&l55FC}KLaPY&ZcYB!20Os31daQ6s< +zP5oap(>aNF2y-x*_Z~Mkmx0O50K)ZS5ZAAI75?)+0l0p9czZ@anV5StHix^X&bmfh +zak%@@W{&f_Z!_S?nXx^rJzIa@E^v$!<8b#7Wo3ck+koY5x`XjpBg5?5doK7Nj2+EG + +literal 0 +HcmV?d00001 + +diff --git a/target/linux/ipq806x/base-files/etc/board.d/01_leds b/target/linux/ipq806x/base-files/etc/board.d/01_leds +index f8b6c32358..ffefb9e01c 100755 +--- a/target/linux/ipq806x/base-files/etc/board.d/01_leds ++++ b/target/linux/ipq806x/base-files/etc/board.d/01_leds +@@ -19,6 +19,10 @@ compex,wpq864) + ucidef_set_led_usbport "usb" "USB" "wpq864:green:usb" "usb1-port1" "usb2-port1" + ucidef_set_led_usbport "pcie-usb" "PCIe USB" "wpq864:green:usb-pcie" "usb3-port1" + ;; ++edgecore,ecw5410) ++ ucidef_set_led_wlan "wlan2g" "WLAN2G" "${boardname}:green:wlan2g" "phy1tpt" ++ ucidef_set_led_wlan "wlan5g" "WLAN5G" "${boardname}:green:wlan5g" "phy0tpt" ++ ;; + nec,wg2600hp) + ucidef_set_led_wlan "wlan2g" "WLAN2G" "${boardname}:green:wlan2g" "phy1tpt" + ucidef_set_led_wlan "wlan5g" "WLAN5G" "${boardname}:green:wlan5g" "phy0tpt" +diff --git a/target/linux/ipq806x/base-files/etc/board.d/02_network b/target/linux/ipq806x/base-files/etc/board.d/02_network +index a3aa0fce70..d6958cadac 100755 +--- a/target/linux/ipq806x/base-files/etc/board.d/02_network ++++ b/target/linux/ipq806x/base-files/etc/board.d/02_network +@@ -22,6 +22,11 @@ tplink,vr2600v) + ucidef_add_switch "switch0" \ + "1:lan" "2:lan" "3:lan" "4:lan" "6@eth1" "5:wan" "0@eth0" + ;; ++edgecore,ecw5410) ++ ucidef_set_interfaces_lan_wan "eth1" "eth0" ++ ucidef_set_interface_macaddr "lan" "$(mtd_get_mac_binary "0:ART" 0x6)" ++ ucidef_set_interface_macaddr "wan" "$(mtd_get_mac_binary "0:ART" 0x0)" ++ ;; + qcom,ipq8064-ap161) + ucidef_set_interface_lan "eth1 eth2" + ucidef_add_switch "switch0" \ +diff --git a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +index e05f2b2c7b..71bc906acd 100644 +--- a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata ++++ b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +@@ -117,6 +117,9 @@ case "$FIRMWARE" in + ath10kcal_extract "ART" 20480 12064 + ath10kcal_patch_mac_crc $(mtd_get_mac_binary ART 24) + ;; ++ edgecore,ecw5410) ++ ath10kcal_extract "0:ART" 4096 12064 ++ ;; + linksys,ea8500) + ath10kcal_extract "art" 20480 12064 + ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +2) +@@ -145,6 +148,13 @@ case "$FIRMWARE" in + ;; + esac + ;; ++"ath10k/pre-cal-pci-0002:01:00.0.bin") ++ case $board in ++ edgecore,ecw5410) ++ ath10kcal_extract "0:ART" 20480 12064 ++ ;; ++ esac ++ ;; + *) + exit 1 + ;; +diff --git a/target/linux/ipq806x/base-files/etc/init.d/bootcount b/target/linux/ipq806x/base-files/etc/init.d/bootcount +index 6a5a6d52ad..307cb12b9f 100755 +--- a/target/linux/ipq806x/base-files/etc/init.d/bootcount ++++ b/target/linux/ipq806x/base-files/etc/init.d/bootcount +@@ -6,6 +6,9 @@ start() { + . /lib/functions.sh + + case $(board_name) in ++ edgecore,ecw5410) ++ fw_setenv bootcount 0 ++ ;; + linksys,ea8500) + mtd resetbc s_env || true + ;; +diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh +index 5919613cb9..032e71981e 100644 +--- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh +@@ -25,6 +25,17 @@ platform_do_upgrade() { + zyxel,nbg6817) + nand_do_upgrade "$1" + ;; ++ edgecore,ecw5410) ++ 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" ++ ;; + linksys,ea8500) + platform_do_upgrade_linksys "$1" + ;; +diff --git a/target/linux/ipq806x/files-4.14/arch/arm/boot/dts/qcom-ipq8068-ecw5410.dts b/target/linux/ipq806x/files-4.14/arch/arm/boot/dts/qcom-ipq8068-ecw5410.dts +new file mode 100644 +index 0000000000..6bddc5e288 +--- /dev/null ++++ b/target/linux/ipq806x/files-4.14/arch/arm/boot/dts/qcom-ipq8068-ecw5410.dts +@@ -0,0 +1,400 @@ ++#include "qcom-ipq8064-v2.0.dtsi" ++ ++#include ++#include ++ ++/ { ++ model = "Edgecore ECW5410"; ++ compatible = "edgecore,ecw5410", "qcom,ipq8064"; ++ ++ reserved-memory { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ranges; ++ ++ nss@40000000 { ++ reg = <0x40000000 0x1000000>; ++ no-map; ++ }; ++ ++ smem: smem@41000000 { ++ reg = <0x41000000 0x200000>; ++ no-map; ++ }; ++ ++ wifi_dump@44000000 { ++ reg = <0x44000000 0x600000>; ++ no-map; ++ }; ++ ++ rsvd@41200000 { ++ reg = <0x41200000 0x300000>; ++ no-map; ++ }; ++ }; ++ ++ cpus { ++ idle-states { ++ CPU_SPC: spc { ++ status = "disabled"; ++ }; ++ }; ++ }; ++ ++ aliases { ++ serial0 = &gsbi4_serial; ++ serial1 = &gsbi1_serial; ++ mdio-gpio0 = &mdio0; ++ ethernet0 = &gmac3; ++ ethernet1 = &gmac2; ++ ++ led-boot = &power_green; ++ led-failsafe = &power_red; ++ led-running = &power_green; ++ led-upgrade = &power_green; ++ }; ++ ++ chosen { ++ bootargs-append = " console=ttyMSM0,115200n8 root=/dev/ubiblock0_1"; ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ keys { ++ compatible = "gpio-keys"; ++ pinctrl-0 = <&button_pins>; ++ pinctrl-names = "default"; ++ ++ reset { ++ label = "reset"; ++ gpios = <&qcom_pinmux 25 GPIO_ACTIVE_LOW>; ++ linux,code = ; ++ }; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ pinctrl-0 = <&led_pins>; ++ pinctrl-names = "default"; ++ ++ power_green: power_green { ++ label = "ecw5410:green:power"; ++ gpios = <&qcom_pinmux 16 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ wlan2g_green { ++ label = "ecw5410:green:wlan2g"; ++ gpios = <&qcom_pinmux 23 GPIO_ACTIVE_LOW>; ++ }; ++ ++ wlan2g_yellow { ++ label = "ecw5410:yellow:wlan2g"; ++ gpios = <&qcom_pinmux 24 GPIO_ACTIVE_LOW>; ++ }; ++ ++ wlan5g_green { ++ label = "ecw5410:green:wlan5g"; ++ gpios = <&qcom_pinmux 26 GPIO_ACTIVE_LOW>; ++ }; ++ ++ power_red: power_red { ++ label = "ecw5410:red:power"; ++ gpios = <&qcom_pinmux 28 GPIO_ACTIVE_LOW>; ++ }; ++ ++ wlan5g_yellow { ++ label = "ecw5410:yellow:wlan5g"; ++ gpios = <&qcom_pinmux 59 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; ++ ++ ++&qcom_pinmux { ++ spi_pins: spi_pins { ++ mux { ++ pins = "gpio18", "gpio19"; ++ function = "gsbi5"; ++ drive-strength = <10>; ++ bias-pull-down; ++ }; ++ ++ clk { ++ pins = "gpio21"; ++ function = "gsbi5"; ++ drive-strength = <12>; ++ bias-pull-down; ++ }; ++ ++ cs { ++ pins = "gpio20"; ++ function = "gpio"; ++ drive-strength = <10>; ++ bias-pull-up; ++ }; ++ }; ++ ++ nand_pins: nand_pins { ++ disable { ++ pins = "gpio34", "gpio35", "gpio36", "gpio37", ++ "gpio38"; ++ function = "nand"; ++ drive-strength = <10>; ++ bias-disable; ++ }; ++ ++ pullups { ++ pins = "gpio39"; ++ function = "nand"; ++ drive-strength = <10>; ++ bias-pull-up; ++ }; ++ ++ hold { ++ pins = "gpio40", "gpio41", "gpio42", "gpio43", ++ "gpio44", "gpio45", "gpio46", "gpio47"; ++ function = "nand"; ++ drive-strength = <10>; ++ bias-bus-hold; ++ }; ++ }; ++ ++ mdio0_pins: mdio0_pins { ++ mux { ++ pins = "gpio0", "gpio1"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ }; ++ ++ led_pins: led_pins { ++ mux { ++ pins = "gpio16", "gpio23", "gpio24", "gpio26", ++ "gpio28", "gpio59"; ++ function = "gpio"; ++ drive-strength = <2>; ++ bias-pull-up; ++ }; ++ }; ++ ++ button_pins: button_pins { ++ mux { ++ pins = "gpio25"; ++ function = "gpio"; ++ drive-strength = <2>; ++ bias-pull-up; ++ }; ++ }; ++ ++ uart1_pins: uart1_pins { ++ mux { ++ pins = "gpio51", "gpio52", "gpio53", "gpio54"; ++ function = "gsbi1"; ++ drive-strength = <12>; ++ bias-none; ++ }; ++ }; ++}; ++ ++&gsbi1 { ++ qcom,mode = ; ++ status = "okay"; ++ ++ serial@12450000 { ++ status = "okay"; ++ ++ pinctrl-0 = <&uart1_pins>; ++ pinctrl-names = "default"; ++ }; ++}; ++ ++&gsbi4 { ++ qcom,mode = ; ++ status = "okay"; ++ ++ serial@16340000 { ++ status = "okay"; ++ }; ++ ++ /* ++ * The i2c device on gsbi4 should not be enabled. ++ * On ipq806x designs gsbi4 i2c is meant for exclusive ++ * RPM usage. Turning this on in kernel manifests as ++ * i2c failure for the RPM. ++ */ ++}; ++ ++&gsbi5 { ++ qcom,mode = ; ++ status = "okay"; ++ ++ spi4: spi@1a280000 { ++ status = "okay"; ++ spi-max-frequency = <50000000>; ++ ++ pinctrl-0 = <&spi_pins>; ++ pinctrl-names = "default"; ++ ++ cs-gpios = <&qcom_pinmux 20 GPIO_ACTIVE_HIGH>; ++ ++ m25p80@0 { ++ compatible = "jedec,spi-nor"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ spi-max-frequency = <50000000>; ++ reg = <0>; ++ ++ partitions { ++ compatible = "qcom,smem"; ++ }; ++ }; ++ }; ++}; ++ ++&hs_phy_0 { /* USB3 port 0 HS phy */ ++ status = "okay"; ++}; ++ ++&hs_phy_1 { /* USB3 port 1 HS phy */ ++ status = "okay"; ++}; ++ ++&ss_phy_0 { /* USB3 port 0 SS phy */ ++ status = "okay"; ++}; ++ ++&ss_phy_1 { /* USB3 port 1 SS phy */ ++ status = "okay"; ++}; ++ ++&usb3_0 { ++ status = "okay"; ++}; ++ ++&usb3_1 { ++ status = "okay"; ++}; ++ ++&pcie1 { ++ status = "okay"; ++ ++ /delete-property/ pinctrl-0; ++ /delete-property/ pinctrl-names; ++ /delete-property/ perst-gpios; ++ ++ bridge@0,0 { ++ reg = <0x00000000 0 0 0 0>; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ ranges; ++ ++ wifi@1,0 { ++ compatible = "qcom,ath10k"; ++ status = "okay"; ++ reg = <0x00010000 0 0 0 0>; ++ qcom,ath10k-calibration-variant = "Edgecore-ECW5410-L"; ++ }; ++ }; ++}; ++ ++&pcie2 { ++ status = "okay"; ++ ++ /delete-property/ pinctrl-0; ++ /delete-property/ pinctrl-names; ++ /delete-property/ perst-gpios; ++ ++ bridge@0,0 { ++ reg = <0x00000000 0 0 0 0>; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ ranges; ++ ++ wifi@1,0 { ++ compatible = "qcom,ath10k"; ++ status = "okay"; ++ reg = <0x00010000 0 0 0 0>; ++ qcom,ath10k-calibration-variant = "Edgecore-ECW5410-L"; ++ }; ++ }; ++}; ++ ++&soc { ++ nand@1ac00000 { ++ status = "okay"; ++ ++ pinctrl-0 = <&nand_pins>; ++ pinctrl-names = "default"; ++ ++ nand@0 { ++ compatible = "qcom,nandcs"; ++ ++ reg = <0>; ++ ++ nand-ecc-strength = <4>; ++ nand-bus-width = <8>; ++ nand-ecc-step-size = <512>; ++ ++ partitions { ++ compatible = "fixed-partitions"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ rootfs1@0 { ++ label = "rootfs1"; ++ reg = <0x0000000 0x4000000>; ++ }; ++ ++ rootfs2@4000000 { ++ label = "rootfs2"; ++ reg = <0x4000000 0x4000000>; ++ }; ++ }; ++ }; ++ }; ++ ++ mdio0: mdio { ++ compatible = "virtual,mdio-gpio"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ status = "okay"; ++ ++ pinctrl-0 = <&mdio0_pins>; ++ pinctrl-names = "default"; ++ ++ gpios = <&qcom_pinmux 1 GPIO_ACTIVE_HIGH &qcom_pinmux 0 GPIO_ACTIVE_HIGH>; ++ ++ phy0: ethernet-phy@0 { ++ reg = <0>; ++ }; ++ ++ phy1: ethernet-phy@1 { ++ reg = <1>; ++ }; ++ }; ++}; ++ ++&gmac2 { ++ status = "okay"; ++ ++ qcom,id = <2>; ++ mdiobus = <&mdio0>; ++ ++ phy-mode = "sgmii"; ++ phy-handle = <&phy1>; ++}; ++ ++&gmac3 { ++ status = "okay"; ++ ++ qcom,id = <3>; ++ mdiobus = <&mdio0>; ++ ++ phy-mode = "sgmii"; ++ phy-handle = <&phy0>; ++}; ++ ++&adm_dma { ++ status = "okay"; ++}; +diff --git a/target/linux/ipq806x/image/Makefile b/target/linux/ipq806x/image/Makefile +index e1eb090de3..45f1c7f49c 100644 +--- a/target/linux/ipq806x/image/Makefile ++++ b/target/linux/ipq806x/image/Makefile +@@ -105,6 +105,18 @@ define Device/compex_wpq864 + endef + TARGET_DEVICES += compex_wpq864 + ++define Device/edgecore_ecw5410 ++ $(call Device/FitImage) ++ $(call Device/UbiFit) ++ DEVICE_TITLE := Edgecore ECW5410 ++ BLOCKSIZE := 128k ++ PAGESIZE := 2048 ++ DEVICE_DTS := qcom-ipq8068-ecw5410 ++ DEVICE_DTS_CONFIG := config@v2.0-ap160 ++ DEVICE_PACKAGES := ath10k-firmware-qca9984-ct ipq-wifi-edgecore_ecw5410 ++endef ++TARGET_DEVICES += edgecore_ecw5410 ++ + define Device/linksys_ea8500 + $(call Device/LegacyImage) + DEVICE_DTS := qcom-ipq8064-ea8500 +diff --git a/target/linux/ipq806x/patches-4.14/0069-arm-boot-add-dts-files.patch b/target/linux/ipq806x/patches-4.14/0069-arm-boot-add-dts-files.patch +index e11378b42a..5c88c46e4f 100644 +--- a/target/linux/ipq806x/patches-4.14/0069-arm-boot-add-dts-files.patch ++++ b/target/linux/ipq806x/patches-4.14/0069-arm-boot-add-dts-files.patch +@@ -10,7 +10,7 @@ Signed-off-by: John Crispin + + --- a/arch/arm/boot/dts/Makefile + +++ b/arch/arm/boot/dts/Makefile +-@@ -699,6 +699,18 @@ dtb-$(CONFIG_ARCH_QCOM) += \ ++@@ -699,6 +699,19 @@ dtb-$(CONFIG_ARCH_QCOM) += \ + qcom-apq8084-mtp.dtb \ + qcom-ipq4019-ap.dk01.1-c1.dtb \ + qcom-ipq8064-ap148.dtb \ +@@ -26,6 +26,7 @@ Signed-off-by: John Crispin + + qcom-ipq8064-wxr-2533dhp.dtb \ + + qcom-ipq8065-nbg6817.dtb \ + + qcom-ipq8065-r7800.dtb \ +++ qcom-ipq8068-ecw5410.dtb \ + qcom-msm8660-surf.dtb \ + qcom-msm8960-cdp.dtb \ + qcom-msm8974-lge-nexus5-hammerhead.dtb \ +-- +2.25.1 + diff --git a/patches/wlan-ap/0006-ipq40xx-add-Edgecore-ECW5211-support.patch b/patches/wlan-ap/0006-ipq40xx-add-Edgecore-ECW5211-support.patch new file mode 100644 index 000000000..779c52f30 --- /dev/null +++ b/patches/wlan-ap/0006-ipq40xx-add-Edgecore-ECW5211-support.patch @@ -0,0 +1,550 @@ +From 373d74c5d6aba0baca1c2bc6d3b7df1a35eb90a7 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Fri, 19 Jun 2020 14:01:58 +0200 +Subject: [PATCH 6/7] ipq40xx: add Edgecore ECW5211 support + +This patch adds support for the Edgecore ECW5211 indoor AP. + +Specification: +- SoC: Qualcomm Atheros IPQ4018 ARMv7-A 4x Cortex A-7 +- RAM: 256MB DDR3 +- NOR Flash: 16MB SPI NOR +- NAND Flash: 128MB MX35LFxGE4AB SPI-NAND +- Ethernet: 2 x 1G via Q8075 PHY connected to ethernet adapter via PSGMII (802.3af POE IN on eth0) +- USB: 1 x USB 3.0 SuperSpeed +- WLAN: Built-in IPQ4018 (2x2 802.11bng, 2x2 802.11 acn) +- CC2540 BLE connected to USB 2.0 port +- Atmel AT97SC3205T I2C TPM + +Signed-off-by: Robert Marko +--- + package/firmware/ipq-wifi/Makefile | 2 + + .../ipq-wifi/board-edgecore_ecw5211.qca4019 | Bin 0 -> 24324 bytes + .../ipq40xx/base-files/etc/board.d/01_leds | 1 + + .../ipq40xx/base-files/etc/board.d/02_network | 1 + + .../etc/hotplug.d/firmware/11-ath10k-caldata | 2 + + .../base-files/lib/upgrade/platform.sh | 1 + + .../arm/boot/dts/qcom-ipq4018-ecw5211.dts | 325 ++++++++++++++++++ + target/linux/ipq40xx/image/Makefile | 12 + + .../901-arm-boot-add-dts-files.patch | 3 +- + 9 files changed, 346 insertions(+), 1 deletion(-) + create mode 100644 package/firmware/ipq-wifi/board-edgecore_ecw5211.qca4019 + create mode 100644 target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-ecw5211.dts + +diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile +index 25731ddc56..1609d7a42d 100644 +--- a/package/firmware/ipq-wifi/Makefile ++++ b/package/firmware/ipq-wifi/Makefile +@@ -29,6 +29,7 @@ ALLWIFIBOARDS:= \ + avm_fritzbox-7530 \ + avm_fritzrepeater-1200 \ + avm_fritzrepeater-3000 \ ++ edgecore_ecw5211 \ + edgecore_ecw5410 \ + engenius_eap1300 \ + engenius_ens620ext \ +@@ -102,6 +103,7 @@ $(eval $(call generate-ipq-wifi-package,asus_map-ac2200,ASUS MAP-AC2200)) + $(eval $(call generate-ipq-wifi-package,avm_fritzbox-7530,AVM FRITZ!Box 7530)) + $(eval $(call generate-ipq-wifi-package,avm_fritzrepeater-1200,AVM FRITZRepeater 1200)) + $(eval $(call generate-ipq-wifi-package,avm_fritzrepeater-3000,AVM FRITZ!Repeater 3000)) ++$(eval $(call generate-ipq-wifi-package,edgecore_ecw5211,Edgecore ECW5211)) + $(eval $(call generate-ipq-wifi-package,edgecore_ecw5410,Edgecore ECW5410)) + $(eval $(call generate-ipq-wifi-package,engenius_eap1300,EnGenius EAP1300)) + $(eval $(call generate-ipq-wifi-package,engenius_ens620ext,EnGenius ENS620EXT)) +diff --git a/package/firmware/ipq-wifi/board-edgecore_ecw5211.qca4019 b/package/firmware/ipq-wifi/board-edgecore_ecw5211.qca4019 +new file mode 100644 +index 0000000000000000000000000000000000000000..340cfcc7a20cb88ed6fca7369b380a3d341f76ee +GIT binary patch +literal 24324 +zcmeHPdr%We8gCH92Np~SuMj37JmW%y@Gv3@0mJ}vpom~V5fG7#vLf%7m+JSZ+M22e`Y5nBK@!<1i9wkfYDKQO;o +z5wx#JQ4*vm*c42b@(<^g77)b{NnmAOsUq*w@=aR`4(#7|xO9KemblDtaY#sUu@!8C +z58LCf`}&-f6C5WioG0Y +zG@58SEn`phF~!0M;OXRgtwhjJVA~o>GiB?btKT_}F=BK8YGsPF#PFY>fB>OC81EbH +z=&q>Qo)s}Vq;*(3+D}x=N=%eMhclv8gV5i9Vtg}{YM{(eW#VqeVIm&JON#*|<0D&G*2{wjdt#b| +z)oz7PZq)W-ErB&$#lveyIujZKO5Jih2eLaiH1Nxu^1kXT?1(-YP~n>YY-ndoNG)H% +z&VJfob1t<(ROY$w-au97FU|y2aSL1ecDF}<=3nVnaBrx-C;X^)iA&y<%Zl@|)1Op% +z6x|)Fys+*Vuf!>LVWGrCOCw-ww{rCw2gJ$Q)!oCBM}On%bK*Pp=LEJxUV*KwtgWr# +z#n{?<*)n)FUal3p-s8D3{AWkEiBTUPZ}{gc@bdB&cnJg5vS}QBl)3F2z_|NL)%P9|u(AQfa +z;K2gh?%hxC-#bH%vJpm4dpm0zoBu(Z13X}Q{~vY!R4enhEg6LOBe40BV=aS3B6{-E +ziw_|J0W=T_%H?Xcx!F)%dmLSRv#=RM1wj!+ib|0XGz2NBs6BS7sipn=R0Tw7<$+lW +z3uTE|&shiu<%l?#BkG8_p|NPJDE4_Ql7uFSlCT&w29cp+R4fud7bB5qq$m;#MuQOv +zstZDO$+)VEDJn`A6{Ai$KBhq8ggU);LOf6pkp~us#=VY1lF?*QG8T%4z79n;q8mjU +zG3p=~Zpp4F=;wV)oVz7WszJl#J4ex9S&VDO{$FNmTMYN4%ot2L`V2}8O4A^~oEp;r +zGr_zhQJR1NQ(zEa5MU5s5MU5s5Lm(pxQbm79&4+3E0W4uFJ6yCvsTao((>Cb-F$4g +zr62vx%cu6Sl9mtF#}Yn-%+Sq5;NMfk%m(JGx~VG!rq-LUIOnNdYUw8p>g7HH)y# +z(`og=nmucWfS51{rp|ooAv)UYh5a0)?Q39BJv^k+iL3^yN@DDJ(gz5Km`e1=E +z4J~*CG}rCf*471Z1p+QH!$s3`P%c8D2X+U_Tx{4b_~qI={OxqPzn`zq$4u199ko_R +ztQw%q2wAU +z7TZX#f|Bc>n7EN%0W}}QX+0J{x(ntsSX_acvSyr;kyF^x@zrJZ$k;d2>5B^${b<w7gva}m2BC@VpnfTXY@#1Y75 +zR#q4Bnc4<@oul)G@`z(5?_L~k67T-tJu53ny02~}S>VpS6e`YJ39b?V?f|SLc=v#0 +zffLF^@!m0+cW*zLcRwq5`2akkd!ied%)2MqK5SZG5G +zyO;fPA_Vj$#xZ*98aIbWusOF;9NXU +ztMNQN=3+Aj2E)6jo-!ZkA2yeuYRVjnA>*FXNysR)=6!4I+?}fp+eJ)vKYTIq2}56+ +zsr^^CRZVrcJWd|>W8o=~q`N)A3L|R6VTf#c_FxByjAus;#bA9xLG!4v!zeAMw7rr8-fUjbk|W=8C#p +zwWlru_fy|fcHpJ5c!?M~wAUS?9e(%FUkF|etB%%X;0bsF?CWHG7M_l$tH+exc)4s# +zfE(GvK|GrZ>B%S&(sfmBT^cUMrDG$?X8eFWNuH#>uk6GtWwHQ|u{)|S$&h$NNKZxs +zU=P<-^-2XEi^q=Lgbqcd!wuC1yjUictQ)_tzNDxB5&-rW`;9B?hHw5LgVS#xz4?%u5yl^`)Ink+ps} +zXHWmdw1$oKJ_=WPc}K!2;So;0eZr%@{mq-|ybrj_`!1$7tgjXnxn@7^$J^sS3#sB3 +ze9@ahyuSc&HnoVjMp-TwTx$YcD2&e`{R +zw$=)ZT+$q*4XVs$_+EqqYm!cPrv5Ul(oJqJyEU-)OUX%Iv2)Jj9;{xZaNpq&+t|IU +zIk*}vT9Y(t;X|kwj`V7pU4!i-kadmLtYTUspn1P)zh4M +zf?xkK2EOTX)hXfec*wh7yFnnOk`K&%ju6T6$IC=WBS7%tZ6Ggx*ZHeY=7Sec_cLGl +zbbNc-{xLcCMBfbWo?Ppi?S|pq&lWkx&tefUWzBdxuDzk%Vh1?Kz$~A4Kl`iMN23gx +H5%T{5!-kmb + +literal 0 +HcmV?d00001 + +diff --git a/target/linux/ipq40xx/base-files/etc/board.d/01_leds b/target/linux/ipq40xx/base-files/etc/board.d/01_leds +index 9cd51e5de0..6bc21a67e9 100755 +--- a/target/linux/ipq40xx/base-files/etc/board.d/01_leds ++++ b/target/linux/ipq40xx/base-files/etc/board.d/01_leds +@@ -55,6 +55,7 @@ zyxel,nbg6617) + ucidef_set_led_wlan "wlan2g" "WLAN2G" "${boardname}:green:wlan2G" "phy0tpt" + ucidef_set_led_wlan "wlan5g" "WLAN5G" "${boardname}:green:wlan5G" "phy1tpt" + ;; ++edgecore,ecw5211 |\ + zyxel,wre6606) + ucidef_set_led_wlan "wlan2g" "WLAN2G" "${boardname}:green:wlan2g" "phy0tpt" + ucidef_set_led_wlan "wlan5g" "WLAN5G" "${boardname}:green:wlan5g" "phy1tpt" +diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network +index 01825b8bac..6e0fb52ab4 100755 +--- a/target/linux/ipq40xx/base-files/etc/board.d/02_network ++++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network +@@ -18,6 +18,7 @@ ipq40xx_setup_interfaces() + ucidef_set_interfaces_lan_wan "eth0" "eth1" + ;; + asus,map-ac2200|\ ++ edgecore,ecw5211|\ + openmesh,a42|\ + openmesh,a62) + ucidef_set_interfaces_lan_wan "eth1" "eth0" +diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +index b0035ce8a3..7d2e173e1a 100644 +--- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata ++++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +@@ -158,6 +158,7 @@ case "$FIRMWARE" in + /usr/bin/fritz_cal_extract -i 1 -s 0x3D000 -e 0x207 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader1") + ;; + compex,wpj428 |\ ++ edgecore,ecw5211 |\ + engenius,eap1300 |\ + openmesh,a42 |\ + openmesh,a62 |\ +@@ -220,6 +221,7 @@ case "$FIRMWARE" in + /usr/bin/fritz_cal_extract -i 1 -s 0x3C000 -e 0x208 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader1") + ;; + compex,wpj428 |\ ++ edgecore,ecw5211 |\ + engenius,eap1300 |\ + openmesh,a42 |\ + openmesh,a62 |\ +diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh +index a7b7da1bf3..e0a9301fe0 100644 +--- a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh +@@ -51,6 +51,7 @@ platform_do_upgrade() { + avm,fritzbox-7530 |\ + avm,fritzrepeater-1200 |\ + avm,fritzrepeater-3000 |\ ++ edgecore,ecw5211 |\ + qxwlan,e2600ac-c2) + nand_do_upgrade "$1" + ;; +diff --git a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-ecw5211.dts b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-ecw5211.dts +new file mode 100644 +index 0000000000..6c9b31b99d +--- /dev/null ++++ b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-ecw5211.dts +@@ -0,0 +1,325 @@ ++#include "qcom-ipq4019.dtsi" ++#include ++#include ++#include ++ ++/ { ++ model = "Edgecore ECW5211"; ++ compatible = "edgecore,ecw5211"; ++ ++ aliases { ++ led-boot = &led_power; ++ led-failsafe = &led_power; ++ led-running = &led_power; ++ led-upgrade = &led_power; ++ }; ++ ++ chosen { ++ bootargs-append = " root=/dev/ubiblock0_1"; ++ }; ++ ++ keys { ++ compatible = "gpio-keys"; ++ ++ reset { ++ label = "reset"; ++ gpios = <&tlmm 63 GPIO_ACTIVE_LOW>; ++ linux,code = ; ++ }; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ ++ led_power: power { ++ label = "ecw5211:yellow:power"; ++ gpios = <&tlmm 5 GPIO_ACTIVE_LOW>; ++ }; ++ ++ wlan2g { ++ label = "ecw5211:green:wlan2g"; ++ gpios = <&tlmm 3 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ wlan5g { ++ label = "ecw5211:green:wlan5g"; ++ gpios = <&tlmm 2 GPIO_ACTIVE_HIGH>; ++ }; ++ }; ++ ++ soc { ++ rng@22000 { ++ status = "okay"; ++ }; ++ ++ mdio@90000 { ++ status = "okay"; ++ ++ pinctrl-0 = <&mdio_pins>; ++ pinctrl-names = "default"; ++ }; ++ ++ ess-psgmii@98000 { ++ status = "okay"; ++ }; ++ ++ counter@4a1000 { ++ compatible = "qcom,qca-gcnt"; ++ reg = <0x4a1000 0x4>; ++ }; ++ ++ tcsr@1949000 { ++ compatible = "qcom,tcsr"; ++ reg = <0x1949000 0x100>; ++ qcom,wifi_glb_cfg = ; ++ }; ++ ++ tcsr@194b000 { ++ status = "okay"; ++ ++ compatible = "qcom,tcsr"; ++ reg = <0x194b000 0x100>; ++ qcom,usb-hsphy-mode-select = ; ++ }; ++ ++ ess_tcsr@1953000 { ++ compatible = "qcom,tcsr"; ++ reg = <0x1953000 0x1000>; ++ qcom,ess-interface-select = ; ++ }; ++ ++ tcsr@1957000 { ++ compatible = "qcom,tcsr"; ++ reg = <0x1957000 0x100>; ++ qcom,wifi_noc_memtype_m0_m2 = ; ++ }; ++ ++ usb2: usb2@60f8800 { ++ status = "okay"; ++ }; ++ ++ usb3: usb3@8af8800 { ++ status = "okay"; ++ }; ++ ++ crypto@8e3a000 { ++ status = "okay"; ++ }; ++ ++ watchdog@b017000 { ++ status = "okay"; ++ }; ++ ++ ess-switch@c000000 { ++ status = "okay"; ++ }; ++ ++ edma@c080000 { ++ status = "okay"; ++ }; ++ }; ++}; ++ ++&tlmm { ++ mdio_pins: mdio_pinmux { ++ mux_mdio { ++ pins = "gpio53"; ++ function = "mdio"; ++ bias-pull-up; ++ }; ++ ++ mux_mdc { ++ pins = "gpio52"; ++ function = "mdc"; ++ bias-pull-up; ++ }; ++ }; ++ ++ serial_pins: serial_pinmux { ++ mux { ++ pins = "gpio60", "gpio61"; ++ function = "blsp_uart0"; ++ bias-disable; ++ }; ++ }; ++ ++ spi0_pins: spi0_pinmux { ++ pin { ++ function = "blsp_spi0"; ++ pins = "gpio55", "gpio56", "gpio57"; ++ drive-strength = <2>; ++ bias-disable; ++ }; ++ ++ pin_cs { ++ function = "gpio"; ++ pins = "gpio54", "gpio4"; ++ drive-strength = <2>; ++ bias-disable; ++ output-high; ++ }; ++ }; ++ ++ i2c0_pins: i2c0_pinmux { ++ mux_i2c { ++ function = "blsp_i2c0"; ++ pins = "gpio58", "gpio59"; ++ drive-strength = <16>; ++ bias-disable; ++ }; ++ }; ++}; ++ ++&blsp_dma { ++ status = "okay"; ++}; ++ ++&blsp1_spi1 { ++ status = "okay"; ++ ++ pinctrl-0 = <&spi0_pins>; ++ pinctrl-names = "default"; ++ cs-gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>, <&tlmm 4 GPIO_ACTIVE_HIGH>; ++ ++ flash@0 { ++ status = "okay"; ++ ++ compatible = "jedec,spi-nor"; ++ reg = <0>; ++ spi-max-frequency = <24000000>; ++ ++ partitions { ++ compatible = "fixed-partitions"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ partition@0 { ++ label = "0:SBL1"; ++ reg = <0x00000000 0x00040000>; ++ read-only; ++ }; ++ ++ partition@40000 { ++ label = "0:MIBIB"; ++ reg = <0x00040000 0x00020000>; ++ read-only; ++ }; ++ ++ partition@60000 { ++ label = "0:QSEE"; ++ reg = <0x00060000 0x00060000>; ++ read-only; ++ }; ++ ++ partition@c0000 { ++ label = "0:CDT"; ++ reg = <0x000c0000 0x00010000>; ++ read-only; ++ }; ++ ++ partition@d0000 { ++ label = "0:DDRPARAMS"; ++ reg = <0x000d0000 0x00010000>; ++ read-only; ++ }; ++ ++ partition@e0000 { ++ label = "0:APPSBLENV"; /* uboot env*/ ++ reg = <0x000e0000 0x00010000>; ++ read-only; ++ }; ++ ++ partition@f0000 { ++ label = "0:APPSBL"; /* uboot */ ++ reg = <0x000f0000 0x00080000>; ++ read-only; ++ }; ++ ++ partition@170000 { ++ label = "0:ART"; ++ reg = <0x00170000 0x00010000>; ++ read-only; ++ }; ++ }; ++ }; ++ ++ spi-nand@1 { ++ status = "okay"; ++ ++ compatible = "spinand,mt29f"; ++ reg = <1>; ++ spi-max-frequency = <24000000>; ++ ++ partitions { ++ compatible = "fixed-partitions"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ partition@0 { ++ label = "rootfs"; ++ reg = <0x00000000 0x08000000>; ++ }; ++ }; ++ }; ++}; ++ ++&blsp1_i2c3 { ++ status = "okay"; ++ ++ pinctrl-0 = <&i2c0_pins>; ++ pinctrl-names = "default"; ++ ++ tpm@29 { ++ compatible = "atmel,at97sc3204t"; ++ reg = <0x29>; ++ }; ++}; ++ ++&blsp1_uart1 { ++ status = "okay"; ++ ++ pinctrl-0 = <&serial_pins>; ++ pinctrl-names = "default"; ++}; ++ ++&cryptobam { ++ status = "okay"; ++}; ++ ++&gmac0 { ++ qcom,poll_required = <1>; ++ qcom,poll_required_dynamic = <1>; ++ qcom,phy_mdio_addr = <4>; ++ vlan_tag = <2 0x20>; ++}; ++ ++&gmac1 { ++ qcom,poll_required = <1>; ++ qcom,poll_required_dynamic = <1>; ++ qcom,phy_mdio_addr = <3>; ++ vlan_tag = <1 0x10>; ++}; ++ ++&wifi0 { ++ status = "okay"; ++ ++ qcom,ath10k-calibration-variant = "Edgecore-ECW5211"; ++}; ++ ++&wifi1 { ++ status = "okay"; ++ ++ qcom,ath10k-calibration-variant = "Edgecore-ECW5211"; ++}; ++ ++&usb3_ss_phy { ++ status = "okay"; ++}; ++ ++&usb3_hs_phy { ++ status = "okay"; ++}; ++ ++&usb2_hs_phy { ++ status = "okay"; ++}; +diff --git a/target/linux/ipq40xx/image/Makefile b/target/linux/ipq40xx/image/Makefile +index 98c81726d9..921d412382 100644 +--- a/target/linux/ipq40xx/image/Makefile ++++ b/target/linux/ipq40xx/image/Makefile +@@ -171,6 +171,18 @@ define Device/compex_wpj428 + endef + TARGET_DEVICES += compex_wpj428 + ++define Device/edgecore_ecw5211 ++ $(call Device/FitImage) ++ $(call Device/UbiFit) ++ DEVICE_TITLE := Edgecore ECW5211 ++ BLOCKSIZE := 128k ++ PAGESIZE := 2048 ++ DEVICE_DTS_CONFIG := config@ap.dk01.1-c2 ++ DEVICE_DTS := qcom-ipq4018-ecw5211 ++ DEVICE_PACKAGES := ipq-wifi-edgecore_ecw5211 kmod-tpm-i2c-atmel kmod-usb-acm ++endef ++TARGET_DEVICES += edgecore_ecw5211 ++ + define Device/engenius_eap1300 + $(call Device/FitImage) + DEVICE_TITLE := EnGenius EAP1300 +diff --git a/target/linux/ipq40xx/patches-4.14/901-arm-boot-add-dts-files.patch b/target/linux/ipq40xx/patches-4.14/901-arm-boot-add-dts-files.patch +index f7efd415f1..9b1d825be1 100644 +--- a/target/linux/ipq40xx/patches-4.14/901-arm-boot-add-dts-files.patch ++++ b/target/linux/ipq40xx/patches-4.14/901-arm-boot-add-dts-files.patch +@@ -10,7 +10,7 @@ Signed-off-by: John Crispin + + --- a/arch/arm/boot/dts/Makefile + +++ b/arch/arm/boot/dts/Makefile +-@@ -697,7 +697,31 @@ dtb-$(CONFIG_ARCH_QCOM) += \ ++@@ -697,7 +697,32 @@ dtb-$(CONFIG_ARCH_QCOM) += \ + qcom-apq8074-dragonboard.dtb \ + qcom-apq8084-ifc6540.dtb \ + qcom-apq8084-mtp.dtb \ +@@ -18,6 +18,7 @@ Signed-off-by: John Crispin + + qcom-ipq4018-ap120c-ac.dtb \ + + qcom-ipq4018-ea6350v3.dtb \ + + qcom-ipq4018-eap1300.dtb \ +++ qcom-ipq4018-ecw5211.dtb \ + + qcom-ipq4018-ens620ext.dtb \ + + qcom-ipq4018-ex6100v2.dtb \ + + qcom-ipq4018-ex6150v2.dtb \ +-- +2.25.1 + diff --git a/patches/wlan-ap/0007-ipq40xx-TP-Link-AP2220-support.patch b/patches/wlan-ap/0007-ipq40xx-TP-Link-AP2220-support.patch new file mode 100644 index 000000000..808b0ced0 --- /dev/null +++ b/patches/wlan-ap/0007-ipq40xx-TP-Link-AP2220-support.patch @@ -0,0 +1,534 @@ +From 7352a63c754c84a294eda639f391609deefaf87d Mon Sep 17 00:00:00 2001 +From: Arif Alam +Date: Fri, 19 Jun 2020 14:02:32 +0200 +Subject: [PATCH 7/7] ipq40xx: TP-Link AP2220 support + +Signed-off-by: Arif Alam +--- + package/firmware/ipq-wifi/Makefile | 4 +- + .../ipq-wifi/board-tp-link_ap2220.bin | Bin 0 -> 65536 bytes + .../ipq40xx/base-files/etc/board.d/02_network | 1 + + .../etc/hotplug.d/firmware/11-ath10k-caldata | 6 +- + .../boot/dts/qcom-ipq4019-tp-link-ap2220.dts | 277 ++++++++++++++++++ + target/linux/ipq40xx/image/Makefile | 13 + + .../patches-4.14/998-tp-link-ap2220.patch | 12 + + .../patches-4.14/999-mtd-gd25q256.patch | 28 ++ + 8 files changed, 338 insertions(+), 3 deletions(-) + create mode 100755 package/firmware/ipq-wifi/board-tp-link_ap2220.bin + create mode 100755 target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4019-tp-link-ap2220.dts + create mode 100755 target/linux/ipq40xx/patches-4.14/998-tp-link-ap2220.patch + create mode 100755 target/linux/ipq40xx/patches-4.14/999-mtd-gd25q256.patch + +diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile +index 1609d7a42d..4ca6adf324 100644 +--- a/package/firmware/ipq-wifi/Makefile ++++ b/package/firmware/ipq-wifi/Makefile +@@ -35,7 +35,8 @@ ALLWIFIBOARDS:= \ + engenius_ens620ext \ + linksys_ea6350v3 \ + linksys_ea8300 \ +- qxwlan_e2600ac ++ qxwlan_e2600ac \ ++ tp-link_ap2220 + + ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD)) + +@@ -110,5 +111,6 @@ $(eval $(call generate-ipq-wifi-package,engenius_ens620ext,EnGenius ENS620EXT)) + $(eval $(call generate-ipq-wifi-package,linksys_ea6350v3,Linksys EA6350v3)) + $(eval $(call generate-ipq-wifi-package,linksys_ea8300,Linksys EA8300)) + $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac,Qxwlan E2600AC)) ++$(eval $(call generate-ipq-wifi-package,tp-link_ap2220,tp-link AP2220)) + + $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE)))) +diff --git a/package/firmware/ipq-wifi/board-tp-link_ap2220.bin b/package/firmware/ipq-wifi/board-tp-link_ap2220.bin +new file mode 100755 +index 0000000000000000000000000000000000000000..cfe31877d8c96f07faeb7fc80454017ca693b5c2 +GIT binary patch +literal 65536 +zcmeI5dr(tJzQ;Quh$0Ro1O&lD2;n6dG@wR}10rI87#LJEfCxTNq96}JF}R>8AVzQy +zln|nTpn^`8VYuUCR9wf|yIVC<`^VO;t-H1E+`4!7k2|;A9ml$B)t!~wC&?ipBp3v0 +zc>Fq?)4%?m?$h0$bCR5#KHp|&2m%lQ0zd!=00AHX1b_e#00KY&2mk>fFxv@m!o0I+ +zG-OxKibz3-gO;@+8p=e-(ZL0gfsK$$xXxmrt(&BKq>0=2#3t^L#^`(q1qX9!Ix{>x +z{LSmvG!c6qdi$UCk3e`kD}VOz<{CN*~cW&2v*}XLOpg5p9fNAQ!`n +z+CsLGvW;=%hqu_c6Kpx^QeS_|KpevhJ2*P0VZ~;drXtx64i5JA_I4%#p~qxTZ47QW +zpXuU`)254!yBW^rjKgqZh8y{HcTL{PBRliz*7GX$?$TAMOJ9C=x3YG3>dH8uCq3%w +z+QOVq;#NPogRP>Rchj)&v +zwq96%+&lYzd0GCJ^dRx#h_C9Td7)`uV%EA_H*=cBwIRp74n6p+$Y$%U*hz%=;t +zaL_p>%i?mmhW$;@vc!f-Fqs>Pjm(wAN@jlX$?~)3>n=BsHV{{&4;{mX!6AAyhQT6O +zeAc%t<`QBFe~H9}aAA57(L^*q`rBw`JQ2^2mqZa!OfexK1bo4_0_Hkm9e9A}f9#ylbbK)k|FOg`tizCh9%8Wf0%@)&@aDC;<^dh|YUXo43rdOMo2}A-v +zK@v`czY1rrC)V@VOY{f9bnQ(dX&-w{W-(BDG!dITck|C{?wT(C6AaY%inZ9%`{hG@ +zv*DT)`e4h^2TDN63IRAZtbiHeo|BYD5P$>_00KY&2mk>fFoy{&7A$7^u(k-cFcVp8 +z1Z$X)toc+x$$J|*`o1<@>waI4do{X_1yq={I_B^pgszX1z>lNCICn5r*~y^=TY|0m +zY}wZ|$|FfXr0joz5ROkM+xlOa#{q#j=a^rLfc&7N(KXa4sBZjIBB-H8K*tZ!YKhrT +zccz^Uv!uPYj2TN)GP3KgT)V0La^PRB*|P-4sBW;|v67tkr_m%#T^AE#zx-VSAbrT1cBmecd5D +zZ24r(o7TT{tc~h}9|!;eAOHk_01yBIKmZ5;0U!VbfB+Bx0yBjGC+wJ%M#JL&6PK_W +zorB!k@NJn)tRr`*(A}rOYAR=){vV6sbPltXWAv2i|GzM+3hDL#G>iIw^Ss8iUcx?> +z{-0nPb0ehJ;XBN;vu6w|@e%4DvTa&`{$ahoD?*lac;7b>{B +zyCZU;!Z_25aG;8QXv{^%`+Xz#5yfs}|Bn6CjpLr=Ug6$rY~{#oR#X3@56`V;&~0dK +z9UN?Jb8;H_ejK~ZSX<}hW9884u}%qU+ccy^HErr+W(`8y@CS6U2OZt|Jx#Y%;kfEM +z8alzFqn^8Tbm#AM^y0o9dL?2Y=f?~bxxpSW-R$fgroMSl0}ucLvyy;Ozi&zZ|9}7e +zU*G-t&ws!@->`n|8vMu>*8k6+$Dn`z{a>)pT>t;-d%gZYWqWdxe*SRXCf-$8p22`3NWriYV@IKyHq)3;?<7T#F +zmQg|iZ*A2amv0h#>I!^=`!Jp`4KMYfNwyq7pahhx5SR_8hLx^?d(IMQ?#sIs*|@yM +ztE64KTOCs$Smv2`>`Ls};DRN4onoJM9=Nzc;dgMctiA8pt?0{PHD1Miz1f=hPeXp; +zb+o=MrEcX(j@()L>+T~BQ5F8Vo*ByC9oL1Q`joNcHQgDlf-0hzwfFw*f-6yHf(uzY +zzV6An99iLa#3Q5Z&W>x#YnGIJl-1LF{6J9w)?^A@bhCl_`}6Q0o(YuW=j+S$O+nLU +zHqg=9d`kX5f6}xAqwApL{|hFq4h#6f1q3V-7$yJz(JULyENv}0+4-#1Ge`XI)Bof9 +z-#FkK;6Vl}fXg*l;F|?prvGV=Jjiui0wq`^CPLnj*V;`K{xDiIQrwT +zWia&me?;m3^;KQx%ttPU7cPir^49Gql8ik^>i-e`Z@*aikN@>A-bNWl +zT|ZgEdNAg5qy^I#AeCwXN}}ms=B126eR9hr=>J)+uE=zu^!`+A-hlU{$tQT;lV!$i +z9{JAs@Mh13r^KNTwjBT2K*^SVLLMLh1c1PJ33S!d(0m&CoDBZMhArhKnfsNOe)oG) +zj*tE@)Qc}HAL4nH9uAQ&s{FB`=%K-(%pphAkJ|8y3XZ6E=n7s^aNe6k4a4~_T`Ec4 +zzFiV4#Q#HOz9F+P*xygD-~ZqL_|sdxeqZk+_5W}G@{-PA{1fMOz!#^ue5SsNgx&b1VK8cpJfRH=>PS@{Ev*I{d3T?HM2+BQvHWl@$? +zyaM}bEAzAB#i82kP1TCrtWU(@!v(sUo2nG@EQvU@ONBSev$l%)Sm1vi*F_d+(OF_~ +zu%SQ?>S}4K!PyeTAziIawTi=JQCy%J_hFORA6qq*N3vq{>U`XX9;9v8T&z5bCnAWz +zma;Mr&ovN%=K-j$lw%MAZL{WVWwty)w%k}lbJJPH{;W+&%kcaH7YzkkFr@?Xcv%Q; +zQdQ+ajD$}X_@%A}wdNe&D3%4`>d)c5#mPeMsk_cAbL1Ok+@ +z@Y?|TV9OB)Ns+RDIVi}#*X#ntl5mL7J^P_%Aq;FlA5E@{=Oq#8jfk)-)(Xm&;aTCB53e9{UH25U +zN7e`Y!cG2B+OrP%rH$o0xkp;PI_bQibZNHhuCA8d=hv2U4!Eb}cZxpst8kSsO8e&K +zq01ki=HfX4&Zsw6hm?3^eUx0K-cl2C+;gwpEeJ;t07EvWHpPlLyf23ti +zl}`~f-BGet9dORQaG}gWT%nFU=U>Q9T^M(}Bd=-IDI&)?xx797D*udE-lCl|_P|5K +zfdCLd4ht48a%Q@^E%x+U>N9c>NS7in|HleO@jtdK@NBNg6nadV{-18gV9@XwB!e+e +zcWcVQp1jTG;GkdIGsr2~-=Al+HXro=77iu2W)XomZ{Ci?S>8yj!j=*e1J~7UqZP|2bsa +zxnr*7tkr_m%#T^AE#zzT{$C?M^aEOoUL#-h7RPq@YcTQfJlci} +z#yJ3ZJU{&B&-L}iGbwU?&5~wwESe?FGMgpMGMgo>eIr}AWdtrD00e*l5C8%|00;m9 +zAOHk_01yBIKmZ5;0U!VbfB+Bx0zd!=00AHX1b_e#00KY&2mk>f00e*l5C8%|00;m9 +tAOHk_01yBIKmZ5;0U!VbfB+Bx0zd!=00AHX1b_e#00KY&2uv!0{|8`OD9``^ + +literal 0 +HcmV?d00001 + +diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network +index 6e0fb52ab4..c191812191 100755 +--- a/target/linux/ipq40xx/base-files/etc/board.d/02_network ++++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network +@@ -45,6 +45,7 @@ ipq40xx_setup_interfaces() + meraki,mr33|\ + netgear,ex6100v2|\ + netgear,ex6150v2|\ ++ tp-link,ap2220|\ + zyxel,wre6606) + ucidef_set_interface_lan "eth0" + ;; +diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +index 7d2e173e1a..9b11674b02 100644 +--- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata ++++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +@@ -123,7 +123,8 @@ case "$FIRMWARE" in + # OEM assigns 4 sequential MACs + ath10kcal_patch_mac_crc $(macaddr_setbit_la $(macaddr_add "$(cat /sys/class/net/eth0/address)" 4)) + ;; +- openmesh,a62) ++ openmesh,a62 |\ ++ tp-link,ap2220) + ath10kcal_extract "0:ART" 36864 12064 + ;; + esac +@@ -163,7 +164,8 @@ case "$FIRMWARE" in + openmesh,a42 |\ + openmesh,a62 |\ + qxwlan,e2600ac-c1 |\ +- qxwlan,e2600ac-c2) ++ qxwlan,e2600ac-c2 |\ ++ tp-link,ap2220) + ath10kcal_extract "0:ART" 4096 12064 + ;; + engenius,ens620ext) +diff --git a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4019-tp-link-ap2220.dts b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4019-tp-link-ap2220.dts +new file mode 100755 +index 0000000000..fc35bcacbd +--- /dev/null ++++ b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4019-tp-link-ap2220.dts +@@ -0,0 +1,277 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++ ++#include "qcom-ipq4019.dtsi" ++#include ++#include ++#include ++ ++/ { ++ model = "tp-link AP2220"; ++ compatible = "tp-link,ap2220"; ++ ++ aliases { ++ led-boot = &led_green; ++ led-failsafe = &led_green; ++ led-running = &led_green; ++ led-upgrade = &led_green; ++ }; ++ ++ soc { ++ mdio@90000 { ++ status = "okay"; ++ }; ++ ++ ess-psgmii@98000 { ++ status = "okay"; ++ }; ++ ++ tcsr@1949000 { ++ compatible = "qcom,tcsr"; ++ reg = <0x1949000 0x100>; ++ qcom,wifi_glb_cfg = ; ++ }; ++ ++ ess_tcsr@1953000 { ++ compatible = "qcom,tcsr"; ++ reg = <0x1953000 0x1000>; ++ qcom,ess-interface-select = ; ++ }; ++ ++ tcsr@1957000 { ++ compatible = "qcom,tcsr"; ++ reg = <0x1957000 0x100>; ++ qcom,wifi_noc_memtype_m0_m2 = ; ++ }; ++ ++ crypto@8e3a000 { ++ status = "okay"; ++ }; ++ ++ watchdog@b017000 { ++ status = "okay"; ++ }; ++ ++ ess-switch@c000000 { ++ status = "okay"; ++ switch_mac_mode = <0x0>; /* mac mode for RGMII RMII */ ++ switch_initvlas = <0x0007c 0x54>; /* port0 status */ ++ switch_lan_bmp = <0x10>; ++ }; ++ ++ edma@c080000 { ++ status = "okay"; ++ }; ++ }; ++ ++ key { ++ compatible = "gpio-keys"; ++ ++ button@1 { ++ label = "reset"; ++ linux,code = ; ++ gpios = <&tlmm 10 GPIO_ACTIVE_LOW>; ++ linux,input-type = <1>; ++ }; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ ++ led_red { ++ label = "red"; ++ gpios = <&tlmm 20 GPIO_ACTIVE_LOW>; ++ }; ++ ++ led_green: power { ++ label = "green"; ++ gpios = <&tlmm 21 GPIO_ACTIVE_LOW>; ++ }; ++ ++ led_blue { ++ label = "blue"; ++ gpios = <&tlmm 24 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; ++ ++&tlmm { ++ serial_0_pins: serial_pinmux { ++ mux { ++ pins = "gpio16", "gpio17"; ++ function = "blsp_uart0"; ++ bias-disable; ++ }; ++ }; ++ ++ spi_0_pins: spi_0_pinmux { ++ pinmux { ++ function = "blsp_spi0"; ++ pins = "gpio13", "gpio14", "gpio15"; ++ drive-strength = <12>; ++ bias-disable; ++ }; ++ ++ pinmux_cs { ++ function = "gpio"; ++ pins = "gpio12"; ++ drive-strength = <2>; ++ bias-disable; ++ output-high; ++ }; ++ }; ++ ++ nand_pins: nand_pins { ++ pullups { ++ pins = "gpio53", "gpio58", "gpio59"; ++ function = "qpic"; ++ bias-pull-up; ++ }; ++ ++ pulldowns { ++ pins = "gpio54", "gpio55", "gpio56", ++ "gpio57", "gpio60", "gpio61", ++ "gpio62", "gpio63", "gpio64", ++ "gpio65", "gpio66", "gpio67", ++ "gpio68", "gpio69"; ++ function = "qpic"; ++ bias-pull-down; ++ }; ++ }; ++}; ++ ++&cryptobam { ++ status = "okay"; ++}; ++ ++&blsp1_spi1 { ++ pinctrl-0 = <&spi_0_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++ cs-gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>; ++ ++ flash@0 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "jedec,spi-nor"; ++ reg = <0>; ++ linux,modalias = "m25p80", "gd25q256"; ++ spi-max-frequency = <24000000>; ++ ++ partitions { ++ compatible = "fixed-partitions"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ partition0@0 { ++ label = "0:SBL1"; ++ reg = <0x00000000 0x00040000>; ++ read-only; ++ }; ++ partition1@40000 { ++ label = "0:MIBIB"; ++ reg = <0x00040000 0x00020000>; ++ read-only; ++ }; ++ partition2@60000 { ++ label = "0:QSEE"; ++ reg = <0x00060000 0x00060000>; ++ read-only; ++ }; ++ partition3@c0000 { ++ label = "0:CDT"; ++ reg = <0x000c0000 0x00010000>; ++ read-only; ++ }; ++ partition4@d0000 { ++ label = "0:DDRPARAMS"; ++ reg = <0x000d0000 0x00010000>; ++ read-only; ++ }; ++ partition5@e0000 { ++ label = "0:APPSBLENV"; ++ reg = <0x000e0000 0x00010000>; ++ read-only; ++ }; ++ partition6@f0000 { ++ label = "0:APPSBL"; ++ reg = <0x000f0000 0x00080000>; ++ read-only; ++ }; ++ partition7@170000 { ++ label = "0:ART"; ++ reg = <0x00170000 0x00010000>; ++ read-only; ++ }; ++ partition8@180000 { ++ compatible = "denx,fit"; ++ label = "firmware"; ++ //32M ++ reg = <0x00180000 0x01e80000>; ++ }; ++ }; ++ }; ++}; ++ ++&nand { ++ pinctrl-0 = <&nand_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++ ++ nand@0 { ++ partitions { ++ compatible = "fixed-partitions"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ partition@0 { ++ label = "rootfs1"; ++ reg = <0x00000000 0x10000000>; ++ }; ++ }; ++ }; ++}; ++ ++&blsp_dma { ++ status = "okay"; ++}; ++ ++&blsp1_uart1 { ++ pinctrl-0 = <&serial_0_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&qpic_bam { ++ status = "okay"; ++}; ++ ++&wifi0 { ++ status = "okay"; ++ qcom,ath10k-calibration-variant = "tp-link AP2220"; ++}; ++ ++&wifi1 { ++ status = "disabled"; ++ qcom,ath10k-calibration-variant = "tp-link AP2220"; ++}; ++ ++&pcie0 { ++ status = "okay"; ++ perst-gpio = <&tlmm 38 GPIO_ACTIVE_LOW>; ++ wake-gpio = <&tlmm 40 GPIO_ACTIVE_LOW>; ++ ++ bridge@0,0 { ++ reg = <0x00000000 0 0 0 0>; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ ranges; ++ ++ wifi2: wifi@1,0 { ++ compatible = "qcom,ath10k"; ++ status = "okay"; ++ reg = <0x00010000 0 0 0 0>; ++ qcom,ath10k-calibration-variant = "tp-link AP2220"; ++ }; ++ }; ++}; ++ +diff --git a/target/linux/ipq40xx/image/Makefile b/target/linux/ipq40xx/image/Makefile +index 921d412382..b54a287377 100644 +--- a/target/linux/ipq40xx/image/Makefile ++++ b/target/linux/ipq40xx/image/Makefile +@@ -399,6 +399,19 @@ define Device/qxwlan_e2600ac-c2 + endef + TARGET_DEVICES += qxwlan_e2600ac-c2 + ++define Device/tp-link_ap2220 ++ $(call Device/FitImage) ++ DEVICE_TITLE := tp-link AP2220 ++ BOARD_NAME := ap2220 ++ DEVICE_DTS := qcom-ipq4019-tp-link-ap2220 ++ KERNEL_SIZE := 4096k ++ IMAGE_SIZE := 26624k ++ IMAGES := sysupgrade.bin ++ IMAGE/sysupgrade.bin := append-kernel |append-rootfs | pad-rootfs | append-metadata ++ DEVICE_PACKAGES := ath10k-firmware-qca9984-ct ipq-wifi-tp-link_ap2220 ++endef ++TARGET_DEVICES += tp-link_ap2220 ++ + define Device/zyxel_nbg6617 + $(call Device/FitImageLzma) + DEVICE_DTS := qcom-ipq4018-nbg6617 +diff --git a/target/linux/ipq40xx/patches-4.14/998-tp-link-ap2220.patch b/target/linux/ipq40xx/patches-4.14/998-tp-link-ap2220.patch +new file mode 100755 +index 0000000000..4bb0566493 +--- /dev/null ++++ b/target/linux/ipq40xx/patches-4.14/998-tp-link-ap2220.patch +@@ -0,0 +1,12 @@ ++Index: linux-4.14.171/arch/arm/boot/dts/Makefile ++=================================================================== ++--- linux-4.14.171.orig/arch/arm/boot/dts/Makefile +++++ linux-4.14.171/arch/arm/boot/dts/Makefile ++@@ -715,6 +715,7 @@ dtb-$(CONFIG_ARCH_QCOM) += \ ++ qcom-ipq4019-fritzbox-7530.dtb \ ++ qcom-ipq4019-fritzrepeater-1200.dtb \ ++ qcom-ipq4019-fritzrepeater-3000.dtb \ +++ qcom-ipq4019-tp-link-ap2220.dtb \ ++ qcom-ipq4019-linksys_ea8300.dtb \ ++ qcom-ipq4019-map-ac2200.dtb \ ++ qcom-ipq4019-qxwlan-e2600ac-c1.dtb \ +diff --git a/target/linux/ipq40xx/patches-4.14/999-mtd-gd25q256.patch b/target/linux/ipq40xx/patches-4.14/999-mtd-gd25q256.patch +new file mode 100755 +index 0000000000..0baa38ad29 +--- /dev/null ++++ b/target/linux/ipq40xx/patches-4.14/999-mtd-gd25q256.patch +@@ -0,0 +1,28 @@ ++Index: linux-4.14.171/drivers/mtd/devices/m25p80.c ++=================================================================== ++--- linux-4.14.171.orig/drivers/mtd/devices/m25p80.c +++++ linux-4.14.171/drivers/mtd/devices/m25p80.c ++@@ -354,6 +354,7 @@ static const struct spi_device_id m25p_i ++ {"m25p64"}, {"m25p128"}, ++ {"w25x80"}, {"w25x32"}, {"w25q32"}, {"w25q32dw"}, ++ {"w25q80bl"}, {"w25q128"}, {"w25q256"}, +++ {"gd25q256"}, ++ ++ /* Flashes that can't be detected using JEDEC */ ++ {"m25p05-nonjedec"}, {"m25p10-nonjedec"}, {"m25p20-nonjedec"}, ++Index: linux-4.14.171/drivers/mtd/spi-nor/spi-nor.c ++=================================================================== ++--- linux-4.14.171.orig/drivers/mtd/spi-nor/spi-nor.c +++++ linux-4.14.171/drivers/mtd/spi-nor/spi-nor.c ++@@ -1005,6 +1005,11 @@ static const struct flash_info spi_nor_i ++ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | ++ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) ++ }, +++ { +++ "gd25q256", INFO(0xc84019, 0, 64 * 1024, 512, +++ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | +++ SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) +++ }, ++ ++ /* Intel/Numonyx -- xxxs33b */ ++ { "160s33b", INFO(0x898911, 0, 64 * 1024, 32, 0) }, +-- +2.25.1 + diff --git a/patches/wlan-ap/0008-include-prereq-build.mk-add-ovsdb-tool-dependency.patch b/patches/wlan-ap/0008-include-prereq-build.mk-add-ovsdb-tool-dependency.patch new file mode 100644 index 000000000..14a2d3674 --- /dev/null +++ b/patches/wlan-ap/0008-include-prereq-build.mk-add-ovsdb-tool-dependency.patch @@ -0,0 +1,34 @@ +From 678ee2539ee25894b7f44cb971e121ab07e5e9d9 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Thu, 25 Jun 2020 09:03:16 +0200 +Subject: [PATCH] include/prereq-build.mk: add ovsdb-tool dependency + +OpenSync requires a host installation of ovsdb-tool. Add this to the +required commands. + +If the tool is missing, users will be presented witht he following line. + +-> Build dependency: Please install the 'ovsdb-tool' package + +Signed-off-by: John Crispin +--- + include/prereq-build.mk | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/include/prereq-build.mk b/include/prereq-build.mk +index 501739968c..ea22510bfd 100644 +--- a/include/prereq-build.mk ++++ b/include/prereq-build.mk +@@ -140,6 +140,9 @@ $(eval $(call SetupHostCommand,git,Please install Git (git-core) >= 1.7.12.2, \ + $(eval $(call SetupHostCommand,file,Please install the 'file' package, \ + file --version 2>&1 | grep file)) + ++$(eval $(call SetupHostCommand,ovsdb-tool,Please install the 'ovsdb-tool' package, \ ++ ovsdb-tool -V 2>&1 | grep vSwitch)) ++ + $(STAGING_DIR_HOST)/bin/mkhash: $(SCRIPT_DIR)/mkhash.c + mkdir -p $(dir $@) + $(CC) -O2 -I$(TOPDIR)/tools/include -o $@ $< +-- +2.25.1 + diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..79aba1e71 --- /dev/null +++ b/setup.py @@ -0,0 +1,129 @@ +from pathlib import Path +from subprocess import run +import os +import sys +import yaml +import getopt + +git_am = "am" + +def clone_tree(): + try: + makefile = openwrt +"/Makefile" + if Path(makefile).is_file(): + print("### OpenWrt checkout is already present. Please run --rebase") + sys.exit(-1) + + print("### Cloning tree") + Path(openwrt).mkdir(exist_ok=True, parents=True) + run(["git", "clone", config["repo"], openwrt], check=True) + print("### Clone done") + except: + print("### Cloning the tree failed") + sys.exit(1) + +def fetch_tree(): + try: + makefile = openwrt +"/Makefile" + if not Path(makefile).is_file(): + print("### OpenWrt checkout is not present. Please run --setup") + sys.exit(-1) + + print("### Fetch tree") + os.chdir(openwrt) + run(["git", "fetch"], check=True) + print("### Fetch done") + except: + print("### Fetching the tree failed") + sys.exit(1) + finally: + os.chdir(base_dir) + +def reset_tree(): + try: + print("### Resetting tree") + os.chdir(openwrt) + run( + ["git", "checkout", config["branch"]], check=True, + ) + run( + ["git", "reset", "--hard", config.get("revision", config["branch"])], + check=True, + ) + print("### Reset done") + except: + print("### Resetting tree failed") + sys.exit(1) + finally: + os.chdir(base_dir) + +def setup_tree(): + try: + print("### Applying patches") + + patches = [] + for folder in config.get("patch_folders", []): + patch_folder = base_dir / folder + if not patch_folder.is_dir(): + print(f"Patch folder {patch_folder} not found") + sys.exit(-1) + + print(f"Adding patches from {patch_folder}") + + patches.extend( + sorted(list((base_dir / folder).glob("*.patch")), key=os.path.basename) + ) + + print(f"Found {len(patches)} patches") + + os.chdir(openwrt) + + for patch in patches: + run(["git", git_am, "-3", str(base_dir / patch)], check=True) + + print("### Patches done") + except: + print("### Setting up the tree failed") + sys.exit(1) + finally: + os.chdir(base_dir) + + +base_dir = Path.cwd().absolute() +setup = False +rebase = False +config = "config.yml" +openwrt = "openwrt" + +try: + opts, args = getopt.getopt(sys.argv[1:], "srdc:f:", ["setup", "rebase", "docker", "config=", "folder="]) +except getopt.GetoptError as err: + print(err) + sys.exit(2) + + +for o, a in opts: + if o in ("-s", "--setup"): + setup = True + elif o in ("-r", "--rebase"): + rebase = True + elif o in ("-c", "--config"): + config = a + elif o in ("-d", "--docker"): + git_am = "apply" + else: + assert False, "unhandled option" + +if not Path(config).is_file(): + print(f"Missing {config}") + sys.exit(1) +config = yaml.safe_load(open(config)) + +if setup: + clone_tree() + reset_tree() + setup_tree() +elif rebase: + fetch_tree() + reset_tree() + setup_tree()