Re: cleaning up INET: deprecating network class A/B/C

From: Mike Karels <karels_at_freebsd.org>
Date: Tue, 19 Oct 2021 21:15:54 UTC
Rod wrote:

> > I plan to do some cleanup of the residual code defining and using the
> > old Internet network classes (A/B/C), which have been obsolete since
> > CIDR took hold.  This is an outline of what I plan, as it will happen
> > in a number of steps and reviews, and I would like feedback on some
> > of it.
> > 
> > I want to reduce the use of the obsolete definitions and interfaces,
> > and make it less likely for them to be used going forward.  I plan
> > to hide the Class A/B/C bit definitions unless a feature test macro
> > is defined; that will be the default for user code for the moment.
> > A few files in the kernel will need to define the feature test macro
> > for now (but see the next two paragraphs).

> Sounds good.

> > 
> > Several of the uses of the historical network class macros have to
> > do with generating a default network mask when none is provided.
> > The worst of these is in the code for SIOCAIFADDR (add interface
> > address).  I want to have ifconfig and/or the kernel warn about this;
> > the default is most likely wrong.  After some time with a warning,
> > it should become an error to set an Internet interface address
> > without a mask (except for loopback and point-to-point interfaces,
> > where the mask is meaningless).

> Sounds good except that last bit, mask on loopback is
> meaningful, especially for people like me that alrady
> have modified systems that change loopback from 127/8
> to 127/16.

I'm not aware of anything that uses the mask on a loopback interface;
are you?  There is no network route installed when the loopback address
is set.  I think it's similar for point-to-point interfaces, where only
the host route for the destination is added.

>  Also care should be taken on point to point,
> I think there is probably a fair bit of code/systems
> out there that MAY still assume /30 or require /30 to
> be set on these, it MAY be an interropt issue to force
> the FreeBSD end to /32.

Where is the mask ever used on a point-to-point interface?  There is
no broadcast address.  However, my changes wouldn't break anything
that isn't already broken.

> > I am tempted to define a new default mask, e.g. 24 bits, for those
> > places that must be able to generate one.  An example is NFS BOOTP
> > code.  I am interested in feedback on this idea.  It would help to
> > reduce use of the old masks, and 8- or 16-bit prefixes are highly
> > unlikely to be correct.  Comments on adding a default mask?  This
> > would eliminate the use of the old class macros in the kernel.

> I am not keen on the idea of a default mask at all.  I believe
> every place that an IP address -is- used also has the ability
> to specify a netmask.

The cases that I'm talking about, like the NFS BOOTP code, have two
choices: use a default, or fail (to boot, in this case).  I'm not talking
about adding a default anywhere, just changing it to ignore the "class"
of the address.  This would also be true when setting a local address
with ifconfig, but that would only be temporary until it starts to return
an error.

> > The C library routines inet_netof() and inet_lnaof() should be
> > deprecated, as they use the historical masks.  inet_makeaddr() is
> > almost as bad; it works almost by accident as long as a mask is a
> > multiple of 8 bits.  I'd like to remove their use from the base
> > system.  Unfortunately, I have no idea how much other software uses
> > them.  We can at least document them as deprecated and unsafe.

> Wrap them in a depricating macro, the do a EXP-RUN with that macro
> defined, should get a good idea of that fallout from that.

EXP-RUN?

> I do believe Linux still defines the CLASS macros.

It does.  There are a surprising number of references even in base.

		Mike