DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

NetAddr::IP::Util



NAME

NetAddr::IP::Util -- IPv4/6 and 128 bit number utilities


SYNOPSIS

  use NetAddr::IP::Util qw(
        inet_aton
        inet_ntoa
        ipv6_aton
        ipv6_n2x
        ipv6_n2d
        inet_any2n
        hasbits
        isIPv4
        inet_n2dx
        inet_n2ad
        ipv4to6
        mask4to6
        ipanyto6
        maskanyto6
        ipv6to4
        shiftleft
        addconst
        add128
        sub128
        notcontiguous
        bin2bcd
        bcd2bin
        mode
  );
  use NetAddr::IP::Util qw(:all :inet :ipv4 :ipv6 :math)
  :inet   =>    inet_aton, inet_ntoa, ipv6_aton,
                ipv6_n2x, ipv6_n2d, inet_any2n, 
                inet_n2dx, inet_n2ad, ipv4to6,
                mask4to6, ipanyto6, maskanyto6,
                ipv6to4
  :ipv4   =>    inet_aton, inet_ntoa
  :ipv6   =>    ipv6_aton, ipv6_n2x, ipv6_n2d,
                inet_any2n, inet_n2dx, inet_n2ad
                ipv4to6, mask4to6, ipanyto6,
                maskanyto6, ipv6to4
  :math   =>    hasbits, isIPv4, addconst,
                add128, sub128, notcontiguous,
                bin2bcd, bcd2bin, shiftleft
  $dotquad = inet_ntoa($netaddr);
  $netaddr = inet_aton($dotquad);
  $ipv6naddr = ipv6_aton($ipv6_text);
  $hex_text = ipv6_n2x($ipv6naddr);
  $dec_text = ipv6_n2d($ipv6naddr);
  $ipv6naddr = inet_any2n($dotquad or $ipv6_text);
  $rv = hasbits($bits128);
  $rv = isIPv4($bits128);
  $dotquad or $hex_text = inet_n2dx($ipv6naddr);
  $dotquad or $dec_text = inet_n2ad($ipv6naddr);
  $ipv6naddr = ipv4to6($netaddr);
  $ipv6naddr = mask4to6($netaddr);
  $ipv6naddr = ipanyto6($netaddr);
  $ipv6naddr = maskanyto6($netaddr);
  $netaddr = ipv6to4($pv6naddr);
  $bitsX2 = shiftleft($bits128,$n);
  $carry = addconst($ipv6naddr,$signed_32con);
  ($carry,$ipv6naddr)=addconst($ipv6naddr,$signed_32con);
  $carry = add128($ipv6naddr1,$ipv6naddr2);
  ($carry,$ipv6naddr)=add128($ipv6naddr1,$ipv6naddr2);
  $carry = sub128($ipv6naddr1,$ipv6naddr2);
  ($carry,$ipv6naddr)=sub128($ipv6naddr1,$ipv6naddr2);
  ($spurious,$cidr) = notcontiguous($mask128);
  $bcdtext = bin2bcd($bits128);
  $bits128 = bcd2bin($bcdtxt);
  $modetext = mode;


INSTALLATION

Un-tar the distribution in an appropriate directory and type:

        perl Makefile.PL
        make
        make test
        make install

NetAddr::IP::Util installs by default with its primary functions compiled using Perl's XS extensions to build a 'C' library. If you do not have a 'C' complier available or would like the slower Pure Perl version for some other reason, then type:

        perl Makefile.PL -noxs
        make
        make test
        make install


DESCRIPTION

NetAddr::IP::Util provides a suite of tools for manipulating and converting IPv4 and IPv6 addresses into 128 bit string context and back to text. The strings can be manipulated with Perl's logical operators:

        and     &
        or      |
        xor     ^

in the same manner as 'vec' strings.

The IPv6 functions support all rfc1884 formats.

  i.e.  x:x:x:x:x:x:x:x:x
        x:x:x:x:x:x:x:d.d.d.d
        ::x:x:x
        ::x:d.d.d.d
  and so on...


EXAMPLES

  # convert any textual IP address into a 128 bit vector
  #
  sub text2vec {
    my($anyIP,$anyMask) = @_;
  # not IPv4 bit mask
    my $notiv4 = ipv6_aton('FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::');
    my $vecip   = inet_any2n($anyIP);
    my $mask    = inet_any2n($anyMask);
  # extend mask bits for IPv4
    my $bits = 128;     # default
    unless (hasbits($mask & $notiv4)) {
      $mask |= $notiv4;
      $bits = 32;
    }
    return ($vecip, $mask, $bits);
  }
  ... alternate implementation, a little faster
  sub text2vec {
    my($anyIP,$anyMask) = @_;
  # not IPv4 bit mask
    my $notiv4 = ipv6_aton('FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::');
    my $vecip   = inet_any2n($anyIP);
    my $mask    = inet_any2n($anyMask);
  # extend mask bits for IPv4
    my $bits = 128;     # default
    if (isIPv4($mask)) {
      $mask |= $notiv4;
      $bits = 32;
    }
    return ($vecip, $mask, $bits);
  }
  ... elsewhere
    $nip = {
        addr    => $vecip,
        mask    => $mask,
        bits    => $bits,
    };
  # return network and broadcast addresses from IP and Mask
  #
  sub netbroad {
    my($nip) = shift;
    my $notmask = ~ $nip->{mask};
    my $bcast   = $nip->{addr} | $notmask;
    my $network = $nip->{addr} & $nip->{mask};
    return ($network, $broadcast);
  }
  # check if address is within a network
  #
  sub within {
    my($nip,$net) = @_;
    my $addr = $nip->{addr}
    my($nw,$bc) = netbroad($net);
  # arg1 >= arg2, sub128 returns true
    return (sub128($addr,$nw) && sub128($bc,$addr))
        ? 1 : 0;
  }
  # add a constant, wrapping at netblock boundries
  # to subtract the constant, negate it before calling 
  # 'addwrap' since 'addconst' will extend the sign bits
  #
  sub addwrap {
    my($nip,$const) = @_;
    my $mask    = $nip->{addr};
    my $bits    = $nip->{bits};
    my $notmask = ~ $mask;
    my $hibits  = $addr & $mask;
    my $addr = addconst($addr,$const);
    my $wraponly = $addr & $notmask;
    my $newip = {
        addr    => $hibits | $wraponly,
        mask    => $mask,
        bits    => $bits,
    };
    # bless $newip as appropriate
    return $newip;
  }     
    
=head1 EXPORT_OK
        inet_aton
        inet_ntoa
        ipv6_aton
        ipv6_n2x
        ipv6_n2d
        inet_any2n
        hasbits
        isIPv4
        inet_n2dx
        inet_n2ad
        ipv4to6
        mask4to6
        ipanyto6
        maskanyto6
        ipv6to4
        shiftleft
        addconst
        add128
        sub128
        notcontiguous
        bin2bcd
        bcd2bin
        mode


AUTHOR

Michael Robinton <michael@bizsystems.com>


ACKNOWLEDGEMENTS

The following functions are used in whole or in part as include files to Util.xs. The copyright is include in the file.

  file:              function:
  miniSocket.inc  inet_aton, inet_ntoa

inet_aton, inet_ntoa are from the perl-5.8.0 release by Larry Wall, copyright 1989-2002. inet_aton, inet_ntoa code is current through perl-5.9.3 release. Thank you Larry for making PERL possible for all of us.


COPYRIGHT

Copyright 2003 - 2007, Michael Robinton <michael@bizsystems.com>

LICENSE AND WARRANTY

This software is (c) Michael Robinton. 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.

No warranty of any kind is expressed or implied, by using it you accept any and all the liability.


AUTHOR

Michael Robinton <michael@bizsystems.com>