From c54a5b35ad711626f76184e2353f2658a0f73de9 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Thu, 16 Apr 2026 16:48:54 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ipv6_assist/ipv6_assist_server.erl | 38 ++++++++++++++--------- src/sdlan_app.erl | 4 ++- src/sdlan_token_store.erl | 43 -------------------------- 3 files changed, 27 insertions(+), 58 deletions(-) delete mode 100644 src/sdlan_token_store.erl diff --git a/src/ipv6_assist/ipv6_assist_server.erl b/src/ipv6_assist/ipv6_assist_server.erl index ba800b2..75c2a5f 100644 --- a/src/ipv6_assist/ipv6_assist_server.erl +++ b/src/ipv6_assist/ipv6_assist_server.erl @@ -80,19 +80,19 @@ handle_cast(_Request, State) -> {noreply, NewState :: #state{}, timeout() | hibernate} | {stop, Reason :: term(), NewState :: #state{}}. handle_info({udp, Sock, Ip, Port, Body}, State = #state{socket = Sock}) -> - case catch sdlan_pb:decode_msg(Body, 'SDLV6AssistProbe') of - #'SDLV6AssistProbe'{pkt_id = PktId} -> - V6Bytes = sdlan_util:ipv6_to_bytes(Ip), - ReplyBin = sdlan_pb:encode_msg(#'SDLV6AssistProbeReply'{ - pkt_id = PktId, - v6_info = #'SDLV6Info'{ - v6 = V6Bytes, - port = Port - } - }), - ok = gen_udp:send(Sock, Ip, Port, ReplyBin); - _Err -> - ok + maybe + ThrottleKey = {Ip, Port}, + ok ?= limit_check(ThrottleKey), + #'SDLV6AssistProbe'{pkt_id = PktId} ?= catch sdlan_pb:decode_msg(Body, 'SDLV6AssistProbe'), + V6Bytes = sdlan_util:ipv6_to_bytes(Ip), + ReplyBin = sdlan_pb:encode_msg(#'SDLV6AssistProbeReply'{ + pkt_id = PktId, + v6_info = #'SDLV6Info'{ + v6 = V6Bytes, + port = Port + } + }), + ok ?= gen_udp:send(Sock, Ip, Port, ReplyBin) end, {noreply, State}; handle_info(_Info, State) -> @@ -107,4 +107,14 @@ terminate(_Reason, _State = #state{}) -> Extra :: term()) -> {ok, NewState :: #state{}} | {error, Reason :: term()}. code_change(_OldVsn, State = #state{}, _Extra) -> - {ok, State}. \ No newline at end of file + {ok, State}. + +%% 访问频率限制 +-spec limit_check(ThrottleKey :: any()) -> ok | limited. +limit_check(ThrottleKey) -> + case throttle:check(sdlan_ipv6_assist, ThrottleKey) of + {ok, _RestCount, _LeftToReset} -> + ok; + {limit_exceeded, 0, _LeftToReset} -> + limited + end. \ No newline at end of file diff --git a/src/sdlan_app.erl b/src/sdlan_app.erl index 623fdc7..93552f0 100644 --- a/src/sdlan_app.erl +++ b/src/sdlan_app.erl @@ -22,10 +22,12 @@ start(_StartType, _StartArgs) -> ok end, + %% 现在ipv6探测工具的使用频率 + throttle:setup(sdlan_ipv6_assist, 60, per_minute), + %% 启动注册表 sdlan_hostname_regedit:init(), sdlan_domain_regedit:init(), - sdlan_token_store:init(), %% 权限的数据管理 identity_policy_ets:init(), diff --git a/src/sdlan_token_store.erl b/src/sdlan_token_store.erl deleted file mode 100644 index 7e527b2..0000000 --- a/src/sdlan_token_store.erl +++ /dev/null @@ -1,43 +0,0 @@ -%%%------------------------------------------------------------------- -%%% @author anlicheng -%%% @copyright (C) 2026, -%%% @doc -%%% Token存储 -%%% @end -%%% Created : 16. 4月 2026 12:00 -%%%------------------------------------------------------------------- --module(sdlan_token_store). --author("anlicheng"). - -%% API --export([init/0, store/1, lookup/1, delete/1, generate_token/0]). - --define(TABLE, sdlan_token_store). - --spec init() -> ok. -init() -> - ets:new(?TABLE, [named_table, set, public, {read_concurrency, true}, {write_concurrency, true}]). - -generate_token() -> - Token = sdlan_util:rand_byte(128), - store(Token), - Token. - --spec store(Token :: binary()) -> ok. -store(Token) when is_binary(Token) -> - true = ets:insert(?TABLE, {Token}), - ok. - --spec lookup(Token :: binary()) -> boolean(). -lookup(Token) when is_binary(Token) -> - case ets:lookup(?TABLE, Token) of - [{Token}] -> - true; - [] -> - false - end. - --spec delete(Token :: binary()) -> ok. -delete(Token) when is_binary(Token) -> - true = ets:delete(?TABLE, Token), - ok. \ No newline at end of file