NAME

Net::IP::LPM - Perl implementation of Longest Prefix Match algorithm

SYNOPSIS

use Net::IP::LPM;

my $lpm = Net::IP::LPM->new();

# add prefixes 
$lpm->add('0.0.0.0/0', 'default');
$lpm->add('::/0', 'defaultv6');
$lpm->add('147.229.0.0/16', 'net1');
$lpm->add('147.229.3.0/24', 'net2');
$lpm->add('147.229.3.10/32', 'host3');
$lpm->add('147.229.3.11', 'host4');
$lpm->add('2001:67c:1220::/32', 'net16');
$lpm->add('2001:67c:1220:f565::/64', 'net26');
$lpm->add('2001:67c:1220:f565::1235/128', 'host36');
$lpm->add('2001:67c:1220:f565::1236', 'host46');


printf $lpm->lookup('147.229.100.100'); # returns net1
printf $lpm->lookup('147.229.3.10');    # returns host3
printf $lpm->lookup('2001:67c:1220::1');# returns net16

DESCRIPTION

The module Net::IP::LPM implements the Longest Prefix Match algorithm to both protocols, IPv4 and IPv6. The module uses Trie algo.

PERFORMANCE

The module is able to match ~ 1 mln. lookups per second to a complete Internet BGP table (approx. 500,000 prefixes) using a common hardware (2.4GHz Xeon CPU). For more detail, make a test on the module source to check its performance on your system. Module supports both, IPv4 and IPv6 protocols.

CLASS METHODS

new - Class Constructor

$lpm = Net::IP::LPM->new( );

Constructs a new Net::IP::LPM object.

OBJECT METHODS

add - Add Prefix

$code = $lpm->add( $prefix, $value );

Adds a prefix $prefix into the database with value $value. Returns 1 if the prefix was added successfully. Returns 0 when an error occurs (typically the wrong address formating).

lookup - Lookup Address

$value = $lpm->$lookup( $address );

Looks up the prefix in the database and returns the value. If the prefix is not found or an error occured, the undef value is returned.

Before lookups are performed the database has to be rebuilt by $lpm->rebuild() operation.

lookup_raw - Lookup Address in raw format

$value = $lpm->lookup_raw( $address );

The same case as $lpm->lookup but it takes $address in raw format (result of the inet_ntop function). It is more effective than $lpm->lookup, because the conversion from text format is not necessary.

info - Returns information about the built trie

$ref = $lpm->info();

Returns following items

ipv4_nodes_total - total number of allocated nodes in trie
ipv4_nodes_value - number of allocated nodes in trie that have stored some value 
ipv4_trie_bytes - number of bytes allocated for trie nodes (without data)
ipv6_ - the same for IPv6 

dump - Return hash array reference containg all stored prefixes in the trie

$ref = $lpm->dump();

finish - Release all data in object

$lpm->finish();

SEE ALSO

There are also other implementations of the Longest Prefix Match in Perl. However, most of them have some disadvantages (poor performance, lack of support for IPv6 or require a lot of time for initial database building). However, in some cases it might be usefull:

Net::IPTrie

Net::IP::Match

Net::IP::Match::Trie

Net::IP::Match-XS

Net::CIDR::Lookup

Net::CIDR::Compare

AUTHOR

Tomas Podermanski <tpoder@cis.vutbr.cz>, Martin Ministr <leadersmash@email.cz>, Brno University of Technology

COPYRIGHT AND LICENSE

Copyright (C) 2012, Brno University of Technology

This library is a free software; you can redistribute it and/or modify it under the same terms as Perl itself.