* [PATCH] The Ubuntu Collection: Winter/Spring 2006
@ 2006-02-09 22:43 Scott James Remnant
2006-02-09 22:52 ` Marco d'Itri
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Scott James Remnant @ 2006-02-09 22:43 UTC (permalink / raw)
To: linux-hotplug
[-- Attachment #1.1: Type: text/plain, Size: 1388 bytes --]
Further patches added to udev since the last drop to the list; note that
we've frozen at 079 for the time being as we're planning on releasing
with 2.6.15 so wanted a version "well tested" with that; as such these
patches are aimed at that, though should apply to later.
New patches:
70-ifrename-wait-on-eexist.patch
This is an improvement to the rename_net_if() function to allow
interface names to be swapped if probed at the same time. Should
the ioctl return the EEXIST error, the interface is instead renamed
to something temporary (__name) and then goes into a loop
trying to rename to the desired interface.
The theory is that another udev process will do the opposite, and
both renames will succeed.
80-extras-iftab_helper.patch
Adds an iftab_helper program that parses a tiny subset of the
ifrename-style /etc/iftab file and outputs the name the interface
should have.
As an improvement, if the kernel-assigned name would be taken by an
interface in this file and the selectors don't match, the interface
is renamed out of the kernel namespace (_name) so it doesn't clash
later.
We use the above patches for the following rule:
SUBSYSTEM=="net", ACTION=="add", \
PROGRAM="iftab_helper %k $sysfs{address}", \
NAME="$result"
Scott
--
Scott James Remnant
scott@ubuntu.com
[-- Attachment #1.2: Type: text/x-patch, Size: 1353 bytes --]
diff -ruNp udev-079~/udev_add.c udev-079/udev_add.c
--- udev-079~/udev_add.c 2005-12-22 23:51:30.000000000 +0000
+++ udev-079/udev_add.c 2006-02-09 22:25:59.498029768 +0000
@@ -32,6 +32,7 @@
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/sockios.h>
+#include <errno.h>
#include "libsysfs/sysfs/libsysfs.h"
#include "udev_libc_wrapper.h"
@@ -262,10 +263,30 @@ static int rename_net_if(struct udevice
strlcpy(ifr.ifr_newname, udev->name, IFNAMSIZ);
retval = ioctl(sk, SIOCSIFNAME, &ifr);
- if (retval != 0)
+ if ((retval != 0) && (errno == EEXIST)) {
+ /* Rename to something temporary then keep trying until
+ * the name we want stops being hogged. */
+ strlcpy(ifr.ifr_newname, "__", IFNAMSIZ);
+ strlcat(ifr.ifr_newname, udev->name, IFNAMSIZ);
+
+ retval = ioctl(sk, SIOCSIFNAME, &ifr);
+ if (retval != 0)
+ err("error changing net interface name: %s", strerror(errno));
+
+ strlcpy(ifr.ifr_newname, udev->name, IFNAMSIZ);
+ while ((retval = ioctl(sk, SIOCSIFNAME, &ifr)) != 0) {
+ if (errno != EEXIST) {
+ err("error changing net interface name: %s", strerror(errno));
+ break;
+ }
+
+ usleep(10000);
+ }
+ } else if (retval != 0) {
err("error changing net interface name: %s", strerror(errno));
- close(sk);
+ }
+ close(sk);
return retval;
}
[-- Attachment #1.3: Type: text/x-patch, Size: 11108 bytes --]
diff -ruNp udev-079~/extras/iftab/Makefile udev-079/extras/iftab/Makefile
--- udev-079~/extras/iftab/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ udev-079/extras/iftab/Makefile 2006-02-09 21:41:12.115562240 +0000
@@ -0,0 +1,68 @@
+# Copyright © 2006 Canonical Ltd.
+# Author: Scott James Remnant <scott@ubuntu.com>
+#
+# Released under the GNU General Public License, version 2.
+
+PROG = iftab_helper
+OBJ =
+HEADERS =
+GEN_HEADERS =
+MAN_PAGES =
+
+prefix =
+etcdir = ${prefix}/etc
+sbindir = ${prefix}/sbin
+usrbindir = ${prefix}/usr/bin
+usrsbindir = ${prefix}/usr/sbin
+libudevdir = ${prefix}/lib/udev
+mandir = ${prefix}/usr/share/man
+configdir = ${etcdir}/udev/
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+
+all: $(PROG) $(MAN_PAGES)
+.PHONY: all
+.DEFAULT: all
+
+%.o: %.c $(GEN_HEADERS)
+ $(QUIET) $(CC) -c $(CFLAGS) $< -o $@
+
+$(PROG): %: $(HEADERS) %.o $(OBJS)
+ $(QUIET) $(LD) $(LDFLAGS) $@.o $(OBJS) -o $@ $(LIBUDEV) $(LIBSYSFS) $(LIB_OBJS)
+ifneq ($(strip $(STRIPCMD)),)
+ $(QUIET) $(STRIPCMD) $@
+endif
+
+# man pages
+%.8: %.xml
+ xmlto man $?
+.PRECIOUS: %.8
+
+clean:
+ rm -f $(PROG) $(OBJS) $(GEN_HEADERS)
+.PHONY: clean
+
+install-bin: all
+ $(INSTALL_PROGRAM) -D $(PROG) $(DESTDIR)$(libudevdir)/$(PROG)
+.PHONY: install-bin
+
+uninstall-bin:
+ - rm $(DESTDIR)$(libudevdir)/$(PROG)
+.PHONY: uninstall-bin
+
+install-man:
+ $(INSTALL_DATA) -D $(PROG).8 $(DESTDIR)$(mandir)/man8/$(PROG).8
+ $(INSTALL_DATA) -D iftab.5 $(DESTDIR)$(mandir)/man5/iftab.5
+.PHONY: uninstall-man
+
+uninstall-man:
+ -rm -f $(DESTDIR)$(mandir)/man8/$(PROG).8
+ -rm -f $(DESTDIR)$(mandir)/man5/iftab.5
+.PHONY: uninstall-man
+
+install-config:
+ @echo "no config file to install"
+.PHONY: install-config
diff -ruNp udev-079~/extras/iftab/iftab.5 udev-079/extras/iftab/iftab.5
--- udev-079~/extras/iftab/iftab.5 1970-01-01 01:00:00.000000000 +0100
+++ udev-079/extras/iftab/iftab.5 2006-02-09 21:41:43.575779560 +0000
@@ -0,0 +1,74 @@
+.TH IFTAB 5 "February 2006" "" "Linux Administrator's Manual"
+.SH NAME
+iftab \- assign consistent names to network interfaces
+.SH DESCRIPTION
+The file
+.B /etc/iftab
+contains descriptive information about the various network interfaces and
+is used by
+.BR udev (8)
+and its
+.BR iftab_helper (8)
+to assign consistent names to network interfaces.
+
+.B /etc/iftab
+defines a set of \fImappings\fR. Each mapping contains an interface name
+and a set of selectors which identify the physical network device that
+should be assigned that name.
+
+If a network device matches all selectors of a mapping, \fBudev\fR will
+rename the interface to the name given by the mapping.
+
+If a network device \fIdoes not\fR match all of the selectors,
+but has the same name as the mapping, \fBudev\fR instead will rename the
+interface so that it does not have the name given by the kernel.
+.\"
+.SH COMPATIBILITY
+Please note that this file format is a subset of that supported by the
+.BR ifrename (8)
+tool you may find in other distributions, and does not (yet) support the
+full range of selectors and features.
+.\"
+.SH MAPPINGS
+Each mapping is described on a separate line, which may be broken across
+multiple lines by terminating the first line with a backslash. A mapping
+starts with an \fIinterface name\fR and contains a set of \fIselector\fR
+name and value pairs; all separated by space or tabs.
+
+The relationship between selectors of a mapping is a \fIlogical and\fR.
+A mapping only matches a network deivce if all of the selectors for it
+match.
+
+When multiple matching selectors are present, the last in the file is used.
+.\"
+.SH SELECTORS
+Each selector is composed of a selector name and selector value
+separated by spaces or tabs. Selectors specify a static attribute of a
+network device, the goal being to uniquely identify each piece of hardware.
+
+Currently only the \fBmac\fR selector is supported, other selectors supported
+by the
+.BR ifrename (8)
+tool will be supported as and when required.
+
+.TP
+.BI mac mac-address
+Matches the MAC address of the device which can be obtained by using
+.BR ifconfig (8)
+or
+.BR ip (8).
+.\"
+.SH EXAMPLE
+# This is a comment
+.br
+eth0 mac 00:12:79:59:8D:38
+.br
+eth1 mac 00:0B:CD:5C:9E:2A
+.SH SEE ALSO
+.BR udev (8)
+.BR iftab_helper (8)
+.BR ifconfig (8)
+.BR ip (8)
+.BR ifrename (8)
+.SH AUTHORS
+Scott James Remnant <scott@ubuntu.com>
diff -ruNp udev-079~/extras/iftab/iftab_helper.8 udev-079/extras/iftab/iftab_helper.8
--- udev-079~/extras/iftab/iftab_helper.8 1970-01-01 01:00:00.000000000 +0100
+++ udev-079/extras/iftab/iftab_helper.8 2006-02-09 21:49:48.502059560 +0000
@@ -0,0 +1,33 @@
+.TH IFTAB_HELPER 8 "February 2006" "" "Linux Administrator's Manual"
+.SH NAME
+iftab_helper \- udev callout to parse /etc/iftab and name network devices
+.SH SYNOPSIS
+.BI iftab_helper
+\fIdevicename\fP \fIaddress\fP
+.SH DESCRIPTION
+.B iftab_helper
+is normally called from a udev rule to provide the name for a detected
+network device. Udev can use this information to rename devices and thus
+provide consistent names for network devices.
+.SH USAGE
+.B iftab_helper
+looks up the address specified on the command-line in the \fI/etc/iftab\fR
+file and returns the name assigned to it in that file. If it is not present
+it checks whether the kernel-assigned name is assigned to a different device
+in that file and if so returns a new name for the device.
+
+.B iftab_helper
+is not responsible for performing the actual renaming, that is instead
+eperformed by udev using a NAME rule. This replaces the functionality
+previously offered by
+.BR ifrename (8)
+though note that
+.B iftab_helper
+does not support as wide a range of selectors for devices and files may
+need to be simplified.
+.SH SEE ALSO
+.BR iftab (5)
+.BR ifrename (8)
+.BR udev (8)
+.SH AUTHORS
+Scott James Remnant <scott@ubuntu.com>
diff -ruNp udev-079~/extras/iftab/iftab_helper.c udev-079/extras/iftab/iftab_helper.c
--- udev-079~/extras/iftab/iftab_helper.c 1970-01-01 01:00:00.000000000 +0100
+++ udev-079/extras/iftab/iftab_helper.c 2006-02-09 21:49:09.995913384 +0000
@@ -0,0 +1,205 @@
+/*
+ * iftab_helper - parses /etc/iftab and outputs network device name
+ *
+ * Copyright © 2006 Canonical Ltd.
+ * Author: Scott James Remnant <scott@ubuntu.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "../../logging.h"
+#include "../../udev_utils.h"
+
+#define IFTAB "/etc/iftab"
+
+#ifdef USE_LOG
+void log_message(int priority, const char *format, ...)
+{
+ va_list args;
+ static int udev_log = -1;
+
+ if (udev_log == -1) {
+ const char *value;
+
+ value = getenv("UDEV_LOG");
+ if (value)
+ udev_log = log_priority(value);
+ else
+ udev_log = LOG_ERR;
+ }
+
+ if (priority > udev_log)
+ return;
+
+ va_start(args, format);
+ vprintf(format, args);
+ if (format[strlen(format)-1] != '\n')
+ printf("\n");
+ vsyslog(priority, format, args);
+ va_end(args);
+}
+#endif
+
+char *next_token(char **linepos)
+{
+ char *token = *linepos;
+
+ /* read up to whitespace */
+ while (**linepos && !isspace(**linepos))
+ (*linepos)++;
+
+ /* split the string and skip over whitespace */
+ if (**linepos) {
+ *((*linepos)++) = '\0';
+ while (isspace(**linepos))
+ (*linepos)++;
+ }
+
+ return token;
+}
+
+const char *whats_my_name(const char *name, const char *address)
+{
+ static char iftab_name[NAME_SIZE] = "";
+ char *buf;
+ size_t bufsize, cur, lineno;
+
+ if (file_map(IFTAB, &buf, &bufsize)) {
+ if (errno != ENOENT)
+ err("%s: unable to open: %s", IFTAB, strerror(errno));
+ return NULL;
+ }
+
+ cur = 0;
+ lineno = 0;
+ while (cur < bufsize) {
+ char line[LINE_SIZE], *bufline, *linepos;
+ char *ifname;
+ size_t count;
+ int match = 1;
+
+ count = buf_get_line(buf, bufsize, cur);
+ bufline = &buf[cur];
+ cur += count+1;
+ lineno++;
+
+ if (count >= sizeof(line)) {
+ err("%s:%d: line too long", IFTAB, lineno);
+ continue;
+ }
+
+ /* eat initial whitespace */
+ while ((count > 0) && isspace(bufline[0])) {
+ bufline++;
+ count--;
+ }
+ if (!count)
+ continue;
+
+ /* comment? */
+ if (bufline[0] == '#')
+ continue;
+
+ /* copy into buffer */
+ memcpy(line, bufline, count);
+ line[count] = '\0';
+ linepos = line;
+
+ /* up to the first whitespace is the interface name */
+ ifname = next_token(&linepos);
+ if (!*linepos) {
+ err("%s:%d: no selectors for %s", IFTAB, lineno, ifname);
+ continue;
+ }
+
+ while (*linepos) {
+ char *selector, *value;
+
+ /* read selector name and value */
+ selector = next_token(&linepos);
+ if (!*linepos) {
+ err("%s:%d: no value after %s selector for %s", IFTAB, lineno, selector, ifname);
+ break;
+ }
+ value = next_token(&linepos);
+
+ if (!strcasecmp(selector, "mac")) {
+ if (strcasecmp(value, address))
+ match = 0;
+
+ } else {
+ err("%s:%d: unknown or unsupported %s selector for %s", IFTAB, lineno, selector, ifname);
+ }
+ }
+
+ if (match) {
+ /* Matched details: use assigned name */
+ strncpy(iftab_name, ifname, sizeof(iftab_name));
+ iftab_name[sizeof(iftab_name)-1] = '\0';
+ } else if (!strcasecmp(ifname, name)) {
+ /* Name already used: invent new name */
+ snprintf(iftab_name, sizeof(iftab_name), "_%s", name);
+ }
+ }
+
+ file_unmap(buf, bufsize);
+ return iftab_name;
+}
+
+
+int main(int argc, char *argv[])
+{
+ const char *name = NULL, *address = NULL, *iftab_name;
+ int ret = 0;
+ int i;
+
+ logging_init("iftab_helper");
+
+ for (i = 1; i < argc; i++) {
+ if (!name) {
+ name = argv[i];
+ } else if (!address) {
+ address = argv[i];
+ }
+ }
+
+ if (!name) {
+ err("no device name specified");
+ ret = 1;
+ goto exit;
+ }
+
+ if (!address) {
+ err("no mac address specified");
+ ret = 1;
+ goto exit;
+ }
+
+ iftab_name = whats_my_name(name, address);
+ if (!*iftab_name)
+ iftab_name = name;
+
+ printf("%s\n", iftab_name);
+
+exit:
+ logging_close();
+ return ret;
+}
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] The Ubuntu Collection: Winter/Spring 2006
2006-02-09 22:43 [PATCH] The Ubuntu Collection: Winter/Spring 2006 Scott James Remnant
@ 2006-02-09 22:52 ` Marco d'Itri
2006-02-10 1:30 ` Scott James Remnant
2006-02-10 1:35 ` Scott James Remnant
2 siblings, 0 replies; 4+ messages in thread
From: Marco d'Itri @ 2006-02-09 22:52 UTC (permalink / raw)
To: linux-hotplug
[-- Attachment #1: Type: text/plain, Size: 332 bytes --]
On Feb 09, Scott James Remnant <scott@ubuntu.com> wrote:
> The theory is that another udev process will do the opposite, and
> both renames will succeed.
Did you consider the case of a system with a dozen of interfaces, the
exaustion of available udevd child processes and the possible deadlock?
--
ciao,
Marco
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] The Ubuntu Collection: Winter/Spring 2006
2006-02-09 22:43 [PATCH] The Ubuntu Collection: Winter/Spring 2006 Scott James Remnant
2006-02-09 22:52 ` Marco d'Itri
@ 2006-02-10 1:30 ` Scott James Remnant
2006-02-10 1:35 ` Scott James Remnant
2 siblings, 0 replies; 4+ messages in thread
From: Scott James Remnant @ 2006-02-10 1:30 UTC (permalink / raw)
To: linux-hotplug
[-- Attachment #1: Type: text/plain, Size: 616 bytes --]
On Thu, 2006-02-09 at 23:52 +0100, Marco d'Itri wrote:
> On Feb 09, Scott James Remnant <scott@ubuntu.com> wrote:
>
> > The theory is that another udev process will do the opposite, and
> > both renames will succeed.
> Did you consider the case of a system with a dozen of interfaces, the
> exaustion of available udevd child processes and the possible deadlock?
>
They'll die off eventually under the three minute rule; if systems with
dozens of interfaces are really doing this kind of renaming frenzy,
they're probably doomed anyway :-)
Scott
--
Scott James Remnant
scott@ubuntu.com
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] The Ubuntu Collection: Winter/Spring 2006
2006-02-09 22:43 [PATCH] The Ubuntu Collection: Winter/Spring 2006 Scott James Remnant
2006-02-09 22:52 ` Marco d'Itri
2006-02-10 1:30 ` Scott James Remnant
@ 2006-02-10 1:35 ` Scott James Remnant
2 siblings, 0 replies; 4+ messages in thread
From: Scott James Remnant @ 2006-02-10 1:35 UTC (permalink / raw)
To: linux-hotplug
[-- Attachment #1: Type: text/plain, Size: 1217 bytes --]
On Fri, 2006-02-10 at 01:30 +0000, Scott James Remnant wrote:
> On Thu, 2006-02-09 at 23:52 +0100, Marco d'Itri wrote:
>
> > On Feb 09, Scott James Remnant <scott@ubuntu.com> wrote:
> >
> > > The theory is that another udev process will do the opposite, and
> > > both renames will succeed.
> > Did you consider the case of a system with a dozen of interfaces, the
> > exaustion of available udevd child processes and the possible deadlock?
> >
> They'll die off eventually under the three minute rule; if systems with
> dozens of interfaces are really doing this kind of renaming frenzy,
> they're probably doomed anyway :-)
>
Uh, missed the following paragraph ...
This is why it renames the interfaces to a temporary name before
waiting, so there's never a chain deadlock. You'd need a system with
twice the number of interfaces as there were maximum udev processes,
with every single one needing renaming and swapping, and be unlucky
enough for all the wrong ones to be queued at the same time.
I suspect if a sysadmin really reached that, their box is powerful
enough to increase the number of udev children *anyway*.
Scott
--
Scott James Remnant
scott@ubuntu.com
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2006-02-10 1:35 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-02-09 22:43 [PATCH] The Ubuntu Collection: Winter/Spring 2006 Scott James Remnant
2006-02-09 22:52 ` Marco d'Itri
2006-02-10 1:30 ` Scott James Remnant
2006-02-10 1:35 ` Scott James Remnant
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).