fix transport

This commit is contained in:
anlicheng 2026-05-03 14:41:52 +08:00
parent 2c88842012
commit 6b2777b5b6
2 changed files with 12 additions and 24 deletions

View File

@ -36,9 +36,6 @@
session :: sdlan_session:session(), session :: sdlan_session:session(),
frames_recv = 0,
bytes_recv = 0,
close_reason = undefined close_reason = undefined
}). }).
@ -159,14 +156,14 @@ handle_event(info, {quic, shutdown, Conn, ErrorCode}, _StateName, State = #state
%% quicer相关的信息, frame消息 %% quicer相关的信息, frame消息
handle_event(info, {quic, Data, Stream, _Props}, _StateName, handle_event(info, {quic, Data, Stream, _Props}, _StateName,
State = #state{stream = Stream, buf = Buf, max_packet_size = MaxPacketSize, bytes_recv = BytesRecv, frames_recv = FramesRecv}) State = #state{stream = Stream, buf = Buf, max_packet_size = MaxPacketSize})
when is_binary(Data) -> when is_binary(Data) ->
case decode_frames(<<Buf/binary, Data/binary>>, MaxPacketSize) of case decode_frames(<<Buf/binary, Data/binary>>, MaxPacketSize) of
{error, Reason} -> {error, Reason} ->
{stop, Reason, State}; {stop, Reason, State};
{ok, NBuf, Frames} -> {ok, NBuf, Frames} ->
Actions = [{next_event, internal, {frame, Frame}} || Frame <- Frames], Actions = [{next_event, internal, {frame, Frame}} || Frame <- Frames],
{keep_state, State#state{buf = NBuf, bytes_recv = BytesRecv + byte_size(Data), frames_recv = FramesRecv + length(Frames)}, Actions} {keep_state, State#state{buf = NBuf}, Actions}
end; end;
%% %%
@ -272,21 +269,13 @@ expected_stop(Reason, State) ->
logger:notice("[sdlan_quic_transport] expected close: ~p", [Reason]), logger:notice("[sdlan_quic_transport] expected close: ~p", [Reason]),
{stop, normal, State#state{close_reason = Reason}}. {stop, normal, State#state{close_reason = Reason}}.
debug_info(StateName, #state{ debug_info(StateName, #state{session = Session, stream_active_n = StreamActiveN, heartbeat_sec = HeartbeatSec}) ->
session = Session,
frames_recv = FramesRecv,
bytes_recv = BytesRecv,
stream_active_n = StreamActiveN,
heartbeat_sec = HeartbeatSec
}) ->
ProcInfo = maps:from_list(process_info(self(), [message_queue_len, memory, reductions])), ProcInfo = maps:from_list(process_info(self(), [message_queue_len, memory, reductions])),
SessionInfo = sdlan_session:debug_info(Session), SessionInfo = sdlan_session:debug_info(Session),
maps:merge(SessionInfo, ProcInfo#{ maps:merge(SessionInfo, ProcInfo#{
state => StateName, state => StateName,
session => SessionInfo, session => SessionInfo,
frames_recv => FramesRecv,
frames_sent => get_counter(quic_frames_sent), frames_sent => get_counter(quic_frames_sent),
bytes_recv => BytesRecv,
bytes_sent => get_counter(quic_bytes_sent), bytes_sent => get_counter(quic_bytes_sent),
stream_active_n => StreamActiveN, stream_active_n => StreamActiveN,
heartbeat_sec => HeartbeatSec heartbeat_sec => HeartbeatSec

View File

@ -75,10 +75,10 @@ handle_event(info, {ssl, Socket, Frame}, _StateName,
State = #state{socket = Socket, transport = Transport, session = Session}) when is_binary(Frame) -> State = #state{socket = Socket, transport = Transport, session = Session}) when is_binary(Frame) ->
case sdlan_session:handle_frame(Frame, Session) of case sdlan_session:handle_frame(Frame, Session) of
{ok, NStateName, NSession, Packets} -> {ok, NStateName, NSession, Packets} ->
send_packets(Transport, Socket, Packets), ssl_send(Transport, Socket, Packets),
{next_state, NStateName, State#state{session = NSession}}; {next_state, NStateName, State#state{session = NSession}};
{stop, Reason, _NStateName, NSession, Packets} -> {stop, Reason, _NStateName, NSession, Packets} ->
send_packets(Transport, Socket, Packets), ssl_send(Transport, Socket, Packets),
{stop, Reason, State#state{session = NSession}} {stop, Reason, State#state{session = NSession}}
end; end;
@ -100,7 +100,7 @@ handle_event(info, {timeout, TimerRef, ping_ticker}, _StateName, State = #state{
handle_event(cast, {send_event, Event}, _StateName, State = #state{socket = Socket, transport = Transport, session = Session}) -> handle_event(cast, {send_event, Event}, _StateName, State = #state{socket = Socket, transport = Transport, session = Session}) ->
case sdlan_session:send_event(Event, Session) of case sdlan_session:send_event(Event, Session) of
{ok, NStateName, NSession, Packets} -> {ok, NStateName, NSession, Packets} ->
send_packets(Transport, Socket, Packets), ssl_send(Transport, Socket, Packets),
{next_state, NStateName, State#state{session = NSession}}; {next_state, NStateName, State#state{session = NSession}};
{error, not_registered} -> {error, not_registered} ->
keep_state_and_data keep_state_and_data
@ -110,7 +110,7 @@ handle_event(cast, {send_event, Event}, _StateName, State = #state{socket = Sock
handle_event(cast, {command, Ref, ReceiverPid, SubCommand}, _StateName, State = #state{socket = Socket, transport = Transport, session = Session}) -> handle_event(cast, {command, Ref, ReceiverPid, SubCommand}, _StateName, State = #state{socket = Socket, transport = Transport, session = Session}) ->
case sdlan_session:command(Ref, ReceiverPid, SubCommand, Session) of case sdlan_session:command(Ref, ReceiverPid, SubCommand, Session) of
{ok, NStateName, NSession, Packets} -> {ok, NStateName, NSession, Packets} ->
send_packets(Transport, Socket, Packets), ssl_send(Transport, Socket, Packets),
{next_state, NStateName, State#state{session = NSession}}; {next_state, NStateName, State#state{session = NSession}};
{error, not_registered} -> {error, not_registered} ->
keep_state_and_data keep_state_and_data
@ -136,10 +136,12 @@ code_change(_OldVsn, StateName, State = #state{}, _Extra) ->
%%% Internal functions %%% Internal functions
%%%=================================================================== %%%===================================================================
ssl_send(Transport, Socket, Packet) when is_binary(Packet) -> ssl_send(_Transport, _Socket, []) ->
Len = byte_size(Packet), ok;
ssl_send(Transport, Socket, Data) ->
Len = iolist_size(Data),
true = Len =< 65535, true = Len =< 65535,
case Transport:send(Socket, Packet) of case Transport:send(Socket, Data) of
ok -> ok ->
incr_counter(ssl_frames_sent, 1), incr_counter(ssl_frames_sent, 1),
incr_counter(ssl_bytes_sent, Len + 2), incr_counter(ssl_bytes_sent, Len + 2),
@ -148,9 +150,6 @@ ssl_send(Transport, Socket, Packet) when is_binary(Packet) ->
exit({ssl_send_failed, Reason}) exit({ssl_send_failed, Reason})
end. end.
send_packets(Transport, Socket, Packets) ->
lists:foreach(fun(Packet) -> ssl_send(Transport, Socket, Packet) end, Packets).
expected_stop(Reason, State) -> expected_stop(Reason, State) ->
logger:notice("[sdlan_ssl_transport] expected close: ~p", [Reason]), logger:notice("[sdlan_ssl_transport] expected close: ~p", [Reason]),
{stop, normal, State#state{close_reason = Reason}}. {stop, normal, State#state{close_reason = Reason}}.