Index: sbin/ifconfig/ifconfig.c =================================================================== --- sbin/ifconfig/ifconfig.c (revision 180468) +++ sbin/ifconfig/ifconfig.c (working copy) @@ -709,6 +709,15 @@ } void +setifdesc(const char *val, int dummy __unused, int s, const struct afswtch *afp) +{ + ifr.ifr_sdata = val; + ifr.ifr_sdatalen = strlen(val) + 1; + if (ioctl(s, SIOCSIFDESCR, &ifr) < 0) + warn("SIOCSIFDESCR"); +} + +void setifcap(const char *vname, int value, int s, const struct afswtch *afp) { int flags; @@ -802,6 +811,8 @@ struct ifaddrs *ift; int allfamilies, s; struct ifstat ifs; + struct ifreq ifrdesc; + char *ifdescr; if (afp == NULL) { allfamilies = 1; @@ -824,6 +835,15 @@ printf(" mtu %d", ifr.ifr_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); @@ -1016,6 +1036,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), Index: sbin/ifconfig/ifconfig.h =================================================================== --- sbin/ifconfig/ifconfig.h (revision 180468) +++ sbin/ifconfig/ifconfig.h (working copy) @@ -134,6 +134,7 @@ extern int verbose; 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); Index: sys/net/if.c =================================================================== --- sys/net/if.c (revision 180468) +++ sys/net/if.c (working copy) @@ -1553,9 +1553,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; @@ -1840,6 +1842,40 @@ 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));*/ + error = copyout(ifp->if_description, ifr->ifr_sdata, + (strlen(ifp->if_description) + 1)); + ifr->ifr_sdatalen = strlen(ifp->if_description) + 1; + } else + error = copyout("", ifr->ifr_data, 1); + break; + + case SIOCSIFDESCR: + error = suser(td); + if (error) + return (error); + if (MAXPHYS < ifr->ifr_sdatalen) + return (EINVAL); + ifdescrbuf = malloc(ifr->ifr_sdatalen, M_IFNET, M_ZERO | M_NOWAIT); + if (ifdescrbuf == NULL) + return (ENOMEM); + error = copyinstr(ifr->ifr_sdata, 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; case SIOCAIFGROUP: { Index: sys/net/if.h =================================================================== --- sys/net/if.h (revision 180468) +++ sys/net/if.h (working copy) @@ -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. */ @@ -292,6 +297,10 @@ struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; + struct { + void *data; + size_t len; + } ifru_sdata; short ifru_flags[2]; short ifru_index; int ifru_metric; @@ -304,6 +313,8 @@ #define ifr_addr ifr_ifru.ifru_addr /* address */ #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +#define ifr_sdata ifr_ifru.ifru_sdata.data /* sized data pointer */ +#define ifr_sdatalen ifr_ifru.ifru_sdata.len /* sized data length */ #define ifr_flags ifr_ifru.ifru_flags[0] /* flags (low 16 bits) */ #define ifr_flagshigh ifr_ifru.ifru_flags[1] /* flags (high 16 bits) */ #define ifr_metric ifr_ifru.ifru_metric /* metric */ Index: sys/net/if_var.h =================================================================== --- sys/net/if_var.h (revision 180468) +++ sys/net/if_var.h (working copy) @@ -188,6 +188,7 @@ void *if_lagg; /* lagg glue */ void *if_pspare[10]; /* multiq/TOE 3; vimage 3; general use 4 */ int if_ispare[2]; /* general use 2 */ + char *if_description; }; typedef void if_init_f_t(void *); Index: sys/sys/sockio.h =================================================================== --- sys/sys/sockio.h (revision 180468) +++ sys/sys/sockio.h (working copy) @@ -118,6 +118,9 @@ #define SIOCIFDESTROY _IOW('i', 121, struct ifreq) /* destroy clone if */ #define SIOCIFGCLONERS _IOWR('i', 120, struct if_clonereq) /* get cloners */ +#define SIOCSIFDESCR _IOW('i', 128, struct ifreq) /* set ifnet descr */ +#define SIOCGIFDESCR _IOWR('i', 129, struct ifreq) /* get ifnet descr */ + #define SIOCAIFGROUP _IOW('i', 135, struct ifgroupreq) /* add an ifgroup */ #define SIOCGIFGROUP _IOWR('i', 136, struct ifgroupreq) /* get ifgroups */ #define SIOCDIFGROUP _IOW('i', 137, struct ifgroupreq) /* delete ifgroup */