From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl0-f65.google.com ([209.85.160.65]:36383 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752178AbeBWQ2p (ORCPT ); Fri, 23 Feb 2018 11:28:45 -0500 Received: by mail-pl0-f65.google.com with SMTP id v3so5175107plg.3 for ; Fri, 23 Feb 2018 08:28:45 -0800 (PST) Date: Fri, 23 Feb 2018 08:28:42 -0800 From: Stephen Hemminger To: Donald Sharp Cc: netdev@vger.kernel.org Subject: Re: [PATCH iproute2] ip: Properly display AF_BRIDGE address information for neighbor events Message-ID: <20180223082842.780c9f2d@xeon-e3> In-Reply-To: <20180222022650.14316-1-sharpd@cumulusnetworks.com> References: <20180222022650.14316-1-sharpd@cumulusnetworks.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: netdev-owner@vger.kernel.org List-ID: On Wed, 21 Feb 2018 21:26:50 -0500 Donald Sharp wrote: > The vxlan driver when a neighbor add/delete event occurs sends > NDA_DST filled with a union: > > union vxlan_addr { > struct sockaddr_in sin; > struct sockaddr_in6 sin6; > struct sockaddr sa; > }; > > This eventually calls rt_addr_n2a_r which had no handler for the > AF_BRIDGE family and "???" was being printed. > > Add code to properly display this data when requested. > > Signed-off-by: Donald Sharp Minor style comment. > --- > lib/utils.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/lib/utils.c b/lib/utils.c > index 24aeddd8..e01e18a7 100644 > --- a/lib/utils.c > +++ b/lib/utils.c > @@ -1004,6 +1004,24 @@ const char *rt_addr_n2a_r(int af, int len, > } > case AF_PACKET: > return ll_addr_n2a(addr, len, ARPHRD_VOID, buf, buflen); > + case AF_BRIDGE: > + { > + unsigned short family = ((struct sockaddr *)addr)->sa_family; > + struct sockaddr_in6 *sin6; > + struct sockaddr_in *sin; > + Since you are doing aliasing, would it be clearer to do? union { struct sockaddr sa; struct sockaddr_in6 sin6; struct sockaddr_in sin; } *sa = addr; > + switch(family) { > + case AF_INET: > + sin = (struct sockaddr_in *)addr; Casting a void pointer is unnecessary > + return inet_ntop(AF_INET, &sin->sin_addr, buf, buflen); > + case AF_INET6: > + sin6 = (struct sockaddr_in6 *)addr; > + return inet_ntop(AF_INET6, &sin6->sin6_addr, > + buf, buflen); > + } > + > + /* fallthrough */ > + } > default: > return "???"; > }