[Take 3] RFC: interface description
Xin LI
delphij at delphij.net
Fri Nov 6 19:56:29 UTC 2009
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi,
Here is a revised patchset based on previous comments. This version
would store the description in kernel space, but struct ifnet would only
have a reference to the sbuf storing the description, supporting
arbitrary description length.
Note that, because we now have a different KPI/API with OpenBSD's
counterpart, this patchset would break some stuff like libpcap which
expect OpenBSD API.
Comments?
Cheers,
- --
Xin LI <delphij at delphij.net> http://www.delphij.net/
FreeBSD - The Power to Serve! Live free or die
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.13 (FreeBSD)
iEYEARECAAYFAkr0f08ACgkQi+vbBBjt66CLRwCfcn0b+95uQvAI5k+gs4VdQ6F+
DOcAniPvnqclIoxRbhzxI1uZOivqU/N9
=bB5n
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: sbin/ifconfig/ifconfig.8
===================================================================
--- sbin/ifconfig/ifconfig.8 (revision 198964)
+++ sbin/ifconfig/ifconfig.8 (working copy)
@@ -28,7 +28,7 @@
.\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
.\" $FreeBSD$
.\"
-.Dd September 23, 2009
+.Dd November 11, 2009
.Dt IFCONFIG 8
.Os
.Sh NAME
@@ -258,6 +258,12 @@
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 .
@@ -2512,6 +2518,10 @@
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 198964)
+++ sbin/ifconfig/ifconfig.c (working copy)
@@ -83,6 +83,8 @@
struct ifreq ifr;
char name[IFNAMSIZ];
+char *descr = NULL;
+size_t descrlen = 64;
int setaddr;
int setmask;
int doalias;
@@ -822,6 +824,36 @@
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_buffer.buffer = newdescr;
+ ifr.ifr_buffer.length = strlen(newdescr);
+ if (ioctl(s, SIOCSIFDESCR, (caddr_t)&ifr) < 0) {
+ warn("ioctl (set descr)");
+ free(newdescr);
+ return;
+ }
+ 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 +898,23 @@
printf(" mtu %d", ifr.ifr_mtu);
putchar('\n');
+ descr = reallocf(descr, descrlen);
+ if (descr != NULL) {
+ do {
+ ifr.ifr_buffer.buffer = descr;
+ ifr.ifr_buffer.length = descrlen;
+ if (ioctl(s, SIOCGIFDESCR, &ifr) == 0) {
+ if (strlen(descr) > 0)
+ printf("\tdescription: %s\n", descr);
+ break;
+ }
+ if (errno == ENAMETOOLONG) {
+ descrlen *= 2;
+ descr = reallocf(descr, descrlen);
+ }
+ } while (errno == ENAMETOOLONG);
+ }
+
if (ioctl(s, SIOCGIFCAP, (caddr_t)&ifr) == 0) {
if (ifr.ifr_curcap != 0) {
printb("\toptions", ifr.ifr_curcap, IFCAPBITS);
@@ -1035,6 +1084,10 @@
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 198964)
+++ 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 November 11, 2009
.Dt NETINTRO 4
.Os
.Sh NAME
@@ -277,6 +277,15 @@
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 198964)
+++ sys/kern/kern_jail.c (working copy)
@@ -3467,6 +3467,7 @@
case PRIV_NET_SETIFMTU:
case PRIV_NET_SETIFFLAGS:
case PRIV_NET_SETIFCAP:
+ case PRIV_NET_SETIFDESCR:
case PRIV_NET_SETIFNAME :
case PRIV_NET_SETIFMETRIC:
case PRIV_NET_SETIFPHYS:
Index: sys/net/if.c
===================================================================
--- sys/net/if.c (revision 198964)
+++ sys/net/if.c (working copy)
@@ -463,6 +463,8 @@
#ifdef MAC
mac_ifnet_destroy(ifp);
#endif /* MAC */
+ if (ifp->if_description != NULL)
+ sbuf_delete(ifp->if_description);
IF_AFDATA_DESTROY(ifp);
IF_ADDR_LOCK_DESTROY(ifp);
ifq_delete(&ifp->if_snd);
@@ -2090,6 +2092,45 @@
ifr->ifr_phys = ifp->if_physical;
break;
+ case SIOCGIFDESCR:
+ IF_AFDATA_RLOCK(ifp);
+ if (ifp->if_description == NULL)
+ error = ENOMSG;
+ else
+ error = copystr(sbuf_data(ifp->if_description),
+ ifr->ifr_buffer.buffer,
+ ifr->ifr_buffer.length, NULL);
+ IF_AFDATA_RUNLOCK(ifp);
+ break;
+
+ case SIOCSIFDESCR:
+ error = priv_check(td, PRIV_NET_SETIFDESCR);
+ if (error)
+ return (error);
+
+ IF_AFDATA_WLOCK(ifp);
+ if (ifp->if_description == NULL) {
+ ifp->if_description = sbuf_new_auto();
+ if (ifp->if_description == NULL) {
+ error = ENOMEM;
+ IF_AFDATA_WUNLOCK(ifp);
+ break;
+ }
+ } else
+ sbuf_clear(ifp->if_description);
+
+ if (sbuf_copyin(ifp->if_description, ifr->ifr_buffer.buffer,
+ ifr->ifr_buffer.length) == -1)
+ error = EFAULT;
+
+ if (error == 0) {
+ sbuf_finish(ifp->if_description);
+ getmicrotime(&ifp->if_lastchange);
+ }
+ IF_AFDATA_WUNLOCK(ifp);
+
+ break;
+
case SIOCSIFFLAGS:
error = priv_check(td, PRIV_NET_SETIFFLAGS);
if (error)
Index: sys/net/if.h
===================================================================
--- sys/net/if.h (revision 198964)
+++ sys/net/if.h (working copy)
@@ -56,6 +56,7 @@
* Note: this is the same size as a generic device's external name.
*/
#define IF_NAMESIZE 16
+
#if __BSD_VISIBLE
#define IFNAMSIZ IF_NAMESIZE
#define IF_MAXUNIT 0x7fff /* historical value */
@@ -294,6 +295,7 @@
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
+ struct { size_t length; caddr_t buffer; } ifru_buffer;
short ifru_flags[2];
short ifru_index;
int ifru_jid;
@@ -307,6 +309,7 @@
#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_buffer ifr_ifru.ifru_buffer /* user supplied buffer with its 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_jid ifr_ifru.ifru_jid /* jail/vnet */
Index: sys/net/if_var.h
===================================================================
--- sys/net/if_var.h (revision 198964)
+++ sys/net/if_var.h (working copy)
@@ -198,6 +198,7 @@
void *if_pf_kif;
void *if_lagg; /* lagg glue */
u_char if_alloctype; /* if_type at time of allocation */
+ struct sbuf *if_description; /* interface description */
/*
* Spare fields are added so that we can modify sensitive data
@@ -205,7 +206,7 @@
* be used with care where binary compatibility is required.
*/
char if_cspare[3];
- void *if_pspare[8];
+ void *if_pspare[7];
int if_ispare[4];
};
Index: sys/sys/priv.h
===================================================================
--- sys/sys/priv.h (revision 198964)
+++ 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.
Index: sys/sys/sockio.h
===================================================================
--- sys/sys/sockio.h (revision 198964)
+++ sys/sys/sockio.h (working copy)
@@ -82,6 +82,8 @@
#define SIOCGIFMAC _IOWR('i', 38, struct ifreq) /* get IF MAC label */
#define SIOCSIFMAC _IOW('i', 39, struct ifreq) /* set IF MAC label */
#define SIOCSIFNAME _IOW('i', 40, struct ifreq) /* set IF name */
+#define SIOCSIFDESCR _IOW('i', 41, struct ifreq) /* set ifnet descr */
+#define SIOCGIFDESCR _IOWR('i', 42, struct ifreq) /* get ifnet descr */
#define SIOCADDMULTI _IOW('i', 49, struct ifreq) /* add m'cast addr */
#define SIOCDELMULTI _IOW('i', 50, struct ifreq) /* del m'cast addr */
More information about the freebsd-net
mailing list