From 672da8d7b1569e6e708d562d415e95ba2b26f9e0 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Mon, 26 Jan 2026 22:48:03 +0800 Subject: [PATCH] fix --- apps/sdlan/src/http_handler/test_handler.erl | 8 +--- apps/sdlan/src/sdlan_hostname_regedit.erl | 8 ++-- apps/sdlan/src/sdlan_network.erl | 14 +++--- apps/sdlan/src/sdlan_register_worker.erl | 45 +++++++++++--------- apps/sdlan/src/sdlan_register_worker_sup.erl | 8 ++-- apps/sdlan/src/test/stun_client.erl | 8 ++++ config/sys-dev.config | 2 +- 7 files changed, 52 insertions(+), 41 deletions(-) diff --git a/apps/sdlan/src/http_handler/test_handler.erl b/apps/sdlan/src/http_handler/test_handler.erl index 65f71c4..1d9a56a 100644 --- a/apps/sdlan/src/http_handler/test_handler.erl +++ b/apps/sdlan/src/http_handler/test_handler.erl @@ -19,13 +19,7 @@ %% 重新加载对应的主机信息 handle_request("POST", "/test/auth_token", _, PostParams) -> logger:debug("[test_handler] get post params: ~p", [PostParams]), - Data = #{ - <<"network_id">> => 8, - <<"upgrade_type">> => 0, - <<"upgrade_prompt">> => <<"simple upgrade">>, - <<"upgrade_address">> => <<"upgrade_address">> - }, - {ok, 200, sdlan_util:json_data(Data)}; + {ok, 200, sdlan_util:json_data(<<"ok">>)}; handle_request("POST", "/test/upgrade", _, PostParams) -> logger:debug("[test_handler] get post params: ~p", [PostParams]), diff --git a/apps/sdlan/src/sdlan_hostname_regedit.erl b/apps/sdlan/src/sdlan_hostname_regedit.erl index c77bd49..3610deb 100644 --- a/apps/sdlan/src/sdlan_hostname_regedit.erl +++ b/apps/sdlan/src/sdlan_hostname_regedit.erl @@ -27,11 +27,11 @@ lookup(FullHostname) when is_binary(FullHostname) -> end. -spec insert(any(), Domain :: binary(), Ip :: integer()) -> no_return(). -insert(<<>>, _Domain, _Ip) -> - ok; -insert(HostName, Domain, Ip) when is_integer(HostName), is_binary(Domain), is_integer(Ip) -> +insert(HostName, Domain, Ip) when is_binary(HostName), is_binary(Domain), is_integer(Ip), HostName /= <<>> -> FullHostname = <>, - insert(FullHostname, Ip). + insert(FullHostname, Ip); +insert(_, _, _) -> + ok. -spec insert(FullHostname :: binary(), Ip :: integer()) -> no_return(). insert(FullHostname, Ip) when is_binary(FullHostname), is_integer(Ip) -> diff --git a/apps/sdlan/src/sdlan_network.erl b/apps/sdlan/src/sdlan_network.erl index 928febe..206b8b2 100644 --- a/apps/sdlan/src/sdlan_network.erl +++ b/apps/sdlan/src/sdlan_network.erl @@ -90,9 +90,9 @@ lookup_pid(Id) when is_integer(Id) -> get_name(Id) when is_integer(Id) -> list_to_atom("sdlan_network:" ++ integer_to_list(Id)). --spec attach(Pid :: pid(), Peer :: {Ip :: inet:ip4_address(), Port :: integer()}, ClientId :: binary(), Mac :: binary(), Ip :: inet:ip4_address(), HostName :: binary()) -> +-spec attach(Pid :: pid(), Peer :: {Ip :: inet:ip4_address(), Port :: integer()}, ClientId :: binary(), Mac :: binary(), Ip :: integer(), HostName :: binary()) -> {ok, Domain :: binary(), MaskLen :: integer(), AesKey :: binary()} | {error, Reason :: any()}. -attach(Pid, Peer, ClientId, Mac, Ip, HostName) when is_pid(Pid), is_binary(ClientId), is_binary(Mac) -> +attach(Pid, Peer, ClientId, Mac, Ip, HostName) when is_pid(Pid), is_binary(ClientId), is_binary(Mac), is_integer(Ip) -> gen_server:call(Pid, {attach, Peer, ClientId, Mac, Ip, HostName}). -spec get_network_id(Pid :: pid()) -> {ok, NetworkId :: integer()}. @@ -354,7 +354,7 @@ handle_cast({stun_request, Sock, Peer = {ClientIp, ClientPort}, #sdl_stun_reques case maps:find(Mac, Endpoints) of %% ClientId =:= ClientId0, SessionToken =:= SessionToken0 - {ok, Endpoint0 = #endpoint{ip = Ip, client_id = ClientId, hole = OldHole, session_token = ST}} -> + {ok, Endpoint0 = #endpoint{ip = Ip, client_id = ClientId, hole = OldHole, session_token = ST}} when 1 == 2 -> NHole = #hole{peer = Peer, nat_type = NatType}, maybe %% hole changed -> notify peers @@ -364,11 +364,15 @@ handle_cast({stun_request, Sock, Peer = {ClientIp, ClientPort}, #sdl_stun_reques ip = Ip }), EventPacket = <>, - EndpointPeers = endpoint_peers([Mac], Endpoints), + logger:debug("[sdlan_network] hole changed, mac: ~p, ip: ~p, notify peers: ~p", [Mac, Ip, EndpointPeers]), + sdlan_stun_pool:send_packets(EndpointPeers, EventPacket) end, - {noreply, State#state{endpoints = maps:put(Mac, Endpoint0#endpoint{hole = NHole, v6_info = V6Info, last_seen = erlang:monotonic_time(second)}, Endpoints)}}; + NEndpoint = Endpoint0#endpoint{hole = NHole, v6_info = V6Info, last_seen = erlang:monotonic_time(second)}, + logger:debug("[sdlan_network] mac: ~p, ip: ~p, endpoint is: ~p", [Mac, Ip, NEndpoint]), + + {noreply, State#state{endpoints = maps:put(Mac, NEndpoint, Endpoints)}}; _ -> %% 客户端需要重新校验 RefreshAuthEvent = sdlan_pb:encode_msg(#sdl_refresh_auth_event{ diff --git a/apps/sdlan/src/sdlan_register_worker.erl b/apps/sdlan/src/sdlan_register_worker.erl index d164da2..4c39f44 100644 --- a/apps/sdlan/src/sdlan_register_worker.erl +++ b/apps/sdlan/src/sdlan_register_worker.erl @@ -31,14 +31,10 @@ start_link(Sock, Ip, Port, Packet) -> {ok, erlang:spawn_link(?MODULE, do_register, [Sock, Ip, Port, Packet])}. -do_register(Sock, SrcIp, SrcPort, #sdl_register_super{ +do_register(Sock, ClientIp, ClientPort, #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}) -> - %% 参数检查 - logger:debug("[sdlan_channel] client_id: ~p, ip: ~p, mac: ~p, host_name: ~p, access_token: ~p, network_id: ~p", - [ClientId, Ip, Mac, HostName, AccessToken, NetworkId]), - true = (Mac =/= <<>> andalso PubKey =/= <<>> andalso ClientId =/= <<>>), %% Mac地址不能是广播地址 true = not (sdlan_util:is_multicast_mac(Mac) orelse sdlan_util:is_broadcast_mac(Mac)), @@ -53,12 +49,19 @@ do_register(Sock, SrcIp, SrcPort, #sdl_register_super{ <<"access_token">> => AccessToken }, - case sdlan_api:auth_access_token(Params) of + %% 参数检查 + logger:debug("[sdlan_register_worker] xyz client_id: ~p, ip: ~p, mac: ~p, host_name: ~p, access_token: ~p, network_id: ~p", + [ClientId, Ip, Mac, HostName, AccessToken, NetworkId]), + + %% TODO + %AuthResult = sdlan_api:auth_access_token(Params), + AuthResult = {ok, #{<<"result">> => <<"ok">>}}, + case AuthResult of {ok, #{<<"result">> := <<"ok">>}} -> %% 建立到network的对应关系 case sdlan_network:get_pid(NetworkId) of NetworkPid when is_pid(NetworkPid) -> - case sdlan_network:attach(NetworkPid, {SrcIp, SrcPort}, ClientId, Mac, Ip, HostName) of + case sdlan_network:attach(NetworkPid, {ClientIp, ClientPort}, ClientId, Mac, Ip, HostName) of {ok, AesKey, SessionToken} -> RsaPubKey = sdlan_cipher:rsa_pem_decode(PubKey), EncodedAesKey = rsa_encode(AesKey, RsaPubKey), @@ -71,31 +74,31 @@ do_register(Sock, SrcIp, SrcPort, #sdl_register_super{ %% 发送确认信息 Reply = <>, - gen_udp:send(Sock, SrcIp, SrcPort, Reply), + gen_udp:send(Sock, ClientIp, ClientPort, Reply), %% 设置节点的在线状态 Result = sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(Ip)), - logger:debug("[sdlan_channel] client_id: ~p, set none online result is: ~p", [ClientId, Result]); + logger:debug("[sdlan_register_worker] client_id: ~p, set none online result is: ~p", [ClientId, Result]); {error, no_ip} -> - logger:warning("[sdlan_channel] client_id: ~p, register get error: no_ip", [ClientId]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_NO_IP, <<"No Ip address">>)); + logger:warning("[sdlan_register_worker] client_id: ~p, register get error: no_ip", [ClientId]), + gen_udp:send(Sock, ClientIp, ClientPort, register_nak_reply(PktId, ?NAK_NO_IP, <<"No Ip address">>)); {error, host_name_used} -> - logger:warning("[sdlan_channel] client_id: ~p, register get error: host_name_used", [ClientId]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_HOSTNAME_USED, <<"Host Name Used">>)); + logger:warning("[sdlan_register_worker] client_id: ~p, register get error: host_name_used", [ClientId]), + gen_udp:send(Sock, ClientIp, ClientPort, register_nak_reply(PktId, ?NAK_HOSTNAME_USED, <<"Host Name Used">>)); {error, client_disabled} -> - logger:warning("[sdlan_channel] client_id: ~p, register get error: client_disabled", [ClientId]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_NODE_DISABLE, <<"Client Connection Disable">>)) + logger:warning("[sdlan_register_worker] client_id: ~p, register get error: client_disabled", [ClientId]), + gen_udp:send(Sock, ClientIp, ClientPort, register_nak_reply(PktId, ?NAK_NODE_DISABLE, <<"Client Connection Disable">>)) end; undefined -> - logger:warning("[sdlan_channel] client_id: ~p, register get error: network not found", [ClientId]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)) + logger:warning("[sdlan_register_worker] client_id: ~p, register get error: network not found", [ClientId]), + gen_udp:send(Sock, ClientIp, ClientPort, register_nak_reply(PktId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)) end; {ok, #{<<"error">> := #{<<"code">> := Code, <<"message">> := Message}}} -> - logger:warning("[sdlan_channel] network_id: ~p, client_id: ~p, register get error: ~ts, error_code: ~p", [NetworkId, ClientId, Message, Code]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, Code, Message)); + logger:warning("[sdlan_register_worker] network_id: ~p, client_id: ~p, register get error: ~ts, error_code: ~p", [NetworkId, ClientId, Message, Code]), + gen_udp:send(Sock, ClientIp, ClientPort, register_nak_reply(PktId, Code, Message)); {error, Reason} -> - logger:warning("[sdlan_channel] network_id: ~p, client_id: ~p, register get error: ~p", [NetworkId, ClientId, Reason]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_NETWORK_FAULT, <<"Network Error">>)) + logger:warning("[sdlan_register_worker] network_id: ~p, client_id: ~p, register get error: ~p", [NetworkId, ClientId, Reason]), + gen_udp:send(Sock, ClientIp, ClientPort, register_nak_reply(PktId, ?NAK_NETWORK_FAULT, <<"Network Error">>)) end, exit(normal). diff --git a/apps/sdlan/src/sdlan_register_worker_sup.erl b/apps/sdlan/src/sdlan_register_worker_sup.erl index f8f914c..9c6f399 100644 --- a/apps/sdlan/src/sdlan_register_worker_sup.erl +++ b/apps/sdlan/src/sdlan_register_worker_sup.erl @@ -47,14 +47,16 @@ start_link() -> init([]) -> SupFlags = #{strategy => simple_one_for_one, intensity => 1000, period => 3600}, - ChildSpec = #{id => sdlan_register_worker, + ChildSpec = #{ + id => sdlan_register_worker, start => {sdlan_register_worker, start_link, []}, restart => temporary, shutdown => 2000, type => worker, - modules => [sdlan_register_worker]}, + modules => [sdlan_register_worker] + }, - {ok, {SupFlags, ChildSpec}}. + {ok, {SupFlags, [ChildSpec]}}. %%%=================================================================== %%% Internal functions diff --git a/apps/sdlan/src/test/stun_client.erl b/apps/sdlan/src/test/stun_client.erl index bf4b305..7529209 100644 --- a/apps/sdlan/src/test/stun_client.erl +++ b/apps/sdlan/src/test/stun_client.erl @@ -149,6 +149,12 @@ handle_info({udp, _Socket, _ServerIp, _ServerPort, <>}, State) -> + Event = #sdl_refresh_auth_event{} = sdlan_pb:decode_msg(Data, sdl_refresh_auth_event), + logger:debug("[stun_client] get a refresh_auth_event: ~p", [Event]), + {stop, refresh_auth, State}; + handle_info({timeout, _, stun_request_ticker}, State = #state{tun_socket = TunSocket, client_id = ClientId, mac = Mac, ip = Ip, session_token = SessionToken}) -> Packet = sdlan_pb:encode_msg(#sdl_stun_request{ client_id = ClientId, @@ -158,6 +164,8 @@ handle_info({timeout, _, stun_request_ticker}, State = #state{tun_socket = TunSo nat_type = 0, session_token = SessionToken }), + logger:debug("timer ticker will send packet: ~p", [Packet]), + gen_udp:send(TunSocket, ?SUPER_HOST, ?SUPER_PORT, <>), erlang:start_timer(5000, self(), stun_request_ticker), diff --git a/config/sys-dev.config b/config/sys-dev.config index 2b01dc3..72e94ac 100644 --- a/config/sys-dev.config +++ b/config/sys-dev.config @@ -14,7 +14,7 @@ %% stun类型探测相当于有个类型 {stun_servers, [ {port, 1265}, - {acceptor_nums, 5} + {acceptor_nums, 1} ]}, {stun_port_assist, [