Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.07 KB | None | 0 0
  1. -module(bridge).
  2.  
  3. -export([start/2]).
  4.  
  5. -define(SIOCGIFINDEX, 16#8933).
  6. -define(ETH_P_ALL, 16#0300).
  7.  
  8. start(Iface1, Iface2) ->
  9. S1 = bind(Iface1),
  10. S2 = bind(Iface2),
  11. spawn(fun() -> loop(S1, S2) end),
  12. spawn(fun() -> loop(S2, S1) end).
  13.  
  14. loop(Src, Dst) ->
  15. case socket:recv(Src) of
  16. {error, _} ->
  17. loop(Src, Dst);
  18.  
  19. {ok, Pkt} ->
  20. _ = socket:send(Dst, Pkt),
  21. loop(Src, Dst)
  22. end.
  23.  
  24. %% private functions
  25.  
  26. bind(Iface) ->
  27. {ok, S} = socket:open(packet, raw, {raw, ?ETH_P_ALL}),
  28. {ok, 0} = socket:bind(S, sockaddr_ll(ifindex_of(S, Iface))),
  29. S.
  30.  
  31. ifindex_of(S, Iface) ->
  32. {ok, Return} = socket:ioctl(S, ?SIOCGIFINDEX, ifreq(Iface)),
  33. <<_Ifname:16/bytes, Ifr:32/native, _/binary>> = Return,
  34. Ifr.
  35.  
  36. sockaddr_ll(Ifr) ->
  37. #{
  38. family => packet,
  39. protocol => 0,
  40. ifindex => Ifr,
  41. hatype => 0,
  42. pkttype => 0,
  43. halen => 0,
  44. addr => <<0:64>>
  45. }.
  46.  
  47. ifreq(Dev) ->
  48. list_to_binary(
  49. [
  50. Dev,
  51. <<0:((15*8) - (length(Dev)*8)), 0:8, 0:128>>
  52. ]
  53. ).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement