--- sbin/ifconfig/ifconfig.c.orig Thu Aug 24 15:29:10 2006 +++ sbin/ifconfig/ifconfig.c Thu Aug 24 15:31:34 2006 @@ -725,6 +725,14 @@ } void +setifdesc(const char *val, int dummy __unused, int s, const struct afswtch *afp) +{ + ifr.ifr_data = val; + if (ioctl(s, SIOCSIFDESCR, &ifr) < 0) + warn("SIOCSIFDESCR"); +} + +void setifcap(const char *vname, int value, int s, const struct afswtch *afp) { @@ -828,6 +836,8 @@ struct rt_addrinfo info; int allfamilies, s; struct ifstat ifs; + struct ifreq ifrdesc; + char *ifdescr; if (afp == NULL) { allfamilies = 1; @@ -850,6 +860,15 @@ printf(" mtu %ld", ifm->ifm_data.ifi_mtu); putchar('\n'); + memset(&ifrdesc, 0, sizeof(ifrdesc)); + strlcpy(ifrdesc.ifr_name, name, sizeof(ifrdesc.ifr_name)); + ifdescr = malloc(MAX_IFDESCRSIZE); + ifrdesc.ifr_data = (caddr_t)ifdescr; + if (ioctl(s, SIOCGIFDESCR, &ifrdesc) == 0 && + strlen(ifrdesc.ifr_data)) + printf("\tdescription: %s\n", ifrdesc.ifr_data); + free(ifdescr); + if (ioctl(s, SIOCGIFCAP, (caddr_t)&ifr) == 0) { if (ifr.ifr_curcap != 0) { printb("\toptions", ifr.ifr_curcap, IFCAPBITS); @@ -1025,6 +1044,8 @@ DEF_CMD_ARG("broadcast", setifbroadaddr), DEF_CMD_ARG("ipdst", setifipdst), DEF_CMD_ARG2("tunnel", settunnel), + DEF_CMD_ARG("description", setifdesc), + DEF_CMD_ARG("descr", setifdesc), DEF_CMD("-tunnel", 0, deletetunnel), DEF_CMD("deletetunnel", 0, deletetunnel), DEF_CMD("link0", IFF_LINK0, setifflags), --- sbin/ifconfig/ifconfig.h.orig Thu Aug 24 15:32:13 2006 +++ sbin/ifconfig/ifconfig.h Thu Aug 24 15:32:33 2006 @@ -134,6 +134,7 @@ extern int setipdst; void setifcap(const char *, int value, int s, const struct afswtch *); +void setifdesc(const char *, int, int, const struct afswtch *); void Perror(const char *cmd); void printb(const char *s, unsigned value, const char *bits); --- sys/net/if.c.orig Thu Aug 24 15:33:46 2006 +++ sys/net/if.c Thu Aug 24 15:52:57 2006 @@ -1203,9 +1203,11 @@ { struct ifreq *ifr; struct ifstat *ifs; + char *ifdescrbuf; + char *ifdescrbuf_old; int error = 0; int new_flags, temp_flags; - size_t namelen, onamelen; + size_t bytesdone, namelen, onamelen; char new_name[IFNAMSIZ]; struct ifaddr *ifa; struct sockaddr_dl *sdl; @@ -1468,6 +1470,35 @@ return (error); error = if_setlladdr(ifp, ifr->ifr_addr.sa_data, ifr->ifr_addr.sa_len); + break; + + case SIOCGIFDESCR: + if (ifp->if_description != NULL) + error = copyout(ifp->if_description, ifr->ifr_data, + (strlen(ifp->if_description) + 1)); + else + error = copyout("", ifr->ifr_data, 1); + break; + + case SIOCSIFDESCR: + error = suser(td); + if (error) + return (error); + ifdescrbuf = malloc(MAX_IFDESCRSIZE, M_IFNET, M_ZERO | M_NOWAIT); + if (ifdescrbuf == NULL) + return (ENOMEM); + error = copyinstr(ifr->ifr_data, ifdescrbuf, MAX_IFDESCRSIZE, + &bytesdone); + if (error == 0) { + ifdescrbuf = reallocf(ifdescrbuf, bytesdone, M_IFNET, + M_ZERO | M_NOWAIT); + if (ifdescrbuf == NULL) + return (ENOMEM); + ifdescrbuf_old = ifp->if_description; + ifp->if_description = ifdescrbuf; + free(ifdescrbuf_old, M_IFNET); + } else + free(ifdescrbuf, M_IFNET); break; default: --- sys/net/if.h.orig Thu Aug 24 15:40:57 2006 +++ sys/net/if.h Thu Aug 24 15:43:14 2006 @@ -63,6 +63,11 @@ #if __BSD_VISIBLE /* + * Maximum length of interface description, including terminating '\0'. + */ +#define MAX_IFDESCRSIZE 64 + +/* * Structure used to query names of interface cloners. */ --- sys/net/if_var.h.orig Thu Aug 24 15:43:31 2006 +++ sys/net/if_var.h Thu Aug 24 15:44:26 2006 @@ -180,6 +180,7 @@ struct task if_starttask; /* task for IFF_NEEDSGIANT */ struct task if_linktask; /* task for link change events */ struct mtx if_addr_mtx; /* mutex to protect address lists */ + char *if_description; }; typedef void if_init_f_t(void *); --- sys/sys/sockio.h.orig Wed Feb 15 06:37:15 2006 +++ sys/sys/sockio.h Thu Aug 24 15:45:12 2006 @@ -117,4 +117,7 @@ #define SIOCIFDESTROY _IOW('i', 121, struct ifreq) /* destroy clone if */ #define SIOCIFGCLONERS _IOWR('i', 120, struct if_clonereq) /* get cloners */ +#define SIOCSIFDESCR _IOW('i', 124, struct ifreq) /* set ifnet descr */ +#define SIOCGIFDESCR _IOWR('i', 125, struct ifreq) /* get ifnet descr */ + #endif /* !_SYS_SOCKIO_H_ */