--- /dev/null
+#!/bin/sh
+
+# if there are no ifname parameters, just use NAME=KERNEL
+if ! getarg ifname= >/dev/null ; then
+ echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="?*", ATTR{type}=="1", NAME="%k"' \
+ > /etc/udev/rules.d/50-ifname.rules
+ return
+fi
+
+{
+ for p in $(getargs ifname=); do
+ parse_ifname_opts $p
+ printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{type}=="1", NAME="%s"\n' "$ifname_mac" "$ifname_if"
+ done
+
+ # Rename non named interfaces out of the way for named ones.
+ for p in $(getargs ifname=); do
+ parse_ifname_opts $p
+ printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="?*", ATTR{type}=="1", NAME!="?*", KERNEL=="%s", NAME="%%k-renamed"\n' "$ifname_if"
+ done
+} > /etc/udev/rules.d/50-ifname.rules
--- /dev/null
+#!/bin/sh
+#
+# Format:
+# ifname=<interface>:<mac>
+#
+# Note letters in the macaddress must be lowercase!
+#
+# Examples:
+# ifname=eth0:4a:3f:4c:04:f8:d7
+#
+# Note when using ifname= to get persistent interface names, you must specify
+# an ifname= argument for each interface used in an ip= or fcoe= argument
+
+# check if there are any ifname parameters
+if ! getarg ifname= >/dev/null ; then
+ return
+fi
+
+parse_ifname_opts() {
+ local IFS=:
+ set $1
+
+ case $# in
+ 7)
+ ifname_if=$1
+ ifname_mac=$2:$3:$4:$5:$6:$7
+ ;;
+ *)
+ die "Invalid arguments for ifname="
+ ;;
+ esac
+}
+
+# Check ifname= lines
+for p in $(getargs ifname=); do
+ parse_ifname_opts $p
+done