This module provides an object-oriented abstraction on top of IP
addresses or IP subnets, that allows for easy manipulations. Many
operations are supported, as described below:
Those are numeric comparisons. All will return undef if you attempt to
compare a V4 subnet with a V6 subnet, when V6 becomes supported some
day.
In case the version matches, the numeric representation of the network
is compared through the corresponding operation. The netmask is
ignored for these comparisons, as there is no standard criteria to say
wether 10/8 is larger than 10/10 or not.
my $net = new NetAddr::IP $cidr_spec;
for my $ip (@$net) {
print "Host $ip is in $net\n";
}
However, note that this might generate a very large amount of items in
the list. You must be careful when doing this kind of expansion, as it
is very easy to consume huge amounts of resources. See below for
smarter ways to do loops and other constructions that are much more
conservative.
Auto-incrementing a NetAddr::IP object causes the address part to be
adjusted to the next host address within the subnet. It will wrap at
the broadcast address and start again from the network address.
perldoc2tree.cgi: /usr/lib/perl5/vendor_perl/5.8.5/NetAddr/IP.pm: cannot resolve L in paragraph 160.
This module defines hooks to collaborate with Storable for
serializing NetAddr::IP objects, through compact and human readable
strings. You can revert to the old format by invoking this module as
This method creates a new IPv4 address with the supplied address in
$addr and an optional netmask $mask, which can be omitted to get
a /32 mask.
$addr can be almost anything that can be resolved to an IP address
in all the notations I have seen over time. It can optionally contain
the mask in CIDR notation.
prefix notation is understood, with the limitation that the range
speficied by the prefix must match with a valid subnet.
Addresses in the same format returned by inet_aton or
gethostbyname can also be understood, although no mask can be
specified for them. The default is to not attempt to recognize this
format, as it seems to be seldom used.
To accept addresses in that format, invoke the module as in
Returns a new object refering to the broadcast address of a given
subnet. The broadcast address has all ones in all the bit positions
where the netmask has zero bits. This is normally used to address all
the hosts in a given subnet.
Returns a new object refering to the network address of a given
subnet. A network address has all zero bits where the bits of the
netmask are zero. Normally this is used to refer to a subnet.
Returns a scalar with the address part of the object as a
dotted-quad. This is useful for printing or for passing the address
part of the NetAddr::IP object to other components that expect an IP
address.
Returns the address part of the NetAddr::IP object in the same format
as the inet_aton() function. This should ease a bit the code
required to deal with ``old-style'' sockets.
Returns a scalar with the address and mask in prefix
representation. This is useful for some programs, which expect its
input to be in this format. This method will include the broadcast
address in the encoding.
When called in a scalar context, will return a numeric representation
of the address part of the IP address. When called in an array
contest, it returns a list of two elements. The first element is as
described, the second element is the numeric representation of the
netmask.
This method is essential for serializing the representation of a
subnet.
When called in a scalar context, returns the wildcard bits
corresponding to the mask, in dotted-quad format.
When called in an array context, returns a two-element array. The
first element, is the address part. The second element, is the
wildcard translation of the mask.
Returns the address part in a short or compact notation. (ie,
127.0.0.1 becomes 127.1). Works with both, V4 and V6. Note that
compact_addr is now deprecated.
Returns a list of objects, representing subnets of $bits mask
produced by splitting the original object, which is left
unchanged. Note that $bits must be longer than the original
mask in order for it to be splittable.
Note that $bits can be given as an integer (the length of the mask)
or as a dotted-quad. If omitted, a host mask is assumed.
A (faster) version of ->split() that returns a reference to a
list of objects instead of a real list. This is useful when large
numbers of objects are expected.
Given a list of objects (including $me), this method will compact
all the addresses and subnets into the largest (ie, least specific)
subnets possible that contain exactly all of the given objects.
Note that in versions prior to 3.02, if fed with the same IP subnets
multiple times, these subnets would be returned. From 3.02 on, a more
``correct'' approach has been adopted and only one address would be
returned.
Note that $me and all $addr-n must be NetAddr::IP objects.
Will return a reference to list of NetAddr::IP subnets of
$masklen mask length, when $number or more addresses from
@list_of_subnets are found to be contained in said subnet.
Subnets from @list_of_subnets with a mask shorter than $masklen
are passed ``as is'' to the return list.
Subnets from @list_of_subnets with a mask longer than $masklen
will be counted (actually, the number of IP addresses is counted)
towards $number.
Returns a new object representing the n-th useable IP address within
the subnet (ie, the n-th host address). If no address is available
(for example, when the network is too small for $index hosts),
undef is returned.
Implemented ->new_subnet. Version changed to 1.00.
less croak()ing when improper input is fed to the module. A
more consistent 'undef' is returned now instead to allow the
user to better handle the error.
Added ->addr_number and ->mask_bits. Currently we return
normal numbers (not BigInts). Please test this in your
platform and report any problems!
00
Released under the new *official* name of NetAddr::IP
10
Added support for ->new($min, $max, $bits) form
Added ->to_numeric. This helps serializing objects
20
Chris Dowling reported that the sort method introduced in
v1.20 for ->expand and ->compact doesn't always return a
number under perl versions < 5.6.0. His fix was applied and
redistributed. Thanks Chris!
This module is hopefully released with no CR-LF issues!
Fixed a warning about uninitialized values during make test
21
Dennis Boylan pointed out a bug under Linux and perhaps
other platforms as well causing the error ``Sort subroutine
didn't return single value at
/usr/lib/perl5/site_perl/5.6.0/NetAddr/IP.pm line 299, <>
line 2.'' or similar. This was fixed.
Bug fix for /XXX.XXX.XXX.XXX netmasks under v5.6.1 suggested
by Tim Wuyts. Thanks!
Tested the module under MACHTYPE=hppa1.0-hp-hpux11.00. It is
now konwn to work under Linux (Intel/AMD), Digital Unix
(Alpha), Solaris (Sun), HP-UX11 (HP-PA-RISC), Windows
9x/NT/2K (using ActiveState on Intel).
A spurious warning when expand()ing with -w under certain
circumstances was removed. This involved using /31s, /32s
and the same netmask as the input. Thanks to Elie Rosenblum
for pointing it out.
Slight change in license terms to ease redistribution as a
Debian package.
00
This is a major rewrite, supposed to fix a number of issues pointed
out in earlier versions.
The goals for this version include getting rid of BigInts, speeding up
and also cleaning up the code, which is written in a modular enough
way so as to allow IPv6 functionality in the future, taking benefit
from most of the methods.
Note that no effort has been made to remain backwards compatible with
earlier versions. In particular, certain semantics of the earlier
versions have been removed in favor of faster performance.
This version was tested under Win98/2K (ActiveState 5.6.0/5.6.1),
HP-UX11 on PA-RISC (5.6.0), RedHat Linux 6.2 (5.6.0), Digital Unix on
Alpha (5.6.0), Solaris on Sparc (5.6.0) and possibly others.
Fxed ->compact() for cases of equal subnets or
mutually-contained IP addresses as pointed out by Peter Wirdemo. Note
that now only distinct IP addresses will be returned by this method.
Fixed the docs as suggested by Thomas Linden.
Introduced overloading to ease certain common operations.
Fixed compatibility issue with C<-E<gt>num()> on 64-bit processors.
03
Added more comparison operators.
As per Peter Wirdemo's suggestion, added ->wildcard() for
producing subnets in wildcard format.
Added ++ and + to provide for efficient iteration operations
over all the hosts of a subnet without ->expand()ing it.
Fixed typo that invalidated otherwise correct masks. This bug appeared in 3.08.
10
Fixed relops. Semantics where adjusted to remove the netmask from the
comparison. (ie, it does not make sense to say that 10.0.0.0/24 is >
10.0.0.0/16 or viceversa).
Added CVS control files, though this is of no relevance to the community.
Thanks to Steve Snodgrass for pointing out a bug in the processing of
the special names such as default, any, etc. A fix was produced and
adequate tests were added to the code.
First steps towards ``regexp free'' parsing.
Documentation revisited and reorganized within the file, so that it
helps document the code.
Added ->aton() and support for this format in
->new(). This makes the code helpful to interface with
old-style socket code.
This is an interim release just to incorporate the v6 patches
contributed. No extensive testing has been done with this support
yet. More tests are needed.
Preliminary support for IPv6 contributed by Kadlecsik Jozsi
<kadlec at sunserv.kfki.hu>. Thanks a lot!
IP.pm and other files are enconded in ISO-8859-1 (Latin1) so that I
can spell my name properly.
Fixed a bug pointed out by Brent Imhoff related to the implicit
comparison that happens within Compact(). The netmask was being
ignored in the comparison (ie, 10/8 was considered the same as
10.0/16). Since some people have requested that 10.0/16 was considered
larger than 10/8, I added this change, which makes the bug go
away. This will be the last '_' release, pending new bugs.
Regarding the comparison of subnets, I'm still open to debate so as to
wether 10.0/16 > 10/8. Certainly 255.255.0.0 > 255.0.0.0, but 2 ** 24
are more hosts than 2 ** 16. I think we might use gt & friends for
this semantic and make everyone happy, but I won't do anything else
here without (significant) feedback.
Finally. Added POD tests (and fixed minor doc bug in IP.pm). As
reported by Anand Vijay, negative numbers are assumed to be signed
ints and converted accordingly to a v4 address. split() and nth() now
work with IPv6 addresses (Thanks to Venkata Pingali for
reporting). Tests were added for v6 base functionality and
splitting. Also tests for bitwise aritmethic with long integers has
been added. I'm afraid Math::BigInt is now required.
Note that IPv6 might not be as solid as I would like. Be careful...
Fixed a bug pointed out by Andrew D. Clark, regarding proper parsing
of IP ranges with non-contiguous masks. Thanks Andrew!
20
Suggestion by Reuland Olivier gave birth to short(), which provides
for a compact representation of the IP address. Rewrote _compact to
find the longest sequence of zeros to compact. Reuland also pointed
out a flaw in contains() and within(), which was fixed. Thanks
Reuland!
Fixed rt bug #5478 in t/00-load.t.
21
Fixed minor v-string problem pointed out by Steve Snodgrass (Thanks
Steve!). NetAddr::IP can now collaborate with Storable to serialize
itself.
22
Fixed bug rt.cpan.org #7070 reported by Grover Browning (auto-inc/dec
on v6 fails). Thanks Grover. Ruben van Staveren pointed out a bug in
v6 canonicalization, as well as providing a patch that was
applied. Thanks Ruben.
23
Included support for Module::Signature. Added ->re() as
contributed by Laurent Facq (Thanks Laurent!). Added Coalesce() as
suggested by Perullo.
24
Version bump. Transfer of 3.23 to CPAN ended up in a truncated file
being uploaded.
Some IP specs resembling range notations but not depicting actual CIDR
ranges, were being erroneously recognized. Thanks to Steve Snodgrass
for reporting a bug with parsing IP addresses in 4-octet binary
format. Added optional Pod::Coverage tests. compact_addr has been
commented out, after a long time as deprecated. Improved speed of
->new() for the case of a single host IPv4 address, which seems to
be the most common one.
$Log: IP.pm,v $
Revision 3.28 2005/09/28 23:56:52 lem
Each revision will now add the CVS log to the docs automatically.
This software is (c) Luis E. Muņoz. It can be used under the terms of
the perl artistic license provided that proper credit for the work of
the author is preserved in the form of this copyright notice and
license for this module.