RFC: interface description

Xin LI delphij at delphij.net
Thu Aug 13 10:46:18 UTC 2009


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi guys,

While playing with some OpenBSD installation I found that they have an
interesting feature - adding description to a NIC.  This is useful for
system administrators to "tag" the interface, also, the ladvd program
has a feature to use the SIOCSIFDESCR ioctl to document the remote CDP
peer like:

em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	ether 00:11:22:33:44:55
	description: connected to myrouter.home (CDP)
	[...]

The attached patch ported the feature to FreeBSD.

Cheers,
- --
Xin LI <delphij at delphij.net>	http://www.delphij.net/
FreeBSD - The Power to Serve!
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.12 (FreeBSD)

iEYEARECAAYFAkqD7qgACgkQi+vbBBjt66CF+QCeO6INwh3S1T/LvhIUTjZ/Ix4H
zQkAniftv+SQ+irEcnItGHTbLH0HyUez
=cEsJ
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: sbin/ifconfig/ifconfig.8
===================================================================
--- sbin/ifconfig/ifconfig.8	(revision 196163)
+++ sbin/ifconfig/ifconfig.8	(working copy)
@@ -28,7 +28,7 @@
 .\"     From: @(#)ifconfig.8	8.3 (Berkeley) 1/5/94
 .\" $FreeBSD$
 .\"
-.Dd July 8, 2009
+.Dd September 14, 2009
 .Dt IFCONFIG 8
 .Os
 .Sh NAME
@@ -258,6 +258,12 @@ Disable permanently promiscuous mode.
 Another name for the
 .Fl alias
 parameter.
+.It Cm description Ar value
+Specify a description of the interface.
+This can be used to label interfaces in situations where they may
+otherwise be difficult to distinguish.
+.It Cm -description
+Clear the interface description.
 .It Cm down
 Mark an interface
 .Dq down .
@@ -2443,6 +2449,10 @@ Configure the interface
 to use 100baseTX, full duplex Ethernet media options:
 .Dl # ifconfig xl0 media 100baseTX mediaopt full-duplex
 .Pp
+Label the em0 interface as an uplink:
+.Pp
+.Dl # ifconfig em0 description \&"Uplink to Gigabit Switch 2\&"
+.Pp
 Create the software network interface
 .Li gif1 :
 .Dl # ifconfig gif1 create
Index: sbin/ifconfig/ifconfig.c
===================================================================
--- sbin/ifconfig/ifconfig.c	(revision 196163)
+++ sbin/ifconfig/ifconfig.c	(working copy)
@@ -83,6 +83,7 @@ static const char rcsid[] =
 struct	ifreq ifr;
 
 char	name[IFNAMSIZ];
+char	descr[IFDESCRSIZE];
 int	setaddr;
 int	setmask;
 int	doalias;
@@ -822,6 +823,36 @@ setifname(const char *val, int dummy __unused, int
 	free(newname);
 }
 
+/* ARGSUSED */
+static void
+setifdescr(const char *val, int dummy __unused, int s, 
+    const struct afswtch *afp)
+{
+	char *newdescr;
+
+	newdescr = strdup(val);
+	if (newdescr == NULL) {
+		warn("no memory to set ifdescr");
+		return;
+	}
+	ifr.ifr_data = newdescr;
+	if (ioctl(s, SIOCSIFDESCR, (caddr_t)&ifr) < 0) {
+		warn("ioctl (set descr)");
+		free(newdescr);
+		return;
+	}
+	strlcpy(descr, newdescr, sizeof(descr));
+	free(newdescr);
+}
+
+/* ARGSUSED */
+static void
+unsetifdescr(const char *val, int value, int s, const struct afswtch *afp)
+{
+
+	setifdescr("", 0, s, 0);
+}
+
 #define	IFFBITS \
 "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6SMART\7RUNNING" \
 "\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2" \
@@ -866,6 +897,11 @@ status(const struct afswtch *afp, const struct soc
 		printf(" mtu %d", ifr.ifr_mtu);
 	putchar('\n');
 
+	ifr.ifr_data = (caddr_t)&descr;
+	if (ioctl(s, SIOCGIFDESCR, &ifr) == 0 &&
+	    strlen(ifr.ifr_data) > 0)
+		printf("\tdescription: %s\n", ifr.ifr_data);
+
 	if (ioctl(s, SIOCGIFCAP, (caddr_t)&ifr) == 0) {
 		if (ifr.ifr_curcap != 0) {
 			printb("\toptions", ifr.ifr_curcap, IFCAPBITS);
@@ -1035,6 +1071,10 @@ static struct cmd basic_cmds[] = {
 	DEF_CMD("-arp",		IFF_NOARP,	setifflags),
 	DEF_CMD("debug",	IFF_DEBUG,	setifflags),
 	DEF_CMD("-debug",	-IFF_DEBUG,	setifflags),
+	DEF_CMD_ARG("description",		setifdescr),
+	DEF_CMD_ARG("descr",			setifdescr),
+	DEF_CMD("-description",	0,		unsetifdescr),
+	DEF_CMD("-descr",	0,		unsetifdescr),
 	DEF_CMD("promisc",	IFF_PPROMISC,	setifflags),
 	DEF_CMD("-promisc",	-IFF_PPROMISC,	setifflags),
 	DEF_CMD("add",		IFF_UP,		notealias),
Index: share/man/man4/netintro.4
===================================================================
--- share/man/man4/netintro.4	(revision 196163)
+++ share/man/man4/netintro.4	(working copy)
@@ -32,7 +32,7 @@
 .\"     @(#)netintro.4	8.2 (Berkeley) 11/30/93
 .\" $FreeBSD$
 .\"
-.Dd June 18, 2004
+.Dd September 15, 2009
 .Dt NETINTRO 4
 .Os
 .Sh NAME
@@ -277,6 +277,15 @@ and
 fields of the
 .Vt ifreq
 structure, respectively.
+.It Dv SIOCGIFDESCR Fa "struct ifreq *"
+Get the interface description, returned in the
+.Va ifru_data
+field.
+.It Dv SIOCSIFDESCR Fa "struct ifreq *"
+Set the interface description to the value of the
+.Va ifru_data
+field, limited to the size of
+.Dv IFDESCRSIZE .
 .It Dv SIOCSIFFLAGS
 Set interface flags field.
 If the interface is marked down,
Index: sys/kern/kern_jail.c
===================================================================
--- sys/kern/kern_jail.c	(revision 196163)
+++ sys/kern/kern_jail.c	(working copy)
@@ -3437,6 +3437,7 @@ prison_priv_check(struct ucred *cred, int priv)
 	case PRIV_NET_SETIFMETRIC:
 	case PRIV_NET_SETIFPHYS:
 	case PRIV_NET_SETIFMAC:
+	case PRIV_NET_SETIFDESCR:
 	case PRIV_NET_ADDMULTI:
 	case PRIV_NET_DELMULTI:
 	case PRIV_NET_HWIOCTL:
Index: sys/net/if.c
===================================================================
--- sys/net/if.c	(revision 196163)
+++ sys/net/if.c	(working copy)
@@ -1927,6 +1927,7 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t d
 	int new_flags, temp_flags;
 	size_t namelen, onamelen;
 	char new_name[IFNAMSIZ];
+	char ifdescrbuf[IFDESCRSIZE];
 	struct ifaddr *ifa;
 	struct sockaddr_dl *sdl;
 
@@ -1965,6 +1966,25 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t d
 		ifr->ifr_phys = ifp->if_physical;
 		break;
 
+	case SIOCGIFDESCR:
+		bzero(ifdescrbuf, sizeof(ifdescrbuf));
+		strlcpy(ifdescrbuf, ifp->if_description, IFDESCRSIZE);
+		error = copyout(ifdescrbuf, ifr->ifr_data, IFDESCRSIZE);
+		break;
+
+	case SIOCSIFDESCR:
+		error = priv_check(td, PRIV_NET_SETIFDESCR);
+		if (error)
+			return (error);
+		error = copyinstr(ifr->ifr_data, ifdescrbuf,
+			IFDESCRSIZE, NULL);
+		if (error == 0) {
+			bzero(ifp->if_description, IFDESCRSIZE);
+			strlcpy(ifp->if_description, ifdescrbuf, IFDESCRSIZE);
+			getmicrotime(&ifp->if_lastchange);
+		}
+		break;
+
 	case SIOCSIFFLAGS:
 		error = priv_check(td, PRIV_NET_SETIFFLAGS);
 		if (error)
Index: sys/net/if.h
===================================================================
--- sys/net/if.h	(revision 196163)
+++ sys/net/if.h	(working copy)
@@ -60,6 +60,10 @@ struct ifnet;
 #define		IFNAMSIZ	IF_NAMESIZE
 #define		IF_MAXUNIT	0x7fff	/* historical value */
 #endif
+
+/* Length of interface description, including terminating '\0'. */
+#define		IFDESCRSIZE	64
+
 #if __BSD_VISIBLE
 
 /*
Index: sys/net/if_var.h
===================================================================
--- sys/net/if_var.h	(revision 196163)
+++ sys/net/if_var.h	(working copy)
@@ -197,6 +197,7 @@ struct ifnet {
 	void	*if_pf_kif;
 	void	*if_lagg;		/* lagg glue */
 	u_char	 if_alloctype;		/* if_type at time of allocation */
+	char	if_description[IFDESCRSIZE];	/* interface description */
 
 	/*
 	 * Spare fields are added so that we can modify sensitive data
Index: sys/sys/priv.h
===================================================================
--- sys/sys/priv.h	(revision 196163)
+++ sys/sys/priv.h	(working copy)
@@ -335,6 +335,7 @@
 #define	PRIV_NET_LAGG		415	/* Administer lagg interface. */
 #define	PRIV_NET_GIF		416	/* Administer gif interface. */
 #define	PRIV_NET_SETIFVNET	417	/* Move interface to vnet. */
+#define	PRIV_NET_SETIFDESCR	418	/* Set interface description. */
 
 /*
  * 802.11-related privileges.


More information about the freebsd-net mailing list