View Source InetCidr (InetCidr v1.0.8)

Module Version Hex Docs Total Download License Last Updated

Classless Inter-Domain Routing (CIDR) library for Elixir that is compatible with Erlang's :inet and supports both IPv4 and IPv6.

Install

Add :inet_cidr to your list of dependencies in mix.exs:

defp deps do
  [
    {:inet_cidr, "~> 1.0.0"}
  ]
end

Usage

Parsing a CIDR string (IPv4 or IPv6)

iex> InetCidr.parse_cidr("192.168.0.0/16")
{:ok, {{192,168,0,0}, {192,168,255,255}, 16}}

iex> InetCidr.parse_cidr!("192.168.0.0/16")
{{192,168,0,0}, {192,168,255,255}, 16}

iex> InetCidr.parse_cidr("2001:abcd::/32")
{:ok, {{8193, 43981, 0, 0, 0, 0, 0, 0}, {8193, 43981, 65535, 65535, 65535, 65535, 65535, 65535}, 32}}

iex> InetCidr.parse_cidr!("2001:abcd::/32")
{{8193, 43981, 0, 0, 0, 0, 0, 0}, {8193, 43981, 65535, 65535, 65535, 65535, 65535, 65535}, 32}

Printing a CIDR block to string

iex> "192.168.0.0/16" |> InetCidr.parse_cidr! |> InetCidr.to_string
"192.168.0.0/16"

iex> "2001:abcd::/32" |> InetCidr.parse_cidr! |> InetCidr.to_string
"2001:ABCD::/32"

Check whether a CIDR block contains an IP address

There are also parse_cidr/1 and parse_address/1 versions that return {:ok,_cidr} and {:error,_msg} tuples.

IPv4

iex> cidr = InetCidr.parse_cidr!("192.168.0.0/16")
{{192,168,0,0}, {192,168,255,255}, 16}

iex> address1 = InetCidr.parse_address!("192.168.15.20")
{192,168,15,20}

iex> InetCidr.contains?(cidr, address1)
true

iex> address2 = InetCidr.parse_address!("10.168.15.20")
{10,168,15,20}

iex> InetCidr.contains?(cidr, address2)
false

IPv6

iex> cidr = InetCidr.parse_cidr!("2001:abcd::/32")
{{8193, 43981, 0, 0, 0, 0, 0, 0}, {8193, 43981, 65535, 65535, 65535, 65535, 65535, 65535}, 32}

iex> address1 = InetCidr.parse_address!("2001:abcd::")
{8193, 43981, 0, 0, 0, 0, 0, 0}

iex> InetCidr.contains?(cidr, address1)
true

iex> address2 = InetCidr.parse_address!("abcd:2001::")
{43981, 8193, 0, 0, 0, 0, 0, 0}

iex> InetCidr.contains?(cidr, address2)
false

Get the end of a CIDR block

iex> InetCidr.calc_end_address({192, 168, 0, 0}, 16)
{:ok, {192, 168, 255, 255}}

iex> InetCidr.calc_end_address!({192, 168, 0, 0}, 16)
{192, 168, 255, 255}

License

Copyright (c) 2015-2024 Cobenian and Bryan Weber

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Summary

Functions

The number of IP addresses included in the CIDR block.

The number of bits in the address family (32 for IPv4 and 128 for IPv6)

Calculates the end of a CIDR block given the start address (tuple) and prefix length.

Calculates the end of a CIDR block given the start address (tuple) and prefix length.

Returns true if the CIDR block contains the IP address, false otherwise.

Parses a string containing either an IPv4 or IPv6 CIDR block using the notation like 192.168.0.0/16 or 2001:abcd::/32. It returns a tuple with the start address, end address and cidr length.

Convenience function that takes an IPv4 or IPv6 address as a string and returns the address.

Convenience function that takes an IPv4 or IPv6 address as a string and returns the address. It raises an exception if the string does not contain a valid IP address.

Parses a string containing either an IPv4 or IPv6 CIDR block using the notation like 192.168.0.0/16 or 2001:abcd::/32.

Parses a string containing either an IPv4 or IPv6 CIDR block using the notation like 192.168.0.0/16 or 2001:abcd::/32. It returns a tuple with the start address, end address and cidr length.

Prints the CIDR block to a string such that it can be parsed back to a CIDR block by this module.

Returns true if the value passed in is an IPv4 address, false otherwise.

Returns true if the value passed in is an IPv6 address, false otherwise.

Functions

The number of IP addresses included in the CIDR block.

The number of bits in the address family (32 for IPv4 and 128 for IPv6)

Link to this function

calc_end_address(start_address, prefix_length)

View Source (since 1.0.7)

Calculates the end of a CIDR block given the start address (tuple) and prefix length.

Returns an {:ok, end_address} tuple if the start address and prefix length are valid. Returns {:error, reason} if the start address or prefix length are invalid.

Link to this function

calc_end_address!(start_address, prefix_length)

View Source (since 1.0.7)

Calculates the end of a CIDR block given the start address (tuple) and prefix length.

Assumes valid start address and prefix length. Raises an exception if either is invalid.

Returns true if the CIDR block contains the IP address, false otherwise.

Link to this function

parse(cidr_string, adjust \\ false)

View Source
This function is deprecated. Use `parse_cidr!/2` instead (or `parse_cidr/2` for {:ok, {start,end,prefix}} / {:error,msg} tuples).

Parses a string containing either an IPv4 or IPv6 CIDR block using the notation like 192.168.0.0/16 or 2001:abcd::/32. It returns a tuple with the start address, end address and cidr length.

You can optionally pass true as the second argument to adjust the start IP address if it is not consistent with the cidr length. For example, 192.168.0.0/0 would be adjusted to have a start IP of 0.0.0.0 instead of 192.168.0.0. The default behavior is to be more strict and raise an exception when this occurs.

Link to this function

parse_address(prefix)

View Source (since 1.0.6)

Convenience function that takes an IPv4 or IPv6 address as a string and returns the address.

It returns an {:ok, address} tuple if the string contains a valid IP address.

It returns an {:error, reason} tuple if the string does not contain a valid IP address.

Link to this function

parse_address!(prefix)

View Source (since 1.0.6)

Convenience function that takes an IPv4 or IPv6 address as a string and returns the address. It raises an exception if the string does not contain a valid IP address.

Link to this function

parse_cidr(cidr_string, adjust \\ false)

View Source (since 1.0.6)

Parses a string containing either an IPv4 or IPv6 CIDR block using the notation like 192.168.0.0/16 or 2001:abcd::/32.

You can optionally pass true as the second argument to adjust the start IP address if it is not consistent with the cidr length. For example, 192.168.0.0/0 would be adjusted to have a start IP of 0.0.0.0 instead of 192.168.0.0.

It returns an {:ok, {start address, end address, cidr length}} tuple if the string contains a valid IP address.

It returns an {:error, reason} tuple if the it cannot be parsed.

Link to this function

parse_cidr!(cidr_string, adjust \\ false)

View Source (since 1.0.6)

Parses a string containing either an IPv4 or IPv6 CIDR block using the notation like 192.168.0.0/16 or 2001:abcd::/32. It returns a tuple with the start address, end address and cidr length.

You can optionally pass true as the second argument to adjust the start IP address if it is not consistent with the cidr length. For example, 192.168.0.0/0 would be adjusted to have a start IP of 0.0.0.0 instead of 192.168.0.0. The default behavior is to be more strict and raise an exception when this occurs.

Prints the CIDR block to a string such that it can be parsed back to a CIDR block by this module.

Returns true if the value passed in is an IPv4 address, false otherwise.

Returns true if the value passed in is an IPv6 address, false otherwise.