Skip to content

Instantly share code, notes, and snippets.

@msantos
Created June 11, 2011 14:30
Show Gist options
  • Select an option

  • Save msantos/1020605 to your computer and use it in GitHub Desktop.

Select an option

Save msantos/1020605 to your computer and use it in GitHub Desktop.
VPN over Erlang Distribution Protocol
-module(vpwn).
-export([start/3]).
start(Node, SrcIP, DstIP) ->
Pid = peer(Node, SrcIP, DstIP),
{ok, Dev} = tuncer:create(),
ok = tuncer:up(Dev, SrcIP),
spawn_link(fun() -> read(Dev, Pid) end),
write(Dev).
% Parent
peer(N, SrcIP, DstIP) when is_atom(N) ->
pong = net_adm:ping(N),
Self = self(),
spawn_link(N, vpwn, start, [Self, DstIP, SrcIP]);
% Child
peer(N, _, _) when is_pid(N) ->
N.
read(Dev, Pid) ->
case tuncer:read(Dev, 16#FFFF) of
{error,eagain} ->
timer:sleep(10),
read(Dev, Pid);
{ok, Data} ->
Pid ! {data, Data},
read(Dev, Pid)
end.
write(Dev) ->
receive
{data, Data} ->
ok = tuncer:write(Dev, Data),
write(Dev);
Error ->
error_logger:error_report([{write_error, Error}])
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment