I think this is the complete diff, with the man page bits mostly from
Martijn. Now that the ifconfig -M bits are in, this should be easier
to test. I was able to test the installer bits, and they worked for me.
Index: etc/netstart
===================================================================
RCS file: /cvs/src/etc/netstart,v
retrieving revision 1.229
diff -u -p -r1.229 netstart
--- etc/netstart 5 Nov 2022 12:06:05 -0000 1.229
+++ etc/netstart 26 Nov 2022 17:21:38 -0000
@@ -135,6 +135,23 @@ ifstart() {
local _if=$1 _hn=/etc/hostname.$1 _cmds _i=0 _line _stat
set -A _cmds
+ # If the _if looks like an lladdr and look it up.
+ if [[ $_if = ??:??:??:??:??:?? ]]; then
+ if ! _line="$( ifconfig -M "$_if" )"; then
+ print -u2 "${0##*/}: unique if for lladdr $_if not
found."
+ return
+ fi
+
+ [[ -z "$_line" ]] && return
+ _if=$_line
+ _line=
+
+ if [[ -e /etc/hostname.$_if ]]; then
+ print -u2 "${0##*/}: $_hn: /etc/hostname.$_if overrides"
+ return
+ fi
+ fi
+
# Interface names must be alphanumeric only. We check to avoid
# configuring backup or temp files, and to catch the "*" case.
[[ $_if != +([[:alpha:]])+([[:digit:]]) ]] && return
@@ -183,14 +200,16 @@ ifmstart() {
local _sifs=$1 _xifs=$2 _hn _if _sif _xif
for _sif in ${_sifs:-ALL}; do
- for _hn in /etc/hostname.+([[:alpha:]])+([[:digit:]]); do
+ for _hn in
/etc/hostname.@(+([[:alpha:]])+([[:digit:]])|??:??:??:??:??:??); do
[[ -f $_hn ]] || continue
_if=${_hn#/etc/hostname.}
- # Skip unwanted ifs.
- for _xif in $_xifs; do
- [[ $_xif == ${_if%%[0-9]*} ]] && continue 2
- done
+ if [[ $_if = +([[:alpha:]])+([[:digit:]]) ]]; then
+ # Skip unwanted ifs.
+ for _xif in $_xifs; do
+ [[ $_xif == ${_if%%[0-9]*} ]] &&
continue 2
+ done
+ fi
# Start wanted ifs.
[[ $_sif == @(ALL|${_if%%[0-9]*}) ]] && ifstart $_if
Index: distrib/miniroot/install.sub
===================================================================
RCS file: /cvs/src/distrib/miniroot/install.sub,v
retrieving revision 1.1214
diff -u -p -r1.1214 install.sub
--- distrib/miniroot/install.sub 6 Nov 2022 21:32:54 -0000 1.1214
+++ distrib/miniroot/install.sub 26 Nov 2022 17:21:38 -0000
@@ -2431,6 +2431,12 @@ ifstart() {
local _if=$1 _hn=/mnt/etc/hostname.$1 _cmds _i=0 _line
set -A _cmds
+ if [[ $_if = ??:??:??:??:??:?? ]]; then
+ _if=$(ifconfig -M $_if)
+ [[ -z $_if ]] && return # invalid interface
+ [[ -e /mnt/etc/hostname.$_if ]] && return # duplicate config
+ fi
+
# Create interface if it does not yet exist.
{ ifconfig $_if || ifconfig $_if create; } >/dev/null 2>&1 || return
@@ -2472,6 +2478,9 @@ enable_ifs() {
svlan) _svlans="$_svlans $_if";;
vlan) _vlans="$_vlans $_if";;
esac
+ elif [[ $_if = ??:??:??:??:??:?? ]]; then
+ # start by lladdr
+ ifstart $_if
else
# 'Real' interfaces (if available) are done now.
ifconfig $_if >/dev/null 2>&1 && ifstart $_if
Index: share/man/man5/hostname.if.5
===================================================================
RCS file: /cvs/src/share/man/man5/hostname.if.5,v
retrieving revision 1.79
diff -u -p -r1.79 hostname.if.5
--- share/man/man5/hostname.if.5 26 Jul 2022 00:36:54 -0000 1.79
+++ share/man/man5/hostname.if.5 26 Nov 2022 17:21:38 -0000
@@ -41,9 +41,14 @@ The
.Nm hostname.*\&
files contain information regarding the configuration of each network
interface.
One file should exist for each interface that is to be configured, such as
-.Pa hostname.fxp0
+.Pa hostname.fxp0 ,
+.Pa hostname.12:34:56:78:ab ,
or
.Pa hostname.bridge0 .
+Additionally the interface name can be replaced with the interface's lladdr,
+given that the lladdr is unique across the system and no
+.Nm
+exists for the interface name.
A configuration file is not needed for lo0.
.Pp
The configuration information is expressed in a line-by-line packed format