From d92e5bff254d725472341156f59b9753cd2f685c Mon Sep 17 00:00:00 2001 From: Justin Schneck Date: Wed, 3 Jul 2024 15:22:49 -0400 Subject: [PATCH] reserve in use tunnel interface ips --- lib/peridio/rat/network.ex | 13 ++++++++++++- lib/peridio/rat/network/cidr.ex | 2 +- lib/peridio/rat/tunnel.ex | 8 ++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/peridio/rat/network.ex b/lib/peridio/rat/network.ex index 94f95b4..ae9886b 100644 --- a/lib/peridio/rat/network.ex +++ b/lib/peridio/rat/network.ex @@ -1,4 +1,5 @@ defmodule Peridio.RAT.Network do + alias Peridio.RAT.Tunnel alias Peridio.RAT.Network.CIDR # RFC 1918 - Private Address Space @@ -46,7 +47,7 @@ defmodule Peridio.RAT.Network do case :inet.getifaddrs() do {:ok, addrs} -> resp = - Enum.reduce(addrs, [], fn inets_interface, acc -> + Enum.reduce(addrs, tunnel_interface_cidrs(), fn inets_interface, acc -> case CIDR.from_inets_interface(inets_interface) do {:ok, cidr} -> [cidr | acc] _e -> acc @@ -60,6 +61,16 @@ defmodule Peridio.RAT.Network do end end + def tunnel_interface_cidrs() do + Peridio.RAT.DynamicSupervisor + |> DynamicSupervisor.which_children() + |> Enum.map(&elem(&1, 1)) + |> Enum.map(&Tunnel.get_state/1) + |> Enum.map(& &1.interface.ip_address.address) + |> Enum.map(&CIDR.from_ip_range(&1..&1)) + |> List.flatten() + end + def reserved_ports(port_start..port_end//_) do case System.cmd("ss", [ "-tauH", diff --git a/lib/peridio/rat/network/cidr.ex b/lib/peridio/rat/network/cidr.ex index dc6e8d9..6d4c2bd 100644 --- a/lib/peridio/rat/network/cidr.ex +++ b/lib/peridio/rat/network/cidr.ex @@ -76,7 +76,7 @@ defmodule Peridio.RAT.Network.CIDR do end def from_ip_range(_, acc \\ []) - def from_ip_range(s_ip..s_ip//_ = range, _), do: [do_from_ip_range(range)] + def from_ip_range(s_ip..e_ip//_ = range, []) when s_ip == e_ip, do: [do_from_ip_range(range)] def from_ip_range(s_ip..e_ip//_, acc) when s_ip >= e_ip, do: acc def from_ip_range(_ip_start..ip_end//_ = range, acc) do diff --git a/lib/peridio/rat/tunnel.ex b/lib/peridio/rat/tunnel.ex index fff2c29..21a217d 100644 --- a/lib/peridio/rat/tunnel.ex +++ b/lib/peridio/rat/tunnel.ex @@ -84,6 +84,10 @@ defmodule Peridio.RAT.Tunnel do } end + def get_state(pid) do + GenServer.call(pid, :get_state) + end + def start_link(%State{} = state) do GenServer.start_link(__MODULE__, state, name: generate_via_tuple(state.id, state.interface)) end @@ -119,6 +123,10 @@ defmodule Peridio.RAT.Tunnel do end end + def handle_call(:get_state, _from, state) do + {:reply, state, state} + end + def handle_info(:ttl_timeout, state) do # Just stop the process here and rely on the terminate callback to do the work. {:stop, :normal, state}