diff --git a/sbin/ifconfig/Makefile b/sbin/ifconfig/Makefile index beba2fb77f17..ceb660aa60c0 100644 --- a/sbin/ifconfig/Makefile +++ b/sbin/ifconfig/Makefile @@ -17,6 +17,10 @@ CFLAGS+=-DUSE_VLANS SRCS+= ifieee80211.c CFLAGS+=-DUSE_IEEE80211 +#comment out to exclude MAC support +SRCS+= ifmac.c +CFLAGS+=-DUSE_MAC + MAN= ifconfig.8 .if defined(RELEASE_CRUNCH) diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index 49ae26b84487..53e2563251b8 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -278,6 +278,9 @@ struct cmd { { "wepkey", NEXTARG, set80211wepkey }, { "nwkey", NEXTARG, set80211nwkey }, /* NetBSD */ { "-nwkey", 0, set80211wep }, /* NetBSD */ +#endif +#ifdef USE_MAC + { "mac", NEXTARG, setifmac }, #endif { "rxcsum", IFCAP_RXCSUM, setifcap }, { "-rxcsum", -IFCAP_RXCSUM, setifcap }, @@ -366,6 +369,9 @@ struct afswtch { #ifdef USE_IEEE80211 { "ieee80211", AF_UNSPEC, ieee80211_status, NULL, NULL, }, /* XXX not real!! */ #endif +#ifdef USE_MAC + { "mac", AF_UNSPEC, mac_status, NULL, NULL, }, +#endif #endif { 0, 0, 0, 0 } }; @@ -1144,6 +1150,10 @@ status(const struct afswtch *afp, int addrcount, struct sockaddr_dl *sdl, #ifdef USE_IEEE80211 if (allfamilies || afp->af_status == ieee80211_status) ieee80211_status(s, NULL); +#endif +#ifdef USE_MAC + if (allfamilies || afp->af_status == mac_status) + mac_status(s, NULL); #endif strncpy(ifs.ifs_name, name, sizeof ifs.ifs_name); if (ioctl(s, SIOCGIFSTATUS, &ifs) == 0) diff --git a/sbin/ifconfig/ifconfig.h b/sbin/ifconfig/ifconfig.h index f5c33253b405..c3eb6af07b02 100644 --- a/sbin/ifconfig/ifconfig.h +++ b/sbin/ifconfig/ifconfig.h @@ -64,3 +64,5 @@ extern void set80211weptxkey(const char *, int, int, const struct afswtch *rafp) extern void set80211wepkey(const char *, int, int, const struct afswtch *rafp); extern void set80211nwkey(const char *, int, int, const struct afswtch *rafp); extern void ieee80211_status(int s, struct rt_addrinfo *); +extern void mac_status(int s, struct rt_addrinfo *); +extern void setifmac(const char *, int, int, const struct afswtch *rafp); diff --git a/sbin/ifconfig/ifmac.c b/sbin/ifconfig/ifmac.c new file mode 100644 index 000000000000..dd32a6666c3b --- /dev/null +++ b/sbin/ifconfig/ifmac.c @@ -0,0 +1,100 @@ +/*- + * Copyright (c) 2001 Networks Associates Technology, Inc. + * All rights reserved. + * + * This software was developed for the FreeBSD Project by NAI Labs, the + * Security Research Division of Network Associates, Inc. under + * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA + * CHATS research program. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include "ifconfig.h" + +void +mac_status(int s, struct rt_addrinfo *info) +{ + struct ifreq ifr; + mac_t label; + char *label_text; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); + + if (mac_prepare_ifnet_label(&label) == -1) + return; + ifr.ifr_ifru.ifru_data = (void *)label; + if (ioctl(s, SIOCGIFMAC, &ifr) == -1) + goto mac_free; + + + if (mac_to_text(label, &label_text) == -1) + goto mac_free; + + if (strlen(label_text) != 0) + printf("\tmac %s\n", label_text); + free(label_text); + +mac_free: + mac_free(label); +} + +void +setifmac(const char *val, int d, int s, const struct afswtch *rafp) +{ + struct ifreq ifr; + mac_t label; + int error; + + if (mac_from_text(&label, val) == -1) { + perror(val); + return; + } + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); + ifr.ifr_ifru.ifru_data = (void *)label; + + error = ioctl(s, SIOCSIFMAC, &ifr); + mac_free(label); + if (error == -1) + perror("setifmac"); +}