Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -module(bridge).
- -export([start/2]).
- -define(SIOCGIFINDEX, 16#8933).
- -define(ETH_P_ALL, 16#0300).
- start(Iface1, Iface2) ->
- S1 = bind(Iface1),
- S2 = bind(Iface2),
- spawn(fun() -> loop(S1, S2) end),
- spawn(fun() -> loop(S2, S1) end).
- loop(Src, Dst) ->
- case socket:recv(Src) of
- {error, _} ->
- loop(Src, Dst);
- {ok, Pkt} ->
- _ = socket:send(Dst, Pkt),
- loop(Src, Dst)
- end.
- %% private functions
- bind(Iface) ->
- {ok, S} = socket:open(packet, raw, {raw, ?ETH_P_ALL}),
- {ok, 0} = socket:bind(S, sockaddr_ll(ifindex_of(S, Iface))),
- S.
- ifindex_of(S, Iface) ->
- {ok, Return} = socket:ioctl(S, ?SIOCGIFINDEX, ifreq(Iface)),
- <<_Ifname:16/bytes, Ifr:32/native, _/binary>> = Return,
- Ifr.
- sockaddr_ll(Ifr) ->
- #{
- family => packet,
- protocol => 0,
- ifindex => Ifr,
- hatype => 0,
- pkttype => 0,
- halen => 0,
- addr => <<0:64>>
- }.
- ifreq(Dev) ->
- list_to_binary(
- [
- Dev,
- <<0:((15*8) - (length(Dev)*8)), 0:8, 0:128>>
- ]
- ).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement