kern/83622: [ patch ] add network interfaces labeling support
Roman Bogorodskiy
novel at FreeBSD.org
Sun Jul 17 17:40:16 GMT 2005
>Number: 83622
>Category: kern
>Synopsis: [ patch ] add network interfaces labeling support
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Sun Jul 17 17:40:15 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator: Roman Bogorodskiy
>Release: FreeBSD 4.11-STABLE i386
>Organization:
>Environment:
System: FreeBSD freefall.freebsd.org 4.11-STABLE FreeBSD 4.11-STABLE #16: Sat Feb 26 00:02:03 GMT 2005 kensmith at freefall.freebsd.org:/c/src/sys/compile/FREEFALL i386
>Description:
This patch inspired by and based on work of OpenBSD people. It allows
setting description (label) for network interfaces. For example:
$> sudo ifconfig lo0 descr "loopback device"
$> ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
description: loopback device
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
$>
That may be useful when you have a lot of interfaces.
Attached diff contains patch for kernel and ifconfig(8). You can also
get it here:
http://people.freebsd.org/~novel/patches/freebsd/if_descr.polished.diff
>How-To-Repeat:
>Fix:
diff -ru src.bak/sbin/ifconfig/ifconfig.c src/sbin/ifconfig/ifconfig.c
--- src.bak/sbin/ifconfig/ifconfig.c Sun Jul 17 17:47:09 2005
+++ src/sbin/ifconfig/ifconfig.c Sun Jul 17 18:55:49 2005
@@ -726,6 +726,14 @@
}
void
+setifdesc(const char *val, int dummy __unused, int s, const struct afswtch *afp)
+{
+ ifr.ifr_data = (caddr_t)val;
+ if (ioctl(s, SIOCSIFDESCR, &ifr) < 0)
+ warn("SIOCSIFDESCR");
+}
+
+void
setifcap(const char *vname, int value, int s, const struct afswtch *afp)
{
@@ -829,6 +837,8 @@
struct rt_addrinfo info;
int allfamilies, s;
struct ifstat ifs;
+ struct ifreq ifrdesc;
+ char ifdescr[IFDESCRSIZE];
if (afp == NULL) {
allfamilies = 1;
@@ -851,6 +861,13 @@
printf(" mtu %ld", ifm->ifm_data.ifi_mtu);
putchar('\n');
+ memset(&ifrdesc, 0, sizeof(ifrdesc));
+ strlcpy(ifrdesc.ifr_name, name, sizeof(ifrdesc.ifr_name));
+ ifrdesc.ifr_data = (caddr_t)&ifdescr;
+ if (ioctl(s, SIOCGIFDESCR, &ifrdesc) == 0 &&
+ strlen(ifrdesc.ifr_data))
+ printf("\tdescription: %s\n", ifrdesc.ifr_data);
+
if (ioctl(s, SIOCGIFCAP, (caddr_t)&ifr) == 0) {
if (ifr.ifr_curcap != 0) {
printb("\toptions", ifr.ifr_curcap, IFCAPBITS);
@@ -1025,6 +1042,8 @@
DEF_CMD_ARG("metric", setifmetric),
DEF_CMD_ARG("broadcast", setifbroadaddr),
DEF_CMD_ARG("ipdst", setifipdst),
+ DEF_CMD_ARG("description", setifdesc),
+ DEF_CMD_ARG("descr", setifdesc),
DEF_CMD_ARG2("tunnel", settunnel),
DEF_CMD("deletetunnel", 0, deletetunnel),
DEF_CMD("link0", IFF_LINK0, setifflags),
diff -ru src.bak/sbin/ifconfig/ifconfig.h src/sbin/ifconfig/ifconfig.h
--- src.bak/sbin/ifconfig/ifconfig.h Sun Jul 17 17:47:09 2005
+++ src/sbin/ifconfig/ifconfig.h Sun Jul 17 18:54:44 2005
@@ -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);
diff -ru src.bak/sys/net/if.c src/sys/net/if.c
--- src.bak/sys/net/if.c Sun Jul 17 17:46:40 2005
+++ src/sys/net/if.c Sun Jul 17 17:54:31 2005
@@ -1224,7 +1224,9 @@
{
struct ifreq *ifr;
struct ifstat *ifs;
+ char ifdescrbuf[IFDESCRSIZE];
int error = 0;
+ size_t bytesdone;
int new_flags;
size_t namelen, onamelen;
char new_name[IFNAMSIZ];
@@ -1484,6 +1486,22 @@
return (error);
error = if_setlladdr(ifp,
ifr->ifr_addr.sa_data, ifr->ifr_addr.sa_len);
+ break;
+
+ case SIOCGIFDESCR:
+ strlcpy(ifdescrbuf, ifp->if_description, IFDESCRSIZE);
+ error = copyout(ifdescrbuf, ifr->ifr_data, IFDESCRSIZE);
+ break;
+
+ case SIOCSIFDESCR:
+ if ((error = suser(td)) != 0)
+ return (error);
+ error = copyinstr(ifr->ifr_data, ifdescrbuf,
+ IFDESCRSIZE, &bytesdone);
+ if (error == 0) {
+ (void)memset(ifp->if_description, 0, IFDESCRSIZE);
+ strlcpy(ifp->if_description, ifdescrbuf, IFDESCRSIZE);
+ }
break;
default:
diff -ru src.bak/sys/net/if.h src/sys/net/if.h
--- src.bak/sys/net/if.h Sun Jul 17 17:46:40 2005
+++ src/sys/net/if.h Sun Jul 17 17:52:35 2005
@@ -63,6 +63,11 @@
#if __BSD_VISIBLE
/*
+ + * Length of interface description, including terminating '\0'.
+ */
+#define IFDESCRSIZE 64
+
+/*
* Structure used to query names of interface cloners.
*/
diff -ru src.bak/sys/net/if_var.h src/sys/net/if_var.h
--- src.bak/sys/net/if_var.h Sun Jul 17 17:46:41 2005
+++ src/sys/net/if_var.h Sun Jul 17 17:52:35 2005
@@ -137,6 +137,7 @@
int if_flags; /* up/down, broadcast, etc. */
int if_capabilities; /* interface capabilities */
int if_capenable; /* enabled features */
+ char if_description[IFDESCRSIZE]; /* interface description */
void *if_linkmib; /* link-type-specific MIB data */
size_t if_linkmiblen; /* length of above data */
struct if_data if_data;
diff -ru src.bak/sys/sys/sockio.h src/sys/sys/sockio.h
--- src.bak/sys/sys/sockio.h Sun Jul 17 17:46:49 2005
+++ src/sys/sys/sockio.h Sun Jul 17 17:52:35 2005
@@ -114,4 +114,8 @@
#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 */
+
+
#endif /* !_SYS_SOCKIO_H_ */
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list