--- /usr/src/sbin/ifconfig/ifconfig.c.orig	Thu Dec  2 17:53:16 2004
+++ /usr/src/sbin/ifconfig/ifconfig.c	Fri Dec  3 09:52:08 2004
@@ -176,6 +176,7 @@ void	setatrange(const char *, int);
 void	setatphase(const char *, int);
 void	settunnel(const char *, const char *);
 void	deletetunnel(const char *, int);
+void   setetheraddr(char *);
 #ifdef INET6
 void	setia6flags(const char *, int);
 void	setia6pltime(const char *, int);
@@ -338,6 +339,7 @@ const struct	cmd {
 	{ "-pppoesvc",	1,		0,		setpppoe_svc },
 	{ "pppoeac",	NEXTARG,	0,		setpppoe_ac },
 	{ "-pppoeac",	1,		0,		setpppoe_ac },
+	{ "ether",      NEXTARG,        0,              setetheraddr },
 	{ NULL, /*src*/	0,		0,		setifaddr },
 	{ NULL, /*dst*/	0,		0,		setifdstaddr },
 	{ NULL, /*illegal*/0,		0,		NULL },
@@ -373,6 +375,7 @@ unsigned long get_ts_map(int ts_flag, in
 void	in_status(int);
 void	in_getaddr(const char *, int);
 void	in_getprefix(const char *, int);
+void    in_getmacaddr(char *, u_int8_t *);
 #ifdef INET6
 void	in6_fillscopeid(struct sockaddr_in6 *sin6);
 void	in6_alias(struct in6_ifreq *);
@@ -2747,6 +2750,43 @@ vlan_status(void)
 		    "<none>" : vreq.vlr_parent);
 }
 
+
+void setetheraddr(addr)
+	char *addr;
+{
+	struct ifreq req;
+
+	(void) strlcpy(req.ifr_name, ifr.ifr_name, sizeof(req.ifr_name));
+
+	req.ifr_addr.sa_len = sizeof(req.ifr_addr);
+	req.ifr_addr.sa_family = AF_ETHER;
+	in_getmacaddr(addr, (u_int8_t *)req.ifr_addr.sa_data);
+
+	if (ioctl(s, SIOCSIFMACADDR, &req) < 0) {
+		err(1, "SIOCSIFMACADDR");
+	}
+}
+
+void in_getmacaddr(addr, bytes)
+	char *addr;
+	u_int8_t *bytes;
+{
+	int b[6];
+	int n;
+	int i;
+	char c;
+
+	n = sscanf(addr, "%x:%x:%x:%x:%x:%x%c", b, b+1, b+2, b+3, b+4, b+5, c);
+	if (6 != n) {
+		errx(1, "%s: bad value", addr);
+	}
+	for (i = 0; i < 6; i++) {
+		if (b[i] < 0 || b[i] > 0x00FF) {
+			errx(1, "%s: bad value", addr);
+		}
+		bytes[i] = (u_int8_t)b[i];
+	}
+}
 
 /* ARGSUSED */
 void
