[ovs-dev] [PATCH] xlate: use const struct in6_addr in linklocal check

Aaron Conole aconole at redhat.com
Tue Jul 10 13:34:38 UTC 2018

Commit 83c2757bd16e ("xlate: Move tnl_neigh_snoop() to
terminate_native_tunnel()") introduced a call to
IN6_IS_ADDR_MC_LINKLOCAL() when checking neighbor discovery.

The call to this assumes that the argument may be a const uint8_t *.
According to The Open Group Base Specifications Issue 7, 2018:

    macro is of type int and takes a single argument of
    type const struct in6_addr *

The GNU implementation allows a bit of flexibility, by internally
casting the argument.  However, other implementations (such as OS X)
more rigidly implement the standard and fail with errors like:

    error: member reference base type 'const uint8_t'
           (aka 'const unsigned char') is not a structure or union

Fixes: 83c2757bd16e ("xlate: Move tnl_neigh_snoop() to terminate_native_tunnel()")
Cc: Zoltan Balogh <zoltan.balogh.eth at gmail.com>
Cc: Jan Scheurich <jan.scheurich at ericsson.com>
Signed-off-by: Aaron Conole <aconole at redhat.com>
 ofproto/ofproto-dpif-xlate.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index c02a0327a..8c95935fa 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -3832,7 +3832,7 @@ is_nd_dst_correct(const struct flow *flow, const struct in6_addr *ipv6_addr)
     const uint8_t *flow_ipv6_addr = (uint8_t *) &flow->ipv6_dst;
     const uint8_t *addr = (uint8_t *) ipv6_addr;
-    return (IN6_IS_ADDR_MC_LINKLOCAL(flow_ipv6_addr) &&
+    return (IN6_IS_ADDR_MC_LINKLOCAL(ipv6_addr) &&
             flow_ipv6_addr[11] == 0x01 &&
             flow_ipv6_addr[12] == 0xff &&
             flow_ipv6_addr[13] == addr[13] &&

More information about the dev mailing list