diff --git a/apps/sdlan/src/mnesia/client_model.erl b/apps/sdlan/src/mnesia/client_model.erl index 26738cf..3b67d2b 100644 --- a/apps/sdlan/src/mnesia/client_model.erl +++ b/apps/sdlan/src/mnesia/client_model.erl @@ -24,12 +24,12 @@ create_table(Tab) when is_atom(Tab) -> {type, set} ]). --spec get_table_name(NetworkId :: integer()) -> TableName :: atom(). -get_table_name(NetworkId) when is_integer(NetworkId) -> - list_to_atom("client_" ++ integer_to_list(NetworkId)). +-spec get_table_name(NetworkId :: binary()) -> TableName :: atom(). +get_table_name(NetworkId) when is_binary(NetworkId) -> + list_to_atom("client_" ++ binary_to_list(NetworkId)). --spec get_clients(NetworkId :: integer()) -> [Client :: #client{}]. -get_clients(NetworkId) when is_integer(NetworkId) -> +-spec get_clients(NetworkId :: binary()) -> [Client :: #client{}]. +get_clients(NetworkId) when is_binary(NetworkId) -> Tab = get_table_name(NetworkId), case mnesia:transaction(fun() -> mnesia:foldl(fun(R, Acc0) -> [R|Acc0] end, [], Tab) end) of {'atomic', Items} -> @@ -38,8 +38,8 @@ get_clients(NetworkId) when is_integer(NetworkId) -> [] end. --spec delete_clients(NetworkId :: integer()) -> ok | {error, Reason :: any()}. -delete_clients(NetworkId) when is_integer(NetworkId) -> +-spec delete_clients(NetworkId :: binary()) -> ok | {error, Reason :: any()}. +delete_clients(NetworkId) when is_binary(NetworkId) -> Tab = get_table_name(NetworkId), case mnesia:transaction(fun() -> mnesia:clear_table(Tab) end) of {'atomic', ok} -> @@ -48,8 +48,8 @@ delete_clients(NetworkId) when is_integer(NetworkId) -> {error, Reason} end. --spec delete_client(NetworkId :: integer(), ClientId :: binary()) -> ok | {error, Reason :: any()}. -delete_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(ClientId) -> +-spec delete_client(NetworkId :: binary(), ClientId :: binary()) -> ok | {error, Reason :: any()}. +delete_client(NetworkId, ClientId) when is_binary(NetworkId), is_binary(ClientId) -> Tab = get_table_name(NetworkId), case mnesia:transaction(fun() -> mnesia:delete(Tab, ClientId, write) end) of {'atomic', ok} -> @@ -58,8 +58,8 @@ delete_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(ClientI {error, Reason} end. --spec disable_client(NetworkId :: integer(), ClientId :: binary()) -> ok | {error, Reason :: any()}. -disable_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(ClientId) -> +-spec disable_client(NetworkId :: binary(), ClientId :: binary()) -> ok | {error, Reason :: any()}. +disable_client(NetworkId, ClientId) when is_binary(NetworkId), is_binary(ClientId) -> Tab = get_table_name(NetworkId), Fun = fun() -> case mnesia:read(Tab, ClientId, read) of @@ -78,9 +78,9 @@ disable_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(Client end. %% 分配ip地址的时候,以mac地址为唯一基准 --spec alloc_ip(NetworkId :: integer(), Ips :: list(), ClientId :: binary(), Mac :: binary(), NetAddr0 :: integer()) -> +-spec alloc_ip(NetworkId :: binary(), Ips :: list(), ClientId :: binary(), Mac :: binary(), NetAddr0 :: integer()) -> {ok, Ip :: integer()} | {error, Reason :: any()}. -alloc_ip(NetworkId, Ips, ClientId, Mac, NetAddr0) when is_binary(ClientId), is_integer(NetAddr0), is_binary(Mac) -> +alloc_ip(NetworkId, Ips, ClientId, Mac, NetAddr0) when is_binary(NetworkId), is_binary(ClientId), is_integer(NetAddr0), is_binary(Mac) -> case mnesia:transaction(fun() -> alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0) end) of {'atomic', Res} -> {ok, Res}; @@ -120,7 +120,7 @@ alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0) -> %%% helper functions %%%=================================================================== -debug(NetworkId) when is_integer(NetworkId) -> +debug(NetworkId) when is_binary(NetworkId) -> Tab = get_table_name(NetworkId), F = fun() -> Q = qlc:q([E || E <- mnesia:table(Tab)]), diff --git a/apps/sdlan/src/sdlan.app.src b/apps/sdlan/src/sdlan.app.src index 645a6b8..18c2d24 100644 --- a/apps/sdlan/src/sdlan.app.src +++ b/apps/sdlan/src/sdlan.app.src @@ -11,7 +11,6 @@ ranch, poolboy, mysql, - esockd, jiffy, hackney, gpb, diff --git a/apps/sdlan/src/sdlan_api.erl b/apps/sdlan/src/sdlan_api.erl index 5628a76..a870621 100644 --- a/apps/sdlan/src/sdlan_api.erl +++ b/apps/sdlan/src/sdlan_api.erl @@ -15,7 +15,7 @@ -export([get_all_networks/0, get_network/1]). -export([auth_token/3, node_online/3, node_offline/2, flow_report/5, network_forward_report/2]). --spec get_all_networks() -> {ok, [NetworkId :: integer()]} | {error, Reason :: any()}. +-spec get_all_networks() -> {ok, [NetworkId :: binary()]} | {error, Reason :: any()}. get_all_networks() -> case catch do_get("get_all_networks", []) of {ok, Resp} -> @@ -31,9 +31,9 @@ get_all_networks() -> Error end. --spec get_network(Id :: integer()) -> {ok, Network :: map()} | {error, Reason :: any()}. -get_network(Id) when is_integer(Id) -> - case catch do_get("get_network", [{<<"id">>, integer_to_binary(Id)}]) of +-spec get_network(Id :: binary()) -> {ok, Network :: map()} | {error, Reason :: any()}. +get_network(Id) when is_binary(Id) -> + case catch do_get("get_network", [{<<"id">>, Id}]) of {ok, Resp} -> case catch jiffy:decode(Resp, [return_maps]) of #{<<"result">> := Network} -> @@ -61,8 +61,8 @@ auth_token(ClientId, Token, Version) when is_binary(ClientId), is_binary(Token), Error end. --spec node_online(ClientId :: binary(), NetworkId :: integer(), IpAddr :: binary()) -> {ok, Resp :: map()} | {error, Reason :: any()}. -node_online(ClientId, NetworkId, IpAddr) when is_binary(ClientId), is_integer(NetworkId), is_binary(IpAddr) -> +-spec node_online(ClientId :: binary(), NetworkId :: binary(), IpAddr :: binary()) -> {ok, Resp :: map()} | {error, Reason :: any()}. +node_online(ClientId, NetworkId, IpAddr) when is_binary(ClientId), is_binary(NetworkId), is_binary(IpAddr) -> case catch do_post("set_node_status", #{<<"client_id">> => ClientId, <<"network_id">> => NetworkId, <<"ip_addr">> => IpAddr, <<"status">> => 1}) of {ok, Resp} -> {ok, catch jiffy:decode(Resp, [return_maps])}; @@ -70,8 +70,8 @@ node_online(ClientId, NetworkId, IpAddr) when is_binary(ClientId), is_integer(Ne Error end. --spec node_offline(ClientId :: binary(), NetworkId :: integer()) -> {ok, Resp :: map()} | {error, Reason :: any()}. -node_offline(ClientId, NetworkId) when is_binary(ClientId), is_integer(NetworkId) -> +-spec node_offline(ClientId :: binary(), NetworkId :: binary()) -> {ok, Resp :: map()} | {error, Reason :: any()}. +node_offline(ClientId, NetworkId) when is_binary(ClientId), is_binary(NetworkId) -> case catch do_post("set_node_status", #{<<"client_id">> => ClientId, <<"network_id">> => NetworkId, <<"status">> => 0}) of {ok, Resp} -> {ok, catch jiffy:decode(Resp, [return_maps])}; @@ -79,10 +79,10 @@ node_offline(ClientId, NetworkId) when is_binary(ClientId), is_integer(NetworkId Error end. --spec flow_report(ClientId :: binary(), NetworkId :: integer(), ForwardNum :: integer(), P2PNum :: integer(), InboundNum :: integer()) -> +-spec flow_report(ClientId :: binary(), NetworkId :: binary(), ForwardNum :: integer(), P2PNum :: integer(), InboundNum :: integer()) -> {ok, Resp :: map()} | {error, Reason :: any()}. flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum) - when is_binary(ClientId), is_integer(NetworkId), is_integer(ForwardNum), is_integer(P2PNum), is_integer(InboundNum) -> + when is_binary(ClientId), is_binary(NetworkId), is_integer(ForwardNum), is_integer(P2PNum), is_integer(InboundNum) -> Params = #{ <<"client_id">> => ClientId, <<"network_id">> => NetworkId, @@ -97,9 +97,9 @@ flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum) Error end. --spec network_forward_report(NetworkId :: integer(), ForwardNum :: integer()) -> +-spec network_forward_report(NetworkId :: binary(), ForwardNum :: integer()) -> {ok, Resp :: map()} | {error, Reason :: any()}. -network_forward_report(NetworkId, ForwardNum) when is_integer(NetworkId), is_integer(ForwardNum) -> +network_forward_report(NetworkId, ForwardNum) when is_binary(NetworkId), is_integer(ForwardNum) -> Params = #{ <<"network_id">> => NetworkId, <<"forward_num">> => ForwardNum diff --git a/apps/sdlan/src/sdlan_app.erl b/apps/sdlan/src/sdlan_app.erl index c5f4400..f57bf54 100644 --- a/apps/sdlan/src/sdlan_app.erl +++ b/apps/sdlan/src/sdlan_app.erl @@ -61,18 +61,15 @@ start_tcp_server() -> Backlog = proplists:get_value(backlog, Props, 1024), Port = proplists:get_value(port, Props), - TransOpts = [ - {tcp_options, [ - binary, - {reuseaddr, true}, - {active, false}, - {packet, 2}, + TransOpts = #{ + num_acceptors => Acceptors, + max_connections => MaxConnections, + socket_opts => [ + {port, Port}, {nodelay, false}, {backlog, Backlog} - ]}, - {acceptors, Acceptors}, - {max_connections, MaxConnections} - ], - {ok, _} = esockd:open('sdlan/tcp_server', Port, TransOpts, {sdlan_channel, start_link, []}), + ] + }, + {ok, _} = ranch:start_listener('sdlan/tcp_server', ranch_tcp, TransOpts, sdlan_channel, []), lager:debug("[sdlan_app] the tcp server start at: ~p", [Port]). \ No newline at end of file diff --git a/apps/sdlan/src/sdlan_channel.erl b/apps/sdlan/src/sdlan_channel.erl index 096d8be..f0bead8 100644 --- a/apps/sdlan/src/sdlan_channel.erl +++ b/apps/sdlan/src/sdlan_channel.erl @@ -35,7 +35,7 @@ -define(UPGRADE_FORCE, 2). %% API --export([start_link/2]). +-export([start_link/4]). -export([publish_command/4, send_event/3, stop/2, move_network/3]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). @@ -97,19 +97,15 @@ stop(Pid, Reason) when is_pid(Pid) -> %% esockd callback %%-------------------------------------------------------------------- -start_link(Transport, Sock) -> - {ok, proc_lib:spawn_link(?MODULE, init, [[Transport, Sock]])}. +start_link(Ref, _Socket, Transport, Opts) -> + {ok, proc_lib:spawn_link(?MODULE, init, [[Ref, Transport, Opts]])}. -init([Transport, Sock]) -> - lager:debug("[sdlan_channel] get a new connection: ~p", [Sock]), - case Transport:wait(Sock) of - {ok, NewSock} -> - Transport:setopts(Sock, [{active, true}]), - erlang:start_timer(?PING_TICKER, self(), ping_ticker), - gen_server:enter_loop(?MODULE, [], #state{transport = Transport, socket = NewSock}); - {error, Reason} -> - {stop, Reason} - end. +init([Ref, Transport, _Opts = []]) -> + {ok, Socket} = ranch:handshake(Ref), + lager:debug("[sdlan_channel] get a new connection: ~p", [Socket]), + Transport:setopts(Socket, [{active, true}, {packet, 2}]), + erlang:start_timer(?PING_TICKER, self(), ping_ticker), + gen_server:enter_loop(?MODULE, [], #state{transport = Transport, socket = Socket}). handle_call(_Request, _From, State) -> {reply, ok, State}. diff --git a/apps/sdlan/src/sdlan_network.erl b/apps/sdlan/src/sdlan_network.erl index f5e4f85..63057bc 100644 --- a/apps/sdlan/src/sdlan_network.erl +++ b/apps/sdlan/src/sdlan_network.erl @@ -46,7 +46,7 @@ }). -record(state, { - network_id :: integer(), + network_id :: binary(), name :: binary(), ipaddr :: binary(), mask_len :: integer(), @@ -77,13 +77,13 @@ test_event(Pid) -> gen_server:cast(Pid, test_event). --spec get_pid(Id :: integer()) -> undefined | pid(). -get_pid(Id) when is_integer(Id) -> +-spec get_pid(Id :: binary()) -> undefined | pid(). +get_pid(Id) when is_binary(Id) -> whereis(get_name(Id)). --spec get_name(Id :: integer()) -> atom(). -get_name(Id) when is_integer(Id) -> - list_to_atom("sdlan_network:" ++ integer_to_list(Id)). +-spec get_name(Id :: binary()) -> atom(). +get_name(Id) when is_binary(Id) -> + list_to_atom("sdlan_network:" ++ binary_to_list(Id)). -spec reload(Pid :: pid()) -> ok | {error, Reason :: any()}. reload(Pid) when is_pid(Pid) -> @@ -94,7 +94,7 @@ reload(Pid) when is_pid(Pid) -> assign_ip_addr(Pid, ChannelPid, ClientId, Mac, NetAddr) when is_pid(Pid), is_pid(ChannelPid), is_binary(ClientId), is_binary(Mac), is_integer(NetAddr) -> gen_server:call(Pid, {assign_ip_addr, ChannelPid, ClientId, Mac, NetAddr}). --spec get_network_id(Pid :: pid()) -> {ok, NetworkId :: integer()}. +-spec get_network_id(Pid :: pid()) -> {ok, NetworkId :: binary()}. get_network_id(Pid) when is_pid(Pid) -> gen_server:call(Pid, get_network_id). @@ -140,9 +140,9 @@ get_used_map(undefined) -> #{}. %% @doc Spawns the server and registers the local name (unique) --spec(start_link(Name :: atom(), Id :: integer()) -> +-spec(start_link(Name :: atom(), Id :: binary()) -> {ok, Pid :: pid()} | ignore | {error, Reason :: term()}). -start_link(Name, Id) when is_atom(Name), is_integer(Id) -> +start_link(Name, Id) when is_atom(Name), is_binary(Id) -> gen_server:start_link({local, Name}, ?MODULE, [Id], []). %%%=================================================================== @@ -154,7 +154,7 @@ start_link(Name, Id) when is_atom(Name), is_integer(Id) -> -spec(init(Args :: term()) -> {ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} | {stop, Reason :: term()} | ignore). -init([Id]) when is_integer(Id) -> +init([Id]) -> erlang:process_flag(trap_exit, true), case sdlan_api:get_network(Id) of {ok, #{<<"ipaddr">> := Null}} when Null == <<"null">>; Null == <<"NULL">> -> diff --git a/apps/sdlan/src/sdlan_network_sup.erl b/apps/sdlan/src/sdlan_network_sup.erl index 5a39378..5fe2391 100644 --- a/apps/sdlan/src/sdlan_network_sup.erl +++ b/apps/sdlan/src/sdlan_network_sup.erl @@ -51,8 +51,8 @@ init([]) -> %%% Internal functions %%%=================================================================== --spec ensured_network_started(Id :: integer()) -> {ok, Pid :: pid()} | {error, Reason :: any()}. -ensured_network_started(Id) when is_integer(Id) -> +-spec ensured_network_started(Id :: binary()) -> {ok, Pid :: pid()} | {error, Reason :: any()}. +ensured_network_started(Id) when is_binary(Id) -> case sdlan_network:get_pid(Id) of undefined -> case supervisor:start_child(?MODULE, child_spec(Id)) of @@ -67,8 +67,8 @@ ensured_network_started(Id) when is_integer(Id) -> {ok, Pid} end. --spec start_network(Id :: integer()) -> {ok, Pid :: pid()} | {error, Reason :: any()}. -start_network(Id) when is_integer(Id) -> +-spec start_network(Id :: binary()) -> {ok, Pid :: pid()} | {error, Reason :: any()}. +start_network(Id) when is_binary(Id) -> case supervisor:start_child(?MODULE, child_spec(Id)) of {ok, Pid} when is_pid(Pid) -> {ok, Pid}; @@ -88,8 +88,8 @@ reallocate_bind_width() -> ChildPids = lists:map(fun({_Id, ChildPid, _Type, _Modules}) -> ChildPid end, supervisor:which_children(?MODULE)), set_network_bind(length(ChildPids)). --spec delete_network(NetworkId :: integer()) -> ok | {error, Reason :: any()}. -delete_network(NetworkId) when is_integer(NetworkId) -> +-spec delete_network(NetworkId :: binary()) -> ok | {error, Reason :: any()}. +delete_network(NetworkId) when is_binary(NetworkId) -> ChildId = sdlan_network:get_name(NetworkId), case supervisor:terminate_child(?MODULE, ChildId) of ok -> @@ -98,8 +98,8 @@ delete_network(NetworkId) when is_integer(NetworkId) -> Error end. --spec child_spec(Id :: integer()) -> map(). -child_spec(Id) when is_integer(Id) -> +-spec child_spec(Id :: binary()) -> map(). +child_spec(Id) when is_binary(Id) -> Name = sdlan_network:get_name(Id), #{ id => Name, diff --git a/rebar.config b/rebar.config index 3c9e869..4ade2c4 100644 --- a/rebar.config +++ b/rebar.config @@ -3,9 +3,8 @@ {poolboy, ".*", {git, "https://github.com/devinus/poolboy.git", {tag, "1.5.1"}}}, {hackney, ".*", {git, "https://github.com/benoitc/hackney.git", {tag, "1.16.0"}}}, {sync, ".*", {git, "https://github.com/rustyio/sync.git", {branch, "master"}}}, - {esockd, ".*", {git, "https://github.com/emqx/esockd.git", {tag, "v5.7.3"}}}, {jiffy, ".*", {git, "https://github.com/davisp/jiffy.git", {tag, "1.1.1"}}}, - {cowboy, ".*", {git, "https://github.com/ninenines/cowboy.git", {tag, "2.12.0"}}}, + {cowboy, ".*", {git, "https://github.com/ninenines/cowboy.git", {tag, "2.14.2"}}}, {mysql, ".*", {git, "https://github.com/mysql-otp/mysql-otp", {tag, "1.8.0"}}}, {gpb, ".*", {git, "https://github.com/tomas-abrahamsson/gpb.git", {tag, "4.21.1"}}}, {throttle, ".*", {git, "https://github.com/lambdaclass/throttle.git", {tag, "0.3.0"}}}, diff --git a/rebar.lock b/rebar.lock index 7566f8a..e5286c5 100644 --- a/rebar.lock +++ b/rebar.lock @@ -2,16 +2,12 @@ [{<<"certifi">>,{pkg,<<"certifi">>,<<"2.5.2">>},1}, {<<"cowboy">>, {git,"https://github.com/ninenines/cowboy.git", - {ref,"3ea8395eb8f53a57acb5d3c00b99c70296e7cdbd"}}, + {ref,"495e74ada88d0876d7e438d53f11af767a9cdcc4"}}, 0}, {<<"cowlib">>, {git,"https://github.com/ninenines/cowlib", - {ref,"1eb7f4293a652adcfe43b1835d22c58d8def839f"}}, + {ref,"aca0ad953417b29bab2c41eeb4c37c98606c848b"}}, 1}, - {<<"esockd">>, - {git,"https://github.com/emqx/esockd.git", - {ref,"d9ce4024cc42a65e9a05001997031e743442f955"}}, - 0}, {<<"fs">>,{pkg,<<"fs">>,<<"6.1.1">>},1}, {<<"goldrush">>,{pkg,<<"goldrush">>,<<"0.1.9">>},1}, {<<"gpb">>, @@ -47,7 +43,7 @@ 0}, {<<"ranch">>, {git,"https://github.com/ninenines/ranch", - {ref,"a692f44567034dacf5efcaa24a24183788594eb7"}}, + {ref,"10b51304b26062e0dbfd5e74824324e9a911e269"}}, 1}, {<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.6">>},1}, {<<"sync">>,