From 07bdfb5f315ee79bf72cf55961d463a347d3a92b Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Tue, 26 May 2026 13:46:40 +0800 Subject: [PATCH] fix quic proto --- src/http/node_handler.erl | 9 ++++ src/quic/sdlan_quic_channel.erl | 48 ------------------- src/quic/sdlan_quic_server.erl | 2 +- ...l_sup.erl => sdlan_quic_transport_sup.erl} | 8 ++-- src/sdlan_network.erl | 34 +++++++++---- src/sdlan_sup.erl | 6 +-- 6 files changed, 43 insertions(+), 64 deletions(-) delete mode 100644 src/quic/sdlan_quic_channel.erl rename src/quic/{sdlan_quic_channel_sup.erl => sdlan_quic_transport_sup.erl} (88%) diff --git a/src/http/node_handler.erl b/src/http/node_handler.erl index 58801d2..d61fb72 100644 --- a/src/http/node_handler.erl +++ b/src/http/node_handler.erl @@ -23,6 +23,15 @@ handle_request("POST", "/node/disable", _, #{<<"network_id">> := NetworkId, <<"c {ok, 200, sdlan_util:json_data(<<"success">>)} end; +handle_request("POST", "/node/acl_changed", _, #{<<"network_id">> := NetworkId, <<"client_id">> := ClientId}) when NetworkId > 0 -> + case sdlan_network:get_pid(NetworkId) of + undefined -> + {ok, 200, sdlan_util:json_error(-1, <<"network not found">>)}; + Pid -> + sdlan_network:acl_changed(Pid, ClientId), + {ok, 200, sdlan_util:json_data(<<"success">>)} + end; + handle_request(_, Path, _, _) -> Path1 = list_to_binary(Path), {ok, 200, sdlan_util:json_error(-1, <<"url: ", Path1/binary, " not found">>)}. diff --git a/src/quic/sdlan_quic_channel.erl b/src/quic/sdlan_quic_channel.erl deleted file mode 100644 index 8cc3cb1..0000000 --- a/src/quic/sdlan_quic_channel.erl +++ /dev/null @@ -1,48 +0,0 @@ -%%%------------------------------------------------------------------- -%%% @author anlicheng -%%% @copyright (C) 2026, -%%% @doc -%%% Compatibility facade for the QUIC channel API. -%%% @end -%%%------------------------------------------------------------------- --module(sdlan_quic_channel). --author("anlicheng"). - -%% API --export([start_link/2]). --export([accept_stream/1, send_event/2, command/4, stop/2, debug_info/1]). --export([test_rules/2]). - -%%%=================================================================== -%%% API -%%%=================================================================== - -%% 测试规则函数 --spec test_rules(SrcIdentityId :: integer(), DstIdentityId :: integer()) -> binary(). -test_rules(SrcIdentityId, DstIdentityId) when is_integer(SrcIdentityId), is_integer(DstIdentityId) -> - sdlan_session:test_rules(SrcIdentityId, DstIdentityId). - --spec send_event(Pid :: pid(), Event :: binary()) -> ok. -send_event(Pid, ProtobufEvent) when is_pid(Pid), is_binary(ProtobufEvent) -> - sdlan_quic_transport:send_event(Pid, ProtobufEvent). - --spec command(Pid :: pid(), Ref :: reference(), ReceiverPid :: pid(), {Tag :: atom(), SubCommand :: any()}) -> ok. -command(Pid, Ref, ReceiverPid, SubCommand) when is_pid(Pid), is_pid(ReceiverPid) -> - sdlan_quic_transport:command(Pid, Ref, ReceiverPid, SubCommand). - --spec accept_stream(Pid :: pid()) -> ok. -accept_stream(Pid) when is_pid(Pid) -> - sdlan_quic_transport:accept_stream(Pid). - --spec stop(Pid :: pid(), Reason :: term()) -> ok. -stop(Pid, Reason) when is_pid(Pid) -> - sdlan_quic_transport:stop(Pid, Reason). - --spec debug_info(Pid :: pid()) -> map(). -debug_info(Pid) when is_pid(Pid) -> - sdlan_quic_transport:debug_info(Pid). - -%% @doc Creates a transport process. Kept for existing supervisor specs. --spec start_link(Conn :: quicer:connection_handle(), Limits :: proplists:proplist()) -> gen_statem:start_ret(). -start_link(Conn, Limits) when is_list(Limits) -> - sdlan_quic_transport:start_link(Conn, Limits). diff --git a/src/quic/sdlan_quic_server.erl b/src/quic/sdlan_quic_server.erl index a59a70b..323e59f 100644 --- a/src/quic/sdlan_quic_server.erl +++ b/src/quic/sdlan_quic_server.erl @@ -66,7 +66,7 @@ loop_accept(L, Limits, AcceptorId) -> logger:debug("[sdlan_quic_server] acceptor: ~p, accept a new connection: ~p", [AcceptorId, Conn]), case quicer:handshake(Conn) of {ok, NConn} -> - case sdlan_quic_channel_sup:start_channel(NConn, Limits) of + case sdlan_quic_transport_sup:start_transport(NConn, Limits) of {ok, ChannelPid} -> logger:debug("[sdlan_quic_server] conn: ~p, handshake success, channel pid: ~p", [NConn, ChannelPid]), case quicer:controlling_process(NConn, ChannelPid) of diff --git a/src/quic/sdlan_quic_channel_sup.erl b/src/quic/sdlan_quic_transport_sup.erl similarity index 88% rename from src/quic/sdlan_quic_channel_sup.erl rename to src/quic/sdlan_quic_transport_sup.erl index 345ed63..259bcb4 100644 --- a/src/quic/sdlan_quic_channel_sup.erl +++ b/src/quic/sdlan_quic_transport_sup.erl @@ -6,14 +6,14 @@ %%% @end %%% Created : 13. 2月 2026 18:00 %%%------------------------------------------------------------------- --module(sdlan_quic_channel_sup). +-module(sdlan_quic_transport_sup). -author("anlicheng"). -behaviour(supervisor). %% API -export([start_link/0]). --export([start_channel/2]). +-export([start_transport/2]). %% Supervisor callbacks -export([init/1]). @@ -58,6 +58,6 @@ init([]) -> %%% Internal functions %%%=================================================================== --spec start_channel(NConn :: quicer:connection_handle(), Limits :: proplists:proplist()) -> supervisor:startchild_ret(). -start_channel(NConn, Limits) when is_list(Limits) -> +-spec start_transport(NConn :: quicer:connection_handle(), Limits :: proplists:proplist()) -> supervisor:startchild_ret(). +start_transport(NConn, Limits) when is_list(Limits) -> supervisor:start_child(?MODULE, [NConn, Limits]). diff --git a/src/sdlan_network.erl b/src/sdlan_network.erl index ffc58f8..614d0ce 100644 --- a/src/sdlan_network.erl +++ b/src/sdlan_network.erl @@ -20,7 +20,7 @@ %% API -export([start_link/2]). -export([get_name/1, get_pid/1, lookup_pid/1, peer_info/3, unregister/3, debug_info/1, get_network_id/1, attach/6, arp_request/2]). --export([forward_by_ets/5, update_hole/7, disable_client/2, get_channel/2]). +-export([forward_by_ets/5, update_hole/7, disable_client/2, get_channel/2, acl_changed/2]). -export([command/4, wait_command_ack/2]). %% gen_server callbacks @@ -153,6 +153,10 @@ update_hole(Pid, SessionToken, ClientId, Mac, Peer, NatType, V6Info) when is_pid disable_client(Pid, ClientId) when is_pid(Pid), is_binary(ClientId) -> gen_server:call(Pid, {disable_client, ClientId}). +-spec acl_changed(Pid :: pid(), ClientId :: binary()) -> ok | error. +acl_changed(Pid, ClientId) when is_pid(Pid), is_binary(ClientId) -> + gen_server:call(Pid, {acl_changed, ClientId}). + -spec get_channel(Pid :: pid(), ClientId :: binary()) -> error | {ok, ChannelPid :: pid()}. get_channel(Pid, ClientId) when is_pid(Pid), is_binary(ClientId) -> gen_server:call(Pid, {get_channel, ClientId}). @@ -282,7 +286,7 @@ handle_call({peer_info, SrcMac, DstMac}, _From, State = #state{endpoint_table = }), logger:debug("Event: send_register, for peer_info"), - sdlan_quic_channel:send_event(DstChannelPid, RegisterEvent) + sdlan_quic_transport:send_event(DstChannelPid, RegisterEvent) end, {reply, {ok, {DstNatPeer, DstNatType}, DstV6Info}, State}; _ -> @@ -309,7 +313,21 @@ handle_call({command, ReceiverPid, ClientId, SubCommand}, _From, State = #state{ case select_endpoint(EndpointTable, MatchSpec) of {ok, _Mac, #endpoint{channel_pid = ChannelPid}} -> Ref = make_ref(), - sdlan_quic_channel:command(ChannelPid, Ref, ReceiverPid, SubCommand), + sdlan_quic_transport:command(ChannelPid, Ref, ReceiverPid, SubCommand), + {reply, {ok, Ref}, State}; + error -> + {reply, {error, <<"目标Node不在线"/utf8>>}, State} + end; + +%% 触发acl改变 +handle_call({acl_changed, ReceiverPid, ClientId, SubCommand}, _From, State = #state{endpoint_table = EndpointTable}) -> + MatchSpec = ets:fun2ms(fun(Object = {_Mac, #endpoint{client_id = ClientId0}}) when ClientId0 =:= ClientId -> + Object + end), + case select_endpoint(EndpointTable, MatchSpec) of + {ok, _Mac, #endpoint{channel_pid = ChannelPid}} -> + Ref = make_ref(), + sdlan_quic_transport:command(ChannelPid, Ref, ReceiverPid, SubCommand), {reply, {ok, Ref}, State}; error -> {reply, {error, <<"目标Node不在线"/utf8>>}, State} @@ -363,7 +381,7 @@ handle_cast({update_hole, SessionToken, ClientId, Mac, Peer, NatType, V6Info}, S logger:debug("[sdlan_network] Event: nat_changed, update_hole, client_id: ~p(~p), hole changed", [ClientId, Ip]), broadcast(fun(#endpoint{channel_pid = ChannelPid}) -> - sdlan_quic_channel:send_event(ChannelPid, NatChangedEvent) + sdlan_quic_transport:send_event(ChannelPid, NatChangedEvent) end, [Mac], EndpointTable) end, NEndpoint = Endpoint0#endpoint{hole = NHole, v6_info = V6Info, last_seen = erlang:monotonic_time(second)}, @@ -410,8 +428,8 @@ terminate(Reason, #state{network_id = NetworkId, endpoint_table = EndpointTable} logger:debug("[sdlan_network] Event: shutdown"), - sdlan_quic_channel:send_event(ChannelPid, NetworkShutdownEvent), - sdlan_quic_channel:stop(ChannelPid, normal); + sdlan_quic_transport:send_event(ChannelPid, NetworkShutdownEvent), + sdlan_quic_transport:stop(ChannelPid, normal); false -> ok end @@ -572,7 +590,7 @@ maybe_nat_changed(ChannelPid, Mac, Ip, EndpointTable) -> logger:debug("Event: nat_changed, for attach"), broadcast(fun(#endpoint{channel_pid = ChannelPid0}) -> - sdlan_quic_channel:send_event(ChannelPid0, Event) + sdlan_quic_transport:send_event(ChannelPid0, Event) end, [Mac], EndpointTable) end, %% 重复attach需要清理之前的绑定信息;即使IP未变化,也不能保留旧channel。 @@ -584,7 +602,7 @@ cleanup_endpoint(#endpoint{channel_ref = ChannelRef, channel_pid = ChannelPid}, is_reference(ChannelRef) andalso erlang:demonitor(ChannelRef, [flush]), case should_stop_channel(ChannelPid, KeepChannelPid) of true -> - catch sdlan_quic_channel:stop(ChannelPid, Reason), + catch sdlan_quic_transport:stop(ChannelPid, Reason), ok; false -> ok diff --git a/src/sdlan_sup.erl b/src/sdlan_sup.erl index e61f5d4..d2a76bd 100644 --- a/src/sdlan_sup.erl +++ b/src/sdlan_sup.erl @@ -76,12 +76,12 @@ init([]) -> }, #{ - id => sdlan_quic_channel_sup, - start => {sdlan_quic_channel_sup, start_link, []}, + id => sdlan_quic_transport_sup, + start => {sdlan_quic_transport_sup, start_link, []}, restart => permanent, shutdown => 2000, type => supervisor, - modules => ['sdlan_quic_channel_sup'] + modules => ['sdlan_quic_transport_sup'] }, #{