[Olsr-dev] [PATCH v1 1/2] android: fix type punning warnings on IN6_IS_ADDR_V4MAPPED
Ferry Huberts
(spam-protected)
Tue Oct 23 16:11:15 CEST 2012
How about this then:
> diff --git a/src/ipcalc.h b/src/ipcalc.h
> index 30b8068..f6836d4 100644
> --- a/src/ipcalc.h
> +++ b/src/ipcalc.h
> @@ -161,9 +161,19 @@ sockaddr4_to_string(struct ipaddr_str *const buf, const struct sockaddr *const a
> return ip4_to_string(buf, addr4->sin_addr);
> }
>
> +
> static INLINE bool
> is_prefix_niit_ipv6(const struct olsr_ip_prefix *p) {
> - return olsr_cnf->ip_version == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&p->prefix.v6)
> +#ifdef __ANDROID__
> + #define IN6_IS_ADDR_V4MAPPED_ANDROID_WORKAROUND(a) \
> + ((((__const uint32_t *) (a))[0] == 0) \
> + && (((__const uint32_t *) (a))[1] == 0) \
> + && (((__const uint32_t *) (a))[2] == htonl (0xffff)))
> + bool v4mapped = IN6_IS_ADDR_V4MAPPED_ANDROID_WORKAROUND(&p->prefix.v6);
> +#else
> + bool v4mapped = IN6_IS_ADDR_V4MAPPED(&p->prefix.v6);
> +#endif
> + return olsr_cnf->ip_version == AF_INET6 && v4mapped
> && p->prefix_len >= ipv6_mappedv4_route.prefix_len;
> }
On 22-10-12 20:01, Hans-Christoph Steiner wrote:
>
>
> On 10/22/2012 01:44 PM, Henning Rogge wrote:
>> On Mon, Oct 22, 2012 at 7:37 PM, Hans-Christoph Steiner
>> <(spam-protected)> wrote:
>>> On 10/22/2012 12:50 PM, Henning Rogge wrote:
>>>> I must admit I still have trouble why the compiler has trouble with
>>>> the old statement. The new one is a crazy thing, some special GCC
>>>> extension.
>>>>
>>>> If we replace it, I would suggest building an inline function that
>>>> takes the "olsr_ip_addr" union and gives back a boolean. Much better
>>>> than trying to fix a crazy preprocessor command.
>>>
>>> Did you look at the Android header snippet I posted in this thread? Once you
>>> do, its clear why the compiler is throwing that warning. The Android header
>>> declares things differently and the GNU header. The current olsrd code
>>> follows the GNU definition.
>>
>> What would you two think about this patch? That sidesteps the whole
>> problem quite easily.
>>
>> diff --git a/src/ipcalc.h b/src/ipcalc.h
>> index 30b8068..aeb77b7 100644
>> --- a/src/ipcalc.h
>> +++ b/src/ipcalc.h
>> @@ -163,7 +163,8 @@ sockaddr4_to_string(struct ipaddr_str *const buf,
>> const struct sockaddr *const a
>>
>> static INLINE bool
>> is_prefix_niit_ipv6(const struct olsr_ip_prefix *p) {
>> - return olsr_cnf->ip_version == AF_INET6 &&
>> IN6_IS_ADDR_V4MAPPED(&p->prefix.v6)
>> + return olsr_cnf->ip_version == AF_INET6
>> + && memcmp(p, &ipv6_mappedv4_route.prefix,
>> ipv6_mappedv4_route.prefix_len/8) == 0
>> && p->prefix_len >= ipv6_mappedv4_route.prefix_len;
>> }
>
> If that is only to avoid using an #ifdef __ANDROID__, then I think its harder
> to read since its removing the clearly named IN6_IS_ADDR_V4MAPPED and
> replacing it with some mem tricks. At the very least it should be well commented.
>
> .hc
>
--
Ferry Huberts
More information about the Olsr-dev
mailing list