add debug

This commit is contained in:
anlicheng 2026-05-03 19:54:16 +08:00
parent 65ee6735aa
commit ffc818b2d5
3 changed files with 45 additions and 35 deletions

View File

@ -83,7 +83,7 @@ init([Conn, Limits]) ->
MaxPacketSize = proplists:get_value(max_packet_size, Limits, 16384), MaxPacketSize = proplists:get_value(max_packet_size, Limits, 16384),
HeartbeatSec = proplists:get_value(heartbeat_sec, Limits, 15), HeartbeatSec = proplists:get_value(heartbeat_sec, Limits, 15),
StreamActiveN = proplists:get_value(stream_active_n, Limits, ?STREAM_ACTIVE_N), StreamActiveN = proplists:get_value(stream_active_n, Limits, ?STREAM_ACTIVE_N),
Session = sdlan_session:new(HeartbeatSec), Session = sdlan_session:new(HeartbeatSec, ?MODULE),
{ok, initializing, #state{ {ok, initializing, #state{
conn = Conn, conn = Conn,
max_packet_size = MaxPacketSize, max_packet_size = MaxPacketSize,

View File

@ -11,7 +11,7 @@
-include("sdlan_pb.hrl"). -include("sdlan_pb.hrl").
%% API %% API
-export([new/1, handle_frame/2, handle_timeout/2]). -export([new/2, handle_frame/2, handle_timeout/2]).
-export([send_event/2, command/4, close/1, debug_info/1]). -export([send_event/2, command/4, close/1, debug_info/1]).
-export([welcome_packet/2]). -export([welcome_packet/2]).
-export([test_rules/2]). -export([test_rules/2]).
@ -28,6 +28,7 @@
-define(NAK_INTERNAL_FAULT, 5). -define(NAK_INTERNAL_FAULT, 5).
-record(session, { -record(session, {
transport :: atom(),
status = initialized :: initialized | registered, status = initialized :: initialized | registered,
%% %%
heartbeat_sec = 15, heartbeat_sec = 15,
@ -58,9 +59,9 @@
%%% API %%% API
%%%=================================================================== %%%===================================================================
-spec new(HeartbeatSec :: integer()) -> #session{}. -spec new(HeartbeatSec :: integer(), Transport :: atom()) -> #session{}.
new(HeartbeatSec) -> new(HeartbeatSec, Transport) ->
#session{heartbeat_sec = HeartbeatSec}. #session{heartbeat_sec = HeartbeatSec, transport = Transport}.
%% %%
-spec test_rules(SrcIdentityId :: integer(), DstIdentityId :: integer()) -> binary(). -spec test_rules(SrcIdentityId :: integer(), DstIdentityId :: integer()) -> binary().
@ -89,7 +90,7 @@ welcome_packet(MaxPacketSize, HeartbeatSec) ->
-spec handle_frame(Frame :: binary(), Session :: #session{}) -> -spec handle_frame(Frame :: binary(), Session :: #session{}) ->
{ok, StateName :: initialized | registered, NewSession :: #session{}, Packets :: [binary()]} | {ok, StateName :: initialized | registered, NewSession :: #session{}, Packets :: [binary()]} |
{stop, Reason :: term(), StateName :: initialized | registered, NewSession :: #session{}, Packets :: [binary()]}. {stop, Reason :: term(), StateName :: initialized | registered, NewSession :: #session{}, Packets :: [binary()]}.
handle_frame(<<?PACKET_REGISTER_SUPER, Body/binary>>, Session = #session{status = initialized}) -> handle_frame(<<?PACKET_REGISTER_SUPER, Body/binary>>, Session = #session{status = initialized, transport = Transport}) ->
#'SDLRegisterSuper'{ #'SDLRegisterSuper'{
client_id = ClientId, network_id = NetworkId, mac = Mac, ip = Ip, mask_len = MaskLen, 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, 'SDLRegisterSuper'), hostname = HostName, pub_key = PubKey, access_token = AccessToken} = sdlan_pb:decode_msg(Body, 'SDLRegisterSuper'),
@ -110,8 +111,8 @@ handle_frame(<<?PACKET_REGISTER_SUPER, Body/binary>>, Session = #session{status
<<"access_token">> => AccessToken <<"access_token">> => AccessToken
}, },
%% %%
logger:debug("[sdlan_session] client_id: ~p, ip: ~p, mac: ~p, host_name: ~p, access_token: ~p, network_id: ~p", logger:debug("[sdlan_session] transport: ~p, client_id: ~p, ip: ~p, mac: ~p, host_name: ~p, access_token: ~p, network_id: ~p",
[ClientId, Ip, Mac, HostName, AccessToken, NetworkId]), [Transport, ClientId, Ip, Mac, HostName, AccessToken, NetworkId]),
case sdlan_api:auth_access_token(Params) of case sdlan_api:auth_access_token(Params) of
{ok, #{<<"result">> := <<"ok">>}} -> {ok, #{<<"result">> := <<"ok">>}} ->
@ -134,7 +135,7 @@ handle_frame(<<?PACKET_REGISTER_SUPER, Body/binary>>, Session = #session{status
<<"access_token">> => AccessToken, <<"access_token">> => AccessToken,
<<"status">> => 1 <<"status">> => 1
}), }),
logger:debug("[sdlan_session] client_id: ~p, set none online result is: ~p", [ClientId, Result]), logger:debug("[sdlan_session] tranport: ~p, client_id: ~p, set none online result is: ~p", [Transport, ClientId, Result]),
OfflineCb = fun() -> OfflineCb = fun() ->
sdlan_api:set_node_status(#{ sdlan_api:set_node_status(#{
@ -155,23 +156,23 @@ handle_frame(<<?PACKET_REGISTER_SUPER, Body/binary>>, Session = #session{status
}), }),
ok_result(NSession, [<<?PACKET_REGISTER_SUPER_ACK, RegisterSuperAck/binary>>]); ok_result(NSession, [<<?PACKET_REGISTER_SUPER_ACK, RegisterSuperAck/binary>>]);
undefined -> undefined ->
logger:warning("[sdlan_session] client_id: ~p, register get error: network not found", [ClientId]), logger:warning("[sdlan_session] transport: ~p, client_id: ~p, register get error: network not found", [Transport, ClientId]),
stop_result(normal, Session, [register_nak_reply(?NAK_INTERNAL_FAULT, <<"Internal Error">>)]) stop_result(normal, Session, [register_nak_reply(?NAK_INTERNAL_FAULT, <<"Internal Error">>)])
end; end;
{ok, #{<<"error">> := #{<<"code">> := Code, <<"message">> := Message}}} -> {ok, #{<<"error">> := #{<<"code">> := Code, <<"message">> := Message}}} ->
logger:warning("[sdlan_session] network_id: ~p, client_id: ~p, register get error: ~ts, error_code: ~p", [NetworkId, ClientId, Message, Code]), logger:warning("[sdlan_session] transport: ~p, network_id: ~p, client_id: ~p, register get error: ~ts, error_code: ~p", [Transport, NetworkId, ClientId, Message, Code]),
stop_result(normal, Session, [register_nak_reply(Code, Message)]); stop_result(normal, Session, [register_nak_reply(Code, Message)]);
{error, Reason} -> {error, Reason} ->
logger:warning("[sdlan_session] network_id: ~p, client_id: ~p, register get error: ~p", [NetworkId, ClientId, Reason]), logger:warning("[sdlan_session] transport: ~p, network_id: ~p, client_id: ~p, register get error: ~p", [Transport, NetworkId, ClientId, Reason]),
stop_result(normal, Session, [register_nak_reply(?NAK_NETWORK_FAULT, <<"Network Error">>)]) stop_result(normal, Session, [register_nak_reply(?NAK_NETWORK_FAULT, <<"Network Error">>)])
end; end;
handle_frame(<<?PACKET_QUERY_INFO, Body/binary>>, Session = #session{status = registered, network_pid = NetworkPid, mac = SrcMac}) when is_pid(NetworkPid) -> handle_frame(<<?PACKET_QUERY_INFO, Body/binary>>, Session = #session{status = registered, network_pid = NetworkPid, mac = SrcMac, transport = Transport}) when is_pid(NetworkPid) ->
#'SDLQueryInfo'{dst_mac = DstMac} = sdlan_pb:decode_msg(Body, 'SDLQueryInfo'), #'SDLQueryInfo'{dst_mac = DstMac} = sdlan_pb:decode_msg(Body, 'SDLQueryInfo'),
case sdlan_network:peer_info(NetworkPid, SrcMac, DstMac) of case sdlan_network:peer_info(NetworkPid, SrcMac, DstMac) of
error -> error ->
logger:debug("[sdlan_session] query_info src_mac is: ~p, dst_mac: ~p, nat_peer not found", logger:debug("[sdlan_session] transport: ~p, query_info src_mac is: ~p, dst_mac: ~p, nat_peer not found",
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), [Transport, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
EmptyResponse = sdlan_pb:encode_msg(#'SDLPeerInfo'{ EmptyResponse = sdlan_pb:encode_msg(#'SDLPeerInfo'{
dst_mac = DstMac, dst_mac = DstMac,
@ -180,8 +181,8 @@ handle_frame(<<?PACKET_QUERY_INFO, Body/binary>>, Session = #session{status = re
}), }),
ok_result(Session, [<<?PACKET_PEER_INFO, EmptyResponse/binary>>]); ok_result(Session, [<<?PACKET_PEER_INFO, EmptyResponse/binary>>]);
{ok, {NatPeer = {{Ip0, Ip1, Ip2, Ip3}, NatPort}, NatType}, V6Info} -> {ok, {NatPeer = {{Ip0, Ip1, Ip2, Ip3}, NatPort}, NatType}, V6Info} ->
logger:debug("[sdlan_session] query_info src_mac is: ~p, dst_mac: ~p, nat_peer: ~p", logger:debug("[sdlan_session] transport: ~p, query_info src_mac is: ~p, dst_mac: ~p, nat_peer: ~p",
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), NatPeer]), [Transport, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), NatPeer]),
PeerInfo = sdlan_pb:encode_msg(#'SDLPeerInfo'{ PeerInfo = sdlan_pb:encode_msg(#'SDLPeerInfo'{
dst_mac = DstMac, dst_mac = DstMac,
@ -196,11 +197,15 @@ handle_frame(<<?PACKET_QUERY_INFO, Body/binary>>, Session = #session{status = re
end; end;
%% arp查询 %% arp查询
handle_frame(<<?PACKET_ARP_REQUEST, Body/binary>>, Session = #session{status = registered, network_id = NetworkId, network_pid = NetworkPid}) when is_pid(NetworkPid) -> handle_frame(<<?PACKET_ARP_REQUEST, Body/binary>>,
Session = #session{status = registered, network_id = NetworkId, network_pid = NetworkPid, transport = Transport}) when is_pid(NetworkPid) ->
#'SDLArpRequest'{target_ip = TargetIp, origin_ip = OriginIp, context = Context} = sdlan_pb:decode_msg(Body, 'SDLArpRequest'), #'SDLArpRequest'{target_ip = TargetIp, origin_ip = OriginIp, context = Context} = sdlan_pb:decode_msg(Body, 'SDLArpRequest'),
case sdlan_network:arp_request(NetworkPid, TargetIp) of case sdlan_network:arp_request(NetworkPid, TargetIp) of
error -> error ->
logger:debug("[sdlan_session] network: ~p, arp_request target_ip: ~p, mac not found", [NetworkId, sdlan_util:int_to_ipv4(TargetIp)]), logger:debug("[sdlan_session] transport: ~p, network: ~p, arp_request target_ip: ~p, mac not found",
[Transport, NetworkId, sdlan_util:int_to_ipv4(TargetIp)]),
EmptyArpResponsePkt = sdlan_pb:encode_msg(#'SDLArpResponse'{ EmptyArpResponsePkt = sdlan_pb:encode_msg(#'SDLArpResponse'{
target_ip = TargetIp, target_ip = TargetIp,
target_mac = <<>>, target_mac = <<>>,
@ -209,7 +214,8 @@ handle_frame(<<?PACKET_ARP_REQUEST, Body/binary>>, Session = #session{status = r
}), }),
ok_result(Session, [<<?PACKET_ARP_RESPONSE, EmptyArpResponsePkt/binary>>]); ok_result(Session, [<<?PACKET_ARP_RESPONSE, EmptyArpResponsePkt/binary>>]);
{ok, Mac} -> {ok, Mac} ->
logger:debug("[sdlan_session] network: ~p, arp_request target_ip: ~p, mac: ~p", [NetworkId, sdlan_util:int_to_ipv4(TargetIp), sdlan_util:format_mac(Mac)]), logger:debug("[sdlan_session] transport: ~p, network: ~p, arp_request target_ip: ~p, mac: ~p",
[Transport, NetworkId, sdlan_util:int_to_ipv4(TargetIp), sdlan_util:format_mac(Mac)]),
ArpResponsePkt = sdlan_pb:encode_msg(#'SDLArpResponse'{ ArpResponsePkt = sdlan_pb:encode_msg(#'SDLArpResponse'{
target_ip = TargetIp, target_ip = TargetIp,
target_mac = Mac, target_mac = Mac,
@ -219,12 +225,13 @@ handle_frame(<<?PACKET_ARP_REQUEST, Body/binary>>, Session = #session{status = r
ok_result(Session, [<<?PACKET_ARP_RESPONSE, ArpResponsePkt/binary>>]) ok_result(Session, [<<?PACKET_ARP_RESPONSE, ArpResponsePkt/binary>>])
end; end;
handle_frame(<<?PACKET_POLICY_REQUEST, Body/binary>>, Session = #session{status = registered, network_pid = NetworkPid}) when is_pid(NetworkPid) -> handle_frame(<<?PACKET_POLICY_REQUEST, Body/binary>>, Session = #session{status = registered, network_pid = NetworkPid, transport = Transport}) when is_pid(NetworkPid) ->
Packets = maybe Packets = maybe
#'SDLPolicyRequest'{src_identity_id = SrcIdentityId, dst_identity_id = DstIdentityId, version = Version} ?= sdlan_pb:decode_msg(Body, 'SDLPolicyRequest'), #'SDLPolicyRequest'{src_identity_id = SrcIdentityId, dst_identity_id = DstIdentityId, version = Version} ?= sdlan_pb:decode_msg(Body, 'SDLPolicyRequest'),
{ok, Rules} = get_rules(SrcIdentityId, DstIdentityId), {ok, Rules} = get_rules(SrcIdentityId, DstIdentityId),
logger:debug("[sdlan_session] policy_request src_identity_id: ~p, dst_identity_id: ~p, rules: ~p", [SrcIdentityId, DstIdentityId, Rules]), logger:debug("[sdlan_session] transport: ~p, policy_request src_identity_id: ~p, dst_identity_id: ~p, rules: ~p",
[Transport, SrcIdentityId, DstIdentityId, Rules]),
RuleBin = iolist_to_binary(lists:map(fun({Proto, Port}) -> <<Proto:8, Port:16>> end, Rules)), RuleBin = iolist_to_binary(lists:map(fun({Proto, Port}) -> <<Proto:8, Port:16>> end, Rules)),
PolicyResponsePkt = sdlan_pb:encode_msg(#'SDLPolicyResponse'{ PolicyResponsePkt = sdlan_pb:encode_msg(#'SDLPolicyResponse'{
@ -240,7 +247,8 @@ handle_frame(<<?PACKET_POLICY_REQUEST, Body/binary>>, Session = #session{status
ok_result(Session, Packets); ok_result(Session, Packets);
%% %%
handle_frame(<<?PACKET_COMMAND_ACK, Body/binary>>, Session = #session{status = registered, pending_commands = PendingCommands}) -> handle_frame(<<?PACKET_COMMAND_ACK, Body/binary>>, Session = #session{status = registered, pending_commands = PendingCommands, transport = Transport}) ->
logger:debug("[sdlan_session] transport: ~p command_ack", [Transport]),
maybe maybe
CommandAck = sdlan_pb:decode_msg(Body, 'SDLCommandAck'), CommandAck = sdlan_pb:decode_msg(Body, 'SDLCommandAck'),
#'SDLCommandAck'{pkt_id = PktId} ?= CommandAck, #'SDLCommandAck'{pkt_id = PktId} ?= CommandAck,
@ -257,29 +265,31 @@ handle_frame(<<?PACKET_COMMAND_ACK, Body/binary>>, Session = #session{status = r
ok_result(Session, []) ok_result(Session, [])
end; end;
handle_frame(<<?PACKET_PING>>, Session = #session{ping_counter = PingCounter, client_id = ClientId}) -> handle_frame(<<?PACKET_PING>>, Session = #session{ping_counter = PingCounter, client_id = ClientId, transport = Transport}) ->
logger:warning("[sdlan_session] get ping: ~p", [ClientId]), logger:warning("[sdlan_session] transport: ~p, get ping: ~p", [Transport, ClientId]),
ok_result(Session#session{ping_counter = PingCounter + 1}, [<<?PACKET_PONG>>]); ok_result(Session#session{ping_counter = PingCounter + 1}, [<<?PACKET_PONG>>]);
%% %%
handle_frame(<<?PACKET_UNREGISTER>>, Session = #session{status = registered, client_id = ClientId, mac = Mac, network_pid = NetworkPid}) when is_pid(NetworkPid) -> handle_frame(<<?PACKET_UNREGISTER>>, Session = #session{status = registered, client_id = ClientId, mac = Mac, network_pid = NetworkPid, transport = Transport})
logger:warning("[sdlan_session] unregister client_id: ~p", [ClientId]), when is_pid(NetworkPid) ->
logger:warning("[sdlan_session] transport: ~p, unregister client_id: ~p", [Transport, ClientId]),
sdlan_network:unregister(NetworkPid, ClientId, Mac), sdlan_network:unregister(NetworkPid, ClientId, Mac),
stop_result(normal, Session, []); stop_result(normal, Session, []);
handle_frame(Frame, Session) -> handle_frame(Frame, Session = #session{transport = Transport}) ->
logger:notice("[sdlan_session] unexpected frame: ~p, status: ~p", [Frame, Session#session.status]), logger:notice("[sdlan_session] transport: ~p, unexpected frame: ~p, status: ~p", [Transport, Frame, Session#session.status]),
ok_result(Session, []). ok_result(Session, []).
-spec handle_timeout(TimerRef :: reference(), Session :: #session{}) -> -spec handle_timeout(TimerRef :: reference(), Session :: #session{}) ->
{ok, StateName :: initialized | registered, NewSession :: #session{}} | {ok, StateName :: initialized | registered, NewSession :: #session{}} |
{stop, Reason :: term(), StateName :: initialized | registered, NewSession :: #session{}}. {stop, Reason :: term(), StateName :: initialized | registered, NewSession :: #session{}}.
handle_timeout(TimerRef, Session = #session{ping_timer = TimerRef, client_id = ClientId, ping_counter = PingCounter}) -> handle_timeout(TimerRef, Session = #session{ping_timer = TimerRef, client_id = ClientId, ping_counter = PingCounter, transport = Transport}) ->
case PingCounter > 0 of case PingCounter > 0 of
true -> true ->
ok_timeout_result(schedule_ping(Session#session{ping_counter = 0, ping_timer = undefined})); ok_timeout_result(schedule_ping(Session#session{ping_counter = 0, ping_timer = undefined}));
false -> false ->
logger:debug("[sdlan_session] client_id: ~p, ping losted", [ClientId]), logger:debug("[sdlan_session] transport: ~p, client_id: ~p, ping losted", [Transport, ClientId]),
stop_timeout_result(heartbeat_timeout, Session#session{ping_counter = 0, ping_timer = undefined}) stop_timeout_result(heartbeat_timeout, Session#session{ping_counter = 0, ping_timer = undefined})
end; end;
handle_timeout(_TimerRef, Session) -> handle_timeout(_TimerRef, Session) ->
@ -294,13 +304,13 @@ send_event(_Event, _Session) ->
-spec command(Ref :: reference(), ReceiverPid :: pid(), {Tag :: atom(), SubCommand :: any()}, Session :: #session{}) -> -spec command(Ref :: reference(), ReceiverPid :: pid(), {Tag :: atom(), SubCommand :: any()}, Session :: #session{}) ->
{ok, StateName :: initialized | registered, NewSession :: #session{}, Packets :: [binary()]} | {error, not_registered}. {ok, StateName :: initialized | registered, NewSession :: #session{}, Packets :: [binary()]} | {error, not_registered}.
command(Ref, ReceiverPid, SubCommand, Session = #session{status = registered, pkt_id = PktId, pending_commands = PendingCommands, client_id = ClientId}) command(Ref, ReceiverPid, SubCommand, Session = #session{status = registered, pkt_id = PktId, pending_commands = PendingCommands, client_id = ClientId, transport = Transport})
when is_reference(Ref), is_pid(ReceiverPid) -> when is_reference(Ref), is_pid(ReceiverPid) ->
CommandPkt = sdlan_pb:encode_msg(#'SDLCommand'{ CommandPkt = sdlan_pb:encode_msg(#'SDLCommand'{
pkt_id = PktId, pkt_id = PktId,
command = SubCommand command = SubCommand
}), }),
logger:debug("[sdlan_session] client_id: ~p, will send Command: ~p", [ClientId, SubCommand]), logger:debug("[sdlan_session] transport: ~p, client_id: ~p, will send Command: ~p", [Transport, ClientId, SubCommand]),
ok_result(Session#session{pkt_id = PktId + 1, pending_commands = maps:put(PktId, {Ref, ReceiverPid}, PendingCommands)}, ok_result(Session#session{pkt_id = PktId + 1, pending_commands = maps:put(PktId, {Ref, ReceiverPid}, PendingCommands)},
[<<?PACKET_COMMAND, CommandPkt/binary>>]); [<<?PACKET_COMMAND, CommandPkt/binary>>]);

View File

@ -49,7 +49,7 @@ start_link(Ref, Socket, Transport, Limits) ->
init([Ref, Socket, Transport, Limits]) -> init([Ref, Socket, Transport, Limits]) ->
MaxPacketSize = proplists:get_value(max_packet_size, Limits, 16384), MaxPacketSize = proplists:get_value(max_packet_size, Limits, 16384),
HeartbeatSec = proplists:get_value(heartbeat_sec, Limits, 15), HeartbeatSec = proplists:get_value(heartbeat_sec, Limits, 15),
Session = sdlan_session:new(HeartbeatSec), Session = sdlan_session:new(HeartbeatSec, ?MODULE),
{ok, handshaking, #state{ {ok, handshaking, #state{
ref = Ref, ref = Ref,
socket = Socket, socket = Socket,