IPv6 UDP callback and shared adapter for Erlang :gen_udp and :inet.
Select this callback with {:udp_module, SmolNet.Inet6.Udp} and pass
the target stack with {:smolnet_stack, stack}. Each returned OTP socket is
backed by one temporary :gen_statem child of the stack's inet supervisor.
SmolNet.Inet6.Udp is the IPv6 callback. The IPv4 callback
SmolNet.Inet.Udp selects the other address family and delegates its
socket operations here, so both families have identical bounded behaviour.
Datagram boundaries are preserved. Ancillary data, multicast, and file descriptors are intentionally unsupported.
Summary
Types
@type socket_term() :: {:"$inet", SmolNet.Inet.Udp | SmolNet.Inet6.Udp, pid()}
Functions
@spec child_spec(map()) :: Supervisor.child_spec()
@spec close(socket_term()) :: :ok
@spec connect(socket_term(), map()) :: :ok | {:error, atom()}
@spec connect(socket_term(), term(), term()) :: :ok | {:error, atom()}
@spec controlling_process(socket_term(), pid()) :: :ok | {:error, atom()}
@spec family() :: :inet6
@spec getaddr(term()) :: {:ok, :inet.ip6_address()} | {:error, atom()}
@spec getaddr(term(), term()) :: {:ok, :inet.ip6_address()} | {:error, atom()}
@spec getopts(socket_term(), list()) :: {:ok, list()} | {:error, atom()}
@spec getserv(term()) :: {:ok, :inet.port_number()} | {:error, atom()}
@spec getstat(socket_term(), list()) :: {:ok, list()} | {:error, atom()}
@spec info(socket_term()) :: map() | {:error, atom()}
@spec open(:inet.port_number()) :: {:ok, socket_term()} | {:error, atom()}
@spec open(:inet.port_number(), list()) :: {:ok, socket_term()} | {:error, atom()}
@spec peername(socket_term()) :: {:ok, {:inet.ip_address(), :inet.port_number()}} | {:error, atom()}
@spec recv(socket_term(), non_neg_integer()) :: {:ok, {:inet.ip_address(), :inet.port_number(), binary() | list()}} | {:error, atom()}
@spec recv(socket_term(), non_neg_integer(), timeout()) :: {:ok, {:inet.ip_address(), :inet.port_number(), binary() | list()}} | {:error, atom()}
@spec send(socket_term(), iodata()) :: :ok | {:error, atom()}
@spec send(socket_term(), term(), iodata()) :: :ok | {:error, atom()}
@spec send(socket_term(), term(), term(), iodata()) :: :ok | {:error, atom()}
@spec setopts(socket_term(), list()) :: :ok | {:error, atom()}
@spec socket_to_list(socket_term()) :: charlist()
@spec sockname(socket_term()) :: {:ok, {:inet.ip_address(), :inet.port_number()}} | {:error, atom()}
@spec start_link(map()) :: :gen_statem.start_ret()