This PostgreSQL module provides two data types, ip4 and ip4r, which can contain a single IPv4 address or a range of IPv4 addresses, respectively.
While PostgreSQL already has built-in types 'inet' and 'cidr', the authors of this module found that they had a number of requirements that were not addressed by the built-in type.
Firstly and most importantly, the built-in types have no support for index lookups of the form (column >>= parameter), i.e. where you have a table of IP address ranges and wish to find which ones include a given IP address. This requires an rtree or gist index to do efficiently, and also requires a way to represent IP address ranges that do not fall precisely on CIDR boundaries.
Secondly, the built-in inet/cidr are somewhat overloaded with semantics, with inet combining two distinct concepts (a netblock, and a specific IP within that netblock). Furthermore, they are variable length types (to support IPv6) with non-trivial overheads, and the authors (whose applications mainly deal in large volumes of single IPv4 addresses) wanted a more lightweight representation.
ip4r therefore supports two distinct data types (so far):
ip4 - a single IPv4 address ip4r - an arbitrary range of IPv4 addresses