defmodule P2pChat.Transport.GenTun do require Logger require P2pChat.Transport.PrimTun, as: PrimTun @behaviour GenServer defstruct [:tun_handle] # # Server API # @impl true def init(_args) do {:ok, tun_handle} = PrimTun.make_tun_device(true) state = %__MODULE__{tun_handle: tun_handle} { :ok, state, { :continue, :recv } } end @impl true def handle_continue(:recv, state) do case PrimTun.tun_recv(state.tun_handle, 2**16) do {:ok, buf} -> Logger.debug("Received #{byte_size(buf)} bytes") {:error, :would_block} -> {} {:error, e} -> Logger.error("Error during receive: #{e}") end {:noreply, state} end @impl true def handle_call({:get_addrs}, _from, state) do result = PrimTun.get_addrs(state.tun_handle) {:reply, result, state} end # # Client API # def open() do GenServer.start_link(__MODULE__, nil) end def get_addrs(pid) do GenServer.call(pid, {:get_addrs}) end end