From 2b764cac77db5aa6cd76d8944f7f45fd9d15cd9d Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Tue, 3 Mar 2026 14:14:58 +0800 Subject: [PATCH] fix quic channel --- apps/sdlan/src/quic/sdlan_quic_channel.erl | 50 +++++++++++----------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/apps/sdlan/src/quic/sdlan_quic_channel.erl b/apps/sdlan/src/quic/sdlan_quic_channel.erl index 755c537..51ddc1e 100644 --- a/apps/sdlan/src/quic/sdlan_quic_channel.erl +++ b/apps/sdlan/src/quic/sdlan_quic_channel.erl @@ -99,6 +99,7 @@ handle_event(internal, do_init, initializing, State=#state{conn = Conn}) -> {ok, _} = quicer:async_accept_stream(Conn, #{active => true}), {next_state, waiting_stream, State}; +%% 处理收到的quic消息 handle_event(info, {quic, dgram_state_changed, Conn, Opts = #{dgram_send_enabled := true}}, waiting_stream, State=#state{conn = Conn}) -> logger:debug("[sdlan_quic_channel] dgram_state_changed, opts: ~p", [Opts]), {keep_state, State}; @@ -117,7 +118,28 @@ handle_event(info, {quic, new_stream, Stream, Opts}, waiting_stream, State=#stat {next_state, initialized, State#state{stream = Stream}}; -handle_event(info, {frame, <>}, initialized, State=#state{stream = Stream}) -> +handle_event(info, {quic, closed, Stream, _Props}, _StateName, State = #state{stream = Stream}) -> + {stop, connection_closed, State}; + +handle_event(info, {quic, send_shutdown_complete, Stream, _Props}, _StateName, State = #state{stream = Stream}) -> + {stop, connection_shutdown, State}; + +handle_event(info, {quic, transport_shutdown, Stream, _Props}, _StateName, State = #state{stream = Stream}) -> + {stop, transport_shutdown, State}; + +%% 处理quicer相关的信息, 需要转换成内部能够识别的frame消息 +handle_event(info, {quic, Data, Stream, _Props}, _StateName, State = #state{stream = Stream, buf = Buf, max_packet_size = MaxPacketSize}) when is_binary(Data) -> + case decode_frames(<>, MaxPacketSize) of + {error, Reason} -> + {stop, Reason, State}; + {ok, NBuf, Frames} -> + Actions = [{next_event, internal, {frame, Frame}} || Frame <- Frames], + logger:debug("[sdlan_quic_channel] get frames: ~p", [Frames]), + {keep_state, State#state{buf = NBuf}, Actions} + end; + +%% 处理内部的包消息 +handle_event(internal, {frame, <>}, initialized, State=#state{stream = Stream}) -> #sdl_register_super{ pkt_id = PktId, client_id = ClientId, network_id = NetworkId, mac = Mac, ip = Ip, mask_len = MaskLen, hostname = HostName, pub_key = PubKey, access_token = AccessToken} = sdlan_pb:decode_msg(Body, sdl_register_super), @@ -175,7 +197,7 @@ handle_event(info, {frame, <>}, initialized {stop, normal, State} end; -handle_event(info, {frame, <>}, registered, #state{stream = Stream, network_pid = NetworkPid, mac = SrcMac}) when is_pid(NetworkPid) -> +handle_event(internal, {frame, <>}, registered, #state{stream = Stream, network_pid = NetworkPid, mac = SrcMac}) when is_pid(NetworkPid) -> #sdl_query_info{pkt_id = PktId, dst_mac = DstMac} = sdlan_pb:decode_msg(Body, sdl_query_info), case sdlan_network:peer_info(NetworkPid, SrcMac, DstMac) of error -> @@ -205,7 +227,7 @@ handle_event(info, {frame, <>}, registered, #st keep_state_and_data end; -handle_event(info, {frame, <>}, registered, #state{stream = Stream, network_pid = NetworkPid}) when is_pid(NetworkPid) -> +handle_event(internal, {frame, <>}, registered, #state{stream = Stream, network_pid = NetworkPid}) when is_pid(NetworkPid) -> maybe PolicyRequest = catch sdlan_pb:decode_msg(Body, sdl_policy_request), #sdl_policy_request{src_identity_id = SrcIdentityId, dst_identity_id = DstIdentityId, version = Version} ?= PolicyRequest, @@ -222,7 +244,7 @@ handle_event(info, {frame, <>}, registered, end, keep_state_and_data; -handle_event(info, {frame, <>}, _StateName, State = #state{stream = Stream, ping_counter = PingCounter}) -> +handle_event(internal, {frame, <>}, _StateName, State = #state{stream = Stream, ping_counter = PingCounter}) -> quic_send(Stream, <>), logger:debug("[sdlan_quic_channel] get ping"), {keep_state, State#state{ping_counter = PingCounter + 1}}; @@ -250,26 +272,6 @@ handle_event(info, {frame, <>}, registered, State=#state{cli sdlan_network:unregister(NetworkPid, ClientId, Mac), {stop, normal, State}; -handle_event(info, {quic, send_shutdown_complete, Stream, _Props}, _StateName, State = #state{stream = Stream}) -> - {stop, connection_shutdown, State}; - -handle_event(info, {quic, transport_shutdown, Stream, _Props}, _StateName, State = #state{stream = Stream}) -> - {stop, transport_shutdown, State}; - -%% 处理quicer相关的信息, 需要转换成内部能够识别的frame消息 -handle_event(info, {quic, Data, Stream, _Props}, _StateName, State = #state{stream = Stream, buf = Buf, max_packet_size = MaxPacketSize}) -> - case decode_frames(<>, MaxPacketSize) of - {error, Reason} -> - {stop, Reason, State}; - {ok, NBuf, Frames} -> - Actions = [{next_event, info, {frame, Frame}} || Frame <- Frames], - logger:debug("[sdlan_quic_channel] get frames: ~p", [Frames]), - {keep_state, State#state{buf = NBuf}, Actions} - end; - -handle_event(info, {quic_closed, Stream, _Props}, _StateName, State = #state{stream = Stream}) -> - {stop, connection_closed, State}; - handle_event(info, {'EXIT', _, _}, _StateName, State) -> {stop, connection_closed, State};