--- a/extras/rule_generator/write_net_rules
+++ b/extras/rule_generator/write_net_rules
@@ -53,6 +53,37 @@ write_rule() {
 	} >> $RULES_FILE
 }
 
+write_all_rules() {
+  cd /sys/class/net/ || return 0
+
+  for INTERFACE in *; do
+    case $INTERFACE in
+    eth*|ath*|wlan*|ra*|sta*) ;;
+    *) continue ;;
+    esac
+
+    INTERFACE="$INTERFACE" DEVPATH="/class/net/$INTERFACE" \
+      /lib/udev/write_net_rules || true
+  done
+}
+
+##############################################################################
+# can be used only if $RULES_FILE is empty
+if [ "$1" = "all_interfaces" ]; then
+  if [ -e $RULES_FILE ]; then
+    printf "$RULES_FILE exists, persistent interface names\nnot saved.\n" >&2
+    exit 0
+  fi
+
+  if [ ! -e /sys/class/net/ ]; then
+    echo "/sys/class/net/ is not available, persistent interface names not saved." >&2
+    exit 0
+  fi
+
+  write_all_rules
+  exit 0
+fi
+
 if [ -z "$INTERFACE" ]; then
 	echo "Missing \$INTERFACE." >&2
 	exit 1
