vBulletin Search Engine Optimization
| |||||||
| Register | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| ||||
| Patches for setting interface MAC address with ifconfig. Based on the way FreeBSD does it, since it's been there for a while and should be tested. Personally I think restricting it to interfaces that are down could seem more consistent... /Fredrik Widlund --- sys/net/if.c.orig Mon Mar 28 07:13:21 2005 +++ sys/net/if.c Mon Mar 28 07:02:10 2005 @@ -1190,6 +1190,8 @@ ifioctl(so, cmd, data, p) { struct ifnet *ifp; struct ifreq *ifr; + struct ifaddr *ifa; + struct sockaddr_dl *sdl; struct ifgroupreq *ifgr; char ifdescrbuf[IFDESCRSIZE]; int error = 0; @@ -1345,8 +1347,50 @@ ifioctl(so, cmd, data, p) return (error); break; + case SIOCSIFLLADDR: + if ((error = suser(p, 0))) + return (error); + ifa = ifnet_addrs[ifp->if_index]; + if (ifa == NULL) + return(EINVAL); + sdl = (struct sockaddr_dl *)ifa->ifa_addr; + if (sdl == NULL) + return(EINVAL); + if (ifr->ifr_addr.sa_len != ETHER_ADDR_LEN) + return(EINVAL); + switch (ifp->if_type) { + case IFT_ETHER: + case IFT_FDDI: + case IFT_XETHER: + case IFT_ISO88025: + case IFT_L2VLAN: + bcopy((caddr_t)ifr->ifr_addr.sa_data, + (caddr_t)((struct arpcom *)ifp)->ac_enaddr, ETHER_ADDR_LEN); + /* fall through */ + case IFT_ARCNET: + bcopy((caddr_t)ifr->ifr_addr.sa_data, + LLADDR(sdl), ETHER_ADDR_LEN); + break; + default: + return (ENODEV); + } + if (ifp->if_flags & IFF_UP) { + int s = splimp(); + ifp->if_flags &= ~IFF_UP; + (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr); + ifp->if_flags |= IFF_UP; + (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr); + splx(s); + TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) { + if (ifa->ifa_addr != NULL && + ifa->ifa_addr->sa_family == AF_INET) + arp_ifinit((struct arpcom *)ifp, ifa); + } + } + break; + default: - if (so->so_proto == 0) + if (so->so_proto == 0) return (EOPNOTSUPP); #if !defined(COMPAT_43) && !defined(COMPAT_LINUX) && !defined(COMPAT_SVR4) error = ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL, --- sys/sys/sockio.h.orig Mon Mar 28 05:54:10 2005 +++ sys/sys/sockio.h Mon Mar 28 01:39:28 2005 @@ -88,6 +88,8 @@ #define SIOCSIFGENERIC _IOW('i', 57, struct ifreq) /* generic IF set op */ #define SIOCGIFGENERIC _IOWR('i', 58, struct ifreq) /* generic IF get op */ +#define SIOCSIFLLADDR _IOW('i', 60, struct ifreq) /* set link level addr */ + #define SIOCSIFPHYADDR _IOW('i', 70, struct ifaliasreq) /* set gif address */ #define SIOCGIFPSRCADDR _IOWR('i', 71, struct ifreq) /* get gif psrc addr */ #define SIOCGIFPDSTADDR _IOWR('i', 72, struct ifreq) /* get gif pdst addr */ --- sbin/ifconfig/ifconfig.c.orig Mon Mar 28 05:55:19 2005 +++ sbin/ifconfig/ifconfig.c Mon Mar 28 01:40:20 2005 @@ -166,6 +166,7 @@ void setifdesc(const char *, int); void setifipdst(const char *, int); void setifmetric(const char *, int); void setifmtu(const char *, int); +void setiflladdr(const char *, int); void setifnwid(const char *, int); void setifbssid(const char *, int); void setifnwkey(const char *, int); @@ -274,6 +275,7 @@ const struct cmd { { "netmask", NEXTARG, 0, setifnetmask }, { "metric", NEXTARG, 0, setifmetric }, { "mtu", NEXTARG, 0, setifmtu }, + { "lladdr", NEXTARG, 0, setiflladdr }, { "nwid", NEXTARG, 0, setifnwid }, { "bssid", NEXTARG, 0, setifbssid }, { "-bssid", -1, 0, setifbssid }, @@ -1058,6 +1060,25 @@ setifmtu(const char *val, int d) /* ARGSUSED */ void +setiflladdr(const char *val, int d) +{ + struct ether_addr *ea; + + ea = ether_aton((char *) val); + if (ea == NULL) { + warn("malformed link-level address"); + return; + } + strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); + ifr.ifr_addr.sa_len = ETHER_ADDR_LEN; + ifr.ifr_addr.sa_family = AF_LINK; + bcopy(ea, ifr.ifr_addr.sa_data, ETHER_ADDR_LEN); + if (ioctl(s, SIOCSIFLLADDR, (caddr_t)&ifr) < 0) + warn("SIOCSIFLLADDR"); +} + +/* ARGSUSED */ +void setifgroup(const char *group_name, int dummy) { struct ifgroupreq ifgr; @@ -3339,7 +3360,7 @@ usage(int value) "\t[description value] [[-]group group-name]\n" "\t[[-]link0] [[-]link1] [[-]link2]\n" "\t[media type] [[-]mediaopt opts] [mode mode] [instance minst]\n" - "\t[mtu value] [metric nhops] [netmask mask] [prefixlen n]\n" + "\t[mtu value] [lladdr addr] [metric nhops] [netmask mask] [prefixlen n]\n" "\t[nwid id] [nwkey key] [nwkey persist[:key]] [-nwkey]\n" "\t[bssid bssid] [-bssid] [chan n] [-chan] [txpower dBm]\n" "\t[-txpower] [[-]powersave] [powersavesleep duration]\n" |