diff --git a/feeds/tip/firstcontact/files/usr/share/ucentral/firstcontact.uc b/feeds/tip/firstcontact/files/usr/share/ucentral/firstcontact.uc index d08267fa0..7db685583 100644 --- a/feeds/tip/firstcontact/files/usr/share/ucentral/firstcontact.uc +++ b/feeds/tip/firstcontact/files/usr/share/ucentral/firstcontact.uc @@ -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/"); diff --git a/patches/base/0055-support-dhcp-option138.patch b/patches/base/0055-support-dhcp-option138.patch new file mode 100644 index 000000000..d45282d3b --- /dev/null +++ b/patches/base/0055-support-dhcp-option138.patch @@ -0,0 +1,93 @@ +From 61a2e46d47dcd76dfd4b8d18036794dae4f4f212 Mon Sep 17 00:00:00 2001 +From: Tanya Singh +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 +--- + .../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 +