Newer
Older
dns_server / netmask_table.ml
module NetmasksTable = Map.Make(String)

let int_of_ip ip =
  match (ip |> String.split_on_char '.' |> List.map int_of_string) with
  | a::b::c::d::[] -> (a * 256 * 256 * 256) + (b * 256 * 256) + (c * 256) + d |> Int32.of_int
  | _ -> assert false

let netmasks_table = [("/32", "255.255.255.255");
                      ("/31", "255.255.255.254");
                      ("/30", "255.255.255.252");
                      ("/29", "255.255.255.248");
                      ("/28", "255.255.255.240");
                      ("/27", "255.255.255.224");
                      ("/26", "255.255.255.192");
                      ("/25", "255.255.255.128");
                      ("/24", "255.255.255.0");
                      ("/23", "255.255.254.0");
                      ("/22", "255.255.252.0");
                      ("/21", "255.255.248.0");
                      ("/20", "255.255.240.0");
                      ("/19", "255.255.224.0");
                      ("/18", "255.255.192.0");
                      ("/17", "255.255.128.0");
                      ("/16", "255.255.0.0");
                      ("/15", "255.254.0.0");
                      ("/14", "255.252.0.0");
                      ("/13", "255.248.0.0");
                      ("/12", "255.240.0.0");
                      ("/11", "255.224.0.0");
                      ("/10", "255.192.0.0");
                      ("/9",  "255.128.0.0");
                      ("/8",  "255.0.224.0");
                      ("/7",  "254.0.0.0");
                      ("/6",  "252.0.0.0");
                      ("/5",  "248.0.0.0");
                      ("/4",  "240.0.0.0");
                      ("/3",  "224.0.0.0");
                      ("/2",  "192.0.0.0");
                      ("/1",  "128.0.0.0");
                      ("/0",  "0.0.0.0")]
                     |> List.map (fun (cidr, nm) -> cidr, int_of_ip nm) |> List.to_seq |> NetmasksTable.of_seq

let nmask_of_cidr st =
  NetmasksTable.find st netmasks_table