]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
netifd: dhcp: suppress udhcpc default vendor class if specified in sendopts 21450/head
authorJINLIANG GU <ihipop@gmail.com>
Sat, 10 Jan 2026 01:45:58 +0000 (09:45 +0800)
committerÁlvaro Fernández Rojas <noltari@gmail.com>
Sat, 10 Jan 2026 12:00:15 +0000 (13:00 +0100)
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>
package/network/config/netifd/Makefile
package/network/config/netifd/files/lib/netifd/proto/dhcp.sh

index 0e8dd7d52bda601fb0e4e6c780a5a8bb06dc2a96..2c550ef554df1b086c0fe0a7961d18938b2b5d14 100644 (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
index f6e0690884f40d97fa0d97e23713268559965f92..1c0f720f4ae63c9925dbc2bf8ce8ace12a91846e 100755 (executable)
@@ -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
 }