Re: buildkernel failure in net/toeplitz.c (commit 3b281d1421a78b588c5fc4182009ce62d8823d95)
Date: Mon, 24 Feb 2025 16:01:01 UTC
On 2025-02-24 09:54, Mark Johnston wrote:
> On Mon, Feb 24, 2025 at 03:52:14PM +0800, Zhenlei Huang wrote:
>>
>>
>>> On Feb 24, 2025, at 12:42 PM, Ian FREISLICH <ianfreislich@gmail.com> wrote:
>>>
>>> Hi
>>>
>>> Building a kernel today failed with:
>>>
>>> -Werror /usr/src/sys/net/toeplitz.c
>>> In file included from /usr/src/sys/net/toeplitz.c:29:
>>> In file included from /usr/src/sys/net/rss_config.h:33:
>>> /usr/src/sys/netinet/in.h:692:23: error: call to undeclared function 'htonl'; ISO C99 and later do not support implicit function declarations [-Werror,-Wimplicit-function-declaration]
>>> 692 | return (in.s_addr == htonl(INADDR_BROADCAST) ||
>>> | ^
>>> In file included from /usr/src/sys/net/toeplitz.c:32:
>>> In file included from /usr/src/sys/sys/systm.h:98:
>>> /usr/src/sys/sys/param.h:343:13: error: conflicting types for 'htonl'
>>> 343 | __uint32_t htonl(__uint32_t);
>>> | ^
>>> /usr/src/sys/netinet/in.h:692:23: note: previous implicit declaration is here
>>> 692 | return (in.s_addr == htonl(INADDR_BROADCAST) ||
>>>
>>> I think this is a result of changes to netinet/in.h (3b281d1421a78) which added a static inline function using ntohl() which is not defined in kernel use.
>>>
>>> Ian
>>>
>>
>>
>> May you please have a try with this patch ?
>>
>> ```
>> diff --git a/sys/netinet/in.h b/sys/netinet/in.h
>> index 0925e3aa7669..4dad4e4fed4d 100644
>> --- a/sys/netinet/in.h
>> +++ b/sys/netinet/in.h
>> @@ -689,8 +689,8 @@ void in_ifdetach(struct ifnet *);
>> static inline bool
>> in_broadcast(struct in_addr in)
>> {
>> - return (in.s_addr == htonl(INADDR_BROADCAST) ||
>> - in.s_addr == htonl(INADDR_ANY));
>> + return (in.s_addr == INADDR_BROADCAST ||
>> + in.s_addr == INADDR_ANY);
>> }
>> ```
>>
>> The `htonl` is pointless here, as INADDR_BROADCAST is all 1s, and INADDR_ANY is all 0s.
>
> See the review: it's formally unneeded, as you say, but I think the
> conversions should be there in case this function is ever augmented
> someday. I think this patch would also work:
>
> diff --git a/sys/netinet/in.h b/sys/netinet/in.h
> index fa710af7cd58..e42422341ada 100644
> --- a/sys/netinet/in.h
> +++ b/sys/netinet/in.h
> @@ -689,8 +689,8 @@ void in_ifdetach(struct ifnet *);
> static inline bool
> in_broadcast(struct in_addr in)
> {
> - return (in.s_addr == htonl(INADDR_BROADCAST) ||
> - in.s_addr == htonl(INADDR_ANY));
> + return (in.s_addr == __htonl(INADDR_BROADCAST) ||
> + in.s_addr == __htonl(INADDR_ANY));
> }
>
> #define in_hosteq(s, t) ((s).s_addr == (t).s_addr)
I was going to start a bikeshed: I prefer the style of the original
because it shows that the author understands the importance of byte
order. Perhaps the root issue is that htonl is define in both
arpa/inet.h and netinet/in.h with conditional compilation in and out of
the kernel. The reason existing uses of htonl work in this header file
is that they're #defines and not functions and so they're not compiled
unless they're used.
Ian