Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Mar 2001 11:45:37 +0200
From:      Ruslan Ermilov <ru@FreeBSD.ORG>
To:        Bill Fumerola <billf@mu.org>
Cc:        Garrett Wollman <wollman@khavrinen.lcs.mit.edu>, freebsd-bugs@FreeBSD.ORG
Subject:   Re: bin/25584: arp.c - better printed ether address
Message-ID:  <20010309114537.A19746@sunbay.com>
In-Reply-To: <20010307195349.H31752@elvis.mu.org>; from billf@mu.org on Wed, Mar 07, 2001 at 07:53:49PM -0600
References:  <200103072200.f27M02o56673@freefall.freebsd.org> <20010307195349.H31752@elvis.mu.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--IJpNTDwzlM2Ie8A6
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Wed, Mar 07, 2001 at 07:53:49PM -0600, Bill Fumerola wrote:
> On Wed, Mar 07, 2001 at 02:00:02PM -0800, Garrett Wollman wrote:
> 
> >  > -	printf("%x:%x:%x:%x:%x:%x", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]);
> >  > +	printf("%02x:%02x:%02x:%02x:%02x:%02x", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]);
> >  
> >  FWIW, I like this change.
> 
> So do I, so I committed it...
> 
Objecting.  This is not compatible with ether_ntoa(3) and link_ntoa(3).
The correct fix would be to fix these functions, and use them in arp(8).
I am attaching the patch to arp(8) I would like to commit.  See, for
comparison, how route(8) and netstat(1) output Ethernet addresses.
(I know that kernel prints Ethernet addresses differently.)


Cheers,
-- 
Ruslan Ermilov		Oracle Developer/DBA,
ru@sunbay.com		Sunbay Software AG,
ru@FreeBSD.org		FreeBSD committer,
+380.652.512.251	Simferopol, Ukraine

http://www.FreeBSD.org	The Power To Serve
http://www.oracle.com	Enabling The Information Age

--IJpNTDwzlM2Ie8A6
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=p

Index: arp.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/arp/arp.c,v
retrieving revision 1.28
diff -u -p -r1.28 arp.c
--- arp.c	2001/03/08 01:52:49	1.28
+++ arp.c	2001/03/09 09:34:12
@@ -61,6 +61,7 @@ static const char rcsid[] =
 #include <sys/ioctl.h>
 #include <sys/time.h>
 
+#include <net/ethernet.h>
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
@@ -88,15 +89,14 @@ void print_entry(struct sockaddr_dl *sdl
 void nuke_entry(struct sockaddr_dl *sdl,
 	struct sockaddr_inarp *sin, struct rt_msghdr *rtm);
 int delete(char *host, char *info);
-void ether_print(u_char *cp);
+void sdl_print(const struct sockaddr_dl *);
 void usage(void);
 int set(int argc, char **argv);
 int get(char *host);
 int file(char *name);
 void getsocket(void);
-int my_ether_aton(char *a, u_char *n);
 int rtmsg(int cmd);
-int get_ether_addr(u_int32_t ipaddr, u_char *hwaddr);
+int get_sdl_addr(u_int32_t ipaddr, struct sockaddr_dl *sdl);
 
 static int pid;
 static int nflag;	/* no reverse dns lookups */
@@ -255,7 +255,7 @@ set(int argc, char **argv)
 	register struct sockaddr_inarp *sin = &sin_m;
 	register struct sockaddr_dl *sdl;
 	register struct rt_msghdr *rtm = &(m_rtmsg.m_rtm);
-	u_char *ea;
+	struct ether_addr *ea;
 	char *host = argv[0], *eaddr = argv[1];
 
 	getsocket();
@@ -288,17 +288,19 @@ set(int argc, char **argv)
 		}
 		argv++;
 	}
-	ea = (u_char *)LLADDR(&sdl_m);
 	if (doing_proxy && !strcmp(eaddr, "auto")) {
-		if (!get_ether_addr(sin->sin_addr.s_addr, ea)) {
+		if (!get_sdl_addr(sin->sin_addr.s_addr, &sdl_m)) {
 			printf("no interface found for %s\n",
 			       inet_ntoa(sin->sin_addr));
 			return (1);
 		}
-		sdl_m.sdl_alen = 6;
 	} else {
-		if (my_ether_aton(eaddr, ea) == 0)
+		if ((ea = ether_aton(eaddr)) == NULL)
+			warnx("invalid Ethernet address '%s'", eaddr);
+		else {
 			sdl_m.sdl_alen = 6;
+			memcpy(LLADDR(&sdl_m), ea, sdl_m.sdl_alen);
+		}
 	}
 tryagain:
 	if (rtmsg(RTM_GET) < 0) {
@@ -487,7 +489,7 @@ print_entry(struct sockaddr_dl *sdl,
 	}
 	printf("%s (%s) at ", host, inet_ntoa(sin->sin_addr));
 	if (sdl->sdl_alen)
-		ether_print(LLADDR(sdl));
+		sdl_print(sdl);
 	else
 		printf("(incomplete)");
 	if (rtm->rtm_rmx.rmx_expire == 0)
@@ -535,26 +537,13 @@ nuke_entry(struct sockaddr_dl *sdl,
 }
 
 void
-ether_print(u_char *cp)
-{
-	printf("%02x:%02x:%02x:%02x:%02x:%02x", cp[0], cp[1], cp[2], cp[3],
-						cp[4], cp[5]);
-}
-
-int
-my_ether_aton(char *a, u_char *n)
+sdl_print(const struct sockaddr_dl *sdl)
 {
-	int i, o[6];
 
-	i = sscanf(a, "%x:%x:%x:%x:%x:%x", &o[0], &o[1], &o[2],
-					   &o[3], &o[4], &o[5]);
-	if (i != 6) {
-		warnx("invalid Ethernet address '%s'", a);
-		return (1);
-	}
-	for (i=0; i<6; i++)
-		n[i] = o[i];
-	return (0);
+	if (sdl->sdl_type == IFT_ETHER && sdl->sdl_alen == ETHER_ADDR_LEN)
+		(void)printf("%s", ether_ntoa((struct ether_addr *)LLADDR(sdl)));
+	else
+		(void)printf("%s", link_ntoa(sdl));
 }
 
 void
@@ -636,13 +625,13 @@ doit:
 }
 
 /*
- * get_ether_addr - get the hardware address of an interface on the
+ * get_sdl_addr - get the hardware address of an interface on the
  * the same subnet as ipaddr.
  */
 #define MAX_IFS		32
 
 int
-get_ether_addr(u_int32_t ipaddr, u_char *hwaddr)
+get_sdl_addr(u_int32_t ipaddr, struct sockaddr_dl *sdl)
 {
 	struct ifreq *ifr, *ifend, *ifp;
 	u_int32_t ina, mask;
@@ -720,13 +709,14 @@ nextif:
 			 * Found the link-level address - copy it out
 			 */
 		 	dla = (struct sockaddr_dl *) &ifr->ifr_addr;
-			memcpy(hwaddr,  LLADDR(dla), dla->sdl_alen);
+			memcpy(LLADDR(sdl),  LLADDR(dla), dla->sdl_alen);
+			sdl->sdl_alen = dla->sdl_alen;
 			close (s);
 			printf("using interface %s for proxy with address ",
 				ifp->ifr_name);
-			ether_print(hwaddr);
+			sdl_print(dla);
 			printf("\n");
-			return dla->sdl_alen;
+			return 1;
 		}
 		ifr = (struct ifreq *) ((char *)&ifr->ifr_addr
 		    + MAX(ifr->ifr_addr.sa_len, sizeof(ifr->ifr_addr)));

--IJpNTDwzlM2Ie8A6--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010309114537.A19746>