firstcontact: Zero touch provisioning with DHCP option 138

Fixes: WIFI-7266
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
This commit is contained in:
Tanya Singh 2022-07-05 23:09:24 +08:00 committed by John Crispin
parent 7e2cec9d91
commit d9a8e771ae
2 changed files with 131 additions and 31 deletions

View File

@ -7,39 +7,8 @@ if (!fd) {
devid = fd.read("all");
fd.close();
ret = system(sprintf('/usr/sbin/firstcontact -i %s', devid));
if (ret) {
warn("firstcontact failed to contact redirector\n");
exit(1);
}
let redirector = { };
let fd = fs.open("/etc/ucentral/redirector.json", "r");
if (fd) {
let data = fd.read("all");
fd.close();
try {
redirector = json(data);
}
catch (e) {
warn("firstcontact: Unable to parse JSON data in %s: %s", path, e);
exit(1);
}
}
let config = {};
for (let r in redirector.fields)
if (r.name && r.value)
config[r.name] = r.value;
if (!config.Redirector) {
warn("Reply is missing Redirector field\n");
exit(1);
}
function store_config(path) {
let cursor = uci.cursor(path);
let redir = split(config.Redirector, ":");
@ -50,6 +19,44 @@ function store_config(path) {
cursor.commit();
}
ret = system(sprintf('/usr/sbin/firstcontact -i %s', devid));
if (ret) {
warn("firstcontact failed to contact redirector, check DHCP option\n");
let fd = fs.open("/tmp/capwap/dhcp_opt.txt", "r");
if (!fd) {
warn("No redirector found\n");
exit(1);
} else {
config.Redirector = fd.read("all");
fd.close();
}
} else {
let redirector = { };
let fd = fs.open("/etc/ucentral/redirector.json", "r");
if (fd) {
let data = fd.read("all");
fd.close();
try {
redirector = json(data);
}
catch (e) {
warn("firstcontact: Unable to parse JSON data in %s: %s", path, e);
exit(1);
}
}
for (let r in redirector.fields)
if (r.name && r.value)
config[r.name] = r.value;
if (!config.Redirector) {
warn("Reply is missing Redirector field\n");
exit(1);
}
}
store_config();
store_config("/etc/config-shadow/");

View File

@ -0,0 +1,93 @@
From 61a2e46d47dcd76dfd4b8d18036794dae4f4f212 Mon Sep 17 00:00:00 2001
From: Tanya Singh <tanya_singh@accton.com>
Date: Tue, 28 Jun 2022 17:11:52 +0800
Subject: [PATCH] Support DHCP option 138 and store values in
/tmp/capwap/dhcp_opt.txt
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
---
.../netifd/files/lib/netifd/dhcp.script | 22 +++++++++++++++++++
.../netifd/files/lib/netifd/proto/dhcp.sh | 1 +
.../busybox/patches/531-dhcp_opt_capwap.patch | 18 +++++++++++++++
3 files changed, 41 insertions(+)
create mode 100644 package/utils/busybox/patches/531-dhcp_opt_capwap.patch
diff --git a/package/network/config/netifd/files/lib/netifd/dhcp.script b/package/network/config/netifd/files/lib/netifd/dhcp.script
index 6fcf139beb..d7c1324184 100755
--- a/package/network/config/netifd/files/lib/netifd/dhcp.script
+++ b/package/network/config/netifd/files/lib/netifd/dhcp.script
@@ -4,6 +4,24 @@
. /lib/functions.sh
. /lib/netifd/netifd-proto.sh
+WORKING_PATH=/tmp/capwap
+DHCP_OPT_FILE=${WORKING_PATH}/dhcp_opt.txt
+DHCP_OPT_FILE_TMP=${WORKING_PATH}/dhcp_opt_tmp.txt
+
+set_capwap_ip()
+{
+ local ip
+ if [ ! -d "${WORKING_PATH}" ]; then
+ mkdir -p ${WORKING_PATH}
+ fi
+ for ip in ${capwap}; do
+ echo ${ip} >> ${DHCP_OPT_FILE_TMP}
+ done
+ if ! cmp -s "${DHCP_OPT_FILE}" "${DHCP_OPT_FILE_TMP}"; then
+ mv ${DHCP_OPT_FILE_TMP} ${DHCP_OPT_FILE}
+ fi
+}
+
set_classless_routes() {
local max=128
while [ -n "$1" -a -n "$2" -a $max -gt 0 ]; do
@@ -111,6 +129,10 @@ case "$1" in
;;
esac
+if [ -n "${capwap}" ]; then
+ set_capwap_ip
+fi
+
# user rules
[ -f /etc/udhcpc.user ] && . /etc/udhcpc.user "$@"
for f in /etc/udhcpc.user.d/*; do
diff --git a/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh b/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh
index 3034b2ba68..89908e5ca4 100755
--- a/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh
+++ b/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh
@@ -61,6 +61,7 @@ proto_dhcp_setup() {
[ "$delegate" = "0" ] && proto_export "IFACE6RD_DELEGATE=0"
# Request classless route option (see RFC 3442) by default
[ "$classlessroute" = "0" ] || append dhcpopts "-O 121"
+ append dhcpopts "-O 138"
proto_export "INTERFACE=$config"
proto_run_command "$config" udhcpc \
diff --git a/package/utils/busybox/patches/531-dhcp_opt_capwap.patch b/package/utils/busybox/patches/531-dhcp_opt_capwap.patch
new file mode 100644
index 0000000000..c705c0e40e
--- /dev/null
+++ b/package/utils/busybox/patches/531-dhcp_opt_capwap.patch
@@ -0,0 +1,18 @@
+--- a/networking/udhcp/common.c 2022-06-28 09:32:48.853072914 +0800
++++ b/networking/udhcp/common.c 2022-06-28 09:39:28.000000000 +0800
+@@ -54,6 +54,7 @@
+ { OPTION_STRING , 0x43 }, /* DHCP_BOOT_FILE */
+ //TODO: not a string, but a set of LASCII strings:
+ // { OPTION_STRING , 0x4D }, /* DHCP_USER_CLASS */
++ { OPTION_STRING , 0x8A }, /* DHCP_CAPWAP */
+ { OPTION_STRING , 0x64 }, /* DHCP_PCODE */
+ { OPTION_STRING , 0x65 }, /* DHCP_TCODE */
+ #if ENABLE_FEATURE_UDHCP_RFC3397
+@@ -123,6 +124,7 @@
+ "tftp" "\0" /* DHCP_TFTP_SERVER_NAME*/
+ "bootfile" "\0" /* DHCP_BOOT_FILE */
+ // "userclass" "\0" /* DHCP_USER_CLASS */
++ "capwap" "\0" /* DHCP_CAPWAP */
+ "tzstr" "\0" /* DHCP_PCODE */
+ "tzdbstr" "\0" /* DHCP_TCODE */
+ #if ENABLE_FEATURE_UDHCP_RFC3397
--
2.17.1