----- Original Message -----
From: "Rob Wilton (rwilton)" <rwil...@cisco.com>
ent: Tuesday, April 23, 2019 5:45 PM

> I'm with Kristian on this. :-)
>
> I also think that "1.2.3.4/24" contains an IP addresses, and the
length of the IP prefix.
>
> For me, the natural encoding of:
>   ip-address-and-prefix would be "1.2.3.4/1.2.3.0"
>   ip-address-and-prefix-mask would be "1.2.3.4/255.255.255.0"
>   ip-address-and-prefix-len would be "1.2.3.4/24"
>
> I think that only the first one actually contains both the IP address
and the prefix.  For the other two the prefix is derived from the
provided values.
>
> ----
>
> I also think that it is useful to define this type, because types like
this are being used in various vendor models.
>
> However, I do have a concern that we may be opening IETF up for
inconsistency with the IETF YANG models if different protocols define
this in different ways.  Perhaps the answer is to define both the
combined type and the equivalent grouping, and also perhaps highlight in
the description of the grouping of the two alternative representations
that are available.

I think that the other trap we are falling into is that of trying to
make an identifier do all the work, convey the semantics, and in doing
so make the identifier clumsy and hard to use - the IETF is good at
this:-(

As was said three weeks ago, this type has three elements, an address -
10.0.0.1 - a prefix - 10.0.0.0 - and a prefix length - /24.  If you do
not have the length, then you cannot tell 10.0.0.0 (with a length of 24)
from 10.0.0.0 (with a length of 16).  But to then call it 'ip address
with prefix and with prefix length' is - well, silly comes to mind.

We need to bear in mind the namespace we are slotting this into, namely

 ip-address
 ipv4-address
 ipv6-address
 ip-address-no-zone
 ipv4-address-no-zone
 ipv6-address-no-zone
 ip-prefix
 ipv4-prefix
 ipv6-prefix

which steers me towards
ip-address-prefix
with perhaps an alternative of
ip-address-mask
except that I fear that the latter would fall foul of the IESG with
their insistence that all must be IPv6 and having to cater for those who
are not old enough to know what a mask is.

If the namespace were large, e.g. Webster's Dictionary, then our
identifier would need to be longer - but it isn't

Tom Petch

> Thanks,
> Rob
>
>
> -----Original Message-----
> From: netmod <netmod-boun...@ietf.org> On Behalf Of Martin Bjorklund
> Sent: 23 April 2019 11:55
> To: krist...@spritelink.net
> Cc: netmod@ietf.org
> Subject: Re: [netmod] 6991bis: address-with-prefix-length
>
> Kristian Larsson <krist...@spritelink.net> wrote:
> >
> >
> > On 2019-04-18 14:18, Martin Bjorklund wrote:
> > > Juergen Schoenwaelder <j.schoenwael...@jacobs-university.de>
wrote:
> > >> On Thu, Apr 18, 2019 at 10:41:11AM +0200, Ladislav Lhotka wrote:
> > >>>>>
> > >>>>> I am not in favour of adding this type. Having ip-prefix next
to
> > >>>>> ip-address-and-prefix is confusing.
> > >>>>
> > >>>> Confusing or not, they are NOT interchangeable and actually do
> > >>>> different things, which is why both are needed. There's plenty
of
> > >>>> precedence to
> > >>>
> > >>> I actually agree with you. It is a historical accident that
these
> > >>> two different things got mixed up (and some vendors contributed
to
> > >>> this). I would argue that
> > >>>
> > >>> - IP prefix is a set of IP addresses, and as such can be thought
of
> > >>>    as a single entity.
> > >>>
> > >>> - IP address and subnet mask/prefix are two separate things, the
> > >>>    latter being an instruction for routing to *other*
destination
> > >>>    addresses.
> > >>
> > >> I think we should be pragmatic. There are other common types that
> > >> are in fact constructed out of simpler types, date-and-time is a
> > >> prime example of a type constructed out of a date value and a
time value.
> > > I think that date-and-time represents one thing - a single point
in
> > > time.
> >
> > Convenient for users to enter a single point in time in terms of
year,
> > month, day, hours, minutes and seconds, perhaps. But not as
convenient
> > for a program that needs to compare two date-and-times.
>
> Actually, *comparing* works quite ok, but calculating diff is not as
easy.
>
> > Clearly for a
> > program comparing times against each other we must represent a point
> > in time as the number of vibrations of cesium since an arbitrarily
> > chosen epoch.
>
> We do have yang:timeticks as well.  In some cases that's a better type
than yang:date-and-time.
>
> > >> is sometimes convenient to treat something that is in fact
> > >> constructed as an atomic value.
> > > Convenient for users that enter these values, perhaps.  But not as
> > > convenient for a program (or a filter) that needs one of the
> > > combined values.
> >
> > Really? Are you using a text representation of IP addresses when you
> > handle them in your program?
> >
> > If you are to deal with IP addresses, prefixes etc in a robust way
in
> > your program, you need an internal datatype that understands what an
> > address is - it needs to handle it as bits and massage it to any
other
> > presentation you want. It needs to understand relevant comparisons
and
> > operations, like is prefix A contained in prefix B?
>
> I agree.  Note that I wrote *filter* above.  It also extends to
must/when expressions.  The problem is that these mechanisms use XPath,
and XPath is quite limited when it comes to "understanding"
> types.  I even wrote a (now expired) draft with a proposed solution:
>
https://tools.ietf.org/html/draft-bjorklund-netmod-yang-xpath-extensions
-00
>
>
> > Or if we are dealing with time, then a class that understands leap
> > years, leap seconds, time zones etc can be fairly useful so you
don't
> > have to fall in any of those pitfalls.
> >
> > I don't think we choose a format or representation in our YANG
models
> > primarily to suit the algorithmic needs of a computer program, in
that
> > case an IPv4 address would just be a uint32 and not the dotted quad
> > format we have today.
> >
> >
> > >  For example, suppose I want to find all entries with a given
> > > prefix; that is non-trivial with a combined ip-address-and-prefix
> > > type.
> >
> > This seems like a very weird example since it doesn't support your
> > case; it is not easier with two separate leaves!?
> >
> > The alternative to using ip-address-and-prefix-length would be to
use
> > two leaves; one for the address and the other for the subnet mask /
> > prefix-length.
> >
> > combined:
> > ip-address-and-prefix-length:
> [RW]
> >
> > split:
> > address: 1.2.3.4
> > prefix-length: 24
> >
> > Say we have another interface with address '1.2.3.5' (prefix-length
24
> > still). In what way is it easier to determine these are part of the
> > same IP prefix / subnetwork by having the values split in two
leaves?
>
> As have been said before in this thread, it is not an address and a
prefix length, it is an address and a prefix.  So the split model would
have a leaf "ip-prefix: 1.2.3.0/24", which can be compared.
>
> > There is no text operation that can easily do this for us - we need
to
> > parse the values with some class / type in our programming language
> > that helps us make this comparison so in what way is
> > ip-address-and-prefix-length worse?
> >
> > Let us look at some examples how this is typically done. Again,
> > postgresql has the 'inet' type. From the docs:
> >
> > "The input format for this type is address/y where address is an
IPv4
> > or IPv6 address and y is the number of bits in the netmask. If the
/y
> > portion is missing, the netmask is 32 for IPv4 and 128 for IPv6, so
> > the value represents just a single host. On display, the /y portion
is
> > suppressed if the netmask specifies a single host."
> >
> > It wants it combined, which means the two leaves need to be
formatted
> > into something that looks like 1.2.3.4/24.
> >
> > Python ipaddress.IPv4, from example:
> >
> >   interface = IPv4Interface('192.0.2.5/24')
> >
> > Same thing. Rust ipaddress? Same thing. Go net? Same. Our internal
> > classes that compute IP addressing? Same thing. It seems most of the
> > datatypes that natively handle this kind of information takes a text
> > format like 1.2.3.4/24 as input (and not as separate fields), which
is
> > what is being suggested we have a datatype for.
>
> Is your point that there exist libraries that _can_ handle
"<addr>/<plen>", or are you suggesting that it is problematic to have
separate objects b/c libraries _only_ handle "<addr>/<plen>"?
>
> If it is the former, I agree.  There exist functions that can handle
this format.
>
>
>
> /martin
>

_______________________________________________
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to