fix quic channel
This commit is contained in:
parent
c19a3063dd
commit
2b764cac77
@ -99,6 +99,7 @@ handle_event(internal, do_init, initializing, State=#state{conn = Conn}) ->
|
|||||||
{ok, _} = quicer:async_accept_stream(Conn, #{active => true}),
|
{ok, _} = quicer:async_accept_stream(Conn, #{active => true}),
|
||||||
{next_state, waiting_stream, State};
|
{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}) ->
|
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]),
|
logger:debug("[sdlan_quic_channel] dgram_state_changed, opts: ~p", [Opts]),
|
||||||
{keep_state, State};
|
{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}};
|
{next_state, initialized, State#state{stream = Stream}};
|
||||||
|
|
||||||
handle_event(info, {frame, <<?PACKET_REGISTER_SUPER, Body/binary>>}, 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(<<Buf/binary, Data/binary>>, 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, <<?PACKET_REGISTER_SUPER, Body/binary>>}, initialized, State=#state{stream = Stream}) ->
|
||||||
#sdl_register_super{
|
#sdl_register_super{
|
||||||
pkt_id = PktId, client_id = ClientId, network_id = NetworkId, mac = Mac, ip = Ip, mask_len = MaskLen,
|
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),
|
hostname = HostName, pub_key = PubKey, access_token = AccessToken} = sdlan_pb:decode_msg(Body, sdl_register_super),
|
||||||
@ -175,7 +197,7 @@ handle_event(info, {frame, <<?PACKET_REGISTER_SUPER, Body/binary>>}, initialized
|
|||||||
{stop, normal, State}
|
{stop, normal, State}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
handle_event(info, {frame, <<?PACKET_QUERY_INFO, Body/binary>>}, registered, #state{stream = Stream, network_pid = NetworkPid, mac = SrcMac}) when is_pid(NetworkPid) ->
|
handle_event(internal, {frame, <<?PACKET_QUERY_INFO, Body/binary>>}, 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),
|
#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
|
case sdlan_network:peer_info(NetworkPid, SrcMac, DstMac) of
|
||||||
error ->
|
error ->
|
||||||
@ -205,7 +227,7 @@ handle_event(info, {frame, <<?PACKET_QUERY_INFO, Body/binary>>}, registered, #st
|
|||||||
keep_state_and_data
|
keep_state_and_data
|
||||||
end;
|
end;
|
||||||
|
|
||||||
handle_event(info, {frame, <<?PACKET_POLICY_REQUEST, Body/binary>>}, registered, #state{stream = Stream, network_pid = NetworkPid}) when is_pid(NetworkPid) ->
|
handle_event(internal, {frame, <<?PACKET_POLICY_REQUEST, Body/binary>>}, registered, #state{stream = Stream, network_pid = NetworkPid}) when is_pid(NetworkPid) ->
|
||||||
maybe
|
maybe
|
||||||
PolicyRequest = catch sdlan_pb:decode_msg(Body, sdl_policy_request),
|
PolicyRequest = catch sdlan_pb:decode_msg(Body, sdl_policy_request),
|
||||||
#sdl_policy_request{src_identity_id = SrcIdentityId, dst_identity_id = DstIdentityId, version = Version} ?= PolicyRequest,
|
#sdl_policy_request{src_identity_id = SrcIdentityId, dst_identity_id = DstIdentityId, version = Version} ?= PolicyRequest,
|
||||||
@ -222,7 +244,7 @@ handle_event(info, {frame, <<?PACKET_POLICY_REQUEST, Body/binary>>}, registered,
|
|||||||
end,
|
end,
|
||||||
keep_state_and_data;
|
keep_state_and_data;
|
||||||
|
|
||||||
handle_event(info, {frame, <<?PACKET_PING>>}, _StateName, State = #state{stream = Stream, ping_counter = PingCounter}) ->
|
handle_event(internal, {frame, <<?PACKET_PING>>}, _StateName, State = #state{stream = Stream, ping_counter = PingCounter}) ->
|
||||||
quic_send(Stream, <<?PACKET_PONG>>),
|
quic_send(Stream, <<?PACKET_PONG>>),
|
||||||
logger:debug("[sdlan_quic_channel] get ping"),
|
logger:debug("[sdlan_quic_channel] get ping"),
|
||||||
{keep_state, State#state{ping_counter = PingCounter + 1}};
|
{keep_state, State#state{ping_counter = PingCounter + 1}};
|
||||||
@ -250,26 +272,6 @@ handle_event(info, {frame, <<?PACKET_UNREGISTER>>}, registered, State=#state{cli
|
|||||||
sdlan_network:unregister(NetworkPid, ClientId, Mac),
|
sdlan_network:unregister(NetworkPid, ClientId, Mac),
|
||||||
{stop, normal, State};
|
{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(<<Buf/binary, Data/binary>>, 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) ->
|
handle_event(info, {'EXIT', _, _}, _StateName, State) ->
|
||||||
{stop, connection_closed, State};
|
{stop, connection_closed, State};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user