49 lines
1,009 B
Elixir
49 lines
1,009 B
Elixir
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
|
|
|