netifd: dhcp: suppress udhcpc default vendor class if specified in sendopts
Some checks are pending
Build all core packages / Build all core packages for selected target (push) Waiting to run

When DHCP Option 60 is specified via sendopts (hex, decimal, or named
formats), udhcpc sends its default "udhcp <version>" string alongside
the custom value, which causes authentication failures with some ISPs.

This fix detects Option 60 in sendopts and automatically passes -V ""
to udhcpc to suppress the default version string while allowing
multiple user-defined vendor classes.

Supported formats:
- Hexadecimal: 0x3c
- Decimal: 60
- Named: vendor

Fixes: #21242
Signed-off-by: JINLIANG GU <ihipop@gmail.com>
https://github.com/openwrt/openwrt/pull/21450
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
JINLIANG GU 2026-01-10 09:45:58 +08:00 committed by Álvaro Fernández Rojas
parent 93e98b4082
commit 89d982d723
2 changed files with 13 additions and 2 deletions

View file

@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=netifd
PKG_RELEASE:=1
PKG_RELEASE:=2
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git

View file

@ -66,6 +66,7 @@ proto_dhcp_setup() {
[ "$norelease" = 1 ] && norelease="" || norelease="-R"
[ -z "$clientid" ] && clientid="$(proto_dhcp_get_default_clientid "$iface")"
[ -n "$clientid" ] && clientid="-x 0x3d:${clientid//:/}"
[ -n "$vendorid" ] && append dhcpopts "-x 0x3c:$(echo -n "$vendorid" | hexdump -ve '1/1 "%02x"')"
[ -n "$iface6rd" ] && proto_export "IFACE6RD=$iface6rd"
[ "$iface6rd" != 0 -a -f /lib/netifd/proto/6rd.sh ] && append dhcpopts "-O 212"
[ -n "$zone6rd" ] && proto_export "ZONE6RD=$zone6rd"
@ -76,6 +77,16 @@ proto_dhcp_setup() {
# Request classless route option (see RFC 3442) by default
[ "$classlessroute" = "0" ] || append dhcpopts "-O 121"
# Avoid sending duplicate Option 60 values
local emptyvendorid
case "$dhcpopts" in
*"-x 0"[xX]*"3"[cC]":"* |\
*"-x 60:"* |\
*"-x vendor:"*)
emptyvendorid=1
;;
esac
proto_export "INTERFACE=$config"
proto_run_command "$config" udhcpc \
-p /var/run/udhcpc-$iface.pid \
@ -83,7 +94,7 @@ proto_dhcp_setup() {
-f -t 0 -i "$iface" \
${ipaddr:+-r ${ipaddr/\/*/}} \
${hostname:+-x "hostname:$hostname"} \
${vendorid:+-V "$vendorid"} \
${emptyvendorid:+-V ""} \
$clientid $defaultreqopts $broadcast $norelease $dhcpopts
}