Re: [PATCH] net: ipv4: ipconfig: Support RFC 4361/3315 DHCP client ID in hex format
From: Jakub Kicinski <kuba@kernel.org>
Date: 2025-06-13 02:17:27
Also in:
lkml
On Tue, 10 Jun 2025 16:35:03 +0200 Petr Zejdl wrote:
- len = strlen(dhcp_client_identifier + 1);
maybe keep using len here? Assign dhcp_client_identifier_len to it? I don't think switching to dhcp_client_identifier_len improves the readability and it inflates the diff.
quoted hunk ↗ jump to hunk
/* the minimum length of identifier is 2, include 1 byte type, * and can not be larger than the length of options */ - if (len >= 1 && len < 312 - (e - options) - 1) { - *e++ = 61; - *e++ = len + 1; - memcpy(e, dhcp_client_identifier, len + 1); - e += len + 1; + if (dhcp_client_identifier_len >= 2) { + if (dhcp_client_identifier_len <= 312 - (e - options) - 3) { + pr_debug("DHCP: sending client identifier %*phC\n", + dhcp_client_identifier_len, + dhcp_client_identifier); + *e++ = 61; + *e++ = dhcp_client_identifier_len; + memcpy(e, dhcp_client_identifier, + dhcp_client_identifier_len); + e += dhcp_client_identifier_len; + } else { + pr_warn("DHCP: client identifier doesn't fit in the packet\n"); + } } }@@ -1661,6 +1669,33 @@ static int __init ip_auto_config(void) late_initcall(ip_auto_config); +#ifdef CONFIG_IP_PNP_DHCP +/* + * Parses DHCP Client ID in the hex form "XX:XX ... :XX" (like MAC address). + * Returns the length (min 2, max 253) or -EINVAL on parsing error. + */ +static int __init parse_client_id(const char *s, u8 *buf) +{ + int slen = strlen(s); + int len = (slen + 1) / 3; + int i; + + /* Format: XX:XX ... :XX */ + if (len * 3 - 1 != slen || len < 2 || len > 253) + return -EINVAL; + + for (i = 0; i < len; i++) { + if (!isxdigit(s[i * 3]) || !isxdigit(s[i * 3 + 1])) + return -EINVAL; + if (i != len - 1 && s[i * 3 + 2] != ':') + return -EINVAL; + + buf[i] = (hex_to_bin(s[i * 3]) << 4) | hex_to_bin(s[i * 3 + 1]); + } + + return i; +}
Feels like this helper should live in lib/net_utils.c or lib/hexdump.c as a generic thing? -- pw-bot: cr