On Thu, Jun 30, 2022 at 03:35:05PM +0000, Klemens Nanni wrote:
> On Tue, Dec 07, 2021 at 08:15:41PM +0000, Klemens Nanni wrote:
> > On Tue, Nov 23, 2021 at 01:17:14AM +0000, Klemens Nanni wrote:
> > > On Tue, Nov 16, 2021 at 11:09:40PM +0000, Klemens Nanni wrote:
> > > > Run on boot without arguments, netstart(8) creates all virtual
> > > > interfaces *for which hostname.if files exist* before configuring them.
> > > > 
> > > > This prevents ordering problems with bridges and its members, as dlg's
> > > > commit message from 2018 reminds us.
> > > > 
> > > > But it also helps interface types like pair(4) which pair one another
> > > > in whatever way the user says:
> > > > 
> > > >         $ cat /etc/hostname.pair1
> > > >         patch pair2
> > > >         $ cat /etc/hostname.pair2
> > > >         rdomain 1
> > > > 
> > > > On boot this works, but `sh /etc/netstart pair1 pair2' won't work
> > > > because pair2 does not exist a creation time of pair1 because netstart
> > > > does not create virtual interfaces upfront.
> > > > 
> > > > I just hit this exact use case when setting up gelatod(8) (see ports@).
> > > > 
> > > > To fix this, pass the list of interfaces to vifscreate() and make it
> > > > create only those iff given.
> > > > 
> > > > Regular boot, i.e. `sh /etc/netstart', stays uneffected by this and
> > > > selective runs as shown work as expected without requring users to know
> > > > the order in which netstart creates/configures interfaces.
> > > > 
> > > > The installer's internal version of netstart doesn't need this at all;
> > > > neither does it have the selective semantic nor does vifscreate() exist.
> > > 
> > > Anyone?
> > > 
> > > It seems only logical to treat subsets of interfaces the same way as
> > > a full `sh /etc/netstart'.
> > > 
> > > A pair of pair(4) is one example, I'm certain there are more scenarios
> > > where you craft interfaces with `ifconfig ...' in the shell, then set up
> > > the hostname.* files and test them with `sh /etc/netstart bridge0 ...'
> > > where pseudo interfaces are involved.
> > 
> > Anyone?
> > 
> > This is really practical and fixes things at least for me when I destroy
> > interfaces, reconfigure and recreate them together, for example like so:
> > 
> >     # ifconfig pair2 destroy
> >     # ifconfig pair1 destroy
> >     ... edit hostname.*
> >     # sh /etc/netstart pair1 pair2
> >     ifconfig: patch pair2: No such file or directory
> >     add net default: gateway 192.0.0.1
> > 
> > (redoing it because who knows what failed due to the order problem and
> > what didn't...)
> > 
> >     # ifconfig pair2 destroy
> >     # ifconfig pair1 destroy
> >     # sh /usr/src/etc/netstart pair1 pair2
> >     add net default: gateway 192.0.0.1
> > 
> > Feedback? Objection? OK?
> 
> One last ping with the same diff on top of -CURRENT.
> 
> 
> Index: etc/netstart
> ===================================================================
> RCS file: /cvs/src/etc/netstart,v
> retrieving revision 1.218
> diff -u -p -r1.218 netstart
> --- etc/netstart      26 Jun 2022 09:36:13 -0000      1.218
> +++ etc/netstart      30 Jun 2022 14:48:46 -0000
> @@ -94,9 +94,11 @@ ifcreate() {
>  }
>  
>  # Create interfaces for network pseudo-devices referred to by hostname.if 
> files.
> -# Usage: vifscreate
> +# Optionally, limit creation to given interfaces only.
> +# Usage: vifscreate [if ...]
>  vifscreate() {
> -     local _vif _hn _if
> +     local _vif _hn _if _ifs
> +     set -A _ifs -- "$@"
>  
>       for _vif in $(ifconfig -C); do
>               for _hn in /etc/hostname.${_vif}+([[:digit:]]); do
> @@ -106,6 +108,9 @@ vifscreate() {
>                       # loopback for routing domain is created by kernel
>                       [[ -n ${_if##lo[1-9]*} ]] || continue
>  
> +                     ((${#_ifs[*]} > 0)) && [[ ${_ifs[*]} != *${_if}* ]] &&
> +                             continue

My gut feeling says this is wrong.
I suspect `netstart vlan0` will create an0.

You could probably do

        ((${#_ifs[*]} > 0)) && [[ " ${_ifs[*]} " != *" ${_if} "* ]] &&

but then it starts looking even worse. :-P

> +
>                       if ! ifcreate $_if; then
>                               print -u2 "${0##*/}: create for '$_if' failed."
>                       fi
> @@ -314,6 +319,7 @@ $PRINT_ONLY || [[ ! -f /etc/soii.key ]] 
>  # If we were invoked with a list of interface names, just reconfigure these
>  # interfaces (or bridges), add default routes and return.
>  if (($# > 0)); then
> +     vifscreate "$@"
>       for _if; do ifstart $_if; done
>       defaultroute
>       return

Would it be a problem just creating all pinpointed interfaces, be they
virtual or not, upfront?

/Alexander

diff --git a/etc/netstart b/etc/netstart
index 33e9689a819..62ca64803d8 100644
--- a/etc/netstart
+++ b/etc/netstart
@@ -314,6 +314,7 @@ $PRINT_ONLY || [[ ! -f /etc/soii.key ]] ||
 # If we were invoked with a list of interface names, just reconfigure these
 # interfaces (or bridges), add default routes and return.
 if (($# > 0)); then
+       for _if; do ifcreate $_if; done
        for _if; do ifstart $_if; done
        defaultroute
        return

Reply via email to