Re: buildkernel failure in net/toeplitz.c (commit 3b281d1421a78b588c5fc4182009ce62d8823d95)

From: Ian FREISLICH <ianfreislich_at_gmail.com>
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