implement a bunch of utility functions on tun device primitive

This commit is contained in:
lilly 2026-05-21 16:44:01 +02:00
commit d94f20d042
Signed by: lilly
SSH key fingerprint: SHA256:y9T5GFw2A20WVklhetIxG1+kcg/Ce0shnQmbu1LQ37g
9 changed files with 248 additions and 82 deletions

View file

@ -1,7 +1,7 @@
defmodule P2pChat do
def hello do
{:ok, pid1} = P2pChat.Transport.start_link(port: 12345)
netid1 = P2pChat.Transport.get_netid(pid1)
_netid1 = P2pChat.Transport.get_netid(pid1)
{:ok, pid2} = P2pChat.Transport.start_link(port: 12346)
netid2 = P2pChat.Transport.get_netid(pid2)

View file

@ -1,6 +1,6 @@
defmodule P2pChat.Transport.GenTun do
require Logger
use Rustler, otp_app: :p2p_chat, crate: "p2pchat_transport_gen_tun"
require P2pChat.Transport.PrimTun, as: PrimTun
@behaviour GenServer
@ -10,15 +10,15 @@ defmodule P2pChat.Transport.GenTun do
# Server API
#
@impl true
def init(args) do
{:ok, tun_handle} = make_tun_device()
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 tun_recv(state.tun_handle) do
case PrimTun.tun_recv(state.tun_handle, 2**16) do
{:ok, buf} ->
Logger.debug("Received #{byte_size(buf)} bytes")
{:error, :would_block} -> {}
@ -26,13 +26,13 @@ defmodule P2pChat.Transport.GenTun do
Logger.error("Error during receive: #{e}")
end
{:noreply, state, { :continue, :recv }}
{:noreply, state}
end
@impl true
def handle_call({:recv}, _from, state) do
data = tun_recv(state.tun_handle)
{ :reply, data, state }
def handle_call({:get_addrs}, _from, state) do
result = PrimTun.get_addrs(state.tun_handle)
{:reply, result, state}
end
#
@ -40,13 +40,10 @@ defmodule P2pChat.Transport.GenTun do
#
def open() do
GenServer.start_link(__MODULE__, nil)
end
end
#
# NIFs
#
defp make_tun_device(), do: :erlang.nif_error(:nif_not_loaded)
defp tun_recv(_handle, _bufsize \\ 2*16), do: :erlang.nif_error(:nif_not_loaded)
def get_addrs(pid) do
GenServer.call(pid, {:get_addrs})
end
end

View file

@ -0,0 +1,17 @@
defmodule P2pChat.Transport.PrimTun do
use Rustler, otp_app: :p2p_chat, crate: "p2pchat_transport_prim_tun"
def make_tun_device(_packet_info), do: :erlang.nif_error(:nif_not_loaded)
def recv(_handle, _bufsize), do: :erlang.nif_error(:nif_not_loaded)
def send(_handle, _buf), do: :erlang.nif_error(:nif_not_loaded)
def get_addrs(_handle), do: :erlang.nif_error(:nif_not_loaded)
def get_broadcast(_handle), do: :erlang.nif_error(:nif_not_loaded)
def get_name(_handle), do: :erlang.nif_error(:nif_not_loaded)
def set_name(_handle, _name), do: :erlang.nif_error(:nif_not_loaded)
def is_running(_handle), do: :erlang.nif_error(:nif_not_loaded)
def set_running(_handle, _should_run), do: :erlang.nif_error(:nif_not_loaded)
def add_address(_handle, _address, _prefix_length), do: :erlang.nif_error(:nif_not_loaded)
def remove_address(_handle, _address), do: :erlang.nif_error(:nif_not_loaded)
def get_mtu(_handle), do: :erlang.nif_error(:nif_not_loaded)
def set_mtu(_handle, _mtu), do: :erlang.nif_error(:nif_not_loaded)
end