Merge Lean's source
This commit is contained in:
commit
e6abd4e3ba
@ -105,6 +105,13 @@ menuconfig DEVEL
|
||||
help
|
||||
If enabled, log files will be written to the ./log directory.
|
||||
|
||||
config BUILD_LOG_DIR
|
||||
string "Log folder" if DEVEL
|
||||
default ""
|
||||
help
|
||||
Store build logs in this directory.
|
||||
If not set, uses './logs'
|
||||
|
||||
config SRC_TREE_OVERRIDE
|
||||
bool "Enable package source tree override" if DEVEL
|
||||
help
|
||||
|
||||
@ -14,11 +14,12 @@ menu "Target Images"
|
||||
|
||||
choice
|
||||
prompt "Compression"
|
||||
default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_ar71xx
|
||||
default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_ramips
|
||||
default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_apm821xx
|
||||
default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_mpc85xx
|
||||
default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_ar71xx
|
||||
default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_ipq40xx
|
||||
default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_lantiq
|
||||
default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_mpc85xx
|
||||
default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_ramips
|
||||
default TARGET_INITRAMFS_COMPRESSION_NONE
|
||||
depends on TARGET_ROOTFS_INITRAMFS
|
||||
help
|
||||
@ -194,7 +195,7 @@ menu "Target Images"
|
||||
depends on TARGET_ROOTFS_EXT4FS || TARGET_ROOTFS_ISO || TARGET_ROOTFS_JFFS2 || TARGET_ROOTFS_SQUASHFS
|
||||
select PACKAGE_grub2
|
||||
default y
|
||||
|
||||
|
||||
config EFI_IMAGES
|
||||
bool "Build EFI GRUB images (Linux x86 or x86_64 host only)"
|
||||
depends on TARGET_x86
|
||||
@ -254,6 +255,7 @@ menu "Target Images"
|
||||
select GRUB_IMAGES
|
||||
select TARGET_IMAGES_PAD
|
||||
select PACKAGE_kmod-e1000
|
||||
default n
|
||||
|
||||
config VMDK_IMAGES
|
||||
bool "Build VMware image files (VMDK)"
|
||||
@ -262,22 +264,22 @@ menu "Target Images"
|
||||
select TARGET_IMAGES_PAD
|
||||
select PACKAGE_kmod-e1000
|
||||
default y
|
||||
|
||||
|
||||
config VHD_IMAGES
|
||||
bool "Build Hyper-V image files (VHD)"
|
||||
depends on TARGET_x86 || TARGET_x86_64
|
||||
default n
|
||||
depends on GRUB_IMAGES || EFI_IMAGES
|
||||
select TARGET_IMAGES_PAD
|
||||
select PACKAGE_kmod-tulip
|
||||
|
||||
select PACKAGE_kmod-tulip
|
||||
default n
|
||||
|
||||
config QCOW2_IMAGES
|
||||
bool "Build PVE/KVM image files (QCOW2)"
|
||||
depends on TARGET_x86 || TARGET_x86_64
|
||||
default n
|
||||
depends on GRUB_IMAGES || EFI_IMAGES
|
||||
select TARGET_IMAGES_PAD
|
||||
select PACKAGE_kmod-e1000
|
||||
select PACKAGE_kmod-e1000
|
||||
default n
|
||||
|
||||
config TARGET_IMAGES_PAD
|
||||
bool "Pad images to filesystem size (for JFFS2)"
|
||||
@ -286,7 +288,7 @@ menu "Target Images"
|
||||
|
||||
config TARGET_IMAGES_GZIP
|
||||
bool "GZip images"
|
||||
depends on TARGET_IMAGES_PAD || TARGET_ROOTFS_EXT4FS || TARGET_x86
|
||||
depends on TARGET_ROOTFS_EXT4FS || TARGET_x86 || TARGET_armvirt || TARGET_malta
|
||||
default n
|
||||
|
||||
comment "Image Options"
|
||||
|
||||
@ -46,7 +46,7 @@ config KERNEL_DEBUG_FS
|
||||
|
||||
config KERNEL_MIPS_FPU_EMULATOR
|
||||
bool "Compile the kernel with MIPS FPU Emulator"
|
||||
default y
|
||||
default y if TARGET_pistachio
|
||||
depends on (mips || mipsel || mips64 || mips64el)
|
||||
|
||||
config KERNEL_ARM_PMU
|
||||
@ -596,7 +596,7 @@ endif
|
||||
|
||||
config KERNEL_NAMESPACES
|
||||
bool "Enable kernel namespaces"
|
||||
default n
|
||||
default y if !SMALL_FLASH
|
||||
|
||||
if KERNEL_NAMESPACES
|
||||
|
||||
@ -665,13 +665,13 @@ config KERNEL_POSIX_MQUEUE
|
||||
|
||||
config KERNEL_SECCOMP_FILTER
|
||||
bool
|
||||
default n
|
||||
default y if !SMALL_FLASH
|
||||
|
||||
config KERNEL_SECCOMP
|
||||
bool "Enable seccomp support"
|
||||
depends on !(TARGET_uml)
|
||||
select KERNEL_SECCOMP_FILTER
|
||||
default n
|
||||
default y if !SMALL_FLASH
|
||||
help
|
||||
Build kernel with support for seccomp.
|
||||
|
||||
|
||||
@ -48,4 +48,3 @@ debug_eval:=
|
||||
warn_eval = $(4)
|
||||
|
||||
endif
|
||||
|
||||
|
||||
@ -288,6 +288,7 @@ endef
|
||||
define Download/default
|
||||
FILE:=$(PKG_SOURCE)
|
||||
URL:=$(PKG_SOURCE_URL)
|
||||
URL_FILE:=$(PKG_SOURCE_URL_FILE)
|
||||
SUBDIR:=$(PKG_SOURCE_SUBDIR)
|
||||
PROTO:=$(PKG_SOURCE_PROTO)
|
||||
$(if $(PKG_SOURCE_MIRROR),MIRROR:=$(filter 1,$(PKG_MIRROR)))
|
||||
|
||||
@ -61,4 +61,3 @@ ifdef CONFIG_PKG_RELRO_FULL
|
||||
TARGET_LDFLAGS += -znow -zrelro
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@ -3,6 +3,10 @@
|
||||
IMAGE_KERNEL = $(word 1,$^)
|
||||
IMAGE_ROOTFS = $(word 2,$^)
|
||||
|
||||
define rootfs_align
|
||||
$(patsubst %-256k,0x40000,$(patsubst %-128k,0x20000,$(patsubst %-64k,0x10000,$(patsubst squashfs%,0x4,$(patsubst root.%,%,$(1))))))
|
||||
endef
|
||||
|
||||
define Build/uImage
|
||||
mkimage -A $(LINUX_KARCH) \
|
||||
-O linux -T kernel \
|
||||
@ -271,6 +275,13 @@ define Build/check-size
|
||||
}
|
||||
endef
|
||||
|
||||
define Build/check-kernel-size
|
||||
@[ $$(($(subst k,* 1024,$(subst m, * 1024k,$(1))))) -ge "$$(stat -c%s $(IMAGE_KERNEL))" ] || { \
|
||||
echo "WARNING: Kernel for $@ is too big > $(1)" >&2; \
|
||||
rm -f $@; \
|
||||
}
|
||||
endef
|
||||
|
||||
define Build/combined-image
|
||||
-sh $(TOPDIR)/scripts/combined-image.sh \
|
||||
"$(IMAGE_KERNEL)" \
|
||||
@ -308,7 +319,7 @@ endef
|
||||
|
||||
define Build/qsdk-ipq-factory-nor
|
||||
$(TOPDIR)/scripts/mkits-qsdk-ipq-image.sh \
|
||||
$@.its hlos $(IMAGE_KERNEL) rootfs $(IMAGE_ROOTFS)
|
||||
$@.its kernel $(IMAGE_KERNEL) rootfs $(IMAGE_ROOTFS)
|
||||
PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage -f $@.its $@.new
|
||||
@mv $@.new $@
|
||||
endef
|
||||
@ -335,6 +346,24 @@ define Build/tplink-v1-header
|
||||
@mv $@.new $@
|
||||
endef
|
||||
|
||||
# combine kernel and rootfs into one image
|
||||
# mktplinkfw <type> <optional extra arguments to mktplinkfw binary>
|
||||
# <type> is "sysupgrade" or "factory"
|
||||
#
|
||||
# -a align the rootfs start on an <align> bytes boundary
|
||||
# -j add jffs2 end-of-filesystem markers
|
||||
# -s strip padding from end of the image
|
||||
# -X reserve <size> bytes in the firmware image (hexval prefixed with 0x)
|
||||
define Build/tplink-v1-image
|
||||
-$(STAGING_DIR_HOST)/bin/mktplinkfw \
|
||||
-H $(TPLINK_HWID) -W $(TPLINK_HWREV) -F $(TPLINK_FLASHLAYOUT) \
|
||||
-N "$(VERSION_DIST)" -V $(REVISION) -m $(TPLINK_HEADER_VERSION) \
|
||||
-k $(IMAGE_KERNEL) -r $(IMAGE_ROOTFS) -o $@.new -j -X 0x40000 \
|
||||
-a $(call rootfs_align,$(FILESYSTEM)) \
|
||||
$(wordlist 2,$(words $(1)),$(1)) \
|
||||
$(if $(findstring sysupgrade,$(word 1,$(1))),-s) && mv $@.new $@ || rm -f $@
|
||||
endef
|
||||
|
||||
define Build/tplink-v2-header
|
||||
$(STAGING_DIR_HOST)/bin/mktplinkfw2 \
|
||||
-c -H $(TPLINK_HWID) -W $(TPLINK_HWREV) -L $(KERNEL_LOADADDR) \
|
||||
|
||||
@ -420,6 +420,7 @@ define Device/Init
|
||||
DEVICE_DTS :=
|
||||
DEVICE_DTS_CONFIG :=
|
||||
DEVICE_DTS_DIR :=
|
||||
SOC :=
|
||||
|
||||
BOARD_NAME :=
|
||||
UIMAGE_NAME :=
|
||||
@ -437,7 +438,7 @@ DEFAULT_DEVICE_VARS := \
|
||||
DEVICE_NAME KERNEL KERNEL_INITRAMFS KERNEL_INITRAMFS_IMAGE KERNEL_SIZE \
|
||||
CMDLINE UBOOTENV_IN_UBI KERNEL_IN_UBI BLOCKSIZE PAGESIZE SUBPAGESIZE \
|
||||
VID_HDR_OFFSET UBINIZE_OPTS UBINIZE_PARTS MKUBIFS_OPTS DEVICE_DTS \
|
||||
DEVICE_DTS_CONFIG DEVICE_DTS_DIR BOARD_NAME UIMAGE_NAME SUPPORTED_DEVICES \
|
||||
DEVICE_DTS_CONFIG DEVICE_DTS_DIR SOC BOARD_NAME UIMAGE_NAME SUPPORTED_DEVICES \
|
||||
IMAGE_METADATA KERNEL_ENTRY KERNEL_LOADADDR UBOOT_PATH DEVICE_VENDOR \
|
||||
DEVICE_MODEL DEVICE_VARIANT \
|
||||
DEVICE_ALT0_VENDOR DEVICE_ALT0_MODEL DEVICE_ALT0_VARIANT \
|
||||
|
||||
@ -160,5 +160,3 @@ define Kernel/Clean/Default
|
||||
rm -f $(LINUX_KERNEL)
|
||||
$(_SINGLE)$(MAKE) -C $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION) clean
|
||||
endef
|
||||
|
||||
|
||||
|
||||
@ -114,6 +114,7 @@ KERNEL_MAKE_FLAGS = \
|
||||
KBUILD_BUILD_TIMESTAMP="$(KBUILD_BUILD_TIMESTAMP)" \
|
||||
KBUILD_BUILD_VERSION="0" \
|
||||
HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib" \
|
||||
KBUILD_HOSTLDLIBS="-L$(STAGING_DIR_HOST)/lib" \
|
||||
CONFIG_SHELL="$(BASH)" \
|
||||
$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \
|
||||
$(if $(PKG_BUILD_ID),LDFLAGS_MODULE=--build-id=0x$(PKG_BUILD_ID)) \
|
||||
@ -130,6 +131,11 @@ ifdef CONFIG_USE_SPARSE
|
||||
KERNEL_MAKEOPTS += C=1 CHECK=$(STAGING_DIR_HOST)/bin/sparse
|
||||
endif
|
||||
|
||||
ifneq ($(HOST_OS),Linux)
|
||||
KERNEL_MAKEOPTS += CONFIG_STACK_VALIDATION=
|
||||
export SKIP_STACK_VALIDATION:=1
|
||||
endif
|
||||
|
||||
PKG_EXTMOD_SUBDIRS ?= .
|
||||
|
||||
define populate_module_symvers
|
||||
@ -295,4 +301,3 @@ kernel_patchver_ge=$(call kernel_version_cmp,-ge,$(KERNEL_PATCHVER),$(1))
|
||||
kernel_patchver_eq=$(call kernel_version_cmp,-eq,$(KERNEL_PATCHVER),$(1))
|
||||
kernel_patchver_le=$(call kernel_version_cmp,-le,$(KERNEL_PATCHVER),$(1))
|
||||
kernel_patchver_lt=$(call kernel_version_cmp,-lt,$(KERNEL_PATCHVER),$(1))
|
||||
|
||||
|
||||
@ -12,6 +12,7 @@ HOST_BUILD_PREFIX:=$(TOOLCHAIN_DIR)
|
||||
BUILD_DIR_HOST:=$(BUILD_DIR_TOOLCHAIN)
|
||||
|
||||
include $(INCLUDE_DIR)/host-build.mk
|
||||
include $(INCLUDE_DIR)/hardening.mk
|
||||
|
||||
HOST_STAMP_PREPARED=$(HOST_BUILD_DIR)/.prepared
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ PKG_NAME ?= u-boot
|
||||
ifndef PKG_SOURCE_PROTO
|
||||
PKG_SOURCE = $(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL = \
|
||||
http://sources.lede-project.org \
|
||||
https://sources.openwrt.org \
|
||||
ftp://ftp.denx.de/pub/u-boot
|
||||
endif
|
||||
|
||||
|
||||
@ -42,16 +42,16 @@ VERSION_MANUFACTURER:=$(call qstrip,$(CONFIG_VERSION_MANUFACTURER))
|
||||
VERSION_MANUFACTURER:=$(if $(VERSION_MANUFACTURER),$(VERSION_MANUFACTURER),OpenWrt)
|
||||
|
||||
VERSION_MANUFACTURER_URL:=$(call qstrip,$(CONFIG_VERSION_MANUFACTURER_URL))
|
||||
VERSION_MANUFACTURER_URL:=$(if $(VERSION_MANUFACTURER_URL),$(VERSION_MANUFACTURER_URL),http://openwrt.org/)
|
||||
VERSION_MANUFACTURER_URL:=$(if $(VERSION_MANUFACTURER_URL),$(VERSION_MANUFACTURER_URL),https://openwrt.org/)
|
||||
|
||||
VERSION_BUG_URL:=$(call qstrip,$(CONFIG_VERSION_BUG_URL))
|
||||
VERSION_BUG_URL:=$(if $(VERSION_BUG_URL),$(VERSION_BUG_URL),http://bugs.openwrt.org/)
|
||||
VERSION_BUG_URL:=$(if $(VERSION_BUG_URL),$(VERSION_BUG_URL),https://bugs.openwrt.org/)
|
||||
|
||||
VERSION_HOME_URL:=$(call qstrip,$(CONFIG_VERSION_HOME_URL))
|
||||
VERSION_HOME_URL:=$(if $(VERSION_HOME_URL),$(VERSION_HOME_URL),http://openwrt.org/)
|
||||
VERSION_HOME_URL:=$(if $(VERSION_HOME_URL),$(VERSION_HOME_URL),https://openwrt.org/)
|
||||
|
||||
VERSION_SUPPORT_URL:=$(call qstrip,$(CONFIG_VERSION_SUPPORT_URL))
|
||||
VERSION_SUPPORT_URL:=$(if $(VERSION_SUPPORT_URL),$(VERSION_SUPPORT_URL),http://forum.lede-project.org/)
|
||||
VERSION_SUPPORT_URL:=$(if $(VERSION_SUPPORT_URL),$(VERSION_SUPPORT_URL),https://forum.openwrt.org/)
|
||||
|
||||
VERSION_PRODUCT:=$(call qstrip,$(CONFIG_VERSION_PRODUCT))
|
||||
VERSION_PRODUCT:=$(if $(VERSION_PRODUCT),$(VERSION_PRODUCT),Generic)
|
||||
@ -108,4 +108,3 @@ VERSION_SED_SCRIPT:=$(SED) 's,%U,$(call sed_escape,$(VERSION_REPO)),g' \
|
||||
-e 's,%s,$(call sed_escape,$(VERSION_SUPPORT_URL)),g' \
|
||||
-e 's,%P,$(call sed_escape,$(VERSION_PRODUCT)),g' \
|
||||
-e 's,%h,$(call sed_escape,$(VERSION_HWREV)),g'
|
||||
|
||||
|
||||
@ -85,12 +85,16 @@ generate_network() {
|
||||
set network.$1.proto='none'
|
||||
EOF
|
||||
|
||||
[ -n "$macaddr" ] && uci -q batch <<-EOF
|
||||
delete network.$1_dev
|
||||
set network.$1_dev='device'
|
||||
set network.$1_dev.name='$ifname'
|
||||
set network.$1_dev.macaddr='$macaddr'
|
||||
EOF
|
||||
if [ -n "$macaddr" ]; then
|
||||
for name in $ifname; do
|
||||
uci -q batch <<-EOF
|
||||
delete network.$1_${name/./_}_dev
|
||||
set network.$1_${name/./_}_dev='device'
|
||||
set network.$1_${name/./_}_dev.name='$name'
|
||||
set network.$1_${name/./_}_dev.macaddr='$macaddr'
|
||||
EOF
|
||||
done
|
||||
fi
|
||||
|
||||
case "$protocol" in
|
||||
static)
|
||||
@ -213,7 +217,8 @@ generate_switch() {
|
||||
|
||||
json_select switch
|
||||
json_select "$key"
|
||||
json_get_vars enable reset blinkrate cpu_port
|
||||
json_get_vars enable reset blinkrate cpu_port \
|
||||
ar8xxx_mib_type ar8xxx_mib_poll_interval
|
||||
|
||||
uci -q batch <<-EOF
|
||||
add network switch
|
||||
@ -221,6 +226,8 @@ generate_switch() {
|
||||
set network.@switch[-1].reset='$reset'
|
||||
set network.@switch[-1].enable_vlan='$enable'
|
||||
set network.@switch[-1].blinkrate='$blinkrate'
|
||||
set network.@switch[-1].ar8xxx_mib_type='$ar8xxx_mib_type'
|
||||
set network.@switch[-1].ar8xxx_mib_poll_interval='$ar8xxx_mib_poll_interval'
|
||||
EOF
|
||||
|
||||
generate_switch_vlans_ports "$1"
|
||||
@ -244,10 +251,10 @@ generate_static_system() {
|
||||
set system.ntp='timeserver'
|
||||
set system.ntp.enabled='1'
|
||||
set system.ntp.enable_server='0'
|
||||
add_list system.ntp.server='0.openwrt.pool.ntp.org'
|
||||
add_list system.ntp.server='1.openwrt.pool.ntp.org'
|
||||
add_list system.ntp.server='2.openwrt.pool.ntp.org'
|
||||
add_list system.ntp.server='3.openwrt.pool.ntp.org'
|
||||
add_list system.ntp.server='ntp1.aliyun.com'
|
||||
add_list system.ntp.server='time1.cloud.tencent.com'
|
||||
add_list system.ntp.server='time.ustc.edu.cn'
|
||||
add_list system.ntp.server='pool.ntp.org'
|
||||
EOF
|
||||
|
||||
if json_is_a system object; then
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
root:x:0:
|
||||
daemon:x:1:
|
||||
adm:x:4:
|
||||
tty:x:5:
|
||||
mail:x:8:
|
||||
dialout:x:20:
|
||||
audio:x:29:
|
||||
www-data:x:33:
|
||||
ftp:x:55:
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
# Copyright (C) 2006-2011 OpenWrt.org
|
||||
|
||||
START=10
|
||||
STOP=98
|
||||
STOP=90
|
||||
|
||||
uci_apply_defaults() {
|
||||
. /lib/functions/system.sh
|
||||
@ -31,8 +31,9 @@ boot() {
|
||||
chmod 0700 /tmp/.uci
|
||||
touch /var/log/wtmp
|
||||
touch /var/log/lastlog
|
||||
touch /tmp/resolv.conf.auto
|
||||
ln -sf /tmp/resolv.conf.auto /tmp/resolv.conf
|
||||
mkdir -p /tmp/resolv.conf.d
|
||||
touch /tmp/resolv.conf.d/resolv.conf.auto
|
||||
ln -sf /tmp/resolv.conf.d/resolv.conf.auto /tmp/resolv.conf
|
||||
grep -q debugfs /proc/filesystems && /bin/mount -o noatime -t debugfs debugfs /sys/kernel/debug
|
||||
[ "$FAILSAFE" = "true" ] && touch /tmp/.failsafe
|
||||
|
||||
|
||||
@ -1,7 +1,12 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (C) 2006 OpenWrt.org
|
||||
|
||||
STOP=99
|
||||
STOP=90
|
||||
|
||||
restart() {
|
||||
:
|
||||
}
|
||||
|
||||
stop() {
|
||||
sync
|
||||
/bin/umount -a -d -r
|
||||
|
||||
12
package/base-files/files/etc/rc.button/reboot
Executable file
12
package/base-files/files/etc/rc.button/reboot
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ "${ACTION}" = "released" ] || exit 0
|
||||
|
||||
if [ "$SEEN" -ge 5 ]
|
||||
then
|
||||
echo "REBOOT" > /dev/console
|
||||
sync
|
||||
reboot
|
||||
fi
|
||||
|
||||
return 0
|
||||
@ -8,6 +8,8 @@ fs.suid_dumpable=2
|
||||
fs.protected_hardlinks=1
|
||||
fs.protected_symlinks=1
|
||||
|
||||
net.core.bpf_jit_enable=1
|
||||
|
||||
net.ipv4.conf.default.arp_ignore=1
|
||||
net.ipv4.conf.all.arp_ignore=1
|
||||
net.ipv4.ip_forward=1
|
||||
|
||||
@ -1,5 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
ppwd="$(sed -ne '/^root:/s/^root:\([^:]*\):.*$/\1/p' /etc/passwd)"
|
||||
spwd="$(sed -ne '/^root:/s/^root:\([^:]*\):.*$/\1/p' /etc/shadow)"
|
||||
|
||||
|
||||
@ -1,5 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ "$(uci -q get network.globals.ula_prefix)" != "auto" ] && exit 0
|
||||
|
||||
r1=$(dd if=/dev/urandom bs=1 count=1 |hexdump -e '1/1 "%02x"')
|
||||
@ -12,4 +10,3 @@ uci -q batch <<-EOF >/dev/null
|
||||
EOF
|
||||
|
||||
exit 0
|
||||
|
||||
|
||||
@ -1,5 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
for file in `grep -sl Require-User /usr/lib/opkg/info/*.control`; do
|
||||
|
||||
@ -17,6 +17,22 @@ NO_EXPORT=1
|
||||
LOAD_STATE=1
|
||||
LIST_SEP=" "
|
||||
|
||||
# xor multiple hex values of the same length
|
||||
xor() {
|
||||
local val
|
||||
local ret="0x$1"
|
||||
local retlen=${#1}
|
||||
|
||||
shift
|
||||
while [ -n "$1" ]; do
|
||||
val="0x$1"
|
||||
ret=$((ret ^ val))
|
||||
shift
|
||||
done
|
||||
|
||||
printf "%0${retlen}x" "$ret"
|
||||
}
|
||||
|
||||
append() {
|
||||
local var="$1"
|
||||
local value="$2"
|
||||
@ -213,6 +229,7 @@ add_group_and_user() {
|
||||
default_postinst() {
|
||||
local root="${IPKG_INSTROOT}"
|
||||
local pkgname="$(basename ${1%.*})"
|
||||
local filelist="/usr/lib/opkg/info/${pkgname}.list"
|
||||
local ret=0
|
||||
|
||||
add_group_and_user "${pkgname}"
|
||||
@ -227,14 +244,14 @@ default_postinst() {
|
||||
rm -fR $root/rootfs-overlay/
|
||||
fi
|
||||
|
||||
if [ -z "$root" ] && grep -q -s "^/etc/modules.d/" "/usr/lib/opkg/info/${pkgname}.list"; then
|
||||
if [ -z "$root" ] && grep -q -s "^/etc/modules.d/" "$filelist"; then
|
||||
kmodloader
|
||||
fi
|
||||
|
||||
if [ -z "$root" ] && grep -q -s "^/etc/uci-defaults/" "/usr/lib/opkg/info/${pkgname}.list"; then
|
||||
if [ -z "$root" ] && grep -q -s "^/etc/uci-defaults/" "$filelist"; then
|
||||
. /lib/functions/system.sh
|
||||
[ -d /tmp/.uci ] || mkdir -p /tmp/.uci
|
||||
for i in $(grep -s "^/etc/uci-defaults/" "/usr/lib/opkg/info/${pkgname}.list"); do
|
||||
for i in $(grep -s "^/etc/uci-defaults/" "$filelist"); do
|
||||
( [ -f "$i" ] && cd "$(dirname $i)" && . "$i" ) && rm -f "$i"
|
||||
done
|
||||
uci commit
|
||||
@ -243,7 +260,7 @@ default_postinst() {
|
||||
[ -n "$root" ] || rm -f /tmp/luci-indexcache 2>/dev/null
|
||||
|
||||
local shell="$(which bash)"
|
||||
for i in $(grep -s "^/etc/init.d/" "$root/usr/lib/opkg/info/${pkgname}.list"); do
|
||||
for i in $(grep -s "^/etc/init.d/" "$root$filelist"); do
|
||||
if [ -n "$root" ]; then
|
||||
${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" enable
|
||||
else
|
||||
|
||||
128
package/base-files/files/lib/functions/caldata.sh
Normal file
128
package/base-files/files/lib/functions/caldata.sh
Normal file
@ -0,0 +1,128 @@
|
||||
# Copyright (C) 2019 OpenWrt.org
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
|
||||
caldata_die() {
|
||||
echo "caldata: " "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
caldata_extract() {
|
||||
local part=$1
|
||||
local offset=$(($2))
|
||||
local count=$(($3))
|
||||
local mtd
|
||||
|
||||
mtd=$(find_mtd_chardev $part)
|
||||
[ -n "$mtd" ] || caldata_die "no mtd device found for partition $part"
|
||||
|
||||
dd if=$mtd of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
|
||||
caldata_die "failed to extract calibration data from $mtd"
|
||||
}
|
||||
|
||||
caldata_extract_ubi() {
|
||||
local part=$1
|
||||
local offset=$(($2))
|
||||
local count=$(($3))
|
||||
local ubidev
|
||||
local ubi
|
||||
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
ubidev=$(nand_find_ubi $CI_UBIPART)
|
||||
ubi=$(nand_find_volume $ubidev $part)
|
||||
[ -n "$ubi" ] || caldata_die "no UBI volume found for $part"
|
||||
|
||||
dd if=/dev/$ubi of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
|
||||
caldata_die "failed to extract calibration data from $ubi"
|
||||
}
|
||||
|
||||
caldata_extract_reverse() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$(($3))
|
||||
local mtd
|
||||
local reversed
|
||||
local caldata
|
||||
|
||||
mtd=$(find_mtd_chardev "$part")
|
||||
reversed=$(hexdump -v -s $offset -n $count -e '/1 "%02x "' $mtd)
|
||||
|
||||
for byte in $reversed; do
|
||||
caldata="\x${byte}${caldata}"
|
||||
done
|
||||
|
||||
printf "%b" "$caldata" > /lib/firmware/$FIRMWARE
|
||||
}
|
||||
|
||||
caldata_from_file() {
|
||||
local source=$1
|
||||
local offset=$(($2))
|
||||
local count=$(($3))
|
||||
|
||||
dd if=$source of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
|
||||
caldata_die "failed to extract calibration data from $source"
|
||||
}
|
||||
|
||||
caldata_valid() {
|
||||
local expected="$1"
|
||||
|
||||
magic=$(hexdump -v -n 2 -e '1/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
[ "$magic" = "$expected" ]
|
||||
return $?
|
||||
}
|
||||
|
||||
caldata_patch_chksum() {
|
||||
local mac=$1
|
||||
local mac_offset=$(($2))
|
||||
local chksum_offset=$(($3))
|
||||
local xor_mac
|
||||
local xor_fw_mac
|
||||
local xor_fw_chksum
|
||||
|
||||
xor_mac=${mac//:/}
|
||||
xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
|
||||
|
||||
xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
|
||||
|
||||
xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
|
||||
|
||||
printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
|
||||
dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2
|
||||
}
|
||||
|
||||
caldata_patch_mac() {
|
||||
local mac=$1
|
||||
local mac_offset=$(($2))
|
||||
local chksum_offset=$3
|
||||
|
||||
[ -z "$mac" -o -z "$mac_offset" ] && return
|
||||
|
||||
[ -n "$chksum_offset" ] && caldata_patch_chksum "$mac" "$mac_offset" "$chksum_offset"
|
||||
|
||||
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc oflag=seek_bytes bs=6 seek=$mac_offset count=1 || \
|
||||
caldata_die "failed to write MAC address to eeprom file"
|
||||
}
|
||||
|
||||
ath9k_patch_mac() {
|
||||
local mac=$1
|
||||
|
||||
caldata_patch_mac "$mac" 0x2
|
||||
}
|
||||
|
||||
ath9k_patch_mac_crc() {
|
||||
local mac=$1
|
||||
local mac_offset=$2
|
||||
local chksum_offset=$((mac_offset - 10))
|
||||
|
||||
caldata_patch_mac "$mac" "$mac_offset" "$chksum_offset"
|
||||
}
|
||||
|
||||
ath10k_patch_mac() {
|
||||
local mac=$1
|
||||
|
||||
caldata_patch_mac "$mac" 0x6 0x2
|
||||
}
|
||||
39
package/base-files/files/lib/functions/migrations.sh
Normal file
39
package/base-files/files/lib/functions/migrations.sh
Normal file
@ -0,0 +1,39 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
migrate_led_sysfs() {
|
||||
local cfg="$1"; shift
|
||||
local tuples="$@"
|
||||
local sysfs
|
||||
local name
|
||||
|
||||
config_get sysfs ${cfg} sysfs
|
||||
config_get name ${cfg} name
|
||||
|
||||
[ -z "${sysfs}" ] && return
|
||||
|
||||
for tuple in ${tuples}; do
|
||||
local old=${tuple%=*}
|
||||
local new=${tuple#*=}
|
||||
local new_sysfs
|
||||
|
||||
new_sysfs=$(echo ${sysfs} | sed "s/${old}/${new}/")
|
||||
|
||||
[ "${new_sysfs}" = "${sysfs}" ] && continue
|
||||
|
||||
uci set system.${cfg}.sysfs="${new_sysfs}"
|
||||
|
||||
logger -t led-migration "sysfs option of LED \"${name}\" updated to ${new_sysfs}"
|
||||
done;
|
||||
}
|
||||
|
||||
migrate_leds() {
|
||||
config_load system
|
||||
config_foreach migrate_led_sysfs led "$@"
|
||||
}
|
||||
|
||||
migrations_apply() {
|
||||
local realm="$1"
|
||||
[ -n "$(uci changes ${realm})" ] && uci -q commit ${realm}
|
||||
}
|
||||
@ -271,6 +271,11 @@ network_is_up()
|
||||
# 2: interface
|
||||
network_get_protocol() { __network_ifstatus "$1" "$2" ".proto"; }
|
||||
|
||||
# determine the uptime of the given logical interface
|
||||
# 1: destination variable
|
||||
# 2: interface
|
||||
network_get_uptime() { __network_ifstatus "$1" "$2" ".uptime"; }
|
||||
|
||||
# determine the metric of the given logical interface
|
||||
# 1: destination variable
|
||||
# 2: interface
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
# Copyright (C) 2006-2013 OpenWrt.org
|
||||
|
||||
. /usr/share/libubox/jshn.sh
|
||||
|
||||
get_mac_binary() {
|
||||
local path="$1"
|
||||
local offset="$2"
|
||||
|
||||
if [ -z "$path" ]; then
|
||||
if ! [ -e "$path" ]; then
|
||||
echo "get_mac_binary: file $path not found!" >&2
|
||||
return
|
||||
fi
|
||||
@ -12,6 +14,44 @@ get_mac_binary() {
|
||||
hexdump -v -n 6 -s $offset -e '5/1 "%02x:" 1/1 "%02x"' $path 2>/dev/null
|
||||
}
|
||||
|
||||
get_mac_label_dt() {
|
||||
local basepath="/proc/device-tree"
|
||||
local macdevice="$(cat "$basepath/aliases/label-mac-device" 2>/dev/null)"
|
||||
local macaddr
|
||||
|
||||
[ -n "$macdevice" ] || return
|
||||
|
||||
macaddr=$(get_mac_binary "$basepath/$macdevice/mac-address" 0 2>/dev/null)
|
||||
[ -n "$macaddr" ] || macaddr=$(get_mac_binary "$basepath/$macdevice/local-mac-address" 0 2>/dev/null)
|
||||
|
||||
echo $macaddr
|
||||
}
|
||||
|
||||
get_mac_label_json() {
|
||||
local cfg="/etc/board.json"
|
||||
local macaddr
|
||||
|
||||
[ -s "$cfg" ] || return
|
||||
|
||||
json_init
|
||||
json_load "$(cat $cfg)"
|
||||
if json_is_a system object; then
|
||||
json_select system
|
||||
json_get_var macaddr label_macaddr
|
||||
json_select ..
|
||||
fi
|
||||
|
||||
echo $macaddr
|
||||
}
|
||||
|
||||
get_mac_label() {
|
||||
local macaddr=$(get_mac_label_dt)
|
||||
|
||||
[ -n "$macaddr" ] || macaddr=$(get_mac_label_json)
|
||||
|
||||
echo $macaddr
|
||||
}
|
||||
|
||||
find_mtd_chardev() {
|
||||
local INDEX=$(find_mtd_index "$1")
|
||||
local PREFIX=/dev/mtd
|
||||
@ -40,7 +80,7 @@ mtd_get_mac_ascii() {
|
||||
|
||||
mtd_get_mac_text() {
|
||||
local mtdname=$1
|
||||
local offset=$2
|
||||
local offset=$(($2))
|
||||
local part
|
||||
local mac_dirty
|
||||
|
||||
@ -79,12 +119,7 @@ mtd_get_mac_binary_ubi() {
|
||||
local ubidev=$(nand_find_ubi $CI_UBIPART)
|
||||
local part=$(nand_find_volume $ubidev $1)
|
||||
|
||||
if [ -z "$part" ]; then
|
||||
echo "mtd_get_mac_binary: ubi volume $mtdname not found!" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
hexdump -v -n 6 -s $offset -e '5/1 "%02x:" 1/1 "%02x"' /dev/$part 2>/dev/null
|
||||
get_mac_binary "/dev/$part" "$offset"
|
||||
}
|
||||
|
||||
mtd_get_part_size() {
|
||||
@ -105,10 +140,17 @@ macaddr_add() {
|
||||
local oui=${mac%:*:*:*}
|
||||
local nic=${mac#*:*:*:}
|
||||
|
||||
nic=$(printf "%06x" $((0x${nic//:/} + $val & 0xffffff)) | sed 's/^\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)/\1:\2:\3/')
|
||||
nic=$(printf "%06x" $((0x${nic//:/} + val & 0xffffff)) | sed 's/^\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)/\1:\2:\3/')
|
||||
echo $oui:$nic
|
||||
}
|
||||
|
||||
macaddr_geteui() {
|
||||
local mac=$1
|
||||
local sep=$2
|
||||
|
||||
echo ${mac:9:2}$sep${mac:12:2}$sep${mac:15:2}
|
||||
}
|
||||
|
||||
macaddr_setbit_la() {
|
||||
local mac=$1
|
||||
|
||||
|
||||
@ -182,6 +182,19 @@ _ucidef_finish_switch_roles() {
|
||||
done
|
||||
}
|
||||
|
||||
ucidef_set_ar8xxx_switch_mib() {
|
||||
local name="$1"
|
||||
local type="$2"
|
||||
local interval="$3"
|
||||
|
||||
json_select_object switch
|
||||
json_select_object "$name"
|
||||
json_add_int ar8xxx_mib_type $type
|
||||
json_add_int ar8xxx_mib_poll_interval $interval
|
||||
json_select ..
|
||||
json_select ..
|
||||
}
|
||||
|
||||
ucidef_add_switch() {
|
||||
local name="$1"; shift
|
||||
local port num role device index need_tag prev_role
|
||||
@ -294,6 +307,14 @@ ucidef_set_interface_macaddr() {
|
||||
ucidef_set_interface "$network" macaddr "$macaddr"
|
||||
}
|
||||
|
||||
ucidef_set_label_macaddr() {
|
||||
local macaddr="$1"
|
||||
|
||||
json_select_object system
|
||||
json_add_string label_macaddr "$macaddr"
|
||||
json_select ..
|
||||
}
|
||||
|
||||
ucidef_add_atm_bridge() {
|
||||
local vpi="$1"
|
||||
local vci="$2"
|
||||
@ -463,6 +484,7 @@ _ucidef_set_led_timer() {
|
||||
|
||||
_ucidef_set_led_common "$1" "$2" "$3"
|
||||
|
||||
json_add_string type "$trigger_name"
|
||||
json_add_string trigger "$trigger_name"
|
||||
json_add_int delayon "$delayon"
|
||||
json_add_int delayoff "$delayoff"
|
||||
|
||||
@ -31,6 +31,8 @@ fs_wait_for_key () {
|
||||
lock $keypress_wait
|
||||
{
|
||||
while [ $timer -gt 0 ]; do
|
||||
pi_failsafe_net_message=true \
|
||||
preinit_net_echo "Please press button now to enter failsafe"
|
||||
echo "$timer" >$keypress_sec
|
||||
timer=$(($timer - 1))
|
||||
sleep 1
|
||||
@ -88,9 +90,6 @@ failsafe_wait() {
|
||||
}
|
||||
grep -q 'failsafe=' /proc/cmdline && FAILSAFE=true && export FAILSAFE
|
||||
if [ "$FAILSAFE" != "true" ]; then
|
||||
pi_failsafe_net_message=true
|
||||
preinit_net_echo "Please press button now to enter failsafe"
|
||||
pi_failsafe_net_message=false
|
||||
fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true
|
||||
[ -f "/tmp/failsafe_button" ] && FAILSAFE=true && echo "- failsafe button "`cat /tmp/failsafe_button`" was pressed -"
|
||||
[ "$FAILSAFE" = "true" ] && export FAILSAFE && touch /tmp/failsafe
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Usage: $0 [config|up|down|reload|status]
|
||||
Usage: $0 [config|up|down|reconf|reload|status]
|
||||
enables (default), disables or configures devices not yet configured.
|
||||
EOF
|
||||
exit 1
|
||||
|
||||
@ -8,11 +8,11 @@ HOME_URL="%u"
|
||||
BUG_URL="%b"
|
||||
SUPPORT_URL="%s"
|
||||
BUILD_ID="%R"
|
||||
LEDE_BOARD="%S"
|
||||
LEDE_ARCH="%A"
|
||||
LEDE_TAINTS="%t"
|
||||
LEDE_DEVICE_MANUFACTURER="%M"
|
||||
LEDE_DEVICE_MANUFACTURER_URL="%m"
|
||||
LEDE_DEVICE_PRODUCT="%P"
|
||||
LEDE_DEVICE_REVISION="%h"
|
||||
LEDE_RELEASE="%D %V %C"
|
||||
OPENWRT_BOARD="%S"
|
||||
OPENWRT_ARCH="%A"
|
||||
OPENWRT_TAINTS="%t"
|
||||
OPENWRT_DEVICE_MANUFACTURER="%M"
|
||||
OPENWRT_DEVICE_MANUFACTURER_URL="%m"
|
||||
OPENWRT_DEVICE_PRODUCT="%P"
|
||||
OPENWRT_DEVICE_REVISION="%h"
|
||||
OPENWRT_RELEASE="%D %V %C"
|
||||
|
||||
@ -183,7 +183,7 @@ if VERSIONOPT
|
||||
config VERSION_REPO
|
||||
string
|
||||
prompt "Release repository"
|
||||
default "http://downloads.lede-project.org/snapshots"
|
||||
default "http://downloads.openwrt.org/snapshots"
|
||||
help
|
||||
This is the repository address embedded in the image, it defaults
|
||||
to the trunk snapshot repo; the url may contain the following placeholders:
|
||||
|
||||
@ -1,622 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
@ -1,89 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2018 Simon Shi <simonsmh@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v3.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-nfs
|
||||
PKG_VERSION:=1.0.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_LICENSE:=GPLv3
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
PKG_MAINTAINER:=Simon Shi <simonsmh@gmail.com>
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/luci-app-nfs
|
||||
SECTION:=LuCI
|
||||
CATEGORY:=LuCI
|
||||
SUBMENU:=3. Applications
|
||||
TITLE:=LuCI Support for NFS
|
||||
PKGARCH:=all
|
||||
endef
|
||||
|
||||
define Package/luci-app-nfs/description
|
||||
LuCI Support for NFS.
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
$(foreach po,$(wildcard ${CURDIR}/files/luci/i18n/*.po), \
|
||||
po2lmo $(po) $(PKG_BUILD_DIR)/$(patsubst %.po,%.lmo,$(notdir $(po)));)
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/luci-app-nfs/postinst
|
||||
#!/bin/sh
|
||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||
if [ -f /etc/uci-defaults/luci-nfs ]; then
|
||||
( . /etc/uci-defaults/luci-nfs ) && \
|
||||
rm -f /etc/uci-defaults/luci-nfs
|
||||
fi
|
||||
rm -rf /tmp/luci-indexcache /tmp/luci-modulecache
|
||||
fi
|
||||
exit 0
|
||||
endef
|
||||
|
||||
define Package/luci-app-nfs/conffiles
|
||||
/etc/config/nfs
|
||||
endef
|
||||
|
||||
define Package/luci-app-nfs/postrm
|
||||
#!/bin/sh
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@nfs[-1]
|
||||
commit ucitrack
|
||||
EOF
|
||||
rm -f /tmp/luci-indexcache
|
||||
rm -rf /tmp/luci-modulecache
|
||||
exit 0
|
||||
endef
|
||||
|
||||
define Package/luci-app-nfs/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/nfs.*.lmo $(1)/usr/lib/lua/luci/i18n/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller
|
||||
$(INSTALL_DATA) ./files/luci/controller/*.lua $(1)/usr/lib/lua/luci/controller/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi
|
||||
$(INSTALL_DATA) ./files/luci/model/cbi/*.lua $(1)/usr/lib/lua/luci/model/cbi/
|
||||
$(INSTALL_DIR) $(1)/etc
|
||||
$(INSTALL_BIN) ./files/root/etc/firewall.nfs $(1)/etc/firewall.nfs
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DATA) ./files/root/etc/config/nfs $(1)/etc/config/nfs
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_BIN) ./files/root/etc/init.d/nfs $(1)/etc/init.d/nfs
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_BIN) ./files/root/etc/uci-defaults/luci-nfs $(1)/etc/uci-defaults/luci-nfs
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,luci-app-nfs))
|
||||
@ -1,18 +0,0 @@
|
||||
module("luci.controller.nfs", package.seeall)
|
||||
|
||||
function index()
|
||||
require("luci.i18n")
|
||||
luci.i18n.loadc("nfs")
|
||||
if not nixio.fs.access("/etc/config/nfs") then
|
||||
return
|
||||
end
|
||||
|
||||
local page = entry({"admin", "services", "nfs"}, cbi("nfs"), luci.i18n.translate("NFS"))
|
||||
page.i18n = "nfs"
|
||||
page.dependent = true
|
||||
|
||||
|
||||
local page = entry({"mini", "services", "nfs"}, cbi("nfs", {autoapply=true}), luci.i18n.translate("NFS"))
|
||||
page.i18n = "nfs"
|
||||
page.dependent = true
|
||||
end
|
||||
@ -1,79 +0,0 @@
|
||||
local fs = require "nixio.fs"
|
||||
|
||||
m = Map("nfs", translate("NFS"))
|
||||
|
||||
-- NFS Share --
|
||||
s = m:section(TypedSection, "share", translate("Shared Directories"))
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.template = "cbi/tblsection"
|
||||
|
||||
en = s:option(Flag, "enabled", translate("Enable"))
|
||||
en.rmempty = false
|
||||
en.default = "1"
|
||||
|
||||
ph1 = s:option(Value, "path", translate("Path"))
|
||||
ph1.placeholder = "/mnt/sda1"
|
||||
ph1.rmempty = false
|
||||
ph1.optional = false
|
||||
|
||||
ct = s:option(Value, "clients", translate("Clients"))
|
||||
ct.placeholder = "192.168.1.0/24"
|
||||
ct.rmempty = false
|
||||
ct.optional = false
|
||||
|
||||
am = s:option(ListValue, "permission", translate("Permission"))
|
||||
am:value("0", translate("anonymous"))
|
||||
am:value("1", translate("root"))
|
||||
am:value("2", translate("full"))
|
||||
am.default = "0"
|
||||
am.rmempty = false
|
||||
|
||||
ro = s:option(Flag, "read_only", translate("Read-only"))
|
||||
ro.rmempty = false
|
||||
ro.default = "0"
|
||||
|
||||
is = s:option(Flag, "insecure", translate("Insecure"))
|
||||
is.default = "1"
|
||||
is.rmempty = false
|
||||
|
||||
g = m:section(TypedSection, "general")
|
||||
g.anonymous = true
|
||||
|
||||
en=g:option(Flag, "external_access", translate(""), translate("Allow external network access"))
|
||||
en.rmempty = false
|
||||
en.default = "0"
|
||||
|
||||
-- NFS Mount --
|
||||
c = m:section(TypedSection, "mount", translate("Mounted Points"))
|
||||
c.anonymous = true
|
||||
c.addremove = true
|
||||
c.template = "cbi/tblsection"
|
||||
|
||||
en = c:option(Flag, "enabled", translate("Enable"))
|
||||
en.default = "1"
|
||||
en.rmempty = false
|
||||
|
||||
ho = c:option(Value, "host", translate("Host"))
|
||||
ho.placeholder = "192.168.1.1"
|
||||
ho.rmempty = false
|
||||
ho.optional = false
|
||||
|
||||
ph2 = c:option(Value, "path", translate("Path"))
|
||||
ph2.placeholder = "/media/share"
|
||||
ph2.rmempty = false
|
||||
ph2.optional = false
|
||||
|
||||
mo = c:option(Value, "mount_on", translate("Mount On"))
|
||||
mo.placeholder = "/mnt/nfs"
|
||||
|
||||
ro = c:option(Flag, "read_only", translate("Read-only"))
|
||||
ro.rmempty = false
|
||||
ro.default = "0"
|
||||
|
||||
if nixio.fs.access("/etc/config/fstab") then
|
||||
ph1.titleref = luci.dispatcher.build_url("admin", "system", "fstab")
|
||||
mo.titleref = luci.dispatcher.build_url("admin", "system", "fstab")
|
||||
end
|
||||
|
||||
return m
|
||||
@ -1,11 +0,0 @@
|
||||
|
||||
config general
|
||||
option external_access '0'
|
||||
|
||||
config share
|
||||
option insecure '1'
|
||||
option clients '*'
|
||||
option enabled '0'
|
||||
option path '/mnt/sda1'
|
||||
option permission '0'
|
||||
option read_only '0'
|
||||
@ -1,5 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ -z "$(pidof nfsd)" ] || /etc/init.d/nfs firewall
|
||||
|
||||
exit 0
|
||||
@ -1,244 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
START=45
|
||||
STOP=99
|
||||
EXTRA_COMMANDS="firewall restart"
|
||||
APP="nfs"
|
||||
|
||||
check_nfsd() {
|
||||
pidof nfsd &>/dev/null && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
get_lan_wan_ip() {
|
||||
[ -z "$1" ] && return 1
|
||||
ip=''
|
||||
. /lib/functions/network.sh>/dev/null
|
||||
network_get_ipaddr ip $1>/dev/null && echo "$ip"
|
||||
}
|
||||
|
||||
iptables_init() {
|
||||
INPUT="INPUT"
|
||||
iptables -t filter --list zone_wan_input &>/dev/null && INPUT="zone_wan_input"
|
||||
PREROUTING="PREROUTING"
|
||||
iptables -t nat --list zone_wan_prerouting &>/dev/null && PREROUTING="zone_wan_prerouting"
|
||||
[ -z "$LAN_IP" ] && {
|
||||
LAN_IP=$(get_lan_wan_ip 'lan')
|
||||
[ -z "$LAN_IP" ] && return 1
|
||||
}
|
||||
if [ "$external_access" = '1' ]; then
|
||||
RULES_NAT="*nat
|
||||
-A $PREROUTING -p udp -m udp --dport 111 -m comment --comment \"NFS\" -j DNAT --to-destination $LAN_IP:111
|
||||
-A $PREROUTING -p tcp -m tcp --dport 111 -m comment --comment \"NFS\" -j DNAT --to-destination $LAN_IP:111
|
||||
-A $PREROUTING -p udp -m udp --dport 2049 -m comment --comment \"NFS\" -j DNAT --to-destination $LAN_IP:2049
|
||||
-A $PREROUTING -p tcp -m tcp --dport 2049 -m comment --comment \"NFS\" -j DNAT --to-destination $LAN_IP:2049
|
||||
-A $PREROUTING -p udp -m udp --dport 32777 -m comment --comment \"NFS\" -j DNAT --to-destination $LAN_IP:32777
|
||||
-A $PREROUTING -p tcp -m tcp --dport 32777 -m comment --comment \"NFS\" -j DNAT --to-destination $LAN_IP:32777
|
||||
-A $PREROUTING -p udp -m udp --dport 32780 -m comment --comment \"NFS\" -j DNAT --to-destination $LAN_IP:32780
|
||||
-A $PREROUTING -p tcp -m tcp --dport 32780 -m comment --comment \"NFS\" -j DNAT --to-destination $LAN_IP:32780
|
||||
COMMIT"
|
||||
else
|
||||
SOURCE="-s ${LAN_IP%.*}.0/24 "
|
||||
fi
|
||||
RULES_FILTER="*filter
|
||||
-A $INPUT ${SOURCE}-p udp -m udp --dport 111:2049 -m comment --comment \"NFS\" -j ACCEPT
|
||||
-A $INPUT ${SOURCE}-p tcp -m tcp --dport 111:2049 -m comment --comment \"NFS\" -j ACCEPT
|
||||
-A $INPUT ${SOURCE}-p udp -m udp --dport 32777:32780 -m comment --comment \"NFS\" -j ACCEPT
|
||||
-A $INPUT ${SOURCE}-p tcp -m tcp --dport 32777:32780 -m comment --comment \"NFS\" -j ACCEPT
|
||||
COMMIT"
|
||||
return 0
|
||||
}
|
||||
|
||||
iptables_run() {
|
||||
[ -z "$1" -o -z "$2" ] && return 1
|
||||
RUN_RUNLES=$(echo -e "$1"|grep -Eo '[-][A].*')
|
||||
[ "$3" = '-D' ] && RUN_RUNLES=$(echo -e "$RUN_RUNLES"|sed -E 's/^-[AI]/-D/')
|
||||
while read RULE
|
||||
do
|
||||
eval "iptables -t $2 $RULE"
|
||||
done <<-EOF
|
||||
$(echo -e "$RUN_RUNLES")
|
||||
EOF
|
||||
}
|
||||
|
||||
iptables_flush() {
|
||||
iptables_init || return 1
|
||||
iptables-restore <<-EOF || {
|
||||
$(echo -e "$( iptables-save)" | grep -v 'NFS')
|
||||
EOF
|
||||
iptables_run "$RULES_FILTER" "filter" "-D" &>/dev/null
|
||||
iptables_run "$RULES_NAT" "nat" "-D" &>/dev/null
|
||||
}
|
||||
return $?
|
||||
}
|
||||
|
||||
iptables_restore() {
|
||||
iptables_init || return 1
|
||||
iptables-restore -n <<-EOF || {
|
||||
$RULES_FILTER
|
||||
$RULES_NAT
|
||||
EOF
|
||||
iptables_run "$RULES_FILTER" "filter" "-A"
|
||||
[ "$external_access" = '1' ] && iptables_run "$RULES_NAT" "nat" "-A"
|
||||
}
|
||||
return $?
|
||||
}
|
||||
|
||||
nfs_general() {
|
||||
config_get external_access "$1" external_access '0'
|
||||
}
|
||||
|
||||
nfs_share() {
|
||||
[ -z "$1" ] && return 1
|
||||
config_get enabled "$1" enabled
|
||||
[ "$enabled" = '1' ] || return 1
|
||||
config_get path "$1" path
|
||||
[ -d "$path" ] || return 1
|
||||
config_get clients "$1" clients
|
||||
[ -z "$clients" ] && return 1
|
||||
config_get permission "$1" permission '0'
|
||||
case $permission in
|
||||
1)
|
||||
NFS_PERMISSION='no_root_squash'
|
||||
;;
|
||||
2)
|
||||
NFS_PERMISSION='no_root_squash,fsid=0'
|
||||
;;
|
||||
*)
|
||||
NFS_PERMISSION='all_squash'
|
||||
;;
|
||||
esac
|
||||
config_get read_only "$1" read_only '0'
|
||||
NFS_OPERATION="rw"
|
||||
[ $read_only = '1' ] && NFS_OPERATION="ro"
|
||||
NFS_INSECURE=""
|
||||
config_get insecure "$1" insecure '1'
|
||||
[ $insecure = '1' ] && NFS_INSECURE=",insecure"
|
||||
[ -z "$NFS_SHARE_ALL" ] || {
|
||||
FIND_NFS=$(echo -e "$NFS_SHARE_ALL"|grep -i "^$path ")
|
||||
}
|
||||
if [ -z "$FIND_NFS" ]; then
|
||||
NFS_SHARE_ALL=$([ -z "$NFS_SHARE_ALL" ] || echo "$NFS_SHARE_ALL\n")"$path $clients($NFS_OPERATION,no_subtree_check,$NFS_PERMISSION,async$NFS_INSECURE)"
|
||||
else
|
||||
NFS_SHARE_ALL=$(echo -e "$NFS_SHARE_ALL"|grep -iv "^$path ")
|
||||
NFS_SHARE_ALL=$([ -z "$NFS_SHARE_ALL" ] || echo "$NFS_SHARE_ALL\n")"$FIND_NFS $clients($NFS_OPERATION,no_subtree_check,$NFS_PERMISSION,async$NFS_INSECURE)"
|
||||
fi
|
||||
}
|
||||
|
||||
nfs_share_start() {
|
||||
NFS_EXPORTS=$(cat /etc/exports)
|
||||
if check_nfsd; then
|
||||
if [ -z "$NFS_SHARE_ALL" ]; then
|
||||
echo -e "$NFS_SHARE_ALL">/etc/exports
|
||||
nfs_share_stop
|
||||
return 1
|
||||
else
|
||||
[ "$(echo -e $NFS_EXPORTS)" = "$(echo -e $NFS_SHARE_ALL)" ] || {
|
||||
echo -e "$NFS_SHARE_ALL">/etc/exports
|
||||
/usr/sbin/exportfs -ar
|
||||
}
|
||||
fi
|
||||
else
|
||||
echo -e "$NFS_SHARE_ALL">/etc/exports
|
||||
/etc/init.d/portmap start &>/dev/null
|
||||
/etc/init.d/nfsd start &>/dev/null
|
||||
fi
|
||||
iptables_flush
|
||||
iptables_restore
|
||||
}
|
||||
|
||||
nfs_share_stop() {
|
||||
iptables_flush
|
||||
/etc/init.d/nfsd stop &>/dev/null
|
||||
/etc/init.d/portmap stop &>/dev/null
|
||||
}
|
||||
|
||||
get_mounted_nfs() {
|
||||
[ -z "$MOUNTED_ALL" ] && {
|
||||
MOUNTED_ALL=$(mount)
|
||||
MOUNTED_NFS_ALL=$(echo -e "$MOUNTED_ALL"|grep "type\s\+nfs\s")
|
||||
}
|
||||
}
|
||||
|
||||
create_mount_dir() {
|
||||
if [ -d "$1" ]; then
|
||||
[ -z $(ls $"$1" 2>/dev/null) ] && return 0
|
||||
return 1
|
||||
else
|
||||
mkdir "$1"
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
nfs_mount() {
|
||||
[ -z "$1" ] && return 1
|
||||
config_get enabled "$1" enabled
|
||||
[ "$enabled" = '1' ] || return 1
|
||||
config_get host "$1" host
|
||||
[ -z "$host" ] && return 1
|
||||
config_get path "$1" path
|
||||
[ -z "$path" ] && return 1
|
||||
config_get mount_on "$1" mount_on
|
||||
[ -z "$mount_on" ] && return 1
|
||||
config_get read_only "$1" read_only '0'
|
||||
MOUNT_OPERATION="rw"
|
||||
[ $read_only = '1' ] && MOUNT_OPERATION="ro"
|
||||
get_mounted_nfs
|
||||
NFS_MOUNTING=$([ -z "$NFS_MOUNTING" ] || echo "$NFS_MOUNTING\n")"$host:$path"
|
||||
NFS_MOUNT_MATCH=$(echo -e "$MOUNTED_NFS_ALL"|grep "^$host:$path")
|
||||
if [ -z "$NFS_MOUNT_MATCH" ]; then
|
||||
create_mount_dir "$mount_on" && mount -t nfs -o $MOUNT_OPERATION -o nolock "$host:$path" "$mount_on"
|
||||
else
|
||||
echo "$NFS_MOUNT_MATCH"|grep "$mount_on\s\+type\s\+nfs\s\+($MOUNT_OPERATION" 2>/dev/null && return 1
|
||||
umount -fr "$mount_on" && mount -t nfs -o $MOUNT_OPERATION -o nolock "$host:$path" "$mount_on"
|
||||
fi
|
||||
}
|
||||
|
||||
nfs_mount_clean() {
|
||||
MOUNTED_ALL=''
|
||||
get_mounted_nfs
|
||||
echo -e "$MOUNTED_NFS_ALL"|while read NFS_SHARED
|
||||
do
|
||||
echo -e "$NFS_MOUNTING"|grep -x "${NFS_SHARED% on *}" 2>/dev/null || {
|
||||
NFS_SHARED_MOUNT="${NFS_SHARED##* on }"
|
||||
NFS_SHARED_MOUNT="${NFS_SHARED_MOUNT%% type*}"
|
||||
umount -fr "$NFS_SHARED_MOUNT" && rm -r "$NFS_SHARED_MOUNT"
|
||||
}
|
||||
done
|
||||
}
|
||||
|
||||
config_cb() {
|
||||
local cfg="$CONFIG_SECTION"
|
||||
config_get configname "$cfg" TYPE
|
||||
case "$configname" in
|
||||
general)
|
||||
nfs_general "$cfg"
|
||||
;;
|
||||
share)
|
||||
nfs_share "$cfg"
|
||||
;;
|
||||
mount)
|
||||
nfs_mount "$cfg"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
start() {
|
||||
config_load "$APP"
|
||||
nfs_share_start
|
||||
nfs_mount_clean
|
||||
}
|
||||
|
||||
stop() {
|
||||
nfs_mount_clean
|
||||
nfs_share_stop
|
||||
}
|
||||
|
||||
restart() {
|
||||
start
|
||||
}
|
||||
|
||||
firewall() {
|
||||
config_load "$APP"
|
||||
iptables_restore
|
||||
}
|
||||
|
||||
@ -1,21 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete firewall.nfs
|
||||
set firewall.nfs=include
|
||||
set firewall.nfs.type=script
|
||||
set firewall.nfs.path=/etc/firewall.nfs
|
||||
set firewall.nfs.reload=1
|
||||
commit firewall
|
||||
delete ucitrack.@nfs[-1]
|
||||
add ucitrack nfs
|
||||
set ucitrack.@nfs[-1].init=nfs
|
||||
commit ucitrack
|
||||
EOF
|
||||
|
||||
/etc/init.d/portmap disable >/dev/null 2>&1
|
||||
/etc/init.d/nfsd disable >/dev/null 2>&1
|
||||
/etc/init.d/nfs enable >/dev/null 2>&1
|
||||
rm -f /tmp/luci-indexcache
|
||||
|
||||
exit 0
|
||||
@ -1,12 +0,0 @@
|
||||
|
||||
INSTALL = install
|
||||
PREFIX = /usr/bin
|
||||
|
||||
po2lmo: src/po2lmo.o src/template_lmo.o
|
||||
$(CC) $(LDFLAGS) -o src/po2lmo src/po2lmo.o src/template_lmo.o
|
||||
|
||||
install:
|
||||
$(INSTALL) -m 755 src/po2lmo $(PREFIX)
|
||||
|
||||
clean:
|
||||
$(RM) src/po2lmo src/*.o
|
||||
@ -1,247 +0,0 @@
|
||||
/*
|
||||
* lmo - Lua Machine Objects - PO to LMO conversion tool
|
||||
*
|
||||
* Copyright (C) 2009-2012 Jo-Philipp Wich <xm@subsignal.org>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "template_lmo.h"
|
||||
|
||||
static void die(const char *msg)
|
||||
{
|
||||
fprintf(stderr, "Error: %s\n", msg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void usage(const char *name)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s input.po output.lmo\n", name);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void print(const void *ptr, size_t size, size_t nmemb, FILE *stream)
|
||||
{
|
||||
if( fwrite(ptr, size, nmemb, stream) == 0 )
|
||||
die("Failed to write stdout");
|
||||
}
|
||||
|
||||
static int extract_string(const char *src, char *dest, int len)
|
||||
{
|
||||
int pos = 0;
|
||||
int esc = 0;
|
||||
int off = -1;
|
||||
|
||||
for( pos = 0; (pos < strlen(src)) && (pos < len); pos++ )
|
||||
{
|
||||
if( (off == -1) && (src[pos] == '"') )
|
||||
{
|
||||
off = pos + 1;
|
||||
}
|
||||
else if( off >= 0 )
|
||||
{
|
||||
if( esc == 1 )
|
||||
{
|
||||
switch (src[pos])
|
||||
{
|
||||
case '"':
|
||||
case '\\':
|
||||
off++;
|
||||
break;
|
||||
}
|
||||
dest[pos-off] = src[pos];
|
||||
esc = 0;
|
||||
}
|
||||
else if( src[pos] == '\\' )
|
||||
{
|
||||
dest[pos-off] = src[pos];
|
||||
esc = 1;
|
||||
}
|
||||
else if( src[pos] != '"' )
|
||||
{
|
||||
dest[pos-off] = src[pos];
|
||||
}
|
||||
else
|
||||
{
|
||||
dest[pos-off] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (off > -1) ? strlen(dest) : -1;
|
||||
}
|
||||
|
||||
static int cmp_index(const void *a, const void *b)
|
||||
{
|
||||
uint32_t x = ((const lmo_entry_t *)a)->key_id;
|
||||
uint32_t y = ((const lmo_entry_t *)b)->key_id;
|
||||
|
||||
if (x < y)
|
||||
return -1;
|
||||
else if (x > y)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void print_uint32(uint32_t x, FILE *out)
|
||||
{
|
||||
uint32_t y = htonl(x);
|
||||
print(&y, sizeof(uint32_t), 1, out);
|
||||
}
|
||||
|
||||
static void print_index(void *array, int n, FILE *out)
|
||||
{
|
||||
lmo_entry_t *e;
|
||||
|
||||
qsort(array, n, sizeof(*e), cmp_index);
|
||||
|
||||
for (e = array; n > 0; n--, e++)
|
||||
{
|
||||
print_uint32(e->key_id, out);
|
||||
print_uint32(e->val_id, out);
|
||||
print_uint32(e->offset, out);
|
||||
print_uint32(e->length, out);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char line[4096];
|
||||
char key[4096];
|
||||
char val[4096];
|
||||
char tmp[4096];
|
||||
int state = 0;
|
||||
int offset = 0;
|
||||
int length = 0;
|
||||
int n_entries = 0;
|
||||
void *array = NULL;
|
||||
lmo_entry_t *entry = NULL;
|
||||
uint32_t key_id, val_id;
|
||||
|
||||
FILE *in;
|
||||
FILE *out;
|
||||
|
||||
if( (argc != 3) || ((in = fopen(argv[1], "r")) == NULL) || ((out = fopen(argv[2], "w")) == NULL) )
|
||||
usage(argv[0]);
|
||||
|
||||
memset(line, 0, sizeof(key));
|
||||
memset(key, 0, sizeof(val));
|
||||
memset(val, 0, sizeof(val));
|
||||
|
||||
while( (NULL != fgets(line, sizeof(line), in)) || (state >= 2 && feof(in)) )
|
||||
{
|
||||
if( state == 0 && strstr(line, "msgid \"") == line )
|
||||
{
|
||||
switch(extract_string(line, key, sizeof(key)))
|
||||
{
|
||||
case -1:
|
||||
die("Syntax error in msgid");
|
||||
case 0:
|
||||
state = 1;
|
||||
break;
|
||||
default:
|
||||
state = 2;
|
||||
}
|
||||
}
|
||||
else if( state == 1 || state == 2 )
|
||||
{
|
||||
if( strstr(line, "msgstr \"") == line || state == 2 )
|
||||
{
|
||||
switch(extract_string(line, val, sizeof(val)))
|
||||
{
|
||||
case -1:
|
||||
state = 4;
|
||||
break;
|
||||
default:
|
||||
state = 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(extract_string(line, tmp, sizeof(tmp)))
|
||||
{
|
||||
case -1:
|
||||
state = 2;
|
||||
break;
|
||||
default:
|
||||
strcat(key, tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( state == 3 )
|
||||
{
|
||||
switch(extract_string(line, tmp, sizeof(tmp)))
|
||||
{
|
||||
case -1:
|
||||
state = 4;
|
||||
break;
|
||||
default:
|
||||
strcat(val, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
if( state == 4 )
|
||||
{
|
||||
if( strlen(key) > 0 && strlen(val) > 0 )
|
||||
{
|
||||
key_id = sfh_hash(key, strlen(key));
|
||||
val_id = sfh_hash(val, strlen(val));
|
||||
|
||||
if( key_id != val_id )
|
||||
{
|
||||
n_entries++;
|
||||
array = realloc(array, n_entries * sizeof(lmo_entry_t));
|
||||
entry = (lmo_entry_t *)array + n_entries - 1;
|
||||
|
||||
if (!array)
|
||||
die("Out of memory");
|
||||
|
||||
entry->key_id = key_id;
|
||||
entry->val_id = val_id;
|
||||
entry->offset = offset;
|
||||
entry->length = strlen(val);
|
||||
|
||||
length = strlen(val) + ((4 - (strlen(val) % 4)) % 4);
|
||||
|
||||
print(val, length, 1, out);
|
||||
offset += length;
|
||||
}
|
||||
}
|
||||
|
||||
state = 0;
|
||||
memset(key, 0, sizeof(key));
|
||||
memset(val, 0, sizeof(val));
|
||||
}
|
||||
|
||||
memset(line, 0, sizeof(line));
|
||||
}
|
||||
|
||||
print_index(array, n_entries, out);
|
||||
|
||||
if( offset > 0 )
|
||||
{
|
||||
print_uint32(offset, out);
|
||||
fsync(fileno(out));
|
||||
fclose(out);
|
||||
}
|
||||
else
|
||||
{
|
||||
fclose(out);
|
||||
unlink(argv[2]);
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
return(0);
|
||||
}
|
||||
@ -1,328 +0,0 @@
|
||||
/*
|
||||
* lmo - Lua Machine Objects - Base functions
|
||||
*
|
||||
* Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "template_lmo.h"
|
||||
|
||||
/*
|
||||
* Hash function from http://www.azillionmonkeys.com/qed/hash.html
|
||||
* Copyright (C) 2004-2008 by Paul Hsieh
|
||||
*/
|
||||
|
||||
uint32_t sfh_hash(const char *data, int len)
|
||||
{
|
||||
uint32_t hash = len, tmp;
|
||||
int rem;
|
||||
|
||||
if (len <= 0 || data == NULL) return 0;
|
||||
|
||||
rem = len & 3;
|
||||
len >>= 2;
|
||||
|
||||
/* Main loop */
|
||||
for (;len > 0; len--) {
|
||||
hash += sfh_get16(data);
|
||||
tmp = (sfh_get16(data+2) << 11) ^ hash;
|
||||
hash = (hash << 16) ^ tmp;
|
||||
data += 2*sizeof(uint16_t);
|
||||
hash += hash >> 11;
|
||||
}
|
||||
|
||||
/* Handle end cases */
|
||||
switch (rem) {
|
||||
case 3: hash += sfh_get16(data);
|
||||
hash ^= hash << 16;
|
||||
hash ^= data[sizeof(uint16_t)] << 18;
|
||||
hash += hash >> 11;
|
||||
break;
|
||||
case 2: hash += sfh_get16(data);
|
||||
hash ^= hash << 11;
|
||||
hash += hash >> 17;
|
||||
break;
|
||||
case 1: hash += *data;
|
||||
hash ^= hash << 10;
|
||||
hash += hash >> 1;
|
||||
}
|
||||
|
||||
/* Force "avalanching" of final 127 bits */
|
||||
hash ^= hash << 3;
|
||||
hash += hash >> 5;
|
||||
hash ^= hash << 4;
|
||||
hash += hash >> 17;
|
||||
hash ^= hash << 25;
|
||||
hash += hash >> 6;
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
uint32_t lmo_canon_hash(const char *str, int len)
|
||||
{
|
||||
char res[4096];
|
||||
char *ptr, prev;
|
||||
int off;
|
||||
|
||||
if (!str || len >= sizeof(res))
|
||||
return 0;
|
||||
|
||||
for (prev = ' ', ptr = res, off = 0; off < len; prev = *str, off++, str++)
|
||||
{
|
||||
if (isspace(*str))
|
||||
{
|
||||
if (!isspace(prev))
|
||||
*ptr++ = ' ';
|
||||
}
|
||||
else
|
||||
{
|
||||
*ptr++ = *str;
|
||||
}
|
||||
}
|
||||
|
||||
if ((ptr > res) && isspace(*(ptr-1)))
|
||||
ptr--;
|
||||
|
||||
return sfh_hash(res, ptr - res);
|
||||
}
|
||||
|
||||
lmo_archive_t * lmo_open(const char *file)
|
||||
{
|
||||
int in = -1;
|
||||
uint32_t idx_offset = 0;
|
||||
struct stat s;
|
||||
|
||||
lmo_archive_t *ar = NULL;
|
||||
|
||||
if (stat(file, &s) == -1)
|
||||
goto err;
|
||||
|
||||
if ((in = open(file, O_RDONLY)) == -1)
|
||||
goto err;
|
||||
|
||||
if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL)
|
||||
{
|
||||
memset(ar, 0, sizeof(*ar));
|
||||
|
||||
ar->fd = in;
|
||||
ar->size = s.st_size;
|
||||
|
||||
fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC);
|
||||
|
||||
if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED)
|
||||
goto err;
|
||||
|
||||
idx_offset = ntohl(*((const uint32_t *)
|
||||
(ar->mmap + ar->size - sizeof(uint32_t))));
|
||||
|
||||
if (idx_offset >= ar->size)
|
||||
goto err;
|
||||
|
||||
ar->index = (lmo_entry_t *)(ar->mmap + idx_offset);
|
||||
ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t);
|
||||
ar->end = ar->mmap + ar->size;
|
||||
|
||||
return ar;
|
||||
}
|
||||
|
||||
err:
|
||||
if (in > -1)
|
||||
close(in);
|
||||
|
||||
if (ar != NULL)
|
||||
{
|
||||
if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
|
||||
munmap(ar->mmap, ar->size);
|
||||
|
||||
free(ar);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void lmo_close(lmo_archive_t *ar)
|
||||
{
|
||||
if (ar != NULL)
|
||||
{
|
||||
if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
|
||||
munmap(ar->mmap, ar->size);
|
||||
|
||||
close(ar->fd);
|
||||
free(ar);
|
||||
|
||||
ar = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
lmo_catalog_t *_lmo_catalogs = NULL;
|
||||
lmo_catalog_t *_lmo_active_catalog = NULL;
|
||||
|
||||
int lmo_load_catalog(const char *lang, const char *dir)
|
||||
{
|
||||
DIR *dh = NULL;
|
||||
char pattern[16];
|
||||
char path[PATH_MAX];
|
||||
struct dirent *de = NULL;
|
||||
|
||||
lmo_archive_t *ar = NULL;
|
||||
lmo_catalog_t *cat = NULL;
|
||||
|
||||
if (!lmo_change_catalog(lang))
|
||||
return 0;
|
||||
|
||||
if (!dir || !(dh = opendir(dir)))
|
||||
goto err;
|
||||
|
||||
if (!(cat = malloc(sizeof(*cat))))
|
||||
goto err;
|
||||
|
||||
memset(cat, 0, sizeof(*cat));
|
||||
|
||||
snprintf(cat->lang, sizeof(cat->lang), "%s", lang);
|
||||
snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang);
|
||||
|
||||
while ((de = readdir(dh)) != NULL)
|
||||
{
|
||||
if (!fnmatch(pattern, de->d_name, 0))
|
||||
{
|
||||
snprintf(path, sizeof(path), "%s/%s", dir, de->d_name);
|
||||
ar = lmo_open(path);
|
||||
|
||||
if (ar)
|
||||
{
|
||||
ar->next = cat->archives;
|
||||
cat->archives = ar;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
closedir(dh);
|
||||
|
||||
cat->next = _lmo_catalogs;
|
||||
_lmo_catalogs = cat;
|
||||
|
||||
if (!_lmo_active_catalog)
|
||||
_lmo_active_catalog = cat;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
if (dh) closedir(dh);
|
||||
if (cat) free(cat);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int lmo_change_catalog(const char *lang)
|
||||
{
|
||||
lmo_catalog_t *cat;
|
||||
|
||||
for (cat = _lmo_catalogs; cat; cat = cat->next)
|
||||
{
|
||||
if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
|
||||
{
|
||||
_lmo_active_catalog = cat;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash)
|
||||
{
|
||||
unsigned int m, l, r;
|
||||
uint32_t k;
|
||||
|
||||
l = 0;
|
||||
r = ar->length - 1;
|
||||
|
||||
while (1)
|
||||
{
|
||||
m = l + ((r - l) / 2);
|
||||
|
||||
if (r < l)
|
||||
break;
|
||||
|
||||
k = ntohl(ar->index[m].key_id);
|
||||
|
||||
if (k == hash)
|
||||
return &ar->index[m];
|
||||
|
||||
if (k > hash)
|
||||
{
|
||||
if (!m)
|
||||
break;
|
||||
|
||||
r = m - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
l = m + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int lmo_translate(const char *key, int keylen, char **out, int *outlen)
|
||||
{
|
||||
uint32_t hash;
|
||||
lmo_entry_t *e;
|
||||
lmo_archive_t *ar;
|
||||
|
||||
if (!key || !_lmo_active_catalog)
|
||||
return -2;
|
||||
|
||||
hash = lmo_canon_hash(key, keylen);
|
||||
|
||||
for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
|
||||
{
|
||||
if ((e = lmo_find_entry(ar, hash)) != NULL)
|
||||
{
|
||||
*out = ar->mmap + ntohl(e->offset);
|
||||
*outlen = ntohl(e->length);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void lmo_close_catalog(const char *lang)
|
||||
{
|
||||
lmo_archive_t *ar, *next;
|
||||
lmo_catalog_t *cat, *prev;
|
||||
|
||||
for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next)
|
||||
{
|
||||
if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
|
||||
{
|
||||
if (prev)
|
||||
prev->next = cat->next;
|
||||
else
|
||||
_lmo_catalogs = cat->next;
|
||||
|
||||
for (ar = cat->archives; ar; ar = next)
|
||||
{
|
||||
next = ar->next;
|
||||
lmo_close(ar);
|
||||
}
|
||||
|
||||
free(cat);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,92 +0,0 @@
|
||||
/*
|
||||
* lmo - Lua Machine Objects - General header
|
||||
*
|
||||
* Copyright (C) 2009-2012 Jo-Philipp Wich <xm@subsignal.org>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef _TEMPLATE_LMO_H_
|
||||
#define _TEMPLATE_LMO_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <fnmatch.h>
|
||||
#include <dirent.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
|
||||
#if (defined(__GNUC__) && defined(__i386__))
|
||||
#define sfh_get16(d) (*((const uint16_t *) (d)))
|
||||
#else
|
||||
#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
|
||||
+(uint32_t)(((const uint8_t *)(d))[0]) )
|
||||
#endif
|
||||
|
||||
|
||||
struct lmo_entry {
|
||||
uint32_t key_id;
|
||||
uint32_t val_id;
|
||||
uint32_t offset;
|
||||
uint32_t length;
|
||||
} __attribute__((packed));
|
||||
|
||||
typedef struct lmo_entry lmo_entry_t;
|
||||
|
||||
|
||||
struct lmo_archive {
|
||||
int fd;
|
||||
int length;
|
||||
uint32_t size;
|
||||
lmo_entry_t *index;
|
||||
char *mmap;
|
||||
char *end;
|
||||
struct lmo_archive *next;
|
||||
};
|
||||
|
||||
typedef struct lmo_archive lmo_archive_t;
|
||||
|
||||
|
||||
struct lmo_catalog {
|
||||
char lang[6];
|
||||
struct lmo_archive *archives;
|
||||
struct lmo_catalog *next;
|
||||
};
|
||||
|
||||
typedef struct lmo_catalog lmo_catalog_t;
|
||||
|
||||
|
||||
uint32_t sfh_hash(const char *data, int len);
|
||||
uint32_t lmo_canon_hash(const char *data, int len);
|
||||
|
||||
lmo_archive_t * lmo_open(const char *file);
|
||||
void lmo_close(lmo_archive_t *ar);
|
||||
|
||||
|
||||
extern lmo_catalog_t *_lmo_catalogs;
|
||||
extern lmo_catalog_t *_lmo_active_catalog;
|
||||
|
||||
int lmo_load_catalog(const char *lang, const char *dir);
|
||||
int lmo_change_catalog(const char *lang);
|
||||
int lmo_translate(const char *key, int keylen, char **out, int *outlen);
|
||||
void lmo_close_catalog(const char *lang);
|
||||
|
||||
#endif
|
||||
18
package/lean/luci-app-nfs/Makefile
Normal file
18
package/lean/luci-app-nfs/Makefile
Normal file
@ -0,0 +1,18 @@
|
||||
# Copyright (C) 2016 Openwrt.org
|
||||
#
|
||||
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_TITLE:=LuCI support for nfs
|
||||
LUCI_DEPENDS:=
|
||||
LUCI_PKGARCH:=all
|
||||
PKG_NAME:=luci-app-nfs
|
||||
PKG_VERSION:=1.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
|
||||
8
package/lean/luci-app-nfs/luasrc/controller/nfs.lua
Normal file
8
package/lean/luci-app-nfs/luasrc/controller/nfs.lua
Normal file
@ -0,0 +1,8 @@
|
||||
module("luci.controller.nfs", package.seeall)
|
||||
|
||||
function index()
|
||||
if not nixio.fs.access("/etc/config/nfs") then
|
||||
return
|
||||
end
|
||||
entry({"admin", "nas", "nfs"}, cbi("nfs"), _("NFS Manage"), 5).dependent = true
|
||||
end
|
||||
65
package/lean/luci-app-nfs/luasrc/model/cbi/nfs.lua
Normal file
65
package/lean/luci-app-nfs/luasrc/model/cbi/nfs.lua
Normal file
@ -0,0 +1,65 @@
|
||||
local fs = require "nixio.fs"
|
||||
|
||||
m = Map("nfs", translate("NFS Manage"))
|
||||
|
||||
-- NFS Share --
|
||||
s = m:section(TypedSection, "share", translate("Shared Directories"))
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.template = "cbi/tblsection"
|
||||
|
||||
en = s:option(Flag, "enabled", translate("Enable"))
|
||||
en.rmempty = false
|
||||
en.default = "1"
|
||||
|
||||
ph1 = s:option(Value, "path", translate("Path"))
|
||||
ph1.placeholder = "/mnt"
|
||||
ph1.rmempty = false
|
||||
ph1.optional = false
|
||||
|
||||
ct = s:option(Value, "clients", translate("Clients"))
|
||||
ct.placeholder = "192.168.1.0/24"
|
||||
ct.rmempty = false
|
||||
ct.optional = false
|
||||
|
||||
op = s:option(Value, "options", translate("options"))
|
||||
op.placeholder = "rw,sync,root_squash,all_squash,insecure,no_subtree_check"
|
||||
op.rmempty = false
|
||||
op.optional = false
|
||||
|
||||
-- NFS Mount --
|
||||
c = m:section(TypedSection, "mount", translate("Mounted Points"))
|
||||
c.anonymous = true
|
||||
c.addremove = true
|
||||
c.template = "cbi/tblsection"
|
||||
|
||||
en = c:option(Flag, "enabled", translate("Enable"))
|
||||
en.default = "1"
|
||||
en.rmempty = false
|
||||
|
||||
sr = c:option(Value, "source", translate("source"))
|
||||
sr.placeholder = "192.168.1.1:/mnt/*"
|
||||
sr.rmempty = false
|
||||
sr.optional = false
|
||||
|
||||
ph2 = c:option(Value, "target", translate("target"))
|
||||
ph2.placeholder = "/mnt/nfs/*"
|
||||
ph2.rmempty = false
|
||||
ph2.optional = false
|
||||
|
||||
op = c:option(Value, "options", translate("options"))
|
||||
op.placeholder = "rw,nolock"
|
||||
op.rmempty = false
|
||||
op.optional = false
|
||||
|
||||
de = c:option(Value, "delay", translate("delay"))
|
||||
de.placeholder = "5"
|
||||
de.rmempty = false
|
||||
de.optional = false
|
||||
|
||||
if nixio.fs.access("/etc/config/fstab") then
|
||||
ph1.titleref = luci.dispatcher.build_url("admin", "system", "mounts")
|
||||
ph2.titleref = luci.dispatcher.build_url("admin", "system", "mounts")
|
||||
end
|
||||
|
||||
return m
|
||||
@ -13,8 +13,8 @@ msgstr ""
|
||||
"Language-Team: \n"
|
||||
"X-Generator: Poedit 1.8.1\n"
|
||||
|
||||
msgid "NFS"
|
||||
msgstr "NFS"
|
||||
msgid "NFS Manage"
|
||||
msgstr "NFS 管理"
|
||||
|
||||
msgid "Shared Directories"
|
||||
msgstr "共享目录"
|
||||
@ -28,32 +28,17 @@ msgstr "路径"
|
||||
msgid "Clients"
|
||||
msgstr "允许的客户端"
|
||||
|
||||
msgid "Permission"
|
||||
msgstr "访问权限"
|
||||
|
||||
msgid "anonymous"
|
||||
msgstr "匿名访问"
|
||||
|
||||
msgid "root"
|
||||
msgstr "root"
|
||||
|
||||
msgid "full"
|
||||
msgstr "全部权限"
|
||||
|
||||
msgid "Read-only"
|
||||
msgstr "只读"
|
||||
|
||||
msgid "Insecure"
|
||||
msgstr "禁用安全性"
|
||||
|
||||
msgid "Allow external network access"
|
||||
msgstr "允许外部网络访问"
|
||||
|
||||
msgid "Mounted Points"
|
||||
msgstr "已挂载到本地的NFS"
|
||||
msgstr "已挂载的目录"
|
||||
|
||||
msgid "Host"
|
||||
msgstr "主机"
|
||||
msgid "source"
|
||||
msgstr "源目录"
|
||||
|
||||
msgid "Mount On"
|
||||
msgid "target"
|
||||
msgstr "挂载到"
|
||||
|
||||
msgid "options"
|
||||
msgstr "选项"
|
||||
|
||||
msgid "delay"
|
||||
msgstr "延迟时间"
|
||||
BIN
package/lean/luci-app-nfs/po/zh-cn/nfs.zh-cn.lmo
Normal file
BIN
package/lean/luci-app-nfs/po/zh-cn/nfs.zh-cn.lmo
Normal file
Binary file not shown.
6
package/lean/luci-app-nfs/root/etc/config/nfs
Normal file
6
package/lean/luci-app-nfs/root/etc/config/nfs
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
config share
|
||||
option enabled '0'
|
||||
option path '/mnt'
|
||||
option clients '*'
|
||||
option options 'rw,sync,root_squash,all_squash,insecure,no_subtree_check'
|
||||
86
package/lean/luci-app-nfs/root/etc/init.d/nfs
Normal file
86
package/lean/luci-app-nfs/root/etc/init.d/nfs
Normal file
@ -0,0 +1,86 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
START=45
|
||||
STOP=99
|
||||
NAME="nfs"
|
||||
|
||||
nfs_share() {
|
||||
local config="$1"
|
||||
local enabled
|
||||
local path
|
||||
local clients
|
||||
local options
|
||||
|
||||
config_get_bool enabled "$config" enabled 0
|
||||
|
||||
for opt in path clients options
|
||||
do
|
||||
config_get "$opt" "$config" "$opt"
|
||||
done
|
||||
|
||||
if [ "$enabled" = 1 ]; then
|
||||
grep -qs $path /etc/exports
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "$path\t$clients($options)" >>/etc/exports
|
||||
exportfs -r
|
||||
fi
|
||||
elif [ "$enabled" = 0 ]; then
|
||||
exportfs -u | grep -qs $path
|
||||
if [ $? -eq 0 ]; then
|
||||
exportfs -u $clients:$path
|
||||
fi
|
||||
fi
|
||||
exportfs -r
|
||||
}
|
||||
|
||||
nfs_share_stop() {
|
||||
exportfs -au &>/dev/null
|
||||
}
|
||||
|
||||
nfs_mount() {
|
||||
local config="$1"
|
||||
local enabled
|
||||
local target
|
||||
local source
|
||||
local options
|
||||
local delay
|
||||
|
||||
config_get_bool enabled "$config" enabled 0
|
||||
|
||||
for opt in target source options delay
|
||||
do
|
||||
config_get "$opt" "$config" "$opt"
|
||||
done
|
||||
|
||||
if [ "$enabled" = 1 ]; then
|
||||
if [ "$delay" -a $delay -gt 0 ]; then
|
||||
logger "NetMount: Sleep $delay seconds before mount"
|
||||
sleep $delay
|
||||
fi
|
||||
grep -qs $target /proc/mounts
|
||||
if [ $? -ne 0 ]; then
|
||||
mkdir -p $target
|
||||
logger "NetMount: Mounting $source in $target"
|
||||
mount -t nfs -o $options $source $target
|
||||
fi
|
||||
elif [ "$enabled" = 0 ]; then
|
||||
if grep -qs $target /proc/mounts; then
|
||||
umount -fr $target
|
||||
sleep $delay
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
start() {
|
||||
config_load "$NAME"
|
||||
config_foreach nfs_share share
|
||||
config_foreach nfs_mount mount
|
||||
}
|
||||
|
||||
stop() {
|
||||
nfs_share_stop
|
||||
}
|
||||
|
||||
restart() {
|
||||
echo > /etc/exports
|
||||
start
|
||||
}
|
||||
14
package/lean/luci-app-nfs/root/etc/uci-defaults/nfs
Normal file
14
package/lean/luci-app-nfs/root/etc/uci-defaults/nfs
Normal file
@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@nfs[-1]
|
||||
add ucitrack nfs
|
||||
set ucitrack.@nfs[-1].init=nfs
|
||||
commit ucitrack
|
||||
EOF
|
||||
|
||||
/etc/init.d/nfs enable && /etc/init.d/nfs restart
|
||||
|
||||
rm -f /tmp/luci-indexcache
|
||||
|
||||
exit 0
|
||||
@ -194,6 +194,7 @@ foreach my $mirror (@ARGV) {
|
||||
push @mirrors, "https://downloads.sourceforge.net/$1";
|
||||
}
|
||||
} elsif ($mirror =~ /^\@APACHE\/(.+)$/) {
|
||||
push @mirrors, "https://mirrors.ustc.edu.cn/apache/$1";
|
||||
push @mirrors, "https://mirror.netcologne.de/apache.org/$1";
|
||||
push @mirrors, "https://mirror.aarnet.edu.au/pub/apache/$1";
|
||||
push @mirrors, "https://mirror.csclub.uwaterloo.ca/apache/$1";
|
||||
@ -213,6 +214,7 @@ foreach my $mirror (@ARGV) {
|
||||
push @mirrors, "https://raw.githubusercontent.com/$dir";
|
||||
}
|
||||
} elsif ($mirror =~ /^\@GNU\/(.+)$/) {
|
||||
push @mirrors, "https://mirrors.ustc.edu.cn/gnu/$1";
|
||||
push @mirrors, "https://mirror.csclub.uwaterloo.ca/gnu/$1";
|
||||
push @mirrors, "https://mirror.netcologne.de/gnu/$1";
|
||||
push @mirrors, "http://ftp.kddilabs.jp/GNU/gnu/$1";
|
||||
@ -236,19 +238,20 @@ foreach my $mirror (@ARGV) {
|
||||
push @extra, "$extra[0]/testing";
|
||||
} elsif ($filename =~ /linux-(\d+\.\d+(?:\.\d+)?)/) {
|
||||
push @extra, "$extra[0]/longterm/v$1";
|
||||
}
|
||||
}
|
||||
foreach my $dir (@extra) {
|
||||
push @mirrors, "http://mirrors.ustc.edu.cn/kernel.org/$dir";
|
||||
push @mirrors, "https://mirrors.ustc.edu.cn/kernel.org/$dir";
|
||||
push @mirrors, "https://cdn.kernel.org/pub/$dir";
|
||||
push @mirrors, "https://mirror.rackspace.com/kernel.org/$dir";
|
||||
push @mirrors, "http://download.xs4all.nl/ftp.kernel.org/pub/$dir";
|
||||
push @mirrors, "http://mirrors.mit.edu/kernel/$dir";
|
||||
push @mirrors, "https://mirror.rackspace.com/kernel.org/pub/$dir";
|
||||
push @mirrors, "https://download.xs4all.nl/ftp.kernel.org/pub/$dir";
|
||||
push @mirrors, "https://mirrors.mit.edu/kernel/$dir";
|
||||
push @mirrors, "http://ftp.nara.wide.ad.jp/pub/kernel.org/$dir";
|
||||
push @mirrors, "http://www.ring.gr.jp/archives/linux/kernel.org/$dir";
|
||||
push @mirrors, "ftp://ftp.riken.jp/Linux/kernel.org/$dir";
|
||||
push @mirrors, "ftp://www.mirrorservice.org/sites/ftp.kernel.org/pub/$dir";
|
||||
}
|
||||
} elsif ($mirror =~ /^\@GNOME\/(.+)$/) {
|
||||
push @mirrors, "https://mirrors.ustc.edu.cn/gnome/sources/$1";
|
||||
push @mirrors, "https://mirror.csclub.uwaterloo.ca/gnome/sources/$1";
|
||||
push @mirrors, "http://ftp.acc.umu.se/pub/GNOME/sources/$1";
|
||||
push @mirrors, "http://ftp.kaist.ac.kr/gnome/sources/$1";
|
||||
@ -264,9 +267,8 @@ foreach my $mirror (@ARGV) {
|
||||
}
|
||||
|
||||
#push @mirrors, 'https://mirror1.openwrt.org';
|
||||
push @mirrors, 'https://sources.lede-project.org';
|
||||
push @mirrors, 'https://sources.openwrt.org';
|
||||
push @mirrors, 'https://mirror2.openwrt.org/sources';
|
||||
push @mirrors, 'https://downloads.openwrt.org/sources';
|
||||
|
||||
while (!-f "$target/$filename") {
|
||||
my $mirror = shift @mirrors;
|
||||
@ -276,4 +278,3 @@ while (!-f "$target/$filename") {
|
||||
}
|
||||
|
||||
$SIG{INT} = \&cleanup;
|
||||
|
||||
|
||||
1179
scripts/json_add_image_info.py
Normal file → Executable file
1179
scripts/json_add_image_info.py
Normal file → Executable file
File diff suppressed because it is too large
Load Diff
@ -2,50 +2,7 @@
|
||||
|
||||
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
|
||||
ath9k_eeprom_die() {
|
||||
echo "ath9k eeprom: " "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
ath9k_eeprom_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local mtd
|
||||
|
||||
mtd=$(find_mtd_chardev $part)
|
||||
[ -n "$mtd" ] || \
|
||||
ath9k_eeprom_die "no mtd device found for partition $part"
|
||||
|
||||
dd if=$mtd of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
|
||||
ath9k_eeprom_die "failed to extract from $mtd"
|
||||
}
|
||||
|
||||
ath9k_ubi_eeprom_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local ubidev=$(nand_find_ubi $CI_UBIPART)
|
||||
local ubi
|
||||
|
||||
ubi=$(nand_find_volume $ubidev $part)
|
||||
[ -n "$ubi" ] || \
|
||||
ath9k_eeprom_die "no UBI volume found for $part"
|
||||
|
||||
dd if=/dev/$ubi of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
|
||||
ath9k_eeprom_die "failed to extract from $ubi"
|
||||
}
|
||||
|
||||
ath9k_patch_firmware_mac() {
|
||||
local mac=$1
|
||||
|
||||
[ -z "$mac" ] && return
|
||||
|
||||
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=2 count=6
|
||||
}
|
||||
. /lib/functions/caldata.sh
|
||||
|
||||
board=$(board_name)
|
||||
|
||||
@ -56,14 +13,14 @@ case "$FIRMWARE" in
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
||||
ath9k_ubi_eeprom_extract "caldata" 20480 4096
|
||||
caldata_extract_ubi "caldata" 0x5000 0x1000
|
||||
else
|
||||
ath9k_eeprom_extract "wifi_data" 20480 4096
|
||||
ath9k_patch_firmware_mac $(mtd_get_mac_binary wifi_data 12)
|
||||
caldata_extract "wifi_data" 0x5000 0x1000
|
||||
ath9k_patch_mac $(mtd_get_mac_binary wifi_data 0xc)
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
ath9k_eeprom_die "board $board is not supported yet"
|
||||
caldata_die "board $board is not supported yet"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
@ -74,14 +31,14 @@ case "$FIRMWARE" in
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
||||
ath9k_ubi_eeprom_extract "caldata" 4096 4096
|
||||
caldata_extract_ubi "caldata" 0x1000 0x1000
|
||||
else
|
||||
ath9k_eeprom_extract "wifi_data" 4096 4096
|
||||
ath9k_patch_firmware_mac $(mtd_get_mac_binary wifi_data 0)
|
||||
caldata_extract "wifi_data" 0x1000 0x1000
|
||||
ath9k_patch_mac $(mtd_get_mac_binary wifi_data 0x0)
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
ath9k_eeprom_die "board $board is not supported yet"
|
||||
caldata_die "board $board is not supported yet"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
@ -6,7 +6,7 @@ preinit_set_mac_address() {
|
||||
case $(board_name) in
|
||||
meraki,mr24|\
|
||||
meraki,mx60)
|
||||
mac_lan=$(mtd_get_mac_binary_ubi board-config 102)
|
||||
mac_lan=$(mtd_get_mac_binary_ubi board-config 0x66)
|
||||
[ -n "$mac_lan" ] && ifconfig eth0 hw ether "$mac_lan"
|
||||
;;
|
||||
esac
|
||||
|
||||
@ -650,10 +650,58 @@ ar71xx_setup_macs()
|
||||
[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac
|
||||
}
|
||||
|
||||
ar71xx_setup_ar8xxx_switch()
|
||||
{
|
||||
local board="$1"
|
||||
|
||||
case $board in
|
||||
ap147-010|\
|
||||
archer-c25-v1|\
|
||||
archer-c58-v1|\
|
||||
archer-c59-v1|\
|
||||
archer-c59-v2|\
|
||||
archer-c60-v1|\
|
||||
archer-c60-v2|\
|
||||
archer-c7-v4|\
|
||||
archer-c7-v5|\
|
||||
cf-e375ac|\
|
||||
cf-e385ac|\
|
||||
cr3000|\
|
||||
dhp-1565-a1|\
|
||||
mynet-n600|\
|
||||
rb-2011il|\
|
||||
rb-2011ils|\
|
||||
rb-2011l|\
|
||||
rb-2011uas|\
|
||||
rb-2011uas-2hnd|\
|
||||
rb-2011uias|\
|
||||
rb-2011uias-2hnd|\
|
||||
rb-750|\
|
||||
rb-750p-pbr2|\
|
||||
rb-750-r2|\
|
||||
rb-750up-r2|\
|
||||
rb-951ui-2nd|\
|
||||
rb-952ui-5ac2nd|\
|
||||
rb-map-2nd|\
|
||||
tl-wr1043nd-v4|\
|
||||
tl-wr1043n-v5|\
|
||||
wndr3700v4|\
|
||||
wndr4300|\
|
||||
wnr1000-v2|\
|
||||
wnr2000-v3|\
|
||||
wnr2200|\
|
||||
wnr612-v2|\
|
||||
wpn824n)
|
||||
ucidef_set_ar8xxx_switch_mib "switch0" 0 500
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
board_config_update
|
||||
board=$(board_name)
|
||||
ar71xx_setup_interfaces $board
|
||||
ar71xx_setup_macs $board
|
||||
ar71xx_setup_ar8xxx_switch $board
|
||||
board_config_flush
|
||||
|
||||
exit 0
|
||||
|
||||
@ -12,8 +12,8 @@ ath9k_eeprom_die() {
|
||||
|
||||
ath9k_eeprom_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local offset=$(($2))
|
||||
local count=$(($3))
|
||||
local mtd
|
||||
|
||||
mtd=$(find_mtd_chardev $part)
|
||||
@ -26,8 +26,8 @@ ath9k_eeprom_extract() {
|
||||
|
||||
ath9k_ubi_eeprom_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local offset=$(($2))
|
||||
local count=$(($3))
|
||||
local ubidev=$(nand_find_ubi $CI_UBIPART)
|
||||
local ubi
|
||||
|
||||
@ -42,7 +42,7 @@ ath9k_ubi_eeprom_extract() {
|
||||
ath9k_eeprom_extract_reverse() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local count=$(($3))
|
||||
local mtd
|
||||
local reversed
|
||||
local caldata
|
||||
@ -72,53 +72,53 @@ case "$FIRMWARE" in
|
||||
case $board in
|
||||
c-55|\
|
||||
c-60)
|
||||
ath9k_eeprom_extract "art" 4096 2048
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary art 0) +1)
|
||||
ath9k_eeprom_extract "art" 0x1000 0x800
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary art 0x0) +1)
|
||||
;;
|
||||
fritz4020|\
|
||||
fritz450e)
|
||||
ath9k_eeprom_extract_reverse "urlader" 5441 1088
|
||||
ath9k_eeprom_extract_reverse "urlader" 0x1541 0x440
|
||||
;;
|
||||
k2t)
|
||||
ath9k_eeprom_extract "art" 4096 2048
|
||||
ath9k_eeprom_extract "art" 0x1000 0x800
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +3)
|
||||
;;
|
||||
sbr-ac1750)
|
||||
ath9k_eeprom_extract "art" 4096 2048
|
||||
ath9k_eeprom_extract "art" 0x1000 0x800
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
|
||||
;;
|
||||
mr18)
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
||||
ath9k_ubi_eeprom_extract "caldata" 4096 2048
|
||||
ath9k_ubi_eeprom_extract "caldata" 0x1000 0x800
|
||||
else
|
||||
ath9k_eeprom_extract "odm-caldata" 4096 2048
|
||||
ath9k_eeprom_extract "odm-caldata" 0x1000 0x800
|
||||
fi
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +1)
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 0x66) +1)
|
||||
;;
|
||||
r6100 | \
|
||||
wndr3700v4 | \
|
||||
wndr4300)
|
||||
ath9k_eeprom_extract "caldata" 4096 2048
|
||||
ath9k_patch_firmware_mac $(mtd_get_mac_binary caldata 0)
|
||||
ath9k_eeprom_extract "caldata" 0x1000 0x800
|
||||
ath9k_patch_firmware_mac $(mtd_get_mac_binary caldata 0x0)
|
||||
;;
|
||||
rambutan)
|
||||
ath9k_eeprom_extract "art" 4096 2048
|
||||
ath9k_eeprom_extract "art" 0x1000 0x800
|
||||
;;
|
||||
wlr8100)
|
||||
ath9k_eeprom_extract "art" 4096 2048
|
||||
ath9k_eeprom_extract "art" 0x1000 0x800
|
||||
ath9k_patch_firmware_mac $(mtd_get_mac_ascii u-boot-env "ethaddr")
|
||||
;;
|
||||
z1)
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
||||
ath9k_ubi_eeprom_extract "caldata" 4096 2048
|
||||
ath9k_ubi_eeprom_extract "caldata" 0x1000 0x800
|
||||
else
|
||||
ath9k_eeprom_extract "origcaldata" 4096 2048
|
||||
ath9k_eeprom_extract "origcaldata" 0x1000 0x800
|
||||
fi
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +2)
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 0x66) +2)
|
||||
;;
|
||||
*)
|
||||
ath9k_eeprom_die "board $board is not supported yet"
|
||||
@ -129,36 +129,36 @@ case "$FIRMWARE" in
|
||||
"pci_wmac0.eeprom")
|
||||
case $board in
|
||||
c-55)
|
||||
ath9k_eeprom_extract "art" 20480 2048
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary art 0) +2)
|
||||
ath9k_eeprom_extract "art" 0x5000 0x800
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary art 0x0) +2)
|
||||
;;
|
||||
fritz300e)
|
||||
ath9k_eeprom_extract_reverse "urloader" 5441 1088
|
||||
ath9k_eeprom_extract_reverse "urloader" 0x1541 0x440
|
||||
;;
|
||||
mr18)
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
||||
ath9k_ubi_eeprom_extract "caldata" 20480 2048
|
||||
ath9k_ubi_eeprom_extract "caldata" 0x1541 0x440
|
||||
else
|
||||
ath9k_eeprom_extract "odm-caldata" 20480 2048
|
||||
ath9k_eeprom_extract "odm-caldata" 0x5000 0x800
|
||||
fi
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +2)
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 0x66) +2)
|
||||
;;
|
||||
wndr3700v4 | \
|
||||
wndr4300)
|
||||
ath9k_eeprom_extract "caldata" 20480 2048
|
||||
ath9k_patch_firmware_mac $(mtd_get_mac_binary caldata 12)
|
||||
ath9k_eeprom_extract "caldata" 0x5000 0x800
|
||||
ath9k_patch_firmware_mac $(mtd_get_mac_binary caldata 0xc)
|
||||
;;
|
||||
z1)
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
||||
ath9k_ubi_eeprom_extract "caldata" 86016 4096
|
||||
ath9k_ubi_eeprom_extract "caldata" 0x15000 0x1000
|
||||
else
|
||||
ath9k_eeprom_extract "origcaldata" 86016 4096
|
||||
ath9k_eeprom_extract "origcaldata" 0x15000 0x1000
|
||||
fi
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +3)
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 0x66) +3)
|
||||
;;
|
||||
*)
|
||||
ath9k_eeprom_die "board $board is not supported yet"
|
||||
@ -172,11 +172,11 @@ case "$FIRMWARE" in
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
||||
ath9k_ubi_eeprom_extract "caldata" 36864 2048
|
||||
ath9k_ubi_eeprom_extract "caldata" 0x9000 0x800
|
||||
else
|
||||
ath9k_eeprom_extract "odm-caldata" 36864 2048
|
||||
ath9k_eeprom_extract "odm-caldata" 0x9000 0x800
|
||||
fi
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +3)
|
||||
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 0x66) +3)
|
||||
;;
|
||||
*)
|
||||
ath9k_eeprom_die "board $board is not supported yet"
|
||||
|
||||
@ -1,21 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
# xor multiple hex values of the same length
|
||||
xor() {
|
||||
local val
|
||||
local ret="0x$1"
|
||||
local retlen=${#1}
|
||||
|
||||
shift
|
||||
while [ -n "$1" ]; do
|
||||
val="0x$1"
|
||||
ret=$((ret ^ val))
|
||||
shift
|
||||
done
|
||||
|
||||
printf "%0${retlen}x" "$ret"
|
||||
}
|
||||
|
||||
ath10kcal_die() {
|
||||
echo "ath10cal: " "$*"
|
||||
exit 1
|
||||
@ -23,8 +7,8 @@ ath10kcal_die() {
|
||||
|
||||
ath10kcal_from_file() {
|
||||
local source=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local offset=$(($2))
|
||||
local count=$(($3))
|
||||
|
||||
dd if=$source of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
|
||||
ath10kcal_die "failed to extract calibration data from $source"
|
||||
@ -32,8 +16,8 @@ ath10kcal_from_file() {
|
||||
|
||||
ath10kcal_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local offset=$(($2))
|
||||
local count=$(($3))
|
||||
local mtd cal_size
|
||||
|
||||
mtd=$(find_mtd_chardev $part)
|
||||
@ -55,30 +39,7 @@ ath10kcal_patch_mac() {
|
||||
|
||||
[ -z "$mac" ] && return
|
||||
|
||||
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6
|
||||
}
|
||||
|
||||
ath10kcal_patch_mac_crc() {
|
||||
local mac=$1
|
||||
local mac_offset=6
|
||||
local chksum_offset=2
|
||||
local xor_mac
|
||||
local xor_fw_mac
|
||||
local xor_fw_chksum
|
||||
|
||||
xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
|
||||
|
||||
ath10kcal_patch_mac "$mac" && {
|
||||
xor_mac=${mac//:/}
|
||||
xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
|
||||
|
||||
xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
|
||||
|
||||
printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
|
||||
dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2
|
||||
}
|
||||
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc oflag=seek_bytes bs=6 seek=6 count=1
|
||||
}
|
||||
|
||||
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
||||
@ -96,17 +57,17 @@ case "$FIRMWARE" in
|
||||
mr1750|\
|
||||
mr1750v2|\
|
||||
om5p-acv2)
|
||||
ath10kcal_extract "ART" 20480 2116
|
||||
ath10kcal_extract "ART" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16)
|
||||
;;
|
||||
archer-c25-v1|\
|
||||
tl-wdr6500-v2)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -2)
|
||||
;;
|
||||
archer-c7-v4|\
|
||||
archer-c7-v5)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -1)
|
||||
;;
|
||||
cf-e355ac-v1|\
|
||||
@ -119,64 +80,64 @@ case "$FIRMWARE" in
|
||||
oolite-v5.2-dev|\
|
||||
sr3200|\
|
||||
xd3200)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
;;
|
||||
dap-2695-a1)
|
||||
ath10kcal_extract "radiocfg" 20480 2116
|
||||
ath10kcal_extract "radiocfg" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac_a)
|
||||
;;
|
||||
dir-869-a1|\
|
||||
qihoo-c301)
|
||||
ath10kcal_extract "radiocfg" 20480 2116
|
||||
ath10kcal_extract "radiocfg" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(mtd_get_mac_ascii devdata wlan5mac)
|
||||
;;
|
||||
dw33d)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_patch_mac $(mtd_get_mac_binary art 18)
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(mtd_get_mac_binary art 0x12)
|
||||
;;
|
||||
sbr-ac1750)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(cat /sys/class/net/eth1/address) +1)
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) +1)
|
||||
;;
|
||||
epg5000|\
|
||||
esr1750)
|
||||
ath10kcal_extract "caldata" 20480 2116
|
||||
ath10kcal_extract "caldata" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
|
||||
;;
|
||||
gl-ar750s|\
|
||||
gl-ar750|\
|
||||
tl-wpa8630)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
|
||||
;;
|
||||
koala)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_patch_mac $(macaddr_add $(mtd_get_mac_binary art 12) +0)
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0xc) +0)
|
||||
;;
|
||||
mc-mac1200r)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -1)
|
||||
;;
|
||||
r6100)
|
||||
ath10kcal_extract "caldata" 20480 2116
|
||||
ath10kcal_extract "caldata" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) +2)
|
||||
;;
|
||||
rb-952ui-5ac2nd|\
|
||||
rb-wapg-5hact2hnd)
|
||||
ath10kcal_from_file "/sys/firmware/routerboot/ext_wlan_data" 20480 2116
|
||||
ath10kcal_from_file "/sys/firmware/routerboot/ext_wlan_data" 0x5000 0x844
|
||||
;;
|
||||
re355|\
|
||||
re450|\
|
||||
tl-wr902ac-v1)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -2)
|
||||
;;
|
||||
unifiac-lite|\
|
||||
unifiac-pro)
|
||||
ath10kcal_extract "EEPROM" 20480 2116
|
||||
ath10kcal_extract "EEPROM" 0x5000 0x844
|
||||
;;
|
||||
wi2a-ac200i)
|
||||
ath10kcal_extract "ART" 20480 2116
|
||||
ath10kcal_extract "ART" 0x5000 0x844
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
@ -184,25 +145,25 @@ case "$FIRMWARE" in
|
||||
case $board in
|
||||
archer-c5|\
|
||||
archer-c7)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -2)
|
||||
;;
|
||||
nbg6616|\
|
||||
nbg6716)
|
||||
ath10kcal_extract "RFdata" 20480 2116
|
||||
ath10kcal_extract "RFdata" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -2)
|
||||
;;
|
||||
om5p-ac)
|
||||
ath10kcal_extract "ART" 20480 2116
|
||||
ath10kcal_extract "ART" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16)
|
||||
;;
|
||||
rb-911g-5hpacd|\
|
||||
rb-921gs-5hpacd-r2|\
|
||||
rb-962uigs-5hact2hnt)
|
||||
ath10kcal_from_file "/sys/firmware/routerboot/ext_wlan_data" 20480 2116
|
||||
ath10kcal_from_file "/sys/firmware/routerboot/ext_wlan_data" 0x5000 0x844
|
||||
;;
|
||||
wlr8100)
|
||||
ath10kcal_extract "art" 20480 2116
|
||||
ath10kcal_extract "art" 0x5000 0x844
|
||||
ath10kcal_patch_mac $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +1)
|
||||
;;
|
||||
esac
|
||||
@ -213,24 +174,29 @@ case "$FIRMWARE" in
|
||||
archer-c59-v1|\
|
||||
archer-c59-v2|\
|
||||
archer-c60-v1|\
|
||||
archer-c60-v2|\
|
||||
cf-e355ac-v2|\
|
||||
cf-e375ac)
|
||||
ath10kcal_extract "art" 20480 12064
|
||||
ath10kcal_extract "art" 0x5000 0x2f20
|
||||
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
||||
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
||||
;;
|
||||
archer-c60-v2)
|
||||
ath10kcal_extract "art" 0x5000 0x2f20
|
||||
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
||||
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
||||
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -1)
|
||||
;;
|
||||
cf-e385ac)
|
||||
ath10kcal_extract "art" 20480 12064
|
||||
ath10kcal_extract "art" 0x5000 0x2f20
|
||||
;;
|
||||
k2t)
|
||||
ath10kcal_extract "art" 20480 12064
|
||||
ath10kcal_extract "art" 0x5000 0x2f20
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(cat /sys/class/net/eth0/address) +2)
|
||||
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
||||
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
||||
;;
|
||||
tl-wdr6500-v6)
|
||||
ath10kcal_extract "art" 8192 12064
|
||||
tl-wdr6500-v6)
|
||||
ath10kcal_extract "art" 0x2000 0x2f20
|
||||
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
||||
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
||||
;;
|
||||
|
||||
@ -17,7 +17,7 @@ case "$board" in
|
||||
archer-c59-v2|\
|
||||
archer-c60-v1|\
|
||||
archer-c60-v2)
|
||||
echo $(macaddr_add $(mtd_get_mac_binary mac 8) $(($PHYNBR - 1)) ) > /sys${DEVPATH}/macaddress
|
||||
echo $(macaddr_add $(mtd_get_mac_binary mac 0x8) $(($PHYNBR - 1)) ) > /sys${DEVPATH}/macaddress
|
||||
;;
|
||||
tl-wdr6500-v6)
|
||||
echo $(macaddr_add $(mtd_get_mac_binary art 2061) $(($PHYNBR - 2)) ) > /sys${DEVPATH}/macaddress
|
||||
@ -25,4 +25,3 @@ case "$board" in
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
@ -12,6 +12,9 @@
|
||||
devdir=$(dirname $DEVPATH)
|
||||
devdir=$(dirname $devdir)
|
||||
phydir=/sys$devdir/ieee80211
|
||||
|
||||
[ -d $phydir ] || exit 0
|
||||
|
||||
phyname=$(cat $phydir/phy*/name)
|
||||
|
||||
[ -z $phyname -o $ACTION != "add" ] && exit 0
|
||||
|
||||
@ -24,7 +24,7 @@ preinit_set_mac_address() {
|
||||
case $(board_name) in
|
||||
c-55|\
|
||||
c-60)
|
||||
mac_lan=$(mtd_get_mac_binary art 0)
|
||||
mac_lan=$(mtd_get_mac_binary art 0x0)
|
||||
[ -n "$mac_lan" ] && ifconfig eth0 hw ether "$mac_lan"
|
||||
;;
|
||||
dir-615-c1|\
|
||||
@ -40,28 +40,28 @@ preinit_set_mac_address() {
|
||||
;;
|
||||
mr18|\
|
||||
z1)
|
||||
mac_lan=$(mtd_get_mac_binary_ubi board-config 102)
|
||||
mac_lan=$(mtd_get_mac_binary_ubi board-config 0x66)
|
||||
[ -n "$mac_lan" ] && ifconfig eth0 hw ether "$mac_lan"
|
||||
;;
|
||||
r6100)
|
||||
mac_lan=$(mtd_get_mac_binary caldata 0)
|
||||
mac_lan=$(mtd_get_mac_binary caldata 0x0)
|
||||
[ -n "$mac_lan" ] && ifconfig eth1 hw ether "$mac_lan"
|
||||
mac_wan=$(mtd_get_mac_binary caldata 6)
|
||||
mac_wan=$(mtd_get_mac_binary caldata 0x6)
|
||||
[ -n "$mac_wan" ] && ifconfig eth0 hw ether "$mac_wan"
|
||||
;;
|
||||
rambutan)
|
||||
mac_lan=$(mtd_get_mac_binary art 0)
|
||||
mac_lan=$(mtd_get_mac_binary art 0x0)
|
||||
[ -n "$mac_lan" ] && ifconfig eth0 hw ether "$mac_lan"
|
||||
mac_wan=$(mtd_get_mac_binary art 6)
|
||||
mac_wan=$(mtd_get_mac_binary art 0x6)
|
||||
[ -n "$mac_wan" ] && ifconfig eth1 hw ether "$mac_wan"
|
||||
;;
|
||||
wrt160nl)
|
||||
fetch_mac_from_mtd nvram lan_hwaddr wan_hwaddr
|
||||
;;
|
||||
sbr-ac1750)
|
||||
mac_lan=$(mtd_get_mac_binary ft 0)
|
||||
mac_lan=$(mtd_get_mac_binary ft 0x0)
|
||||
[ -n "$mac_lan" ] && ifconfig eth1 hw ether "$mac_lan"
|
||||
mac_wan=$(mtd_get_mac_binary ft 18)
|
||||
mac_wan=$(mtd_get_mac_binary ft 0x12)
|
||||
[ -n "$mac_wan" ] && ifconfig eth0 hw ether "$mac_wan"
|
||||
;;
|
||||
esac
|
||||
|
||||
@ -11,11 +11,6 @@ board=$(board_name)
|
||||
boardname="${board##*,}"
|
||||
|
||||
case "$board" in
|
||||
p2w,r619ac |\
|
||||
p2w,r619ac-128m)
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "r619ac:blue:wlan2g" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "r619ac:blue:wlan5g" "phy1tpt"
|
||||
;;
|
||||
asus,rt-ac58u)
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "${boardname}:blue:wlan2G" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "${boardname}:blue:wlan5G" "phy1tpt"
|
||||
@ -46,15 +41,20 @@ engenius,eap1300)
|
||||
glinet,gl-b1300)
|
||||
ucidef_set_led_wlan "wlan" "WLAN" "${boardname}:green:wlan" "phy0tpt"
|
||||
;;
|
||||
hugo,ac1200)
|
||||
ucidef_set_led_default "green" "GREEN" "${boardname}:green:ctrl1" "1"
|
||||
ucidef_set_led_default "red" "RED" "${boardname}:red:ctrl2" "1"
|
||||
ucidef_set_led_default "blue" "BLUE" "${boardname}:blue:ctrl3" "1"
|
||||
;;
|
||||
netgear,ex6100v2 |\
|
||||
netgear,ex6150v2)
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "ex61x0v2:green:router" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "ex61x0v2:green:client" "phy1tpt"
|
||||
;;
|
||||
hugo,ac1200)
|
||||
ucidef_set_led_default "green" "GREEN" "${boardname}:green:ctrl1" "1"
|
||||
ucidef_set_led_default "red" "RED" "${boardname}:red:ctrl2" "1"
|
||||
ucidef_set_led_default "blue" "BLUE" "${boardname}:blue:ctrl3" "1"
|
||||
p2w,r619ac |\
|
||||
p2w,r619ac-128m)
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "r619ac:blue:wlan2g" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "r619ac:blue:wlan5g" "phy1tpt"
|
||||
;;
|
||||
zyxel,nbg6617)
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "${boardname}:green:wlan2G" "phy0tpt"
|
||||
|
||||
@ -16,24 +16,20 @@ ipq40xx_setup_interfaces()
|
||||
ucidef_add_switch "switch0" \
|
||||
"0t@eth0" "4:lan" "5:wan"
|
||||
;;
|
||||
p2w,r619ac|\
|
||||
p2w,r619ac-128m|\
|
||||
zyxel,nbg6617)
|
||||
ucidef_add_switch "switch0" \
|
||||
"0t@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "5:wan:5"
|
||||
;;
|
||||
asus,map-ac2200|\
|
||||
openmesh,a42|\
|
||||
openmesh,a62)
|
||||
ucidef_add_switch "switch0" \
|
||||
"0t@eth0" "5:lan" "4:wan"
|
||||
;;
|
||||
hugo,ac1200)
|
||||
asus,rt-ac58u|\
|
||||
p2w,r619ac|\
|
||||
p2w,r619ac-128m|\
|
||||
zyxel,nbg6617)
|
||||
ucidef_add_switch "switch0" \
|
||||
"0t@eth0" "5:wan" "3:lan"
|
||||
"0t@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "5:wan"
|
||||
;;
|
||||
asus,rt-acrh17|\
|
||||
asus,rt-ac58u|\
|
||||
avm,fritzbox-4040|\
|
||||
linksys,ea6350v3)
|
||||
ucidef_add_switch "switch0" \
|
||||
@ -53,6 +49,10 @@ ipq40xx_setup_interfaces()
|
||||
ucidef_add_switch "switch0" \
|
||||
"0t@eth0" "3:lan" "4:lan" "5:wan"
|
||||
;;
|
||||
hugo,ac1200)
|
||||
ucidef_add_switch "switch0" \
|
||||
"0t@eth0" "5:wan" "3:lan"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported hardware. Network interfaces not initialized"
|
||||
;;
|
||||
@ -62,6 +62,9 @@ ipq40xx_setup_interfaces()
|
||||
ipq40xx_setup_macs()
|
||||
{
|
||||
local board="$1"
|
||||
local lan_mac=""
|
||||
local wan_mac=""
|
||||
local label_mac=""
|
||||
|
||||
case "$board" in
|
||||
asus,rt-acrh17|\
|
||||
@ -81,8 +84,9 @@ ipq40xx_setup_macs()
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac
|
||||
[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac
|
||||
[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac
|
||||
[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac
|
||||
[ -n "$label_mac" ] && ucidef_set_label_macaddr $label_mac
|
||||
}
|
||||
|
||||
board_config_update
|
||||
|
||||
@ -1,126 +1,38 @@
|
||||
#!/bin/sh
|
||||
|
||||
# xor multiple hex values of the same length
|
||||
xor() {
|
||||
local val
|
||||
local ret="0x$1"
|
||||
local retlen=${#1}
|
||||
|
||||
shift
|
||||
while [ -n "$1" ]; do
|
||||
val="0x$1"
|
||||
ret=$((ret ^ val))
|
||||
shift
|
||||
done
|
||||
|
||||
printf "%0${retlen}x" "$ret"
|
||||
}
|
||||
|
||||
ath10kcal_die() {
|
||||
echo "ath10cal: " "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
ath10kcal_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local mtd
|
||||
|
||||
mtd=$(find_mtd_chardev $part)
|
||||
[ -n "$mtd" ] || \
|
||||
ath10kcal_die "no mtd device found for partition $part"
|
||||
|
||||
dd if=$mtd of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
|
||||
ath10kcal_die "failed to extract calibration data from $mtd"
|
||||
}
|
||||
|
||||
ath10kcal_ubi_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local ubidev
|
||||
local ubi
|
||||
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
ubidev=$(nand_find_ubi $CI_UBIPART)
|
||||
ubi=$(nand_find_volume $ubidev $part)
|
||||
[ -n "$ubi" ] || \
|
||||
ath10kcal_die "no UBI volume found for $part"
|
||||
|
||||
dd if=/dev/$ubi of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
|
||||
ath10kcal_die "failed to extract from $ubi"
|
||||
}
|
||||
|
||||
ath10kcal_patch_mac_crc() {
|
||||
local mac=$1
|
||||
local mac_offset=6
|
||||
local chksum_offset=2
|
||||
local xor_mac
|
||||
local xor_fw_mac
|
||||
local xor_fw_chksum
|
||||
|
||||
[ -z "$mac" ] && return
|
||||
|
||||
xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
|
||||
|
||||
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6
|
||||
|
||||
xor_mac=${mac//:/}
|
||||
xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
|
||||
|
||||
xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
|
||||
|
||||
printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
|
||||
dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2
|
||||
}
|
||||
|
||||
ath10kcal_is_caldata_valid() {
|
||||
local expected="$1"
|
||||
|
||||
magic=$(hexdump -v -n 2 -e '1/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
[[ "$magic" == "$expected" ]]
|
||||
return $?
|
||||
}
|
||||
|
||||
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
. /lib/functions/caldata.sh
|
||||
|
||||
board=$(board_name)
|
||||
|
||||
|
||||
case "$FIRMWARE" in
|
||||
"ath10k/cal-pci-0000:01:00.0.bin")
|
||||
case "$board" in
|
||||
meraki,mr33)
|
||||
ath10kcal_ubi_extract "ART" 36864 2116
|
||||
ath10kcal_is_caldata_valid "4408" || ath10kcal_extract "ART" 36864 2116
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102) +1)
|
||||
caldata_extract_ubi "ART" 0x9000 0x844
|
||||
caldata_valid "4408" || caldata_extract "ART" 0x9000 0x844
|
||||
ath10k_patch_mac $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 0x66) +1)
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
"ath10k/pre-cal-pci-0000:01:00.0.bin")
|
||||
case "$board" in
|
||||
asus,map-ac2200)
|
||||
ath10kcal_ubi_extract "Factory" 36864 12064
|
||||
caldata_extract_ubi "Factory" 0x9000 0x2f20
|
||||
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
||||
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
||||
;;
|
||||
asus,rt-acrh17)
|
||||
CI_UBIPART=UBI_DEV
|
||||
ath10kcal_ubi_extract "Factory" 36864 12064
|
||||
caldata_extract_ubi "Factory" 0x9000 0x2f20
|
||||
;;
|
||||
openmesh,a62)
|
||||
ath10kcal_extract "0:ART" 36864 12064
|
||||
caldata_extract "0:ART" 0x9000 0x2f20
|
||||
;;
|
||||
p2w,r619ac |\
|
||||
p2w,r619ac-128m)
|
||||
ath10kcal_extract "ART" 36864 12064
|
||||
caldata_extract "ART" 0x9000 0x2f20
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
@ -132,40 +44,40 @@ case "$FIRMWARE" in
|
||||
p2w,r619ac |\
|
||||
p2w,r619ac-128m |\
|
||||
qcom,ap-dk01.1-c1)
|
||||
ath10kcal_extract "ART" 4096 12064
|
||||
caldata_extract "ART" 0x1000 0x2f20
|
||||
;;
|
||||
asus,map-ac2200)
|
||||
ath10kcal_ubi_extract "Factory" 4096 12064
|
||||
caldata_extract_ubi "Factory" 0x1000 0x2f20
|
||||
;;
|
||||
asus,rt-acrh17|\
|
||||
asus,rt-ac58u)
|
||||
CI_UBIPART=UBI_DEV
|
||||
ath10kcal_ubi_extract "Factory" 4096 12064
|
||||
caldata_extract_ubi "Factory" 0x1000 0x2f20
|
||||
;;
|
||||
avm,fritzbox-4040)
|
||||
/usr/bin/fritz_cal_extract -i 1 -s 0x400 -e 0x207 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader_config")
|
||||
;;
|
||||
meraki,mr33)
|
||||
ath10kcal_ubi_extract "ART" 4096 12064
|
||||
ath10kcal_is_caldata_valid "202f" || ath10kcal_extract "ART" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102) +2)
|
||||
;;
|
||||
netgear,ex6100v2 |\
|
||||
netgear,ex6150v2)
|
||||
ath10kcal_extract "ART" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(mtd_get_mac_binary dnidata 0)
|
||||
;;
|
||||
compex,wpj428 |\
|
||||
engenius,eap1300 |\
|
||||
hugo,ac1200 |\
|
||||
openmesh,a42 |\
|
||||
openmesh,a62)
|
||||
ath10kcal_extract "0:ART" 4096 12064
|
||||
caldata_extract "0:ART" 0x1000 0x2f20
|
||||
;;
|
||||
meraki,mr33)
|
||||
caldata_extract_ubi "ART" 0x1000 0x2f20
|
||||
caldata_valid "202f" || caldata_extract 0x1000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 0x66) +2)
|
||||
;;
|
||||
netgear,ex6100v2 |\
|
||||
netgear,ex6150v2)
|
||||
caldata_extract "ART" 0x1000 0x2f20
|
||||
ath10k_patch_mac $(mtd_get_mac_binary dnidata 0x0)
|
||||
;;
|
||||
zyxel,nbg6617 |\
|
||||
zyxel,wre6606)
|
||||
ath10kcal_extract "ART" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(cat /sys/class/net/eth0/address) -2)
|
||||
caldata_extract "ART" 0x1000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -2)
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
@ -177,39 +89,39 @@ case "$FIRMWARE" in
|
||||
p2w,r619ac |\
|
||||
p2w,r619ac-128m |\
|
||||
qcom,ap-dk01.1-c1)
|
||||
ath10kcal_extract "ART" 20480 12064
|
||||
caldata_extract "ART" 0x5000 0x2f20
|
||||
;;
|
||||
asus,map-ac2200)
|
||||
ath10kcal_ubi_extract "Factory" 20480 12064
|
||||
caldata_extract "Factory" 0x5000 0x2f20
|
||||
;;
|
||||
asus,rt-ac58u)
|
||||
CI_UBIPART=UBI_DEV
|
||||
ath10kcal_ubi_extract "Factory" 20480 12064
|
||||
caldata_extract_ubi "Factory" 0x5000 0x2f20
|
||||
;;
|
||||
avm,fritzbox-4040)
|
||||
/usr/bin/fritz_cal_extract -i 1 -s 0x400 -e 0x208 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader_config")
|
||||
;;
|
||||
meraki,mr33)
|
||||
ath10kcal_ubi_extract "ART" 20480 12064
|
||||
ath10kcal_is_caldata_valid "202f" || ath10kcal_extract "ART" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102) +3)
|
||||
;;
|
||||
netgear,ex6100v2 |\
|
||||
netgear,ex6150v2)
|
||||
ath10kcal_extract "ART" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(mtd_get_mac_binary dnidata 12)
|
||||
;;
|
||||
compex,wpj428 |\
|
||||
engenius,eap1300 |\
|
||||
hugo,ac1200 |\
|
||||
openmesh,a42 |\
|
||||
openmesh,a62)
|
||||
ath10kcal_extract "0:ART" 20480 12064
|
||||
caldata_extract "0:ART" 0x5000 0x2f20
|
||||
;;
|
||||
meraki,mr33)
|
||||
caldata_extract_ubi "ART" 0x5000 0x2f20
|
||||
caldata_valid "202f" || caldata_extract "ART" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 0x66) +3)
|
||||
;;
|
||||
netgear,ex6100v2 |\
|
||||
netgear,ex6150v2)
|
||||
caldata_extract "ART" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(mtd_get_mac_binary dnidata 0xc)
|
||||
;;
|
||||
zyxel,nbg6617 |\
|
||||
zyxel,wre6606)
|
||||
ath10kcal_extract "ART" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(cat /sys/class/net/eth0/address) -1)
|
||||
caldata_extract "ART" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -1)
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
@ -5,23 +5,24 @@
|
||||
preinit_set_mac_address() {
|
||||
case $(board_name) in
|
||||
asus,map-ac2200)
|
||||
base_mac=$(mtd_get_mac_binary_ubi Factory 4102)
|
||||
base_mac=$(mtd_get_mac_binary_ubi Factory 0x1006)
|
||||
ip link set dev eth0 address $(macaddr_add "$base_mac" +1)
|
||||
ip link set dev eth1 address $(macaddr_add "$base_mac" +3)
|
||||
;;
|
||||
asus,rt-acrh17|\
|
||||
asus,rt-ac58u)
|
||||
CI_UBIPART=UBI_DEV
|
||||
mac=$(macaddr_add $(mtd_get_mac_binary_ubi Factory 4102) +1)
|
||||
mac=$(macaddr_add $(mtd_get_mac_binary_ubi Factory 0x1006) +1)
|
||||
ifconfig eth0 hw ether $mac 2>/dev/null
|
||||
;;
|
||||
meraki,mr33)
|
||||
mac_lan=$(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102)
|
||||
mac_lan=$(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 0x66)
|
||||
[ -n "$mac_lan" ] && ip link set dev eth0 address "$mac_lan"
|
||||
;;
|
||||
zyxel,nbg6617)
|
||||
base_mac=$(cat /sys/class/net/eth0/address)
|
||||
ip link set dev eth0 address $(macaddr_add "$base_mac" +2)
|
||||
ip link set dev eth1 address $(macaddr_add "$base_mac" +3)
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
@ -165,6 +165,19 @@ define Device/glinet_gl-b1300
|
||||
endef
|
||||
TARGET_DEVICES += glinet_gl-b1300
|
||||
|
||||
define Device/hugo_ac1200
|
||||
$(call Device/FitImage)
|
||||
DEVICE_TITLE := Hugo AC1200
|
||||
BOARD_NAME := hugo_ac1200
|
||||
DEVICE_DTS := qcom-ipq4019-hugo-ac1200
|
||||
KERNEL_SIZE := 4096k
|
||||
IMAGE_SIZE := 31232k
|
||||
IMAGES := sysupgrade.bin
|
||||
IMAGE/sysupgrade.bin := append-kernel | append-rootfs | pad-rootfs | append-metadata
|
||||
DEVICE_PACKAGES := ipq-wifi-hugo_ac1200
|
||||
endef
|
||||
TARGET_DEVICES += hugo_ac1200
|
||||
|
||||
define Device/linksys_ea6350v3
|
||||
# The Linksys EA6350v3 has a uboot bootloader that does not
|
||||
# support either booting lzma kernel images nor booting UBI
|
||||
@ -260,22 +273,8 @@ define Device/openmesh_a62
|
||||
IMAGE/sysupgrade.bin/squashfs := append-rootfs | pad-rootfs | sysupgrade-tar rootfs=$$$$@ | append-metadata
|
||||
DEVICE_PACKAGES := ath10k-firmware-qca9888-ct uboot-envtools
|
||||
endef
|
||||
|
||||
TARGET_DEVICES += openmesh_a62
|
||||
|
||||
define Device/qcom_ap-dk01.1-c1
|
||||
DEVICE_TITLE := QCA AP-DK01.1-C1
|
||||
BOARD_NAME := ap-dk01.1-c1
|
||||
DEVICE_DTS := qcom-ipq4019-ap.dk01.1-c1
|
||||
KERNEL_INSTALL := 1
|
||||
KERNEL_SIZE := 4096k
|
||||
IMAGE_SIZE := 26624k
|
||||
$(call Device/FitImage)
|
||||
IMAGES := sysupgrade.bin
|
||||
IMAGE/sysupgrade.bin := append-kernel | pad-to $$$${KERNEL_SIZE} | append-rootfs | pad-rootfs | append-metadata
|
||||
endef
|
||||
TARGET_DEVICES += qcom_ap-dk01.1-c1
|
||||
|
||||
define Device/p2w_r619ac
|
||||
$(call Device/FitzImage)
|
||||
$(call Device/UbiFit)
|
||||
@ -305,6 +304,19 @@ define Device/p2w_r619ac-128m
|
||||
endef
|
||||
TARGET_DEVICES += p2w_r619ac-128m
|
||||
|
||||
define Device/qcom_ap-dk01.1-c1
|
||||
DEVICE_TITLE := QCA AP-DK01.1-C1
|
||||
BOARD_NAME := ap-dk01.1-c1
|
||||
DEVICE_DTS := qcom-ipq4019-ap.dk01.1-c1
|
||||
KERNEL_INSTALL := 1
|
||||
KERNEL_SIZE := 4096k
|
||||
IMAGE_SIZE := 26624k
|
||||
$(call Device/FitImage)
|
||||
IMAGES := sysupgrade.bin
|
||||
IMAGE/sysupgrade.bin := append-kernel | pad-to $$$${KERNEL_SIZE} | append-rootfs | pad-rootfs | append-metadata
|
||||
endef
|
||||
TARGET_DEVICES += qcom_ap-dk01.1-c1
|
||||
|
||||
define Device/qcom_ap-dk04.1-c1
|
||||
$(call Device/FitImage)
|
||||
$(call Device/UbiFit)
|
||||
@ -318,19 +330,6 @@ define Device/qcom_ap-dk04.1-c1
|
||||
endef
|
||||
TARGET_DEVICES += qcom_ap-dk04.1-c1
|
||||
|
||||
define Device/hugo_ac1200
|
||||
$(call Device/FitImage)
|
||||
DEVICE_TITLE := Hugo AC1200
|
||||
BOARD_NAME := hugo_ac1200
|
||||
DEVICE_DTS := qcom-ipq4019-hugo-ac1200
|
||||
KERNEL_SIZE := 4096k
|
||||
IMAGE_SIZE := 31232k
|
||||
IMAGES := sysupgrade.bin
|
||||
IMAGE/sysupgrade.bin := append-kernel | append-rootfs | pad-rootfs | append-metadata
|
||||
DEVICE_PACKAGES := ipq-wifi-hugo_ac1200
|
||||
endef
|
||||
TARGET_DEVICES += hugo_ac1200
|
||||
|
||||
define Device/zyxel_nbg6617
|
||||
$(call Device/FitImageLzma)
|
||||
DEVICE_DTS := qcom-ipq4018-nbg6617
|
||||
|
||||
@ -1,78 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
# xor multiple hex values of the same length
|
||||
xor() {
|
||||
local val
|
||||
local ret="0x$1"
|
||||
local retlen=${#1}
|
||||
|
||||
shift
|
||||
while [ -n "$1" ]; do
|
||||
val="0x$1"
|
||||
ret=$((ret ^ val))
|
||||
shift
|
||||
done
|
||||
|
||||
printf "%0${retlen}x" "$ret"
|
||||
}
|
||||
|
||||
ath10kcal_die() {
|
||||
echo "ath10cal: " "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
ath10kcal_from_file() {
|
||||
local source=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
|
||||
dd if=$source of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
|
||||
ath10kcal_die "failed to extract calibration data from $source"
|
||||
}
|
||||
|
||||
ath10kcal_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local mtd
|
||||
|
||||
mtd=$(find_mtd_chardev $part)
|
||||
[ -n "$mtd" ] || \
|
||||
ath10kcal_die "no mtd device found for partition $part"
|
||||
|
||||
dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
|
||||
ath10kcal_die "failed to extract calibration data from $mtd"
|
||||
}
|
||||
|
||||
ath10kcal_patch_mac_crc() {
|
||||
local mac=$1
|
||||
local mac_offset=6
|
||||
local chksum_offset=2
|
||||
local xor_mac
|
||||
local xor_fw_mac
|
||||
local xor_fw_chksum
|
||||
|
||||
[ -z "$mac" ] && return
|
||||
|
||||
xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
|
||||
|
||||
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6
|
||||
|
||||
xor_mac=${mac//:/}
|
||||
xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
|
||||
|
||||
xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
|
||||
|
||||
printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
|
||||
dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2
|
||||
}
|
||||
|
||||
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
. /lib/functions/caldata.sh
|
||||
|
||||
board=$(board_name)
|
||||
|
||||
@ -80,68 +10,68 @@ case "$FIRMWARE" in
|
||||
"ath10k/pre-cal-pci-0000:01:00.0.bin")
|
||||
case $board in
|
||||
buffalo,wxr-2533dhp)
|
||||
ath10kcal_extract "ART" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(mtd_get_mac_binary ART 30)
|
||||
caldata_extract "ART" 0x1000 0x2f20
|
||||
ath10k_patch_mac $(mtd_get_mac_binary ART 0x1e)
|
||||
;;
|
||||
linksys,ea8500)
|
||||
ath10kcal_extract "art" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +1)
|
||||
caldata_extract "art" 0x1000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +1)
|
||||
;;
|
||||
nec,wg2600hp)
|
||||
ath10kcal_extract "ART" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary PRODUCTDATA 12) +1)
|
||||
caldata_extract "ART" 0x1000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary PRODUCTDATA 0xc) +1)
|
||||
;;
|
||||
netgear,d7800 |\
|
||||
netgear,r7500v2 |\
|
||||
netgear,r7800)
|
||||
ath10kcal_extract "art" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary art 6) +1)
|
||||
caldata_extract "art" 0x1000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +1)
|
||||
;;
|
||||
tplink,c2600)
|
||||
ath10kcal_extract "radio" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary default-mac 8) -1)
|
||||
caldata_extract "radio" 0x1000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary default-mac 0x8) -1)
|
||||
;;
|
||||
tplink,vr2600v)
|
||||
ath10kcal_extract "ART" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary default-mac 0) -1)
|
||||
caldata_extract "ART" 0x1000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary default-mac 0x0) -1)
|
||||
;;
|
||||
zyxel,nbg6817)
|
||||
ath10kcal_extract "0:ART" 4096 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) +1)
|
||||
caldata_extract "0:ART" 0x1000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) +1)
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
"ath10k/pre-cal-pci-0001:01:00.0.bin")
|
||||
case $board in
|
||||
buffalo,wxr-2533dhp)
|
||||
ath10kcal_extract "ART" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(mtd_get_mac_binary ART 24)
|
||||
caldata_extract "ART" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(mtd_get_mac_binary ART 0x18)
|
||||
;;
|
||||
linksys,ea8500)
|
||||
ath10kcal_extract "art" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +2)
|
||||
caldata_extract "art" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +2)
|
||||
;;
|
||||
nec,wg2600hp)
|
||||
ath10kcal_extract "ART" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(mtd_get_mac_binary PRODUCTDATA 12)
|
||||
caldata_extract "ART" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(mtd_get_mac_binary PRODUCTDATA 0xc)
|
||||
;;
|
||||
netgear,d7800 |\
|
||||
netgear,r7500v2 |\
|
||||
netgear,r7800)
|
||||
ath10kcal_extract "art" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary art 6) +2)
|
||||
caldata_extract "art" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +2)
|
||||
;;
|
||||
tplink,c2600)
|
||||
ath10kcal_extract "radio" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(mtd_get_mac_binary default-mac 8)
|
||||
caldata_extract "radio" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(mtd_get_mac_binary default-mac 0x8)
|
||||
;;
|
||||
tplink,vr2600v)
|
||||
ath10kcal_extract "ART" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(mtd_get_mac_binary default-mac 0)
|
||||
caldata_extract "ART" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(mtd_get_mac_binary default-mac 0x0)
|
||||
;;
|
||||
zyxel,nbg6817)
|
||||
ath10kcal_extract "0:ART" 20480 12064
|
||||
ath10kcal_patch_mac_crc $(mtd_get_mac_ascii 0:APPSBLENV ethaddr)
|
||||
caldata_extract "0:ART" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(mtd_get_mac_ascii 0:APPSBLENV ethaddr)
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
@ -29,4 +29,3 @@ set_ether_mac() {
|
||||
}
|
||||
|
||||
boot_hook_add preinit_main set_ether_mac
|
||||
|
||||
|
||||
@ -3,47 +3,18 @@
|
||||
|
||||
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
. /lib/upgrade/nand.sh
|
||||
|
||||
ath10k_caldata_die() {
|
||||
echo "ath10k caldata: " "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
ath10k_caldata_extract_ubi() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local ubidev=$(nand_find_ubi $CI_UBIPART)
|
||||
local ubi
|
||||
|
||||
ubi=$(nand_find_volume $ubidev $part)
|
||||
[ -n "$ubi" ] || \
|
||||
ath10k_caldata_die "no UBI volume found for $part"
|
||||
|
||||
dd if=/dev/$ubi of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
|
||||
ath10k_caldata_die "failed to extract from $ubi"
|
||||
}
|
||||
|
||||
ath10k_caldata_set_macaddr() {
|
||||
local macaddr=$1
|
||||
|
||||
macaddr_2bin $macaddr | dd of=/lib/firmware/$FIRMWARE \
|
||||
conv=notrunc bs=1 seek=6 count=6
|
||||
}
|
||||
. /lib/functions/caldata.sh
|
||||
|
||||
case "$FIRMWARE" in
|
||||
"ath10k/cal-pci-0000:02:00.0.bin")
|
||||
board=$(board_name)
|
||||
case $board in
|
||||
bt,homehub-v5a)
|
||||
ath10k_caldata_extract_ubi "caldata" 20480 2116
|
||||
ath10k_caldata_set_macaddr $(macaddr_add $(mtd_get_mac_binary_ubi caldata 4364) +3)
|
||||
caldata_extract_ubi "caldata" 0x5000 0x844
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary_ubi caldata 0x110c) +3)
|
||||
;;
|
||||
*)
|
||||
ath10k_caldata_die "board $board is not supported yet"
|
||||
caldata_die "board $board is not supported yet"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
@ -1,130 +1,23 @@
|
||||
#!/bin/sh
|
||||
# Based on ar71xx 10-ath9k-eeprom
|
||||
|
||||
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
. /lib/upgrade/nand.sh
|
||||
. /lib/functions/caldata.sh
|
||||
|
||||
# xor multiple hex values of the same length
|
||||
xor() {
|
||||
local val
|
||||
local ret="0x$1"
|
||||
local retlen=${#1}
|
||||
|
||||
shift
|
||||
while [ -n "$1" ]; do
|
||||
val="0x$1"
|
||||
ret=$((ret ^ val))
|
||||
shift
|
||||
done
|
||||
|
||||
printf "%0${retlen}x" "$ret"
|
||||
}
|
||||
|
||||
ath9k_eeprom_die() {
|
||||
echo "ath9k eeprom: $*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
ath9k_eeprom_extract_raw() {
|
||||
local source=$1
|
||||
local offset=$2
|
||||
local swap=$3
|
||||
local size=4096
|
||||
local bs=1
|
||||
local conv=
|
||||
|
||||
if [ $swap -gt 0 ]; then
|
||||
bs=2
|
||||
conv="conv=swab"
|
||||
size=$((size / bs))
|
||||
offset=$((offset / bs))
|
||||
fi
|
||||
|
||||
dd if=$source of=/lib/firmware/$FIRMWARE bs=$bs skip=$offset count=$size $conv 2>/dev/null || \
|
||||
ath9k_eeprom_die "failed to extract from $mtd"
|
||||
}
|
||||
|
||||
ath9k_eeprom_extract_reverse() {
|
||||
caldata_extract_swap() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local mtd
|
||||
local reversed
|
||||
local caldata
|
||||
|
||||
mtd=$(find_mtd_chardev "$part")
|
||||
reversed=$(hexdump -v -s $offset -n $count -e '/1 "%02x "' $mtd)
|
||||
|
||||
for byte in $reversed; do
|
||||
caldata="\x${byte}${caldata}"
|
||||
done
|
||||
|
||||
printf "%b" "$caldata" > /lib/firmware/$FIRMWARE
|
||||
}
|
||||
|
||||
ath9k_eeprom_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local swap=$3
|
||||
local mtd
|
||||
|
||||
mtd=$(find_mtd_chardev $part)
|
||||
[ -n "$mtd" ] || \
|
||||
ath9k_eeprom_die "no mtd device found for partition $part"
|
||||
[ -n "$mtd" ] || caldata_die "no mtd device found for partition $part"
|
||||
|
||||
ath9k_eeprom_extract_raw $mtd $offset $swap
|
||||
}
|
||||
offset=$(($offset / 2))
|
||||
count=$(($count / 2))
|
||||
|
||||
ath9k_ubi_eeprom_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local swap=$3
|
||||
local ubidev=$(nand_find_ubi $CI_UBIPART)
|
||||
local ubi
|
||||
|
||||
ubi=$(nand_find_volume $ubidev $part)
|
||||
[ -n "$ubi" ] || \
|
||||
ath9k_eeprom_die "no UBI volume found for $part"
|
||||
|
||||
ath9k_eeprom_extract_raw /dev/$ubi $offset $swap
|
||||
}
|
||||
|
||||
ath9k_patch_fw_mac_crc() {
|
||||
local mac=$1
|
||||
local mac_offset=$2
|
||||
local chksum_offset=$((mac_offset - 10))
|
||||
|
||||
ath9k_patch_fw_mac "${mac}" "${mac_offset}" "${chksum_offset}"
|
||||
}
|
||||
|
||||
ath9k_patch_fw_mac() {
|
||||
local mac=$1
|
||||
local mac_offset=$2
|
||||
local chksum_offset=$3
|
||||
local xor_mac
|
||||
local xor_fw_mac
|
||||
local xor_fw_chksum
|
||||
|
||||
[ -z "$mac" -o -z "$mac_offset" ] && return
|
||||
|
||||
[ -n "$chksum_offset" ] && {
|
||||
xor_mac=${mac//:/}
|
||||
xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
|
||||
|
||||
xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
|
||||
|
||||
xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
||||
xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
|
||||
|
||||
printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
|
||||
dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2
|
||||
}
|
||||
|
||||
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$mac_offset count=6
|
||||
dd if=$mtd of=/lib/firmware/$FIRMWARE bs=2 skip=$offset count=$count conv=swab 2>/dev/null || \
|
||||
caldata_die "failed to extract calibration data from $mtd"
|
||||
}
|
||||
|
||||
case "$FIRMWARE" in
|
||||
@ -135,43 +28,43 @@ case "$FIRMWARE" in
|
||||
|
||||
case "$board" in
|
||||
arcadyan,arv7518pw)
|
||||
ath9k_eeprom_extract "boardconfig" 1024 1
|
||||
caldata_extract_swap "boardconfig" 0x400 0x1000
|
||||
;;
|
||||
arcadyan,arv8539pw22)
|
||||
ath9k_eeprom_extract "art" 1024 1
|
||||
caldata_extract_swap "art" 0x400 0x1000
|
||||
;;
|
||||
bt,homehub-v2b)
|
||||
ath9k_eeprom_extract "art" 0 1
|
||||
ath9k_patch_fw_mac_crc "00:00:00:00:00:00" 524
|
||||
caldata_extract_swap "art" 0x0 0x1000
|
||||
ath9k_patch_mac_crc "00:00:00:00:00:00" 0x20c
|
||||
;;
|
||||
bt,homehub-v3a)
|
||||
ath9k_eeprom_extract "art-copy" 0 1
|
||||
ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_ascii uboot_env ethaddr) +2) 268
|
||||
caldata_extract_swap "art-copy" 0x0 0x1000
|
||||
ath9k_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii uboot_env ethaddr) +2) 0x10c
|
||||
;;
|
||||
bt,homehub-v5a)
|
||||
ath9k_ubi_eeprom_extract "caldata" 4096 0
|
||||
ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_binary_ubi caldata 4364) +2) 268
|
||||
caldata_extract_ubi "caldata" 0x1000 0x1000
|
||||
ath9k_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary_ubi caldata 0x110c) +2) 0x10c
|
||||
;;
|
||||
netgear,dgn3500|netgear,dgn3500b)
|
||||
ath9k_eeprom_extract "calibration" 61440 0
|
||||
ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_ascii uboot-env ethaddr) +2) 524
|
||||
caldata_extract "calibration" 0xf000 0x1000
|
||||
ath9k_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii uboot-env ethaddr) +2) 0x20c
|
||||
;;
|
||||
avm,fritz3370-rev2-hynix|\
|
||||
avm,fritz3370-rev2-micron|\
|
||||
avm,fritz7362sl)
|
||||
ath9k_eeprom_extract_reverse "urlader" 5441 1088
|
||||
caldata_extract_reverse "urlader" 0x1541 0x440
|
||||
;;
|
||||
avm,fritz7312|avm,fritz7320|avm,fritz7360sl)
|
||||
ath9k_eeprom_extract "urlader" 2437 0
|
||||
caldata_extract "urlader" 0x985 0x1000
|
||||
;;
|
||||
avm,fritz7412)
|
||||
/usr/bin/fritz_cal_extract -i 1 -s 0x1e000 -e 0x207 -l 4096 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader")
|
||||
;;
|
||||
tplink,tdw8970|tplink,tdw8980)
|
||||
ath9k_eeprom_extract "boardconfig" 135168 0
|
||||
caldata_extract "boardconfig" 0x21000 0x1000
|
||||
;;
|
||||
*)
|
||||
ath9k_eeprom_die "board $board is not supported yet"
|
||||
caldata_die "board $board is not supported yet"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
@ -3,37 +3,7 @@
|
||||
# Copyright (C) 2013 OpenWrt.org
|
||||
#
|
||||
|
||||
LED_OPTIONS_CHANGED=0
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
do_led_update_sysfs()
|
||||
{
|
||||
local cfg=$1; shift
|
||||
local tuples="$@"
|
||||
local sysfs
|
||||
local name
|
||||
|
||||
config_get sysfs $cfg sysfs
|
||||
config_get name $cfg name
|
||||
|
||||
[ -z "$sysfs" ] && return
|
||||
|
||||
for tuple in $tuples; do
|
||||
local old=${tuple%=*}
|
||||
local new=${tuple#*=}
|
||||
local new_sysfs
|
||||
|
||||
new_sysfs=$(echo ${sysfs} | sed "s/${old}/${new}/")
|
||||
|
||||
[ "$new_sysfs" = "$sysfs" ] && continue
|
||||
|
||||
uci set system.${cfg}.sysfs="${new_sysfs}"
|
||||
LED_OPTIONS_CHANGED=1
|
||||
|
||||
logger -t led-migration "sysfs option of LED \"${name}\" updated to ${new_sysfs}"
|
||||
done;
|
||||
}
|
||||
. /lib/functions/migrations.sh
|
||||
|
||||
do_internet_led_rename()
|
||||
{
|
||||
@ -45,38 +15,29 @@ do_internet_led_rename()
|
||||
uci rename system.led_internet=led_dsl
|
||||
uci set system.led_dsl.name=dsl
|
||||
|
||||
LED_OPTIONS_CHANGED=1
|
||||
logger -t led-migration "internet led renamed to dsl"
|
||||
}
|
||||
|
||||
migrate_leds()
|
||||
{
|
||||
config_load system
|
||||
config_foreach do_led_update_sysfs led "$@"
|
||||
}
|
||||
|
||||
case "$(board_name)" in
|
||||
alphanetworks,asl56026|\
|
||||
arcadyan,arv452cqw|\
|
||||
arcadyan,arv7510pw22|\
|
||||
arcadyan,arv7519rw22|\
|
||||
arcadyan,arv752dpw|\
|
||||
arcadyan,arv752dpw22|\
|
||||
alphanetworks,asl56026|\
|
||||
arcadyan,vg3503j|\
|
||||
avm,fritz7360sl|\
|
||||
bt,homehub-v2b|\
|
||||
bt,homehub-v3a|\
|
||||
bt,homehub-v5a|\
|
||||
avm,fritz7360sl|\
|
||||
arcadyan,vg3503j)
|
||||
bt,homehub-v5a)
|
||||
do_internet_led_rename
|
||||
;;
|
||||
netgear,dgn3500|\
|
||||
netgear,dgn3500b)
|
||||
migrate_leds "dgn3500:blue:wireless=dgn3500:green:wireless"
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
[ "$LED_OPTIONS_CHANGED" = "1" ] && uci commit system
|
||||
migrations_apply system
|
||||
|
||||
exit 0
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/lantiq.sh
|
||||
|
||||
IFNAME_CHANGED=0
|
||||
|
||||
|
||||
@ -1,10 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions/lantiq.sh
|
||||
|
||||
set_preinit_iface() {
|
||||
ifname=eth0
|
||||
}
|
||||
|
||||
boot_hook_add preinit_main set_preinit_iface
|
||||
|
||||
|
||||
@ -1,41 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
FW_FILE="/lib/firmware/$FIRMWARE"
|
||||
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
||||
|
||||
ath9k_eeprom_die() {
|
||||
echo "ath9k eeprom: " "$*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
ath9k_eeprom_extract() {
|
||||
local part=$1
|
||||
local offset=$2
|
||||
local count=$3
|
||||
local mtd
|
||||
|
||||
mtd=$(find_mtd_chardev $part)
|
||||
[ -n "$mtd" ] || \
|
||||
ath9k_eeprom_die "no mtd device found for partition $part"
|
||||
|
||||
dd if=$mtd bs=$offset skip=1 count=1 2>/dev/null | dd of=$FW_FILE bs=$count count=1 2>/dev/null || \
|
||||
ath9k_eeprom_die "failed to extract from $mtd"
|
||||
}
|
||||
|
||||
tpl_set_wireless_mac()
|
||||
{
|
||||
local offset=$1
|
||||
local mac
|
||||
|
||||
mac=$(mtd_get_mac_binary u-boot 326656)
|
||||
mac=$(macaddr_add $mac $offset)
|
||||
|
||||
macaddr_2bin $mac | dd bs=1 count=6 seek=2 conv=notrunc of=$FW_FILE 2>/dev/null
|
||||
}
|
||||
|
||||
[ -e $FW_FILE ] && exit 0
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
. /lib/functions/caldata.sh
|
||||
|
||||
board=$(board_name)
|
||||
|
||||
@ -43,11 +10,11 @@ case "$FIRMWARE" in
|
||||
"pci_wmac0.eeprom")
|
||||
case $board in
|
||||
tplink,tl-wdr4900-v1)
|
||||
ath9k_eeprom_extract "caldata" 4096 2048
|
||||
tpl_set_wireless_mac 0
|
||||
caldata_extract "caldata" 0x1000 0x800
|
||||
ath9k_patch_mac $(mtd_get_mac_binary u-boot 0x4fc00)
|
||||
;;
|
||||
*)
|
||||
ath9k_eeprom_die "board $board is not supported yet"
|
||||
caldata_die "board $board is not supported yet"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
@ -55,11 +22,11 @@ case "$FIRMWARE" in
|
||||
"pci_wmac1.eeprom")
|
||||
case $board in
|
||||
tplink,tl-wdr4900-v1)
|
||||
ath9k_eeprom_extract "caldata" 20480 2048
|
||||
tpl_set_wireless_mac -1
|
||||
caldata_extract "caldata" 0x5000 0x800
|
||||
ath9k_patch_mac $(macaddr_add $(mtd_get_mac_binary u-boot 0x4fc00) -1)
|
||||
;;
|
||||
*)
|
||||
ath9k_eeprom_die "board $board is not supported yet"
|
||||
caldata_die "board $board is not supported yet"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
@ -3,27 +3,54 @@
|
||||
# Copyright (C) 2013 OpenWrt.org
|
||||
#
|
||||
|
||||
ramips_set_preinit_iface() {
|
||||
RT3X5X=$(grep -E "(RT3.5|RT5350|MT7628|MT7688|MT7620|MT7621)" /proc/cpuinfo)
|
||||
. /lib/functions.sh
|
||||
|
||||
if [ -n "${RT3X5X}" ]; then
|
||||
# The ethernet switch driver enables VLAN by default, but
|
||||
# failsafe uses eth0, making the device unreachable:
|
||||
# https://dev.openwrt.org/ticket/18768
|
||||
case "${RT3X5X}" in
|
||||
*MT7620*)
|
||||
ralink_switchdev=mt7620
|
||||
;;
|
||||
*MT7621*)
|
||||
ralink_switchdev=mt7530
|
||||
;;
|
||||
*)
|
||||
ralink_switchdev=rt305x
|
||||
;;
|
||||
esac
|
||||
swconfig dev $ralink_switchdev set reset 1
|
||||
swconfig dev $ralink_switchdev set enable_vlan 0
|
||||
swconfig dev $ralink_switchdev set apply 1
|
||||
ramips_switchdev_from_soc() {
|
||||
# The ethernet switch driver enables VLAN by default, but
|
||||
# failsafe uses eth0, making the device unreachable:
|
||||
# https://dev.openwrt.org/ticket/18768
|
||||
|
||||
local switchdev
|
||||
local RT3X5X=$(grep -E "(RT3.5|RT5350|MT7628|MT7688|MT7620|MT7621)" /proc/cpuinfo)
|
||||
|
||||
[ -n "$RT3X5X" ] || return 1
|
||||
|
||||
case "$RT3X5X" in
|
||||
*MT7620*)
|
||||
switchdev=mt7620
|
||||
;;
|
||||
*MT7621*)
|
||||
switchdev=mt7530
|
||||
;;
|
||||
*)
|
||||
switchdev=rt305x
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "$switchdev"
|
||||
}
|
||||
|
||||
ramips_switchdev_from_board() {
|
||||
# For these devices, external ethernet switch should be used
|
||||
# instead of the SoC internal switch.
|
||||
|
||||
local switchdev
|
||||
local board=$(board_name)
|
||||
|
||||
case "$board" in
|
||||
esac
|
||||
|
||||
echo "$switchdev"
|
||||
}
|
||||
|
||||
ramips_set_preinit_iface() {
|
||||
local switchdev=$(ramips_switchdev_from_board)
|
||||
[ -n "$switchdev" ] || switchdev=$(ramips_switchdev_from_soc)
|
||||
|
||||
if [ -n "$switchdev" ]; then
|
||||
swconfig dev $switchdev set reset 1
|
||||
swconfig dev $switchdev set enable_vlan 0
|
||||
swconfig dev $switchdev set apply 1
|
||||
fi
|
||||
|
||||
ifname=eth0
|
||||
|
||||
Loading…
Reference in New Issue
Block a user