wlan-ap: initial import

based on the develop branch -> 6af07cd39cfa06ec8eb4d6182c7d7923236c2dbf

Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
John Crispin 2020-07-01 15:35:04 +02:00
commit ae51caf8a5
93 changed files with 9544 additions and 0 deletions

82
.github/workflows/build.yml vendored Normal file
View File

@ -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""

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/openwrt

13
Dockerfile Normal file
View File

@ -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

12
Makefile Normal file
View File

@ -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

32
README.md Normal file
View File

@ -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
```

48
build.sh Executable file
View File

@ -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"

8
config.yml Normal file
View File

@ -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

9
dock-run.sh Executable file
View File

@ -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 $@

View File

@ -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))

View File

@ -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)

View File

@ -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) {

View File

@ -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

View File

@ -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 :=

View File

@ -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)

View File

@ -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;

View File

@ -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.

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
CONFIG_USE_KCONFIG=y

View File

@ -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
}

View File

@ -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

View File

@ -0,0 +1,37 @@
#include <stdlib.h>
#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;
}

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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 <stdio.h>
#include <stdbool.h>
#include <target.h>
#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;
}

View File

@ -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 <stdio.h>
#include <stdbool.h>
#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;
}

View File

@ -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 <stdio.h>
#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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
0.1.0

View File

@ -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.

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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"
}
}
]

View File

@ -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-----

View File

@ -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-----

View File

@ -0,0 +1,7 @@
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDCyrVlkcE5QLYWpNyRTSo8zhjZ3ksrLzhdFgfIPDDO0HGTk/08aTGGM
VrEvui9yLBmgBwYFK4EEACKhZANiAAT2cULpM9yyeHT5+xxBpgQp69vS5H3mdqiY
N6FNqUYzCq30Fw6UMFqE4N8WEy7lJXDVmaaYej5kgne6MrVV2sCBFFKH3WTt1C8x
WB5dPax7WtzUvygq9Ocg8XZTCxKjf7k=
-----END EC PRIVATE KEY-----

View File

@ -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 */

View File

@ -0,0 +1,3 @@
UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/entity.c
UNIT_CFLAGS += -I$(OVERRIDE_DIR)/inc
UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS)

View File

@ -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 <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <target.h>
#include <os_types.h>
#include <os_nif.h>
#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;
}

View File

@ -0,0 +1 @@
0.1.0

View File

@ -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.

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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"
}
}
]

View File

@ -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-----

View File

@ -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-----

View File

@ -0,0 +1,7 @@
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDCyrVlkcE5QLYWpNyRTSo8zhjZ3ksrLzhdFgfIPDDO0HGTk/08aTGGM
VrEvui9yLBmgBwYFK4EEACKhZANiAAT2cULpM9yyeHT5+xxBpgQp69vS5H3mdqiY
N6FNqUYzCq30Fw6UMFqE4N8WEy7lJXDVmaaYej5kgne6MrVV2sCBFFKH3WTt1C8x
WB5dPax7WtzUvygq9Ocg8XZTCxKjf7k=
-----END EC PRIVATE KEY-----

View File

@ -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 */

View File

@ -0,0 +1,3 @@
UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/entity.c
UNIT_CFLAGS += -I$(OVERRIDE_DIR)/inc
UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS)

View File

@ -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 <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <target.h>
#include <os_types.h>
#include <os_nif.h>
#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;
}

View File

@ -0,0 +1 @@
0.1.0

View File

@ -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.

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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"
}
}
]

View File

@ -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-----

View File

@ -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-----

View File

@ -0,0 +1,7 @@
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDCyrVlkcE5QLYWpNyRTSo8zhjZ3ksrLzhdFgfIPDDO0HGTk/08aTGGM
VrEvui9yLBmgBwYFK4EEACKhZANiAAT2cULpM9yyeHT5+xxBpgQp69vS5H3mdqiY
N6FNqUYzCq30Fw6UMFqE4N8WEy7lJXDVmaaYej5kgne6MrVV2sCBFFKH3WTt1C8x
WB5dPax7WtzUvygq9Ocg8XZTCxKjf7k=
-----END EC PRIVATE KEY-----

View File

@ -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 */

View File

@ -0,0 +1,3 @@
UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/entity.c
UNIT_CFLAGS += -I$(OVERRIDE_DIR)/inc
UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS)

View File

@ -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 <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <target.h>
#include <os_types.h>
#include <os_nif.h>
#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;
}

View File

@ -0,0 +1 @@
0.1.0

View File

@ -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.

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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"
}
}
]

View File

@ -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-----

View File

@ -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-----

View File

@ -0,0 +1,7 @@
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDCyrVlkcE5QLYWpNyRTSo8zhjZ3ksrLzhdFgfIPDDO0HGTk/08aTGGM
VrEvui9yLBmgBwYFK4EEACKhZANiAAT2cULpM9yyeHT5+xxBpgQp69vS5H3mdqiY
N6FNqUYzCq30Fw6UMFqE4N8WEy7lJXDVmaaYej5kgne6MrVV2sCBFFKH3WTt1C8x
WB5dPax7WtzUvygq9Ocg8XZTCxKjf7k=
-----END EC PRIVATE KEY-----

View File

@ -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 */

View File

@ -0,0 +1,3 @@
UNIT_SRC_TOP += $(OVERRIDE_DIR)/src/entity.c
UNIT_CFLAGS += -I$(OVERRIDE_DIR)/inc
UNIT_EXPORT_CFLAGS := $(UNIT_CFLAGS)

View File

@ -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 <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <target.h>
#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;
}

View File

@ -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))

View File

@ -0,0 +1,206 @@
From 4c6e17ce63c1da986237cc368a3085e19c7947c6 Mon Sep 17 00:00:00 2001
From: John Crispin <john@phrozen.org>
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 <john@phrozen.org>
---
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]} <profile> [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

View File

@ -0,0 +1,131 @@
From 732f0992ad36a6d9f6aa459ce0899891422b65f0 Mon Sep 17 00:00:00 2001
From: John Crispin <john@phrozen.org>
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 <john@phrozen.org>
---
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] <type,name,link> <type,name,link> ...: 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

View File

@ -0,0 +1,163 @@
From 93a25b8fd76b7868e82d8d88036541da46081052 Mon Sep 17 00:00:00 2001
From: John Crispin <john@phrozen.org>
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 <john@phrozen.org>
---
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

View File

@ -0,0 +1,31 @@
From f46ac3c1bc7e84ba3f09d79c4ba1ddd49122d306 Mon Sep 17 00:00:00 2001
From: Robert Marko <robert.marko@sartura.hr>
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 <robert.marko@sartura.hr>
---
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

View File

@ -0,0 +1,28 @@
From cb0b442df7dd7b03bbda6344ecfe8799595e81db Mon Sep 17 00:00:00 2001
From: Robert Marko <robert.marko@sartura.hr>
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 <robert.marko@sartura.hr>
---
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

View File

@ -0,0 +1,63 @@
From 18b22a37bf37e661824ff8fe9bf4d3ab9df2d940 Mon Sep 17 00:00:00 2001
From: Robert Marko <robert.marko@sartura.hr>
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 <robert.marko@sartura.hr>
---
.../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 = <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>;
+ 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 = <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>;
+ 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

View File

@ -0,0 +1,41 @@
From a7dd83202c73e8dec2963d97d1a0580dcd4add7a Mon Sep 17 00:00:00 2001
From: Robert Marko <robert.marko@sartura.hr>
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 <robert.marko@sartura.hr>
---
.../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

View File

@ -0,0 +1,725 @@
From 85b302d3f5423d54378a178602a8097dac50d9d0 Mon Sep 17 00:00:00 2001
From: Robert Marko <robert.marko@sartura.hr>
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 <your factory image path>
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 <robert.marko@sartura.hr>
---
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
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
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 <dt-bindings/input/input.h>
+#include <dt-bindings/soc/qcom,tcsr.h>
+
+/ {
+ 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 = <KEY_RESTART>;
+ };
+ };
+
+ 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 = <GSBI_PROT_UART_W_FC>;
+ status = "okay";
+
+ serial@12450000 {
+ status = "okay";
+
+ pinctrl-0 = <&uart1_pins>;
+ pinctrl-names = "default";
+ };
+};
+
+&gsbi4 {
+ qcom,mode = <GSBI_PROT_I2C_UART>;
+ 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 = <GSBI_PROT_SPI>;
+ 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 <john@phrozen.org>
--- 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 <john@phrozen.org>
+ 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

View File

@ -0,0 +1,550 @@
From 373d74c5d6aba0baca1c2bc6d3b7df1a35eb90a7 Mon Sep 17 00:00:00 2001
From: Robert Marko <robert.marko@sartura.hr>
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 <robert.marko@sartura.hr>
---
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
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
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 <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/soc/qcom,tcsr.h>
+
+/ {
+ 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 = <KEY_RESTART>;
+ };
+ };
+
+ 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_WIFI_GLB_CFG>;
+ };
+
+ tcsr@194b000 {
+ status = "okay";
+
+ compatible = "qcom,tcsr";
+ reg = <0x194b000 0x100>;
+ qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
+ };
+
+ ess_tcsr@1953000 {
+ compatible = "qcom,tcsr";
+ reg = <0x1953000 0x1000>;
+ qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
+ };
+
+ tcsr@1957000 {
+ compatible = "qcom,tcsr";
+ reg = <0x1957000 0x100>;
+ qcom,wifi_noc_memtype_m0_m2 = <TCSR_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 <john@phrozen.org>
--- 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 <john@phrozen.org>
+ 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

View File

@ -0,0 +1,534 @@
From 7352a63c754c84a294eda639f391609deefaf87d Mon Sep 17 00:00:00 2001
From: Arif Alam <arif.alam@connectus.ai>
Date: Fri, 19 Jun 2020 14:02:32 +0200
Subject: [PATCH 7/7] ipq40xx: TP-Link AP2220 support
Signed-off-by: Arif Alam <arif.alam@connectus.ai>
---
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
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
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 <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/soc/qcom,tcsr.h>
+
+/ {
+ 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 = <TCSR_WIFI_GLB_CFG>;
+ };
+
+ ess_tcsr@1953000 {
+ compatible = "qcom,tcsr";
+ reg = <0x1953000 0x1000>;
+ qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
+ };
+
+ tcsr@1957000 {
+ compatible = "qcom,tcsr";
+ reg = <0x1957000 0x100>;
+ qcom,wifi_noc_memtype_m0_m2 = <TCSR_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 = <KEY_RESTART>;
+ 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

View File

@ -0,0 +1,34 @@
From 678ee2539ee25894b7f44cb971e121ab07e5e9d9 Mon Sep 17 00:00:00 2001
From: John Crispin <john@phrozen.org>
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 <john@phrozen.org>
---
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

129
setup.py Normal file
View File

@ -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()