BitwiseIp.Block.subnet-question-mark

You're seeing just the function subnet-question-mark, go back to BitwiseIp.Block module for more information.

Specs

subnet?(t(), t()) :: boolean()

Efficiently checks if block2 is a subset of block1.

Thanks to BitwiseIp.Mask, we encode masks as integers. So if mask A is less than mask B, that means A had fewer leading bits, meaning the block will contain more addresses than the block for B. Therefore, as a prerequisite, we first check that block1's mask is <= block2's mask. If not, then there's no chance that block2 could be wholly contained in block1.

Then, if block1's range is wide enough, we can test an arbitrary IP from block2 for membership in block1. Its inclusion would imply that everything else in block2 is also included, since block1 is wider. We have a suitable address to test in the form of the :addr field from block2. The membership check involves the same bitwise AND + integer comparison as member?/2.

If the blocks don't have matching protocols, this function returns false.

Examples

iex> BitwiseIp.Block.parse!("1.0.0.0/8")
...> |> BitwiseIp.Block.subnet?(BitwiseIp.Block.parse!("1.2.0.0/16"))
true

iex> BitwiseIp.Block.parse!("1.2.0.0/16")
...> |> BitwiseIp.Block.subnet?(BitwiseIp.Block.parse!("1.0.0.0/8"))
false

iex> BitwiseIp.Block.parse!("1.2.0.0/16")
...> |> BitwiseIp.Block.subnet?(BitwiseIp.Block.parse!("1.2.0.0/16"))
true

iex> BitwiseIp.Block.parse!("1.2.0.0/16")
...> |> BitwiseIp.Block.subnet?(BitwiseIp.Block.parse!("2.3.0.0/16"))
false