fix transport
This commit is contained in:
parent
2c88842012
commit
6b2777b5b6
@ -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
|
||||||
|
|||||||
@ -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}}.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user