change escokd to ranch

This commit is contained in:
anlicheng 2025-10-17 10:28:17 +08:00
parent 72553b4fea
commit 963b0b7da5
9 changed files with 65 additions and 78 deletions

View File

@ -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)]),

View File

@ -11,7 +11,6 @@
ranch,
poolboy,
mysql,
esockd,
jiffy,
hackney,
gpb,

View File

@ -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

View File

@ -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]).

View File

@ -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}]),
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 = NewSock});
{error, Reason} ->
{stop, Reason}
end.
gen_server:enter_loop(?MODULE, [], #state{transport = Transport, socket = Socket}).
handle_call(_Request, _From, State) ->
{reply, ok, State}.

View File

@ -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">> ->

View File

@ -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,

View File

@ -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"}}},

View File

@ -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">>,