Compare commits

..

5 Commits

Author SHA1 Message Date
f7371377ed fix network code 2025-10-22 15:31:54 +08:00
0a0688d230 fix channel 2025-10-17 16:25:50 +08:00
fd00ce4f12 remove mysql 2025-10-17 12:34:56 +08:00
963b0b7da5 change escokd to ranch 2025-10-17 10:28:17 +08:00
72553b4fea change network_id to string 2025-10-15 18:14:31 +08:00
45 changed files with 550 additions and 2192 deletions

26
API.md
View File

@ -45,7 +45,6 @@ return:
"id": 1, "id": 1,
"name": "网络1", "name": "网络1",
"ipaddr": "192.168.0.1/24", "ipaddr": "192.168.0.1/24",
"domain": "punchnet.cn",
"owner_id": 1234, "owner_id": 1234,
"disabled_clients": ["client_id_xyz", "client_id_xyz1"] "disabled_clients": ["client_id_xyz", "client_id_xyz1"]
} }
@ -79,31 +78,6 @@ return:
code = 2, Client Connection Disable code = 2, Client Connection Disable
``` ```
### 3.网络校验
```text
url: /api/check_network
method: post
params:
client_id: string
code: string,
version: int // 当前客户端版本
return:
{"result":
{
"network_id": 8,
"upgrade_type": 0, // 升级类型0: 不升级1: 普通升级2: 强制升级
"upgrade_prompt": "升级提升语"
"upgrade_address": "升级提升语"
}
}
{"error": {"code": 1, "message": "错误描述"}}
code = 1, Token does not exists
code = 2, Client Connection Disable
```
### 4.设置节点的状态 ### 4.设置节点的状态
```text ```text
url: /api/set_node_status url: /api/set_node_status

View File

@ -1,24 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2025, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 04. 12 2025 11:41
%%%-------------------------------------------------------------------
-author("anlicheng").
-define(PENDING_TAB, ets_dns_pending_queries).
-define(PENDING_INDEX_TAB, ets_dns_expire_index).
-record(dns_cache, {
%% {Qname, QType, QClass}
key,
answers = [],
authority = [],
additional = [],
rc :: integer(),
flags = #{},
% unix time
expire_at :: integer()
}).

View File

@ -28,11 +28,10 @@
-ifndef('SDL_DEV_ADDR_PB_H'). -ifndef('SDL_DEV_ADDR_PB_H').
-define('SDL_DEV_ADDR_PB_H', true). -define('SDL_DEV_ADDR_PB_H', true).
-record(sdl_dev_addr, -record(sdl_dev_addr,
{network_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits {network_id = <<>> :: unicode:chardata() | undefined, % = 1, optional
mac = <<>> :: iodata() | undefined, % = 2, optional mac = <<>> :: iodata() | undefined, % = 2, optional
net_addr = 0 :: non_neg_integer() | undefined, % = 3, optional, 32 bits net_addr = 0 :: non_neg_integer() | undefined, % = 3, optional, 32 bits
net_bit_len = 0 :: non_neg_integer() | undefined, % = 4, optional, 32 bits net_bit_len = 0 :: non_neg_integer() | undefined % = 4, optional, 32 bits
network_domain = <<>> :: unicode:chardata() | undefined % = 5, optional
}). }).
-endif. -endif.
@ -52,8 +51,7 @@
dev_addr = undefined :: sdlan_pb:sdl_dev_addr() | undefined, % = 4, optional dev_addr = undefined :: sdlan_pb:sdl_dev_addr() | undefined, % = 4, optional
pub_key = <<>> :: unicode:chardata() | undefined, % = 5, optional pub_key = <<>> :: unicode:chardata() | undefined, % = 5, optional
token = <<>> :: unicode:chardata() | undefined, % = 6, optional token = <<>> :: unicode:chardata() | undefined, % = 6, optional
network_code = <<>> :: unicode:chardata() | undefined, % = 7, optional network_id = <<>> :: unicode:chardata() | undefined % = 7, optional
hostname = <<>> :: unicode:chardata() | undefined % = 8, optional
}). }).
-endif. -endif.
@ -148,7 +146,7 @@
-record(sdl_stun_request, -record(sdl_stun_request,
{cookie = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits {cookie = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits
client_id = <<>> :: unicode:chardata() | undefined, % = 2, optional client_id = <<>> :: unicode:chardata() | undefined, % = 2, optional
network_id = 0 :: non_neg_integer() | undefined, % = 3, optional, 32 bits network_id = <<>> :: unicode:chardata() | undefined, % = 3, optional
mac = <<>> :: iodata() | undefined, % = 4, optional mac = <<>> :: iodata() | undefined, % = 4, optional
ip = 0 :: non_neg_integer() | undefined, % = 5, optional, 32 bits ip = 0 :: non_neg_integer() | undefined, % = 5, optional, 32 bits
nat_type = 0 :: non_neg_integer() | undefined, % = 6, optional, 32 bits nat_type = 0 :: non_neg_integer() | undefined, % = 6, optional, 32 bits
@ -166,7 +164,7 @@
-ifndef('SDL_DATA_PB_H'). -ifndef('SDL_DATA_PB_H').
-define('SDL_DATA_PB_H', true). -define('SDL_DATA_PB_H', true).
-record(sdl_data, -record(sdl_data,
{network_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits {network_id = <<>> :: unicode:chardata() | undefined, % = 1, optional
src_mac = <<>> :: iodata() | undefined, % = 2, optional src_mac = <<>> :: iodata() | undefined, % = 2, optional
dst_mac = <<>> :: iodata() | undefined, % = 3, optional dst_mac = <<>> :: iodata() | undefined, % = 3, optional
is_p2p = false :: boolean() | 0 | 1 | undefined, % = 4, optional is_p2p = false :: boolean() | 0 | 1 | undefined, % = 4, optional
@ -178,7 +176,7 @@
-ifndef('SDL_REGISTER_PB_H'). -ifndef('SDL_REGISTER_PB_H').
-define('SDL_REGISTER_PB_H', true). -define('SDL_REGISTER_PB_H', true).
-record(sdl_register, -record(sdl_register,
{network_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits {network_id = <<>> :: unicode:chardata() | undefined, % = 1, optional
src_mac = <<>> :: iodata() | undefined, % = 2, optional src_mac = <<>> :: iodata() | undefined, % = 2, optional
dst_mac = <<>> :: iodata() | undefined % = 3, optional dst_mac = <<>> :: iodata() | undefined % = 3, optional
}). }).
@ -187,7 +185,7 @@
-ifndef('SDL_REGISTER_ACK_PB_H'). -ifndef('SDL_REGISTER_ACK_PB_H').
-define('SDL_REGISTER_ACK_PB_H', true). -define('SDL_REGISTER_ACK_PB_H', true).
-record(sdl_register_ack, -record(sdl_register_ack,
{network_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits {network_id = <<>> :: unicode:chardata() | undefined, % = 1, optional
src_mac = <<>> :: iodata() | undefined, % = 2, optional src_mac = <<>> :: iodata() | undefined, % = 2, optional
dst_mac = <<>> :: iodata() | undefined % = 3, optional dst_mac = <<>> :: iodata() | undefined % = 3, optional
}). }).

View File

@ -13,7 +13,6 @@
client_id :: binary(), client_id :: binary(),
mac :: binary(), mac :: binary(),
ip :: integer(), ip :: integer(),
host_name :: binary(),
%% %%
status = normal :: normal | disabled status = normal :: normal | disabled
}). }).

View File

@ -1,59 +0,0 @@
-module(dns_cache).
-include_lib("dns_proxy.hrl").
-include_lib("dns_erlang/include/dns.hrl").
-include_lib("dns_erlang/include/dns_records.hrl").
-include_lib("dns_erlang/include/dns_terms.hrl").
-export([init/0, lookup/1, insert/2]).
-define(TABLE, dns_cache).
init() ->
ets:new(?TABLE, [named_table, set, public, {keypos, 2}, {read_concurrency, true}]).
lookup(#dns_query{name = Qname, type = QType, class = QClass}) ->
Key = {Qname, QType, QClass},
case ets:lookup(?TABLE, Key) of
[Cache = #dns_cache{expire_at = ExpireAt}] ->
Now = os:system_time(second),
case ExpireAt > Now of
true ->
{hit, Cache};
false ->
true = ets:delete(?TABLE, Key),
miss
end;
[] ->
miss
end.
insert(#dns_query{name = Qname, type = QType, class = QClass},
#dns_message{answers = Answers, authority = Authority, additional = Additional, rc = RCode, aa = AA}) ->
TTLs = lists:foldl(fun(Term, Acc) ->
case Term of
#dns_rr{ttl = TTL} ->
[TTL|Acc];
_ ->
Acc
end
end, [], Answers ++ Authority ++ Additional),
case length(TTLs) > 0 of
true ->
TTL = lists:min(TTLs),
ExpireAt = os:system_time(second) + TTL,
logger:debug("min ttl is: ~p, expire_at: ~p", [TTL, ExpireAt]),
Key = {Qname, QType, QClass},
Cache = #dns_cache{
key = Key,
answers = Answers,
authority = Authority,
additional = Additional,
rc = RCode,
flags = #{aa => AA},
% unix time
expire_at = ExpireAt
},
true = ets:insert(?TABLE, Cache);
false ->
ok
end.

View File

@ -1,263 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2025, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 03. 12 2025 23:00
%%%-------------------------------------------------------------------
-module(dns_handler).
-author("anlicheng").
-behaviour(gen_server).
-include_lib("dns_erlang/include/dns.hrl").
-include_lib("pkt/include/pkt.hrl").
-include("dns_proxy.hrl").
%% API
-export([start_link/0]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-export([handle_ip_packet/5]).
-define(SERVER, ?MODULE).
-define(RESOLVER_POOL, dns_resolver_pool).
%%
-define(TCP_PROTOCOL, 6).
-define(UDP_PROTOCOL, 17).
-record(state, {}).
%%%===================================================================
%%% API
%%%===================================================================
start_link() ->
gen_server:start_link(?MODULE, [], []).
handle_ip_packet(Pid, Sock, SrcIp, SrcPort, Packet) when is_pid(Pid) ->
gen_server:cast(Pid, {handle_ip_packet, Sock, SrcIp, SrcPort, Packet}).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
%% @private
%% @doc Initializes the server
-spec(init(Args :: term()) ->
{ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} |
{stop, Reason :: term()} | ignore).
init([]) ->
{ok, #state{}}.
%% @private
%% @doc Handling call messages
-spec(handle_call(Request :: term(), From :: {pid(), Tag :: term()},
State :: #state{}) ->
{reply, Reply :: term(), NewState :: #state{}} |
{reply, Reply :: term(), NewState :: #state{}, timeout() | hibernate} |
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), Reply :: term(), NewState :: #state{}} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_call(_Request, _From, State = #state{}) ->
{reply, ok, State}.
%% @private
%% @doc Handling cast messages
-spec(handle_cast(Request :: term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_cast({handle_ip_packet, Sock, SrcIp, SrcPort, IpPacket}, State) ->
{#ipv4{saddr = ReqSAddr, daddr = ReqDAddr, p = Protocol}, ReqIpPayload} = pkt:ipv4(IpPacket),
case Protocol =:= ?UDP_PROTOCOL of
true ->
{#udp{sport = ReqSPort, dport = ReqDPort}, UdpPayload} = pkt:udp(ReqIpPayload),
case resolver(UdpPayload) of
{ok, DnsResp} ->
RespIpPacket = build_ip_packet(ReqDAddr, ReqSAddr, ReqDPort, ReqSPort, DnsResp),
gen_udp:send(Sock, SrcIp, SrcPort, RespIpPacket);
{error, Reason} ->
logger:notice("[dns_handler] resolver get error: ~p", [Reason])
end;
false ->
logger:notice("[dns_handler] resolver invalid protocol: ~p", [Protocol])
end,
{stop, normal, State}.
%% @private
%% @doc Handling all non call/cast messages
-spec(handle_info(Info :: timeout() | term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_info(_Info, State) ->
{noreply, State}.
%% @private
%% @doc This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any
%% necessary cleaning up. When it returns, the gen_server terminates
%% with Reason. The return value is ignored.
-spec(terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()),
State :: #state{}) -> term()).
terminate(_Reason, _State = #state{}) ->
ok.
%% @private
%% @doc Convert process state when code is changed
-spec(code_change(OldVsn :: term() | {down, term()}, State :: #state{},
Extra :: term()) ->
{ok, NewState :: #state{}} | {error, Reason :: term()}).
code_change(_OldVsn, State = #state{}, _Extra) ->
{ok, State}.
%%%===================================================================
%%% Internal functions
%%%===================================================================
-spec resolver(Packet :: binary()) -> {ok, Resp :: binary()} | {error, Reason :: any()}.
resolver(Packet) when is_binary(Packet) ->
resolver0(Packet, dns:decode_message(Packet)).
resolver0(Packet, QueryMsg = #dns_message{qc = 1, questions = [Question = #dns_query{name = QName, type = QType, class = QClass}|_]}) ->
%%
case sdlan_hostname_regedit:lookup(QName) of
{ok, Ip} ->
Answer = #dns_rr {
name = QName,
type = QType,
class = QClass,
ttl = 300,
data = #dns_rrdata_a {
ip = Ip
}
},
RespMsg = QueryMsg#dns_message{
qr = true,
ra = true,
anc = 1,
auc = 0,
adc = 0,
answers = [Answer],
authority = [],
additional = []
},
logger:debug("[dns_handler] punchnet inbuilt qnanme: ~p, ip: ~p", [QName, Ip]),
{ok, dns:encode_message(RespMsg)};
error ->
%%
EmptyDnsResp = dns:encode_message(build_nxdomain_response(QueryMsg)),
case sdlan_domain_regedit:maybe_domain(QName) of
true ->
logger:debug("[dns_handler] punchnet inbuilt qnanme: ~p, nxdomain", [QName]),
{ok, EmptyDnsResp};
false ->
case dns_cache:lookup(Question) of
{hit, Cache} ->
logger:debug("[dns_handler] qname: ~p, hit cache answers: ~p", [QName, Cache#dns_cache.answers]),
RespMsg = build_response(QueryMsg, Cache),
{ok, dns:encode_message(RespMsg)};
miss ->
Ref = make_ref(),
forward_to_upstream(Ref, Packet, QueryMsg),
logger:debug("[dns_handler] cache is miss, forward_to_upstream"),
receive
{dns_resolver_reply, Ref, Resp} ->
case dns:decode_message(Resp) of
RespMsg = #dns_message{answers = Answers} ->
logger:debug("[dns_handler] get a response answers: ~p", [Answers]),
dns_cache:insert(Question, RespMsg),
{ok, Resp};
Error ->
logger:debug("[dns_handler] parse reply get error: ~p", [Error]),
{ok, EmptyDnsResp}
end
after 5000 ->
logger:debug("[dns_handler] forward_to_upstream timeout"),
{ok, EmptyDnsResp}
end
end
end
end;
resolver0(_, Error) ->
logger:warning("[dns_handler] decode dns_query get error: ~p", [Error]),
{error, Error}.
-spec forward_to_upstream(Ref :: reference(), Request :: binary(), QueryMsg :: #dns_message{}) -> no_return().
forward_to_upstream(Ref, Request, QueryMsg) ->
ReceiverPid = self(),
poolboy:transaction(?RESOLVER_POOL, fun(Pid) -> dns_resolver:forward(Pid, ReceiverPid, Ref, Request, QueryMsg) end).
-spec build_response(QueryMsg :: #dns_message{}, Dns_cache :: #dns_cache{}) -> RespMsg :: #dns_message{}.
build_response(QueryMsg, #dns_cache{expire_at = ExpireAt, answers = Answers, authority = Authority, additional = Additional, rc = RCode, flags = #{aa := AA}}) ->
Now = os:system_time(second),
RemainingTTL = ExpireAt - Now,
Answers2 = [adjust_ttl(RR, RemainingTTL) || RR <- Answers],
Authority2 = [adjust_ttl(RR, RemainingTTL) || RR <- Authority],
Additional2 = [adjust_ttl(RR, RemainingTTL) || RR <- Additional],
QueryMsg#dns_message{
qr = true,
ra = true,
aa = AA,
rc = RCode,
anc = length(Answers2),
auc = length(Authority2),
adc = length(Additional2),
answers = Answers2,
authority = Authority2,
additional = Additional2
}.
-spec adjust_ttl(RR :: any(), RemainingTTL :: integer()) -> any().
adjust_ttl(RR = #dns_rr{}, RemainingTTL) ->
RR#dns_rr{ttl = max(0, RemainingTTL)};
adjust_ttl(RR, _RemainingTTL) ->
RR.
-spec build_nxdomain_response(QueryMsg :: #dns_message{}) -> EmptyResp :: #dns_message{}.
build_nxdomain_response(QueryMsg) ->
QueryMsg#dns_message{
qr = true,
aa = true,
ra = true,
rc = ?DNS_RCODE_NXDOMAIN,
anc = 0,
auc = 0,
adc = 0,
answers = [],
authority = [],
additional = []
}.
-spec build_ip_packet(SAddr :: inet:ip4_address(), DAddr :: inet:ip4_address(), SPort :: integer(), DPort :: integer(), Payload :: binary()) -> IpPacket :: binary().
build_ip_packet(SAddr, DAddr, SPort, DPort, UdpPayload) when is_integer(SPort), is_integer(DPort), is_binary(UdpPayload) ->
ULen = 8 + byte_size(UdpPayload),
RespUdpHeader = pkt:udp(#udp{
sport = SPort,
dport = DPort,
ulen = ULen,
sum = dns_utils:udp_checksum(SAddr, DAddr, SPort, DPort, UdpPayload)
}),
IpPayload = <<RespUdpHeader/binary, UdpPayload/binary>>,
IpPacket0 = #ipv4{
len = 20 + ULen,
ttl = 64,
off = 0,
mf = 0,
sum = 0,
p = ?UDP_PROTOCOL,
saddr = SAddr,
daddr = DAddr,
opt = <<>>
},
IpCheckSum = dns_utils:ip_checksum(IpPacket0),
IpHeader = pkt:ipv4(IpPacket0#ipv4{sum = IpCheckSum}),
<<IpHeader/binary, IpPayload/binary>>.

View File

@ -1,66 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2025, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 03. 12 2025 17:29
%%%-------------------------------------------------------------------
-module(dns_handler_sup).
-author("anlicheng").
-behaviour(supervisor).
%% API
-export([start_link/0]).
%% Supervisor callbacks
-export([init/1]).
-export([start_handler/0]).
-define(SERVER, ?MODULE).
%%%===================================================================
%%% API functions
%%%===================================================================
%% @doc Starts the supervisor
-spec(start_link() -> {ok, Pid :: pid()} | ignore | {error, Reason :: term()}).
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%%%===================================================================
%%% Supervisor callbacks
%%%===================================================================
%% @private
%% @doc Whenever a supervisor is started using supervisor:start_link/[2,3],
%% this function is called by the new process to find out about
%% restart strategy, maximum restart frequency and child
%% specifications.
init([]) ->
SupFlags = #{strategy => simple_one_for_one, intensity => 0, period => 1},
Spec = #{
id => dns_handler,
start => {'dns_handler', start_link, []},
restart => temporary,
shutdown => 2000,
type => worker,
modules => ['dns_handler']
},
{ok, {SupFlags, [Spec]}}.
%%%===================================================================
%%% Internal functions
%%%===================================================================
start_handler() ->
case supervisor:start_child(?MODULE, []) of
{ok, Pid} ->
{ok, Pid};
{error, {already_started, Pid}} ->
{ok, Pid};
StartError ->
StartError
end.

View File

@ -1,64 +0,0 @@
-module(dns_pending_wheel).
-export([start/0, insert/2, lookup/1, delete/1]).
-define(TTL, 5).
-define(TICK_MS, 1000).
-define(WHEEL_SIZE, (?TTL + 1)).
%%% =====================================================
%%% Public API
%%% =====================================================
start() ->
ets:new(dns_pending_data, [ordered_set, public, named_table, {read_concurrency, true}, {write_concurrency, true}]),
ets:new(dns_pending_wheel, [bag, public, named_table, {read_concurrency, true}, {write_concurrency, true}]),
start_scanner().
-spec insert(Key :: any(), Val :: any()) -> ok.
insert(Key, Val) ->
Tick = now_tick(),
Slot = Tick rem ?WHEEL_SIZE,
ets:insert(dns_pending_data, {Key, {Val, Tick}}),
ets:insert(dns_pending_wheel, {Slot, {Key, Tick}}),
ok.
-spec lookup(Key :: any()) -> [term()].
lookup(Key) ->
ets:lookup(dns_pending_data, Key).
-spec delete(Key :: any()) -> ok.
delete(Key) ->
ets:delete(dns_pending_data, Key),
ok.
%%% =====================================================
%%% Internal
%%% =====================================================
start_scanner() ->
{ok, spawn_link(fun tick_loop/0)}.
%% Tick, Tick + 1
tick_loop() ->
Tick = now_tick(),
CleanSlot = (Tick + 1) rem ?WHEEL_SIZE,
spawn(fun() -> clean_slot(CleanSlot) end),
timer:sleep(?TICK_MS),
tick_loop().
clean_slot(Slot) ->
Items = ets:lookup(dns_pending_wheel, Slot),
true = ets:delete(dns_pending_wheel, Slot),
lists:foreach(fun({_, {Key, InsertTick}}) ->
case ets:lookup(dns_pending_data, Key) of
[{Key, {_Val, InsertTick}}] ->
ets:delete(dns_pending_data, Key);
_ ->
ok
end
end, Items).
-spec now_tick() -> integer().
now_tick() ->
erlang:system_time(second).

View File

@ -1,50 +0,0 @@
%%%-------------------------------------------------------------------
%% @doc dns_proxy top level supervisor.
%% @end
%%%-------------------------------------------------------------------
-module(dns_proxy_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
-define(SERVER, ?MODULE).
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%% sup_flags() = #{strategy => strategy(), % optional
%% intensity => non_neg_integer(), % optional
%% period => pos_integer()} % optional
%% child_spec() = #{id => child_id(), % mandatory
%% start => mfargs(), % mandatory
%% restart => restart(), % optional
%% shutdown => shutdown(), % optional
%% type => worker(), % optional
%% modules => modules()} % optional
init([]) ->
SupFlags = #{strategy => one_for_one, intensity => 1000, period => 3600},
Port = 15353,
Specs = [
#{
id => dns_handler_sup,
start => {dns_handler_sup, start_link, []},
restart => permanent,
shutdown => 2000,
type => supervisor,
modules => ['dns_handler_sup']
},
#{
id => dns_server,
start => {dns_server, start_link, [Port]},
restart => permanent,
shutdown => 2000,
type => worker,
modules => ['dns_server']
}
],
{ok, {SupFlags, Specs}}.

View File

@ -1,141 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2025, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 03. 12 2025 18:26
%%%-------------------------------------------------------------------
-module(dns_resolver).
-author("anlicheng").
-include_lib("dns_erlang/include/dns.hrl").
-behaviour(gen_server).
%% API
-export([start_link/1]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-export([forward/5]).
-define(SERVER, ?MODULE).
-record(state, {
socket,
idx :: integer(),
dns_servers = []
}).
%%%===================================================================
%%% API
%%%===================================================================
forward(Pid, ReceiverPid, Ref, Request, QueryMsg) ->
gen_server:cast(Pid, {forward, ReceiverPid, Ref, Request, QueryMsg}).
%% @doc Spawns the server and registers the local name (unique)
-spec(start_link(Args :: list()) ->
{ok, Pid :: pid()} | ignore | {error, Reason :: term()}).
start_link(Args) when is_list(Args) ->
gen_server:start_link(?MODULE, [], []).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
%% @private
%% @doc Initializes the server
-spec(init(Args :: term()) ->
{ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} |
{stop, Reason :: term()} | ignore).
init([]) ->
{ok, DnsServers} = application:get_env(sdlan, public_dns_servers),
{ok, Sock} = gen_udp:open(0, [binary, {active, true}]),
Idx = erlang:unique_integer([monotonic, positive]),
{ok, #state{socket = Sock, idx = Idx, dns_servers = DnsServers}}.
%% @private
%% @doc Handling call messages
-spec(handle_call(Request :: term(), From :: {pid(), Tag :: term()},
State :: #state{}) ->
{reply, Reply :: term(), NewState :: #state{}} |
{reply, Reply :: term(), NewState :: #state{}, timeout() | hibernate} |
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), Reply :: term(), NewState :: #state{}} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_call(_Request, _From, State = #state{}) ->
{reply, ok, State}.
%% @private
%% @doc Handling cast messages
-spec(handle_cast(Request :: term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_cast({forward, ReceiverPid, Ref, Request, #dns_message{id = TxId, questions = [#dns_query{name = QName, type = QType, class = QClass}|_]}},
State = #state{socket = Socket, idx = Idx, dns_servers = DnsServers}) ->
lists:foreach(fun({DnsIp, DnsPort}) ->
ok = gen_udp:send(Socket, DnsIp, DnsPort, Request),
Key = {Idx, TxId, DnsIp, DnsPort, QName, QType, QClass},
logger:debug("[dns_resolver] key: ~p, send to: ~p, packet: ~p", [Key, {DnsIp, DnsPort}, Request]),
dns_pending_wheel:insert(Key, {Ref, ReceiverPid})
end, DnsServers),
{noreply, State}.
%% @private
%% @doc Handling all non call/cast messages
-spec(handle_info(Info :: timeout() | term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_info({udp, Socket, TargetIp, TargetPort, Resp}, State = #state{socket = Socket, idx = Idx}) ->
try dns:decode_message(Resp) of
#dns_message{id = TxId, questions = [#dns_query{name = QName, type = QType, class = QClass}|_]} ->
Key = {Idx, TxId, TargetIp, TargetPort, QName, QType, QClass},
Records = dns_pending_wheel:lookup(Key),
dns_pending_wheel:delete(Key),
resolver_reply(Records, Resp);
_ ->
ok
catch error:_ ->
ok
end,
{noreply, State}.
%% @private
%% @doc This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any
%% necessary cleaning up. When it returns, the gen_server terminates
%% with Reason. The return value is ignored.
-spec(terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()),
State :: #state{}) -> term()).
terminate(_Reason, _State = #state{}) ->
ok.
%% @private
%% @doc Convert process state when code is changed
-spec(code_change(OldVsn :: term() | {down, term()}, State :: #state{},
Extra :: term()) ->
{ok, NewState :: #state{}} | {error, Reason :: term()}).
code_change(_OldVsn, State = #state{}, _Extra) ->
{ok, State}.
%%%===================================================================
%%% Internal functions
%%%===================================================================
-spec resolver_reply(list(), Resp :: binary()) -> no_return().
resolver_reply(Records, Resp) when is_binary(Resp) ->
lists:foreach(fun({_, {Ref, ReceiverPid}}) ->
case is_process_alive(ReceiverPid) of
true ->
ReceiverPid ! {dns_resolver_reply, Ref, Resp};
false ->
ok
end
end, Records).

View File

@ -1,24 +0,0 @@
-module(dns_server).
-export([start_link/1, init/1]).
start_link(Port) when is_integer(Port) ->
{ok, spawn_link(?MODULE, init, [Port])}.
init(Port) ->
dns_cache:init(),
{ok, Sock} = gen_udp:open(Port, [binary, {active, true}]),
logger:debug("[dns_server] DNS Forwarder started on UDP port ~p~n", [Port]),
loop(Sock).
loop(Sock) ->
receive
{udp, Sock, Ip, Port, Packet} ->
logger:debug("[dns_server] ip: ~p, get a packet: ~p", [{Ip, Port}, Packet]),
case dns_handler_sup:start_handler() of
{ok, HandlerPid} ->
dns_handler:handle_ip_packet(HandlerPid, Sock, Ip, Port, Packet);
Error ->
logger:debug("[dns_server] start handler get error: ~p", [Error])
end,
loop(Sock)
end.

View File

@ -1,131 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2025, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 05. 12 2025 18:06
%%%-------------------------------------------------------------------
-module(dns_utils).
-author("anlicheng").
-include_lib("pkt/include/pkt.hrl").
%% API
-export([ends_with/2, parse_address/1, checksum/1, udp_checksum/5, ip_checksum/1]).
-export([test/0]).
-spec ends_with(Bin :: binary(), Suffix :: binary()) -> boolean().
ends_with(Bin, Suffix) when is_binary(Bin), is_binary(Suffix) ->
case binary:match(Bin, Suffix) of
{Pos, Len} ->
Pos + Len =:= byte_size(Bin);
nomatch ->
false
end.
-spec parse_address(Ip :: any()) -> {ok, IpAddress :: inet:ip4_address()} | {error, Reason :: any()}.
parse_address(Ip = {Ip0, Ip1, Ip2, Ip3}) when is_integer(Ip0), is_integer(Ip1), is_integer(Ip2), is_integer(Ip3) ->
{ok, Ip};
parse_address(Bin) when is_binary(Bin) ->
inet:parse_address(binary_to_list(Bin)).
%%--------------------------------------------------------------------
%% @doc
%% Calculate 16-bit one's-complement checksum.
%%
%% Input:
%% Bin :: binary()
%%
%% Output:
%% Checksum :: 0..16#FFFF
%%
%% Usage:
%% Checksum = checksum(Bin).
%%
%% Notes:
%% - Bin is treated as big-endian 16-bit words
%% - If Bin length is odd, a zero byte is padded
%%--------------------------------------------------------------------
-spec checksum(binary()) -> non_neg_integer().
checksum(Bin) when is_binary(Bin) ->
Sum = checksum_sum(Bin, 0),
%% fold carry bits
Folded = fold16(Sum),
%% one's complement
(bnot Folded) band 16#FFFF.
checksum_sum(<<>>, Acc) ->
Acc;
checksum_sum(<<Word:16/big, Rest/binary>>, Acc) ->
checksum_sum(Rest, Acc + Word);
checksum_sum(<<Byte:8>>, Acc) ->
%% odd length: pad low byte with zero
checksum_sum(<<>>, Acc + (Byte bsl 8)).
fold16(S) when S > 16#FFFF ->
fold16((S band 16#FFFF) + (S bsr 16));
fold16(S) ->
S.
-spec udp_checksum(SAddr :: inet:ip4_address(), DAddr :: inet:ip4_address(), SPort :: integer(), DPort :: integer(), UDPPayload :: binary()) -> non_neg_integer().
udp_checksum({SA1, SA2, SA3, SA4}, {DA1, DA2, DA3, DA4}, SPort, DPort, UDPPayload) when is_integer(SPort), is_integer(DPort), is_binary(UDPPayload) ->
ULen = 8 + byte_size(UDPPayload),
PseudoHeader = <<SA1, SA2, SA3, SA4,
DA1, DA2, DA3, DA4,
0:8, 17:8,
ULen:16>>,
UDPHeader = <<SPort:16, DPort:16, ULen:16, 0:16>>,
CheckSum = checksum(<<PseudoHeader/binary, UDPHeader/binary, UDPPayload/binary>>),
case CheckSum of
0 ->
16#FFFF;
_ ->
CheckSum
end.
-spec ip_checksum(Ipv4 :: #ipv4{}) -> non_neg_integer().
ip_checksum(#ipv4{hl = HL, tos = ToS, len = Len,
id = Id, df = DF, mf = MF,
off = Off, ttl = TTL, p = P,
saddr = {SA1, SA2, SA3, SA4},
daddr = {DA1, DA2, DA3, DA4},
opt = Opt}) ->
IPBinForChecksum =
<<4:4, HL:4, %% Version=4 + IHL
ToS:8, %% Type of Service
Len:16/big, %% Total Length
Id:16/big, %% Identification
DF:1, MF:1, Off:14, %% Flags + Fragment offset
TTL:8, %% TTL
P:8, %% Protocol
0:16, %% checksum field set to 0 for calculation
SA1:8, SA2:8, SA3:8, SA4:8, %% Source IP
DA1:8, DA2:8, DA3:8, DA4:8, %% Dest IP
Opt/binary>>, %% Options ()
CheckSum = checksum(IPBinForChecksum),
case CheckSum of
0 ->
16#FFFF;
_ ->
CheckSum
end.
test() ->
%Bin = <<69,0,0,77,48,179,0,0,64,17,28,168,100,123,0,2,100,100,100,100,252,230,0,53,0,57,6,92,152,24,1,0,0,1,0,0,0,0,0,0,2,100,98,7,95,100,110,115,45,115,100,4,95,117,100,112,8,112,117,110,99,104,110,101,116,2,116,115,3,110,101,116,0,0,12,0,1>>,
Bin = <<69,0,0,93,0,0,0,0,64,6,77,86,100,100,100,100,100,123,0,2,0,53,196,102,0,73,39,7,215,192,129,128,0,1,0,1,0,0,0,0,2,108,98,7,95,100,110,115,45,115,100,4,95,117,100,112,8,112,117,110,99,104,110,101,116,2,116,115,3,110,101,116,0,0,12,0,1,192,12,0,12,0,1,0,0,1,44,0,4,192,168,1,101>>,
{IPPacket = #ipv4{
saddr = SAddr,
daddr = DAddr,
sum = IpSum
}, UdpPacket} = pkt:ipv4(Bin),
{UDP = #udp{sport = SPort, dport = DPort, sum = CheckSum}, UDPPayload} = pkt:udp(UdpPacket),
X = udp_checksum(SAddr, DAddr, SPort, DPort, UDPPayload),
logger:debug("ip_sum: ~p, =: ~p, udp: ~p, checkSum: ~p, =: ~p", [IpSum, ip_checksum(IPPacket), UDP, CheckSum, X]),
dns:decode_message(UDPPayload).

View File

@ -18,7 +18,7 @@
%% %%
handle_request("POST", "/test/auth_token", _, PostParams) -> handle_request("POST", "/test/auth_token", _, PostParams) ->
logger:debug("[test_handler] get post params: ~p", [PostParams]), lager:debug("[test_handler] get post params: ~p", [PostParams]),
[Id | _] = network_bo:get_all_networks(), [Id | _] = network_bo:get_all_networks(),
Data = #{ Data = #{
<<"network_id">> => Id <<"network_id">> => Id

View File

@ -21,7 +21,7 @@ init(Req0, Opts = [Mod|_]) ->
try Mod:handle_request(Method, Path, GetParams, PostParams) of try Mod:handle_request(Method, Path, GetParams, PostParams) of
{ok, StatusCode, Resp} -> {ok, StatusCode, Resp} ->
%logger:debug("[http_protocol] request path: ~p, get_params: ~p, post_params: ~p, response: ~ts", %lager:debug("[http_protocol] request path: ~p, get_params: ~p, post_params: ~p, response: ~ts",
% [Path, GetParams, PostParams, Resp]), % [Path, GetParams, PostParams, Resp]),
AcceptEncoding = cowboy_req:header(<<"accept-encoding">>, Req1, <<>>), AcceptEncoding = cowboy_req:header(<<"accept-encoding">>, Req1, <<>>),
Req2 = case iolist_size(Resp) >= 1024 andalso supported_gzip(AcceptEncoding) of Req2 = case iolist_size(Resp) >= 1024 andalso supported_gzip(AcceptEncoding) of
@ -44,7 +44,7 @@ init(Req0, Opts = [Mod|_]) ->
}, Error, Req1), }, Error, Req1),
{ok, Req2, Opts}; {ok, Req2, Opts};
_:Error:Stack -> _:Error:Stack ->
logger:warning("[http_handler] get error: ~p, stack: ~p", [Error, Stack]), lager:warning("[http_handler] get error: ~p, stack: ~p", [Error, Stack]),
Req2 = cowboy_req:reply(500, #{ Req2 = cowboy_req:reply(500, #{
<<"Content-Type">> => <<"text/html;charset=utf-8">> <<"Content-Type">> => <<"text/html;charset=utf-8">>
}, <<"Internal Server Error">>, Req1), }, <<"Internal Server Error">>, Req1),

View File

@ -17,7 +17,7 @@ handle_request("POST", "/network/create", _, #{<<"id">> := NetworkId}) when Netw
{ok, Pid} when is_pid(Pid) -> {ok, Pid} when is_pid(Pid) ->
{ok, 200, sdlan_util:json_data(<<"success">>)}; {ok, 200, sdlan_util:json_data(<<"success">>)};
{error, Reason} -> {error, Reason} ->
logger:debug("[network_handler] create network: ~p, get error: ~p", [NetworkId, Reason]), lager:debug("[network_handler] create network: ~p, get error: ~p", [NetworkId, Reason]),
{ok, 200, sdlan_util:json_error(-1, <<"error">>)} {ok, 200, sdlan_util:json_error(-1, <<"error">>)}
end; end;
@ -29,7 +29,7 @@ handle_request("POST", "/network/reload", _, #{<<"id">> := NetworkId}) when Netw
sdlan_network_sup:reallocate_bind_width(), sdlan_network_sup:reallocate_bind_width(),
{ok, 200, sdlan_util:json_data(<<"success">>)}; {ok, 200, sdlan_util:json_data(<<"success">>)};
{error, Reason} -> {error, Reason} ->
logger:debug("[network_handler] start network: ~p, get error: ~p", [NetworkId, Reason]), lager:debug("[network_handler] start network: ~p, get error: ~p", [NetworkId, Reason]),
{ok, 200, sdlan_util:json_error(-1, <<"error">>)} {ok, 200, sdlan_util:json_error(-1, <<"error">>)}
end; end;
NetworkPid when is_pid(NetworkPid) -> NetworkPid when is_pid(NetworkPid) ->
@ -37,7 +37,7 @@ handle_request("POST", "/network/reload", _, #{<<"id">> := NetworkId}) when Netw
ok -> ok ->
{ok, 200, sdlan_util:json_data(<<"success">>)}; {ok, 200, sdlan_util:json_data(<<"success">>)};
{error, Reason} -> {error, Reason} ->
logger:debug("[network_handler] reload network: ~p, get error: ~p", [NetworkId, Reason]), lager:debug("[network_handler] reload network: ~p, get error: ~p", [NetworkId, Reason]),
{ok, 200, sdlan_util:json_error(-1, <<"error">>)} {ok, 200, sdlan_util:json_error(-1, <<"error">>)}
end end
end; end;
@ -51,7 +51,7 @@ handle_request("POST", "/network/delete", _, #{<<"id">> := NetworkId}) when Netw
ok -> ok ->
{ok, 200, sdlan_util:json_data(<<"success">>)}; {ok, 200, sdlan_util:json_data(<<"success">>)};
{error, Reason} -> {error, Reason} ->
logger:debug("[network_handler] delete network: ~p, get error: ~p", [NetworkId, Reason]), lager:debug("[network_handler] delete network: ~p, get error: ~p", [NetworkId, Reason]),
{ok, 200, sdlan_util:json_error(-1, <<"error">>)} {ok, 200, sdlan_util:json_error(-1, <<"error">>)}
end end
end; end;

View File

@ -45,11 +45,11 @@ handle_request("POST", "/node/move", _, #{<<"client_id">> := ClientId, <<"from_n
case {sdlan_network:get_pid(FromNetworkId), sdlan_network:get_pid(ToNetworkId)} of case {sdlan_network:get_pid(FromNetworkId), sdlan_network:get_pid(ToNetworkId)} of
{FromPid, ToPid} when is_pid(FromPid), is_pid(ToPid) -> {FromPid, ToPid} when is_pid(FromPid), is_pid(ToPid) ->
case sdlan_network:dropout_client(FromPid, ClientId) of case sdlan_network:dropout_client(FromPid, ClientId) of
{ok, ChannelPid, HostName} -> {ok, ChannelPid} ->
Ref = sdlan_channel:move_network(ChannelPid, self(), ToPid, HostName), Ref = sdlan_channel:move_network(ChannelPid, self(), ToPid),
receive receive
{command_reply, Ref, {error, Reason}} -> {command_reply, Ref, {error, Reason}} ->
logger:warning("[node_handler] client_id: ~p, move network from: ~p, to: ~p, get error: ~p", [ClientId, FromPid, ToPid, Reason]), lager:warning("[node_handler] client_id: ~p, move network from: ~p, to: ~p, get error: ~p", [ClientId, FromPid, ToPid, Reason]),
{ok, 200, sdlan_util:json_error(-1, <<"move failed">>)}; {ok, 200, sdlan_util:json_error(-1, <<"move failed">>)};
{command_reply, Ref, #sdl_command_ack{status = true}} -> {command_reply, Ref, #sdl_command_ack{status = true}} ->
{ok, 200, sdlan_util:json_data(<<"success">>)}; {ok, 200, sdlan_util:json_data(<<"success">>)};

View File

@ -18,9 +18,9 @@
%% %%
handle_request("POST", "/test/auth_token", _, PostParams) -> handle_request("POST", "/test/auth_token", _, PostParams) ->
logger:debug("[test_handler] get post params: ~p", [PostParams]), lager:debug("[test_handler] get post params: ~p", [PostParams]),
Data = #{ Data = #{
<<"network_id">> => 8, <<"network_id">> => <<"x7qpl9rtf3sd5gh8jk2mn6bv">>,
<<"upgrade_type">> => 0, <<"upgrade_type">> => 0,
<<"upgrade_prompt">> => <<"simple upgrade">>, <<"upgrade_prompt">> => <<"simple upgrade">>,
<<"upgrade_address">> => <<"upgrade_address">> <<"upgrade_address">> => <<"upgrade_address">>
@ -28,7 +28,7 @@ handle_request("POST", "/test/auth_token", _, PostParams) ->
{ok, 200, sdlan_util:json_data(Data)}; {ok, 200, sdlan_util:json_data(Data)};
handle_request("POST", "/test/upgrade", _, PostParams) -> handle_request("POST", "/test/upgrade", _, PostParams) ->
logger:debug("[test_handler] get post params: ~p", [PostParams]), lager:debug("[test_handler] get post params: ~p", [PostParams]),
Data = #{ Data = #{
<<"upgrade_type">> => 1, <<"upgrade_type">> => 1,
<<"upgrade_prompt">> => <<"prompt需要升级"/utf8>>, <<"upgrade_prompt">> => <<"prompt需要升级"/utf8>>,
@ -36,28 +36,47 @@ handle_request("POST", "/test/upgrade", _, PostParams) ->
}, },
{ok, 200, sdlan_util:json_data(Data)}; {ok, 200, sdlan_util:json_data(Data)};
handle_request("GET", "/test/get_all_networks", _, _) -> handle_request("POST", "/test/get_user_network", _, PostParams) ->
{ok, 200, sdlan_util:json_data([8, 9, 10])}; lager:debug("[test_handler] get post params: ~p", [PostParams]),
Data = #{
<<"network">> => [
#{
<<"name">> => <<"test1">>,
<<"code">> => <<"x7qpl9rtf3sd5gh8jk2mn6bv">>
},
#{
<<"name">> => <<"test2">>,
<<"code">> => <<"p8km3wz7es2df9gh4jk1lo5">>
},
#{
<<"name">> => <<"test3">>,
<<"code">> => <<"9fg2hj5kl8pr3ty6vb1nm7x">>
}
]
},
{ok, 200, sdlan_util:json_data(Data)};
handle_request("GET", "/test/get_network", #{<<"id">> := Id0}, _) -> handle_request("GET", "/test/get_all_networks", _, _) ->
Id = binary_to_integer(Id0), {ok, 200, sdlan_util:json_data([<<"x7qpl9rtf3sd5gh8jk2mn6bv">>, <<"p8km3wz7es2df9gh4jk1lo5">>, <<"9fg2hj5kl8pr3ty6vb1nm7x">>])};
handle_request("GET", "/test/get_network", #{<<"id">> := Id}, _) ->
Networks = #{ Networks = #{
8 => #{ <<"x7qpl9rtf3sd5gh8jk2mn6bv">> => #{
<<"id">> => 8, <<"id">> => <<"x7qpl9rtf3sd5gh8jk2mn6bv">>,
<<"name">> => <<"test1">>, <<"name">> => <<"test1">>,
<<"ipaddr">> => <<"10.211.179.0/24">>, <<"ipaddr">> => <<"10.211.179.0/24">>,
<<"owner_id">> => 1234, <<"owner_id">> => 1234,
<<"disabled_clients">> => [] <<"disabled_clients">> => []
}, },
9 => #{ <<"p8km3wz7es2df9gh4jk1lo5">> => #{
<<"id">> => 9, <<"id">> => <<"p8km3wz7es2df9gh4jk1lo5">>,
<<"name">> => <<"test2">>, <<"name">> => <<"test2">>,
<<"ipaddr">> => <<"10.211.180.0/24">>, <<"ipaddr">> => <<"10.211.180.0/24">>,
<<"owner_id">> => 1234, <<"owner_id">> => 1234,
<<"disabled_clients">> => [] <<"disabled_clients">> => []
}, },
10 => #{ <<"9fg2hj5kl8pr3ty6vb1nm7x">> => #{
<<"id">> => 10, <<"id">> => <<"9fg2hj5kl8pr3ty6vb1nm7x">>,
<<"name">> => <<"test3">>, <<"name">> => <<"test3">>,
<<"ipaddr">> => <<"10.211.181.0/24">>, <<"ipaddr">> => <<"10.211.181.0/24">>,
<<"owner_id">> => 1234, <<"owner_id">> => 1234,

View File

@ -13,7 +13,7 @@
%% API %% API
-export([create_table/1, get_table_name/1]). -export([create_table/1, get_table_name/1]).
-export([get_clients/1, get_client/2, delete_clients/1, delete_client/2, disable_client/2, alloc_ip/6]). -export([get_clients/1, delete_clients/1, delete_client/2, disable_client/2, alloc_ip/5]).
-export([debug/1]). -export([debug/1]).
create_table(Tab) when is_atom(Tab) -> create_table(Tab) when is_atom(Tab) ->
@ -24,22 +24,12 @@ create_table(Tab) when is_atom(Tab) ->
{type, set} {type, set}
]). ]).
-spec get_table_name(NetworkId :: integer()) -> TableName :: atom(). -spec get_table_name(NetworkId :: binary()) -> TableName :: atom().
get_table_name(NetworkId) when is_integer(NetworkId) -> get_table_name(NetworkId) when is_binary(NetworkId) ->
list_to_atom("client_" ++ integer_to_list(NetworkId)). list_to_atom("client_" ++ binary_to_list(NetworkId)).
-spec get_client(NetworkId :: integer(), ClientId :: binary()) -> error | {ok, Client :: #client{}} . -spec get_clients(NetworkId :: binary()) -> [Client :: #client{}].
get_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(ClientId) -> get_clients(NetworkId) when is_binary(NetworkId) ->
Tab = get_table_name(NetworkId),
case mnesia:dirty_read(Tab, ClientId) of
[] ->
error;
[Client|_] ->
{ok, Client}
end.
-spec get_clients(NetworkId :: integer()) -> [Client :: #client{}].
get_clients(NetworkId) when is_integer(NetworkId) ->
Tab = get_table_name(NetworkId), Tab = get_table_name(NetworkId),
case mnesia:transaction(fun() -> mnesia:foldl(fun(R, Acc0) -> [R|Acc0] end, [], Tab) end) of case mnesia:transaction(fun() -> mnesia:foldl(fun(R, Acc0) -> [R|Acc0] end, [], Tab) end) of
{'atomic', Items} -> {'atomic', Items} ->
@ -48,8 +38,8 @@ get_clients(NetworkId) when is_integer(NetworkId) ->
[] []
end. end.
-spec delete_clients(NetworkId :: integer()) -> ok | {error, Reason :: any()}. -spec delete_clients(NetworkId :: binary()) -> ok | {error, Reason :: any()}.
delete_clients(NetworkId) when is_integer(NetworkId) -> delete_clients(NetworkId) when is_binary(NetworkId) ->
Tab = get_table_name(NetworkId), Tab = get_table_name(NetworkId),
case mnesia:transaction(fun() -> mnesia:clear_table(Tab) end) of case mnesia:transaction(fun() -> mnesia:clear_table(Tab) end) of
{'atomic', ok} -> {'atomic', ok} ->
@ -58,29 +48,18 @@ delete_clients(NetworkId) when is_integer(NetworkId) ->
{error, Reason} {error, Reason}
end. end.
-spec delete_client(NetworkId :: integer(), ClientId :: binary()) -> {ok, Client :: #client{}} | {error, Reason :: any()}. -spec delete_client(NetworkId :: binary(), ClientId :: binary()) -> ok | {error, Reason :: any()}.
delete_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(ClientId) -> delete_client(NetworkId, ClientId) when is_binary(NetworkId), is_binary(ClientId) ->
Tab = get_table_name(NetworkId), Tab = get_table_name(NetworkId),
case mnesia:transaction(fun() -> mnesia:delete(Tab, ClientId, write) end) of
Fun = fun() -> {'atomic', ok} ->
case mnesia:read(Tab, ClientId, write) of ok;
[] ->
mnesia:abort(not_found);
[Record] ->
mnesia:delete(Tab, ClientId, write),
{ok, Record}
end
end,
case mnesia:transaction(Fun) of
{'atomic', {ok, Client}} ->
{ok, Client};
{'aborted', Reason} -> {'aborted', Reason} ->
{error, Reason} {error, Reason}
end. end.
-spec disable_client(NetworkId :: integer(), ClientId :: binary()) -> ok | {error, Reason :: any()}. -spec disable_client(NetworkId :: binary(), ClientId :: binary()) -> ok | {error, Reason :: any()}.
disable_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(ClientId) -> disable_client(NetworkId, ClientId) when is_binary(NetworkId), is_binary(ClientId) ->
Tab = get_table_name(NetworkId), Tab = get_table_name(NetworkId),
Fun = fun() -> Fun = fun() ->
case mnesia:read(Tab, ClientId, read) of case mnesia:read(Tab, ClientId, read) of
@ -99,16 +78,16 @@ disable_client(NetworkId, ClientId) when is_integer(NetworkId), is_binary(Client
end. end.
%% ip地址的时候mac地址为唯一基准 %% ip地址的时候mac地址为唯一基准
-spec alloc_ip(NetworkId :: integer(), Ips :: list(), ClientId :: binary(), Mac :: binary(), NetAddr0 :: integer(), HostName :: binary()) -> -spec alloc_ip(NetworkId :: binary(), Ips :: list(), ClientId :: binary(), Mac :: binary(), NetAddr0 :: integer()) ->
{ok, Ip :: integer()} | {error, Reason :: any()}. {ok, Ip :: integer()} | {error, Reason :: any()}.
alloc_ip(NetworkId, Ips, ClientId, Mac, NetAddr0, HostName) when is_binary(ClientId), is_integer(NetAddr0), is_binary(Mac), is_binary(HostName) -> alloc_ip(NetworkId, Ips, ClientId, Mac, NetAddr0) when is_binary(NetworkId), is_binary(ClientId), is_integer(NetAddr0), is_binary(Mac) ->
case mnesia:transaction(fun() -> alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0, HostName) end) of case mnesia:transaction(fun() -> alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0) end) of
{'atomic', Res} -> {'atomic', Res} ->
{ok, Res}; {ok, Res};
{'aborted', Reason} -> {'aborted', Reason} ->
{error, Reason} {error, Reason}
end. end.
alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0, HostName) -> alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0) ->
Tab = get_table_name(NetworkId), Tab = get_table_name(NetworkId),
case mnesia:read(Tab, ClientId) of case mnesia:read(Tab, ClientId) of
@ -118,17 +97,11 @@ alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0, HostName) ->
[#client{status = disabled}] -> [#client{status = disabled}] ->
mnesia:abort(client_disabled); mnesia:abort(client_disabled);
[] -> [] ->
{UsedIps, UsedHostNames} = mnesia:foldl(fun(#client{ip = Ip0, host_name = HostName0}, {IpAcc, HostNameAcc}) -> UsedIps = mnesia:foldl(fun(#client{ip = Ip0}, Acc) -> [Ip0|Acc] end, [], Tab),
{[Ip0|IpAcc], [HostName0|HostNameAcc]}
end, {[], []}, Tab),
case HostName =/= <<>> andalso lists:member(HostName, UsedHostNames) of
true ->
mnesia:abort(host_name_used);
false ->
case lists:member(NetAddr0, Ips) andalso not lists:member(NetAddr0, UsedIps) of case lists:member(NetAddr0, Ips) andalso not lists:member(NetAddr0, UsedIps) of
true -> true ->
%% ip没有被占用 %% ip没有被占用
Client = #client{client_id = ClientId, mac = Mac, ip = NetAddr0, host_name = HostName, status = normal}, Client = #client{client_id = ClientId, mac = Mac, ip = NetAddr0},
ok = mnesia:write(Tab, Client, write), ok = mnesia:write(Tab, Client, write),
NetAddr0; NetAddr0;
false -> false ->
@ -136,19 +109,18 @@ alloc_ip0(NetworkId, Ips, ClientId, Mac, NetAddr0, HostName) ->
[] -> [] ->
mnesia:abort(no_ip); mnesia:abort(no_ip);
[Ip|_] -> [Ip|_] ->
Client = #client{client_id = ClientId, mac = Mac, ip = Ip, host_name = HostName, status = normal}, Client = #client{client_id = ClientId, mac = Mac, ip = Ip, status = normal},
ok = mnesia:write(Tab, Client, write), ok = mnesia:write(Tab, Client, write),
Ip Ip
end end
end end
end
end. end.
%%%=================================================================== %%%===================================================================
%%% helper functions %%% helper functions
%%%=================================================================== %%%===================================================================
debug(NetworkId) when is_integer(NetworkId) -> debug(NetworkId) when is_binary(NetworkId) ->
Tab = get_table_name(NetworkId), Tab = get_table_name(NetworkId),
F = fun() -> F = fun() ->
Q = qlc:q([E || E <- mnesia:table(Tab)]), Q = qlc:q([E || E <- mnesia:table(Tab)]),
@ -156,7 +128,7 @@ debug(NetworkId) when is_integer(NetworkId) ->
end, end,
case mnesia:transaction(F) of case mnesia:transaction(F) of
{'atomic', Records} -> {'atomic', Records} ->
lists:foreach(fun(C) -> logger:debug("client: ~p", [C]) end, Records); lists:foreach(fun(C) -> lager:debug("client: ~p", [C]) end, Records);
{'aborted', Reason} -> {'aborted', Reason} ->
logger:warning("read clients get error: ~p", [Reason]) lager:warning("read clients get error: ~p", [Reason])
end. end.

View File

@ -1,29 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author aresei
%%% @copyright (C) 2023, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 16. 5 2023 12:48
%%%-------------------------------------------------------------------
-module(network_bo).
-author("aresei").
-include("sdlan.hrl").
-define(POOL_NAME, mysql_sdlan).
%% API
-export([get_all_networks/0, get_network_by_id/1]).
-spec get_all_networks() -> Networks :: [integer()].
get_all_networks() ->
case mysql_pool:get_all(?POOL_NAME, <<"SELECT id FROM network">>) of
{ok, Networks} ->
lists:map(fun(#{<<"id">> := Id}) -> Id end, Networks);
{error, _} ->
[]
end.
-spec get_network_by_id(Id :: integer()) -> undefined | {ok, NetworkInfo :: map()}.
get_network_by_id(Id) when is_integer(Id) ->
mysql_pool:get_row(?POOL_NAME, <<"SELECT * FROM network WHERE id = ? LIMIT 1">>, [Id]).

View File

@ -1,48 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author aresei
%%% @copyright (C) 2018, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 29. 2018 17:01
%%%-------------------------------------------------------------------
-module(mysql_pool).
-author("aresei").
%% API
-export([get_row/2, get_row/3, get_all/2, get_all/3]).
-export([update/4, update_by/2, update_by/3, insert/4]).
%%
-spec get_row(Pool :: atom(), Sql::binary()) -> {ok, Record::map()} | undefined.
get_row(Pool, Sql) when is_atom(Pool), is_binary(Sql) ->
poolboy:transaction(Pool, fun(ConnPid) -> mysql_provider:get_row(ConnPid, Sql) end).
-spec get_row(Pool :: atom(), Sql::binary(), Params::list()) -> {ok, Record::map()} | undefined.
get_row(Pool, Sql, Params) when is_atom(Pool), is_binary(Sql), is_list(Params) ->
poolboy:transaction(Pool, fun(ConnPid) -> mysql_provider:get_row(ConnPid, Sql, Params) end).
-spec get_all(Pool :: atom(), Sql::binary()) -> {ok, Rows::list()} | {error, Reason :: any()}.
get_all(Pool, Sql) when is_atom(Pool), is_binary(Sql) ->
poolboy:transaction(Pool, fun(ConnPid) -> mysql_provider:get_all(ConnPid, Sql) end).
-spec get_all(Pool :: atom(), Sql::binary(), Params::list()) -> {ok, Rows::list()} | {error, Reason::any()}.
get_all(Pool, Sql, Params) when is_atom(Pool), is_binary(Sql), is_list(Params) ->
poolboy:transaction(Pool, fun(ConnPid) -> mysql_provider:get_all(ConnPid, Sql, Params) end).
-spec insert(Pool :: atom(), Table :: binary(), Fields :: map() | list(), boolean()) ->
ok | {ok, InsertId :: integer()} | {error, Reason :: any()}.
insert(Pool, Table, Fields, FetchInsertId) when is_atom(Pool), is_binary(Table), is_list(Fields); is_map(Fields), is_boolean(FetchInsertId) ->
poolboy:transaction(Pool, fun(ConnPid) -> mysql_provider:insert(ConnPid, Table, Fields, FetchInsertId) end).
-spec update_by(Pool :: atom(), UpdateSql :: binary()) -> {ok, AffectedRows :: integer()} | {error, Reason :: any()}.
update_by(Pool, UpdateSql) when is_atom(Pool), is_binary(UpdateSql) ->
poolboy:transaction(Pool, fun(ConnPid) -> mysql_provider:update_by(ConnPid, UpdateSql) end).
-spec update_by(Pool :: atom(), UpdateSql :: binary(), Params :: list()) -> {ok, AffectedRows :: integer()} | {error, Reason :: any()}.
update_by(Pool, UpdateSql, Params) when is_atom(Pool), is_binary(UpdateSql) ->
poolboy:transaction(Pool, fun(ConnPid) -> mysql_provider:update_by(ConnPid, UpdateSql, Params) end).
-spec update(Pool :: atom(), Table :: binary(), Fields :: map(), WhereFields :: map()) -> {ok, AffectedRows::integer()} | {error, Reason::any()}.
update(Pool, Table, Fields, WhereFields) when is_atom(Pool), is_binary(Table), is_map(Fields), is_map(WhereFields) ->
poolboy:transaction(Pool, fun(ConnPid) -> mysql_provider:update(ConnPid, Table, Fields, WhereFields) end).

View File

@ -1,144 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author aresei
%%% @copyright (C) 2018, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 29. 2018 17:01
%%%-------------------------------------------------------------------
-module(mysql_provider).
-author("aresei").
%% API
-export([get_row/2, get_row/3, get_all/2, get_all/3]).
-export([update/4, update_by/2, update_by/3, insert/4]).
%%
-spec get_row(ConnPid :: pid(), Sql::binary()) -> {ok, Record::map()} | undefined.
get_row(ConnPid, Sql) when is_pid(ConnPid), is_binary(Sql) ->
logger:debug("[mysql_client] get_row sql is: ~p", [Sql]),
case mysql:query(ConnPid, Sql) of
{ok, Names, [Row | _]} ->
{ok, maps:from_list(lists:zip(Names, Row))};
{ok, _, []} ->
undefined;
Error ->
logger:warning("[mysql_client] get error: ~p", [Error]),
undefined
end.
-spec get_row(ConnPid :: pid(), Sql::binary(), Params::list()) -> {ok, Record::map()} | undefined.
get_row(ConnPid, Sql, Params) when is_pid(ConnPid), is_binary(Sql), is_list(Params) ->
logger:debug("[mysql_client] get_row sql is: ~p, params: ~p", [Sql, Params]),
case mysql:query(ConnPid, Sql, Params) of
{ok, Names, [Row | _]} ->
{ok, maps:from_list(lists:zip(Names, Row))};
{ok, _, []} ->
undefined;
Error ->
logger:warning("[mysql_client] get error: ~p", [Error]),
undefined
end.
-spec get_all(ConnPid :: pid(), Sql::binary()) -> {ok, Rows::list()} | {error, Reason :: any()}.
get_all(ConnPid, Sql) when is_pid(ConnPid), is_binary(Sql) ->
logger:debug("[mysql_client] get_all sql is: ~p", [Sql]),
case mysql:query(ConnPid, Sql) of
{ok, Names, Rows} ->
{ok, lists:map(fun(Row) -> maps:from_list(lists:zip(Names, Row)) end, Rows)};
{error, Reason} ->
logger:warning("[mysql_client] get error: ~p", [Reason]),
{error, Reason}
end.
-spec get_all(ConnPid :: pid(), Sql::binary(), Params::list()) -> {ok, Rows::list()} | {error, Reason::any()}.
get_all(ConnPid, Sql, Params) when is_pid(ConnPid), is_binary(Sql), is_list(Params) ->
logger:debug("[mysql_client] get_all sql is: ~p, params: ~p", [Sql, Params]),
case mysql:query(ConnPid, Sql, Params) of
{ok, Names, Rows} ->
{ok, lists:map(fun(Row) -> maps:from_list(lists:zip(Names, Row)) end, Rows)};
{error, Reason} ->
logger:warning("[mysql_client] get error: ~p", [Reason]),
{error, Reason}
end.
-spec insert(ConnPid :: pid(), Table :: binary(), Fields :: map() | list(), boolean()) ->
ok | {ok, InsertId :: integer()} | {error, Reason :: any()}.
insert(ConnPid, Table, Fields, FetchInsertId) when is_pid(ConnPid), is_binary(Table), is_map(Fields), is_boolean(FetchInsertId) ->
insert(ConnPid, Table, maps:to_list(Fields), FetchInsertId);
insert(ConnPid, Table, Fields, FetchInsertId) when is_pid(ConnPid), is_binary(Table), is_list(Fields), is_boolean(FetchInsertId) ->
{Keys, Values} = kvs(Fields),
FieldSql = iolist_to_binary(lists:join(<<", ">>, Keys)),
Placeholders = lists:duplicate(length(Keys), <<"?">>),
ValuesPlaceholder = iolist_to_binary(lists:join(<<", ">>, Placeholders)),
Sql = <<"INSERT INTO ", Table/binary, "(", FieldSql/binary, ") VALUES(", ValuesPlaceholder/binary, ")">>,
logger:debug("[mysql_client] insert sql is: ~p, params: ~p", [Sql, Values]),
case mysql:query(ConnPid, Sql, Values) of
ok ->
case FetchInsertId of
true ->
InsertId = mysql:insert_id(ConnPid),
{ok, InsertId};
false ->
ok
end;
Error ->
Error
end.
-spec update_by(ConnPid :: pid(), UpdateSql :: binary()) -> {ok, AffectedRows :: integer()} | {error, Reason :: any()}.
update_by(ConnPid, UpdateSql) when is_pid(ConnPid), is_binary(UpdateSql) ->
logger:debug("[mysql_client] updateBySql sql: ~p", [UpdateSql]),
case mysql:query(ConnPid, UpdateSql) of
ok ->
AffectedRows = mysql:affected_rows(ConnPid),
{ok, AffectedRows};
Error ->
Error
end.
-spec update_by(ConnPid :: pid(), UpdateSql :: binary(), Params :: list()) -> {ok, AffectedRows :: integer()} | {error, Reason :: any()}.
update_by(ConnPid, UpdateSql, Params) when is_pid(ConnPid), is_binary(UpdateSql) ->
logger:debug("[mysql_client] updateBySql sql: ~p, params: ~p", [UpdateSql, Params]),
case mysql:query(ConnPid, UpdateSql, Params) of
ok ->
AffectedRows = mysql:affected_rows(ConnPid),
{ok, AffectedRows};
Error ->
Error
end.
-spec update(ConnPid :: pid(), Sql :: binary(), Fields :: map(), WhereFields :: map()) ->
{ok, AffectedRows::integer()} | {error, Reason::any()}.
update(ConnPid, Table, Fields, WhereFields) when is_pid(ConnPid), is_binary(Table), is_map(Fields), is_map(WhereFields) ->
%% set
{SetKeys, SetVals} = kvs(Fields),
SetKeys1 = lists:map(fun(K) when is_binary(K) -> <<"`", K/binary, "` = ?">> end, SetKeys),
SetSql = iolist_to_binary(lists:join(<<", ">>, SetKeys1)),
%% where
{WhereKeys, WhereVals} = kvs(WhereFields),
WhereKeys1 = lists:map(fun(K) when is_binary(K) -> <<"`", K/binary, "` = ?">> end, WhereKeys),
WhereSql = iolist_to_binary(lists:join(<<" AND ">>, WhereKeys1)),
Params = SetVals ++ WhereVals,
Sql = <<"UPDATE ", Table/binary, " SET ", SetSql/binary, " WHERE ", WhereSql/binary>>,
logger:debug("[mysql_client] update sql is: ~p, params: ~p", [Sql, Params]),
case mysql:query(ConnPid, Sql, Params) of
ok ->
AffectedRows = mysql:affected_rows(ConnPid),
{ok, AffectedRows};
Error ->
logger:error("[mysql_client] update sql: ~p, params: ~p, get a error: ~p", [Sql, Params, Error]),
Error
end.
-spec kvs(Fields :: map() | list()) -> {Keys :: list(), Values :: list()}.
kvs(Fields) when is_map(Fields) ->
kvs(maps:to_list(Fields));
kvs(Fields) when is_list(Fields) ->
{Keys0, Values0} = lists:foldl(fun({K, V}, {Acc0, Acc1}) -> {[K|Acc0], [V|Acc1]} end, {[], []}, Fields),
{lists:reverse(Keys0), lists:reverse(Values0)}.

View File

@ -6,6 +6,7 @@
{applications, {applications,
[ [
sync, sync,
lager,
cowboy, cowboy,
ranch, ranch,
poolboy, poolboy,
@ -14,9 +15,7 @@
hackney, hackney,
gpb, gpb,
throttle, throttle,
dns_erlang, parse_trans,
pkt,
quicer,
mnesia, mnesia,
erts, erts,
public_key, public_key,

View File

@ -13,9 +13,9 @@
%% API %% API
-export([get_all_networks/0, get_network/1]). -export([get_all_networks/0, get_network/1]).
-export([auth_token/3, node_online/3, node_offline/2, flow_report/5, network_forward_report/2, auth_network_code/3]). -export([auth_token/3, check_network_code/3, node_online/3, node_offline/2, flow_report/5, network_forward_report/2]).
-spec get_all_networks() -> {ok, [NetworkId :: integer()]} | {error, Reason :: any()}. -spec get_all_networks() -> {ok, [NetworkId :: binary()]} | {error, Reason :: any()}.
get_all_networks() -> get_all_networks() ->
case catch do_get("get_all_networks", []) of case catch do_get("get_all_networks", []) of
{ok, Resp} -> {ok, Resp} ->
@ -31,9 +31,9 @@ get_all_networks() ->
Error Error
end. end.
-spec get_network(Id :: integer()) -> {ok, Network :: map()} | {error, Reason :: any()}. -spec get_network(Id :: binary()) -> {ok, Network :: map()} | {error, Reason :: any()}.
get_network(Id) when is_integer(Id) -> get_network(Id) when is_binary(Id) ->
case catch do_get("get_network", [{<<"id">>, integer_to_binary(Id)}]) of case catch do_get("get_network", [{<<"id">>, Id}]) of
{ok, Resp} -> {ok, Resp} ->
case catch jiffy:decode(Resp, [return_maps]) of case catch jiffy:decode(Resp, [return_maps]) of
#{<<"result">> := Network} -> #{<<"result">> := Network} ->
@ -61,9 +61,9 @@ auth_token(ClientId, Token, Version) when is_binary(ClientId), is_binary(Token),
Error Error
end. end.
-spec auth_network_code(ClientId :: binary(), NetworkCode :: binary(), Version :: integer()) -> {ok, Resp :: map()} | {error, Reason :: any()}. -spec check_network_code(ClientId :: binary(), NetworkCode :: binary(), Version :: integer()) -> {ok, Resp :: map()} | {error, Reason :: any()}.
auth_network_code(ClientId, NetworkCode, Version) when is_binary(ClientId), is_binary(NetworkCode), is_integer(Version) -> check_network_code(ClientId, NetworkCode, Version) when is_binary(ClientId), is_binary(NetworkCode), is_integer(Version) ->
case catch do_post("check_network", #{<<"client_id">> => ClientId, <<"code">> => NetworkCode, <<"version">> => Version}) of case catch do_post("checkNetwork", #{<<"client_id">> => ClientId, <<"code">> => NetworkCode, <<"version">> => Version}) of
{ok, Resp} -> {ok, Resp} ->
case catch jiffy:decode(Resp, [return_maps]) of case catch jiffy:decode(Resp, [return_maps]) of
Result when is_map(Result) -> Result when is_map(Result) ->
@ -75,8 +75,8 @@ auth_network_code(ClientId, NetworkCode, Version) when is_binary(ClientId), is_b
Error Error
end. end.
-spec node_online(ClientId :: binary(), NetworkId :: integer(), IpAddr :: binary()) -> {ok, Resp :: map()} | {error, Reason :: any()}. -spec node_online(ClientId :: binary(), NetworkId :: binary(), IpAddr :: binary()) -> {ok, Resp :: map()} | {error, Reason :: any()}.
node_online(ClientId, NetworkId, IpAddr) when is_binary(ClientId), is_integer(NetworkId), is_binary(IpAddr) -> node_online(ClientId, NetworkId, IpAddr) when is_binary(ClientId), is_binary(NetworkId), is_binary(IpAddr) ->
case catch do_post("set_node_status", #{<<"client_id">> => ClientId, <<"network_id">> => NetworkId, <<"ip_addr">> => IpAddr, <<"status">> => 1}) of case catch do_post("set_node_status", #{<<"client_id">> => ClientId, <<"network_id">> => NetworkId, <<"ip_addr">> => IpAddr, <<"status">> => 1}) of
{ok, Resp} -> {ok, Resp} ->
{ok, catch jiffy:decode(Resp, [return_maps])}; {ok, catch jiffy:decode(Resp, [return_maps])};
@ -84,8 +84,8 @@ node_online(ClientId, NetworkId, IpAddr) when is_binary(ClientId), is_integer(Ne
Error Error
end. end.
-spec node_offline(ClientId :: binary(), NetworkId :: integer()) -> {ok, Resp :: map()} | {error, Reason :: any()}. -spec node_offline(ClientId :: binary(), NetworkId :: binary()) -> {ok, Resp :: map()} | {error, Reason :: any()}.
node_offline(ClientId, NetworkId) when is_binary(ClientId), is_integer(NetworkId) -> node_offline(ClientId, NetworkId) when is_binary(ClientId), is_binary(NetworkId) ->
case catch do_post("set_node_status", #{<<"client_id">> => ClientId, <<"network_id">> => NetworkId, <<"status">> => 0}) of case catch do_post("set_node_status", #{<<"client_id">> => ClientId, <<"network_id">> => NetworkId, <<"status">> => 0}) of
{ok, Resp} -> {ok, Resp} ->
{ok, catch jiffy:decode(Resp, [return_maps])}; {ok, catch jiffy:decode(Resp, [return_maps])};
@ -93,10 +93,10 @@ node_offline(ClientId, NetworkId) when is_binary(ClientId), is_integer(NetworkId
Error Error
end. end.
-spec flow_report(ClientId :: binary(), NetworkId :: integer(), ForwardNum :: integer(), P2PNum :: integer(), InboundNum :: integer()) -> -spec flow_report(ClientId :: binary(), NetworkId :: binary(), ForwardNum :: integer(), P2PNum :: integer(), InboundNum :: integer()) ->
{ok, Resp :: map()} | {error, Reason :: any()}. {ok, Resp :: map()} | {error, Reason :: any()}.
flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum) flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum)
when is_binary(ClientId), is_integer(NetworkId), is_integer(ForwardNum), is_integer(P2PNum), is_integer(InboundNum) -> when is_binary(ClientId), is_binary(NetworkId), is_integer(ForwardNum), is_integer(P2PNum), is_integer(InboundNum) ->
Params = #{ Params = #{
<<"client_id">> => ClientId, <<"client_id">> => ClientId,
<<"network_id">> => NetworkId, <<"network_id">> => NetworkId,
@ -111,9 +111,9 @@ flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum)
Error Error
end. end.
-spec network_forward_report(NetworkId :: integer(), ForwardNum :: integer()) -> -spec network_forward_report(NetworkId :: binary(), ForwardNum :: integer()) ->
{ok, Resp :: map()} | {error, Reason :: any()}. {ok, Resp :: map()} | {error, Reason :: any()}.
network_forward_report(NetworkId, ForwardNum) when is_integer(NetworkId), is_integer(ForwardNum) -> network_forward_report(NetworkId, ForwardNum) when is_binary(NetworkId), is_integer(ForwardNum) ->
Params = #{ Params = #{
<<"network_id">> => NetworkId, <<"network_id">> => NetworkId,
<<"forward_num">> => ForwardNum <<"forward_num">> => ForwardNum

View File

@ -15,12 +15,6 @@ start(_StartType, _StartArgs) ->
mnesia:start(), mnesia:start(),
%% %%
erlang:system_flag(fullsweep_after, 16), erlang:system_flag(fullsweep_after, 16),
%%
sdlan_hostname_regedit:init(),
sdlan_domain_regedit:init(),
dns_pending_wheel:start(),
start_http_server(), start_http_server(),
start_tcp_server(), start_tcp_server(),
sdlan_sup:start_link(). sdlan_sup:start_link().
@ -57,7 +51,7 @@ start_http_server() ->
{ok, Pid} = cowboy:start_clear(http_listener, TransOpts, #{env => #{dispatch => Dispatcher}}), {ok, Pid} = cowboy:start_clear(http_listener, TransOpts, #{env => #{dispatch => Dispatcher}}),
logger:debug("[iot_app] the http server start at: ~p, pid is: ~p", [Port, Pid]). lager:debug("[iot_app] the http server start at: ~p, pid is: ~p", [Port, Pid]).
%% tcp服务 %% tcp服务
start_tcp_server() -> start_tcp_server() ->
@ -78,4 +72,4 @@ start_tcp_server() ->
}, },
{ok, _} = ranch:start_listener('sdlan/tcp_server', ranch_tcp, TransOpts, sdlan_channel, []), {ok, _} = ranch:start_listener('sdlan/tcp_server', ranch_tcp, TransOpts, sdlan_channel, []),
logger:debug("[sdlan_app] the tcp server start at: ~p", [Port]). lager:debug("[sdlan_app] the tcp server start at: ~p", [Port]).

View File

@ -28,8 +28,6 @@
-define(NAK_NETWORK_FAULT, 4). -define(NAK_NETWORK_FAULT, 4).
%% %%
-define(NAK_INTERNAL_FAULT, 5). -define(NAK_INTERNAL_FAULT, 5).
%% hostname被占用
-define(NAK_HOSTNAME_USED, 6).
%% %%
-define(UPGRADE_NONE, 0). -define(UPGRADE_NONE, 0).
@ -38,7 +36,7 @@
%% API %% API
-export([start_link/4]). -export([start_link/4]).
-export([publish_command/4, send_event/3, stop/2, move_network/4]). -export([publish_command/4, send_event/3, stop/2, move_network/3]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
@ -77,10 +75,10 @@ publish_command(Pid, ReceiverPid, CommandType, Msg) when is_pid(Pid), is_pid(Rec
Ref. Ref.
%% %%
-spec move_network(Pid :: pid(), ReceiverPid :: pid(), NetworkPid :: pid(), HostName :: binary()) -> Ref :: reference(). -spec move_network(Pid :: pid(), ReceiverPid :: pid(), NetworkPid :: pid()) -> Ref :: reference().
move_network(Pid, ReceiverPid, NetworkPid, HostName) when is_pid(Pid), is_pid(ReceiverPid), is_pid(NetworkPid), is_binary(HostName) -> move_network(Pid, ReceiverPid, NetworkPid) when is_pid(Pid), is_pid(ReceiverPid), is_pid(NetworkPid) ->
Ref = make_ref(), Ref = make_ref(),
Pid ! {move_network, ReceiverPid, Ref, NetworkPid, HostName}, Pid ! {move_network, ReceiverPid, Ref, NetworkPid},
Ref. Ref.
%% %%
@ -104,7 +102,7 @@ start_link(Ref, _Socket, Transport, Opts) ->
init([Ref, Transport, _Opts = []]) -> init([Ref, Transport, _Opts = []]) ->
{ok, Socket} = ranch:handshake(Ref), {ok, Socket} = ranch:handshake(Ref),
logger:debug("[sdlan_channel] get a new connection: ~p", [Socket]), lager:debug("[sdlan_channel] get a new connection: ~p", [Socket]),
Transport:setopts(Socket, [{active, true}, {packet, 2}]), Transport:setopts(Socket, [{active, true}, {packet, 2}]),
erlang:start_timer(?PING_TICKER, self(), ping_ticker), erlang:start_timer(?PING_TICKER, self(), ping_ticker),
gen_server:enter_loop(?MODULE, [], #state{transport = Transport, socket = Socket}). gen_server:enter_loop(?MODULE, [], #state{transport = Transport, socket = Socket}).
@ -117,97 +115,91 @@ handle_cast(_Msg, State) ->
%% token或者网络id来注册 %% token或者网络id来注册
handle_info({tcp, Sock, <<PacketId:32, ?PACKET_REGISTER_SUPER, Body/binary>>}, State=#state{transport = Transport, socket = Sock}) -> handle_info({tcp, Sock, <<PacketId:32, ?PACKET_REGISTER_SUPER, Body/binary>>}, State=#state{transport = Transport, socket = Sock}) ->
#sdl_register_super{version = Version, client_id = ClientId, hostname = HostName, dev_addr = #sdl_dev_addr{net_addr = NetAddr0, mac = Mac}, network_code = NetworkCode, token = Token, pub_key = PubKey} = sdlan_pb:decode_msg(Body, sdl_register_super), #sdl_register_super{version = Version, client_id = ClientId, dev_addr = #sdl_dev_addr{net_addr = NetAddr0, mac = Mac}, network_id = NetworkCode, token = Token, pub_key = PubKey} = sdlan_pb:decode_msg(Body, sdl_register_super),
%% %%
logger:debug("[sdlan_channel] client_id: ~p, public_key: ~p, token: ~p, network_code: ~p", [ClientId, PubKey, Token, NetworkCode]), lager:debug("[sdlan_channel] client_id: ~p, public_key: ~p", [ClientId, PubKey]),
true = (Mac =/= <<>> andalso PubKey =/= <<>> andalso ClientId =/= <<>>), true = (Mac =/= <<>> andalso PubKey =/= <<>> andalso ClientId =/= <<>>),
%% Mac地址不能是广播地址 %% Mac地址不能是广播地址
true = not (sdlan_util:is_multicast_mac(Mac) orelse sdlan_util:is_broadcast_mac(Mac)), true = not (sdlan_util:is_multicast_mac(Mac) orelse sdlan_util:is_broadcast_mac(Mac)),
AuthResult = if AuthResult = if
Token /= <<>> -> Token /= <<>> ->
logger:debug("[sdlan_channel] auth token: ~p", [Token]),
sdlan_api:auth_token(ClientId, Token, Version); sdlan_api:auth_token(ClientId, Token, Version);
NetworkCode /= <<>> -> NetworkCode /= <<>> ->
logger:debug("[sdlan_channel] auth network code: ~p", [NetworkCode]), sdlan_api:check_network_code(ClientId, NetworkCode, Version)
sdlan_api:auth_network_code(ClientId, NetworkCode, Version)
end, end,
case AuthResult of case AuthResult of
{ok, #{<<"result">> := #{<<"network_id">> := NetworkId, <<"upgrade_type">> := UpgradeType, <<"upgrade_prompt">> := UpgradePrompt, <<"upgrade_address">> := UpgradeAddress}}} when is_integer(NetworkId) -> {ok, #{<<"result">> := #{<<"network_id">> := NetworkId, <<"upgrade_type">> := UpgradeType, <<"upgrade_prompt">> := UpgradePrompt, <<"upgrade_address">> := UpgradeAddress}}} when is_binary(NetworkId) ->
logger:debug("[sdlan_channel] client_id: ~p, mac: ~p, token: ~p, version: ~p, registerd, alloc network_id: ~p", [ClientId, sdlan_util:format_mac(Mac), Token, Version, NetworkId]), lager:debug("[sdlan_channel] client_id: ~p, mac: ~p, token: ~p, version: ~p, registerd, alloc network_id: ~p", [ClientId, sdlan_util:format_mac(Mac), Token, Version, NetworkId]),
%% network的对应关系 %% network的对应关系
case sdlan_network:get_pid(NetworkId) of case sdlan_network:get_pid(NetworkId) of
NetworkPid when is_pid(NetworkPid) -> NetworkPid when is_pid(NetworkPid) ->
try sdlan_network:assign_ip_addr(NetworkPid, self(), ClientId, Mac, NetAddr0, HostName) of try sdlan_network:assign_ip_addr(NetworkPid, self(), ClientId, Mac, NetAddr0) of
{ok, Domain, NetAddr, NetBitLen, AesKey} -> {ok, NetAddr, NetBitLen, AesKey} ->
RsaPubKey = sdlan_cipher:rsa_pem_decode(PubKey), RsaPubKey = sdlan_cipher:rsa_pem_decode(PubKey),
EncodedAesKey = rsa_encode(AesKey, RsaPubKey), EncodedAesKey = rsa_encode(AesKey, RsaPubKey),
RegisterSuperAck = sdlan_pb:encode_msg(#sdl_register_super_ack { RegisterSuperAck = sdlan_pb:encode_msg(Ack = #sdl_register_super_ack {
dev_addr = #sdl_dev_addr{ dev_addr = #sdl_dev_addr{
network_id = NetworkId, network_id = NetworkId,
net_addr = NetAddr, net_addr = NetAddr,
mac = Mac, mac = Mac,
net_bit_len = NetBitLen, net_bit_len = NetBitLen
network_domain = Domain
}, },
aes_key = EncodedAesKey, aes_key = EncodedAesKey,
upgrade_type = UpgradeType, upgrade_type = UpgradeType,
upgrade_prompt = UpgradePrompt, upgrade_prompt = UpgradePrompt,
upgrade_address = UpgradeAddress upgrade_address = UpgradeAddress
}), }),
lager:debug("ack is: ~p", [Ack]),
%% %%
Reply = <<PacketId:32, ?PACKET_REGISTER_SUPER_ACK, RegisterSuperAck/binary>>, Reply = <<PacketId:32, ?PACKET_REGISTER_SUPER_ACK, RegisterSuperAck/binary>>,
Transport:send(Sock, Reply), Transport:send(Sock, Reply),
logger:debug("[sdlan_channel] client_id: ~p, mac: ~p, alloc ip: ~p, register will send ack, aes_key: ~p, enc_aes_key: ~p", lager:debug("[sdlan_channel] client_id: ~p, mac: ~p, alloc ip: ~p, register will send ack, aes_key: ~p, enc_aes_key: ~p",
[ClientId, sdlan_util:format_mac(Mac), sdlan_ipaddr:int_to_ipv4(NetAddr), AesKey, EncodedAesKey]), [ClientId, sdlan_util:format_mac(Mac), sdlan_ipaddr:int_to_ipv4(NetAddr), AesKey, EncodedAesKey]),
%% 线 %% 线
Result = sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(NetAddr)), Result = sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(NetAddr)),
logger:debug("[sdlan_channel] client_id: ~p, set none online, result is: ~p", [ClientId, Result]), lager:debug("[sdlan_channel] client_id: ~p, set none online, result is: ~p", [ClientId, Result]),
case UpgradeType =:= ?UPGRADE_FORCE of case UpgradeType =:= ?UPGRADE_FORCE of
true -> true ->
logger:warning("[sdlan_channel] client_id: ~p, need upgrade force!", [ClientId]), lager:warning("[sdlan_channel] client_id: ~p, need upgrade force!", [ClientId]),
{stop, normal, State}; {stop, normal, State};
false -> false ->
{noreply, State#state{client_id = ClientId, mac = Mac, assign_ip = NetAddr, network_pid = NetworkPid, pub_key = PubKey, is_registered = true}} {noreply, State#state{client_id = ClientId, mac = Mac, assign_ip = NetAddr, network_pid = NetworkPid, pub_key = PubKey, is_registered = true}}
end; end;
{error, no_ip} -> {error, no_ip} ->
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: no_ip", [ClientId, Token]), lager:debug("[sdlan_channel] client_id: ~p, token: ~p, register get error: no_ip", [ClientId, Token]),
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NO_IP, <<"No Ip address">>)), Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NO_IP, <<"No Ip address">>)),
{stop, normal, State}; {stop, normal, State};
{error, host_name_used} ->
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: host_name_used", [ClientId, Token]),
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_HOSTNAME_USED, <<"Host Name Used">>)),
{stop, normal, State};
{error, client_disabled} -> {error, client_disabled} ->
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: client_disabled", [ClientId, Token]), lager:debug("[sdlan_channel] client_id: ~p, token: ~p, register get error: client_disabled", [ClientId, Token]),
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NODE_DISABLE, <<"Client Connection Disable">>)), Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NODE_DISABLE, <<"Client Connection Disable">>)),
{stop, normal, State} {stop, normal, State}
catch _:Error:Stack -> catch _:Error:Stack ->
logger:warning("[sdlan_channel] get error: ~p, stack: ~p", [Error, Stack]) lager:debug("[sdlan_channel] get error: ~p, stack: ~p", [Error, Stack])
end; end;
undefined -> undefined ->
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: network not found", [ClientId, Token]), lager:debug("[sdlan_channel] client_id: ~p, token: ~p, register get error: network not found", [ClientId, Token]),
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)), Transport:send(Sock, register_nak_reply(PacketId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)),
{stop, normal, State} {stop, normal, State}
end; end;
{ok, #{<<"error">> := #{<<"code">> := 1, <<"message">> := Message}}} -> {ok, #{<<"error">> := #{<<"code">> := 1, <<"message">> := Message}}} ->
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~ts, error_code: 1", [ClientId, Token, Message]), lager:debug("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~p, error_code: 1", [ClientId, Token, Message]),
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_INVALID_TOKEN, Message)), Transport:send(Sock, register_nak_reply(PacketId, ?NAK_INVALID_TOKEN, Message)),
{stop, normal, State}; {stop, normal, State};
{ok, #{<<"error">> := #{<<"code">> := 2, <<"message">> := Message}}} -> {ok, #{<<"error">> := #{<<"code">> := 2, <<"message">> := Message}}} ->
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~p, error_code: 2", [ClientId, Token, Message]), lager:debug("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~p, error_code: 2", [ClientId, Token, Message]),
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NODE_DISABLE, Message)), Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NODE_DISABLE, Message)),
{stop, normal, State}; {stop, normal, State};
{error, Reason} -> {error, Reason} ->
logger:warning("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~p", [ClientId, Token, Reason]), lager:debug("[sdlan_channel] client_id: ~p, token: ~p, register get error: ~p", [ClientId, Token, Reason]),
Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NETWORK_FAULT, <<"Network Error">>)), Transport:send(Sock, register_nak_reply(PacketId, ?NAK_NETWORK_FAULT, <<"Network Error">>)),
{stop, normal, State} {stop, normal, State}
end; end;
@ -216,13 +208,13 @@ handle_info({tcp, Sock, <<PacketId:32, ?PACKET_QUERY_INFO, Body/binary>>}, State
#sdl_query_info{dst_mac = DstMac} = sdlan_pb:decode_msg(Body, sdl_query_info), #sdl_query_info{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 ->
logger:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer not found", lager:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer not found",
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), [sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
Transport:send(Sock, <<PacketId:32, ?PACKET_EMPTY>>), Transport:send(Sock, <<PacketId:32, ?PACKET_EMPTY>>),
{noreply, State}; {noreply, State};
{ok, {NatPeer = {{Ip0, Ip1, Ip2, Ip3}, NatPort}, NatType}, V6Info} -> {ok, {NatPeer = {{Ip0, Ip1, Ip2, Ip3}, NatPort}, NatType}, V6Info} ->
logger:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer: ~p", lager:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer: ~p",
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), NatPeer]), [sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), NatPeer]),
PeerInfo = sdlan_pb:encode_msg(#sdl_peer_info{ PeerInfo = sdlan_pb:encode_msg(#sdl_peer_info{
@ -238,8 +230,8 @@ handle_info({tcp, Sock, <<PacketId:32, ?PACKET_QUERY_INFO, Body/binary>>}, State
{noreply, State} {noreply, State}
end; end;
handle_info({tcp, _Sock, <<0:32, ?PACKET_PING>>}, State = #state{transport = Transport, socket = Sock, ping_counter = PingCounter}) -> handle_info({tcp, _Sock, <<0:32, ?PACKET_PING>>}, State = #state{transport = Transport, socket = Sock, client_id = ClientId, ping_counter = PingCounter}) ->
%logger:debug("[sdlan_channel] client_id: ~p, get ping", [ClientId]), %lager:debug("[sdlan_channel] client_id: ~p, get ping", [ClientId]),
Transport:send(Sock, <<0:32, ?PACKET_PONG>>), Transport:send(Sock, <<0:32, ?PACKET_PONG>>),
{noreply, State#state{ping_counter = PingCounter + 1}}; {noreply, State#state{ping_counter = PingCounter + 1}};
@ -250,17 +242,17 @@ handle_info({timeout, _, ping_ticker}, State = #state{client_id = ClientId, ping
true -> true ->
{noreply, State#state{ping_counter = 0}}; {noreply, State#state{ping_counter = 0}};
false -> false ->
logger:debug("[sdlan_channel] client_id: ~p, ping losted", [ClientId]), lager:debug("[sdlan_channel] client_id: ~p, ping losted", [ClientId]),
{stop, normal, State#state{ping_counter = 0}} {stop, normal, State#state{ping_counter = 0}}
end; end;
%% %%
handle_info({move_network, ReceiverPid, Ref, NetworkPid, HostName}, handle_info({move_network, ReceiverPid, Ref, NetworkPid},
State = #state{transport = Transport, socket = Sock, client_id = ClientId, mac = Mac, pub_key = PubKey, packet_id = PacketId, inflight = Inflight, is_registered = true}) -> State = #state{transport = Transport, socket = Sock, client_id = ClientId, mac = Mac, pub_key = PubKey, packet_id = PacketId, inflight = Inflight, is_registered = true}) ->
%% network的对应关系 %% network的对应关系
case sdlan_network:assign_ip_addr(NetworkPid, self(), ClientId, Mac, 0, HostName) of case sdlan_network:assign_ip_addr(NetworkPid, self(), ClientId, Mac, 0) of
{ok, Domain, NetAddr, NetBitLen, AesKey} -> {ok, NetAddr, NetBitLen, AesKey} ->
RsaPubKey = sdlan_cipher:rsa_pem_decode(PubKey), RsaPubKey = sdlan_cipher:rsa_pem_decode(PubKey),
EncodedAesKey = rsa_encode(AesKey, RsaPubKey), EncodedAesKey = rsa_encode(AesKey, RsaPubKey),
@ -270,8 +262,7 @@ handle_info({move_network, ReceiverPid, Ref, NetworkPid, HostName},
dev_addr = #sdl_dev_addr { dev_addr = #sdl_dev_addr {
network_id = NetworkId, network_id = NetworkId,
net_addr = NetAddr, net_addr = NetAddr,
net_bit_len = NetBitLen, net_bit_len = NetBitLen
network_domain = Domain
}, },
aes_key = EncodedAesKey aes_key = EncodedAesKey
}), }),
@ -281,10 +272,10 @@ handle_info({move_network, ReceiverPid, Ref, NetworkPid, HostName},
%% 线 %% 线
sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(NetAddr)), sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(NetAddr)),
logger:debug("[sdlan_channel] client_id: ~p, move_network will send command: ~p", [ClientId, Command]), lager:debug("[sdlan_channel] client_id: ~p, move_network will send command: ~p", [ClientId, Command]),
{noreply, State#state{packet_id = PacketId + 1, assign_ip = NetAddr, network_pid = NetworkPid, inflight = maps:put(PacketId, {ReceiverPid, Ref}, Inflight)}}; {noreply, State#state{packet_id = PacketId + 1, assign_ip = NetAddr, network_pid = NetworkPid, inflight = maps:put(PacketId, {ReceiverPid, Ref}, Inflight)}};
{error, Reason} -> {error, Reason} ->
logger:debug("[sdlan_channel] client_id: ~p, move_network get error: ~p", [ClientId, Reason]), lager:debug("[sdlan_channel] client_id: ~p, move_network get error: ~p", [ClientId, Reason]),
Transport:send(Sock, register_nak_reply(0, ?NAK_NO_IP, <<"No Ip address">>)), Transport:send(Sock, register_nak_reply(0, ?NAK_NO_IP, <<"No Ip address">>)),
ReceiverPid ! {command_reply, Ref, {error, <<"assign_ip error, no ip free">>}}, ReceiverPid ! {command_reply, Ref, {error, <<"assign_ip error, no ip free">>}},
{noreply, State} {noreply, State}
@ -292,7 +283,7 @@ handle_info({move_network, ReceiverPid, Ref, NetworkPid, HostName},
%% %%
handle_info({send_event, EventType, Event}, State = #state{transport = Transport, socket = Sock, client_id = ClientId, is_registered = true}) -> handle_info({send_event, EventType, Event}, State = #state{transport = Transport, socket = Sock, client_id = ClientId, is_registered = true}) ->
logger:debug("[sdlan_channel] client_id: ~p, will send eventType: ~p, event: ~p", [ClientId, EventType, Event]), lager:debug("[sdlan_channel] client_id: ~p, will send eventType: ~p, event: ~p", [ClientId, EventType, Event]),
Transport:send(Sock, <<0:32, ?PACKET_EVENT, EventType, Event/binary>>), Transport:send(Sock, <<0:32, ?PACKET_EVENT, EventType, Event/binary>>),
{noreply, State}; {noreply, State};
@ -301,18 +292,18 @@ handle_info({tcp, _Sock, <<0:32, ?PACKET_FLOW_TRACER, Body/binary>>}, State = #s
#sdl_flows{forward_num = ForwardNum, p2p_num = P2PNum, inbound_num = InboundNum} = sdlan_pb:decode_msg(Body, sdl_flows), #sdl_flows{forward_num = ForwardNum, p2p_num = P2PNum, inbound_num = InboundNum} = sdlan_pb:decode_msg(Body, sdl_flows),
{ok, NetworkId} = sdlan_network:get_network_id(NetworkPid), {ok, NetworkId} = sdlan_network:get_network_id(NetworkPid),
ReportResult = sdlan_api:flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum), ReportResult = sdlan_api:flow_report(ClientId, NetworkId, ForwardNum, P2PNum, InboundNum),
logger:debug("[sdlan_channel] flow_tracer, forward: ~p, p2p: ~p, inbound: ~p, result: ~p", [ClientId, ForwardNum, P2PNum, InboundNum, ReportResult]), lager:debug("[sdlan_channel] flow_tracer, forward: ~p, p2p: ~p, inbound: ~p, result: ~p", [ClientId, ForwardNum, P2PNum, InboundNum, ReportResult]),
{noreply, State}; {noreply, State};
%% %%
handle_info({tcp, _Sock, <<0:32, ?PACKET_UNREGISTER>>}, State = #state{client_id = ClientId, network_pid = NetworkPid, is_registered = true}) when is_pid(NetworkPid) -> handle_info({tcp, _Sock, <<0:32, ?PACKET_UNREGISTER>>}, State = #state{client_id = ClientId, network_pid = NetworkPid, is_registered = true}) when is_pid(NetworkPid) ->
logger:warning("[sdlan_channel] unregister client_id: ~p", [ClientId]), lager:warning("[sdlan_channel] unregister client_id: ~p", [ClientId]),
% sdlan_network:unregister(NetworkPid, ClientId), % sdlan_network:unregister(NetworkPid, ClientId),
{stop, normal, State}; {stop, normal, State};
%% %%
handle_info({publish_command, ReceiverPid, Ref, CommandType, Msg}, State = #state{transport = Transport, socket = Sock, client_id = ClientId, packet_id = PacketId, inflight = Inflight, is_registered = true}) -> handle_info({publish_command, ReceiverPid, Ref, CommandType, Msg}, State = #state{transport = Transport, socket = Sock, client_id = ClientId, packet_id = PacketId, inflight = Inflight, is_registered = true}) ->
logger:warning("[sdlan_channel] client_id: ~p, will publish: ~p, message: ~p", [ClientId, CommandType, Msg]), lager:warning("[sdlan_channel] client_id: ~p, will publish: ~p, message: ~p", [ClientId, CommandType, Msg]),
Transport:send(Sock, <<PacketId:32, ?PACKET_COMMAND, CommandType, Msg/binary>>), Transport:send(Sock, <<PacketId:32, ?PACKET_COMMAND, CommandType, Msg/binary>>),
{noreply, State#state{packet_id = PacketId + 1, inflight = maps:put(PacketId, {ReceiverPid, Ref}, Inflight)}}; {noreply, State#state{packet_id = PacketId + 1, inflight = maps:put(PacketId, {ReceiverPid, Ref}, Inflight)}};
@ -320,27 +311,27 @@ handle_info({publish_command, ReceiverPid, Ref, CommandType, Msg}, State = #stat
handle_info({tcp, _Sock, <<PacketId:32, ?PACKET_COMMAND_ACK, Body/binary>>}, State = #state{client_id = ClientId, inflight = Inflight}) when PacketId > 0 -> handle_info({tcp, _Sock, <<PacketId:32, ?PACKET_COMMAND_ACK, Body/binary>>}, State = #state{client_id = ClientId, inflight = Inflight}) when PacketId > 0 ->
CommandAck = #sdl_command_ack{} = sdlan_pb:decode_msg(Body, sdl_command_ack), CommandAck = #sdl_command_ack{} = sdlan_pb:decode_msg(Body, sdl_command_ack),
logger:debug("[sdlan_channel] client_id: ~p, get publish response message: ~p, packet_id: ~p", [ClientId, CommandAck, PacketId]), lager:debug("[sdlan_channel] client_id: ~p, get publish response message: ~p, packet_id: ~p", [ClientId, CommandAck, PacketId]),
case maps:take(PacketId, Inflight) of case maps:take(PacketId, Inflight) of
error -> error ->
logger:warning("[sdlan_channel] get unknown publish response message: ~p, packet_id: ~p", [CommandAck, PacketId]), lager:warning("[sdlan_channel] get unknown publish response message: ~p, packet_id: ~p", [CommandAck, PacketId]),
{ok, State}; {ok, State};
{{ReceiverPid, Ref}, NInflight} -> {{ReceiverPid, Ref}, NInflight} ->
case is_pid(ReceiverPid) andalso is_process_alive(ReceiverPid) of case is_pid(ReceiverPid) andalso is_process_alive(ReceiverPid) of
true -> true ->
ReceiverPid ! {command_reply, Ref, CommandAck}; ReceiverPid ! {command_reply, Ref, CommandAck};
false -> false ->
logger:warning("[sdlan_channel] get publish response message: ~p, packet_id: ~p, but receiver_pid is deaded", [CommandAck, PacketId]) lager:warning("[sdlan_channel] get publish response message: ~p, packet_id: ~p, but receiver_pid is deaded", [CommandAck, PacketId])
end, end,
{noreply, State#state{inflight = NInflight}} {noreply, State#state{inflight = NInflight}}
end; end;
handle_info({tcp_error, Sock, Reason}, State = #state{socket = Sock, client_id = ClientId}) -> handle_info({tcp_error, Sock, Reason}, State = #state{socket = Sock, client_id = ClientId}) ->
logger:notice("[sdlan_channel] client_id: ~p, tcp_error: ~p", [ClientId, Reason]), lager:notice("[sdlan_channel] client_id: ~p, tcp_error: ~p", [ClientId, Reason]),
{stop, normal, State}; {stop, normal, State};
handle_info({tcp_closed, Sock}, State = #state{socket = Sock, client_id = ClientId}) -> handle_info({tcp_closed, Sock}, State = #state{socket = Sock, client_id = ClientId}) ->
logger:notice("[sdlan_channel] client_id: ~p, tcp_closed", [ClientId]), lager:notice("[sdlan_channel] client_id: ~p, tcp_closed", [ClientId]),
{stop, normal, State}; {stop, normal, State};
%% %%
@ -348,7 +339,7 @@ handle_info({stop, Reason}, State) ->
{stop, Reason, State}; {stop, Reason, State};
handle_info(Info, State) -> handle_info(Info, State) ->
logger:warning("[sdlan_channel] get a unknown message: ~p, channel will closed", [Info]), lager:warning("[sdlan_channel] get a unknown message: ~p, channel will closed", [Info]),
{noreply, State}. {noreply, State}.
terminate(Reason, #state{client_id = ClientId, network_pid = NetworkPid}) -> terminate(Reason, #state{client_id = ClientId, network_pid = NetworkPid}) ->
@ -356,11 +347,11 @@ terminate(Reason, #state{client_id = ClientId, network_pid = NetworkPid}) ->
true -> true ->
{ok, NetworkId} = sdlan_network:get_network_id(NetworkPid), {ok, NetworkId} = sdlan_network:get_network_id(NetworkPid),
Result = sdlan_api:node_offline(ClientId, NetworkId), Result = sdlan_api:node_offline(ClientId, NetworkId),
logger:debug("[sdlan_channel] client_id: ~p, set none offline, result is: ~p", [ClientId, Result]); lager:debug("[sdlan_channel] client_id: ~p, set none offline, result is: ~p", [ClientId, Result]);
false -> false ->
ok ok
end, end,
logger:warning("[sdlan_channel] client_id: ~p, stop with reason: ~p", [ClientId, Reason]), lager:warning("[sdlan_channel] client_id: ~p, stop with reason: ~p", [ClientId, Reason]),
ok. ok.
code_change(_OldVsn, State, _Extra) -> code_change(_OldVsn, State, _Extra) ->

View File

@ -17,7 +17,7 @@
test() -> test() ->
Key = <<"abcdabcdabcdabcd">>, Key = <<"abcdabcdabcdabcd">>,
X = aes_encrypt(Key, Key, <<"hello world">>), X = aes_encrypt(Key, Key, <<"hello world">>),
logger:debug("x is: ~p, raw: ~p", [X, aes_decrypt(Key, Key, X)]), lager:debug("x is: ~p, raw: ~p", [X, aes_decrypt(Key, Key, X)]),
ok. ok.

View File

@ -1,36 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2025, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 13. 12 2025 21:09
%%%-------------------------------------------------------------------
-module(sdlan_domain_regedit).
-author("anlicheng").
%% API
-export([init/0, insert/1, maybe_domain/1]).
-define(TABLE, sdlan_domain_regedit).
init() ->
ets:new(?TABLE, [named_table, ordered_set, public, {read_concurrency, true}, {write_concurrency, true}]).
-spec maybe_domain(QName :: binary()) -> boolean().
maybe_domain(QName) when is_binary(QName) ->
case binary:split(QName, <<".">>) of
[_, Domain] ->
case ets:lookup(?TABLE, Domain) of
[{Domain}] ->
true;
[] ->
false
end;
_ ->
false
end.
-spec insert(Domain :: binary()) -> no_return().
insert(Domain) when is_binary(Domain) ->
true = ets:insert(?TABLE, {Domain}).

View File

@ -1,32 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2025, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 13. 12 2025 21:09
%%%-------------------------------------------------------------------
-module(sdlan_hostname_regedit).
-author("anlicheng").
%% API
-export([init/0, lookup/1, insert/2]).
-define(TABLE, sdlan_hostname_regedit).
init() ->
ets:new(?TABLE, [named_table, set, public, {read_concurrency, true}, {write_concurrency, true}]).
-spec lookup(FullHostname :: binary()) -> error | {ok, Ip :: inet:ip4_address()}.
lookup(FullHostname) when is_binary(FullHostname) ->
case ets:lookup(?TABLE, FullHostname) of
[{_, Ip}] ->
{ok, Ip};
[] ->
error
end.
-spec insert(FullHostname :: binary(), Ip :: integer()) -> no_return().
insert(FullHostname, Ip) when is_binary(FullHostname), is_integer(Ip) ->
<<Ip0, Ip1, Ip2, Ip3>> = <<Ip:32>>,
true = ets:insert(?TABLE, {FullHostname, {Ip0, Ip1, Ip2, Ip3}}).

View File

@ -21,9 +21,9 @@
%% API %% API
-export([start_link/2]). -export([start_link/2]).
-export([get_name/1, get_pid/1, assign_ip_addr/6, peer_info/3, unregister/3, debug_info/1, get_network_id/1, get_used_map/1]). -export([get_name/1, get_pid/1, assign_ip_addr/5, peer_info/3, unregister/3, debug_info/1, get_network_id/1, get_used_map/1]).
-export([forward/5, update_hole/6, disable_client/2, get_channel/2, dropout_client/2, reload/1]). -export([forward/5, update_hole/6, disable_client/2, get_channel/2, dropout_client/2, reload/1]).
-export([test_event/1]). -export([test_event/1, simple_debug/0]).
%% gen_server callbacks %% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
@ -33,9 +33,11 @@
nat_type :: integer() nat_type :: integer()
}). }).
%% ip的使用信息, %% ip的使用信息
-record(host, { -record(host, {
client_id :: binary(), client_id :: binary(),
mac :: binary(),
ip :: integer(),
channel_pid :: undefined | pid(), channel_pid :: undefined | pid(),
monitor_ref :: undefined | reference(), monitor_ref :: undefined | reference(),
hole :: undefined | #hole{}, hole :: undefined | #hole{},
@ -44,9 +46,8 @@
}). }).
-record(state, { -record(state, {
network_id :: integer(), network_id :: binary(),
name :: binary(), name :: binary(),
domain :: binary(),
ipaddr :: binary(), ipaddr :: binary(),
mask_len :: integer(), mask_len :: integer(),
owner_id :: integer(), owner_id :: integer(),
@ -72,28 +73,32 @@
%%% API %%% API
%%%=================================================================== %%%===================================================================
simple_debug() ->
Pid = get_pid(<<"x7qpl9rtf3sd5gh8jk2mn6bv">>),
debug_info(Pid).
%% -- MARK: %% -- MARK:
test_event(Pid) -> test_event(Pid) ->
gen_server:cast(Pid, test_event). gen_server:cast(Pid, test_event).
-spec get_pid(Id :: integer()) -> undefined | pid(). -spec get_pid(Id :: binary()) -> undefined | pid().
get_pid(Id) when is_integer(Id) -> get_pid(Id) when is_binary(Id) ->
whereis(get_name(Id)). whereis(get_name(Id)).
-spec get_name(Id :: integer()) -> atom(). -spec get_name(Id :: binary()) -> atom().
get_name(Id) when is_integer(Id) -> get_name(Id) when is_binary(Id) ->
list_to_atom("sdlan_network:" ++ integer_to_list(Id)). list_to_atom("sdlan_network:" ++ binary_to_list(Id)).
-spec reload(Pid :: pid()) -> ok | {error, Reason :: any()}. -spec reload(Pid :: pid()) -> ok | {error, Reason :: any()}.
reload(Pid) when is_pid(Pid) -> reload(Pid) when is_pid(Pid) ->
gen_server:call(Pid, reload). gen_server:call(Pid, reload).
-spec assign_ip_addr(Pid :: pid(), ChannelPid :: pid(), ClientId :: binary(), Mac :: binary(), NetAddr :: integer(), HostName :: binary()) -> -spec assign_ip_addr(Pid :: pid(), ChannelPid :: pid(), ClientId :: binary(), Mac :: binary(), NetAddr :: integer()) ->
{ok, Domain :: binary(), NetAddr :: integer(), MaskLen :: integer(), AesKey :: binary()} | {error, Reason :: any()}. {ok, NetAddr :: integer(), MaskLen :: integer(), AesKey :: binary()} | {error, Reason :: any()}.
assign_ip_addr(Pid, ChannelPid, ClientId, Mac, NetAddr, HostName) when is_pid(Pid), is_pid(ChannelPid), is_binary(ClientId), is_binary(Mac), is_integer(NetAddr) -> assign_ip_addr(Pid, ChannelPid, ClientId, Mac, NetAddr) when is_pid(Pid), is_pid(ChannelPid), is_binary(ClientId), is_binary(Mac), is_integer(NetAddr) ->
gen_server:call(Pid, {assign_ip_addr, ChannelPid, ClientId, Mac, NetAddr, HostName}). gen_server:call(Pid, {assign_ip_addr, ChannelPid, ClientId, Mac, NetAddr}).
-spec get_network_id(Pid :: pid()) -> {ok, NetworkId :: integer()}. -spec get_network_id(Pid :: pid()) -> {ok, NetworkId :: binary()}.
get_network_id(Pid) when is_pid(Pid) -> get_network_id(Pid) when is_pid(Pid) ->
gen_server:call(Pid, get_network_id). gen_server:call(Pid, get_network_id).
@ -124,7 +129,7 @@ get_channel(Pid, ClientId) when is_pid(Pid), is_binary(ClientId) ->
gen_server:call(Pid, {get_channel, ClientId}). gen_server:call(Pid, {get_channel, ClientId}).
%% client_idchannel不关闭; channel会被重新绑定到其他的network里面 %% client_idchannel不关闭; channel会被重新绑定到其他的network里面
-spec dropout_client(Pid :: pid(), ClientId :: binary()) -> {ok, ChannelPid :: pid(), HostName :: binary()} | error. -spec dropout_client(Pid :: pid(), ClientId :: binary()) -> {ok, ChannelPid :: pid()} | error.
dropout_client(Pid, ClientId) when is_pid(Pid), is_binary(ClientId) -> dropout_client(Pid, ClientId) when is_pid(Pid), is_binary(ClientId) ->
gen_server:call(Pid, {dropout_client, ClientId}). gen_server:call(Pid, {dropout_client, ClientId}).
@ -139,9 +144,9 @@ get_used_map(undefined) ->
#{}. #{}.
%% @doc Spawns the server and registers the local name (unique) %% @doc Spawns the server and registers the local name (unique)
-spec(start_link(Name :: atom(), Id :: integer()) -> -spec(start_link(Name :: atom(), Id :: binary()) ->
{ok, Pid :: pid()} | ignore | {error, Reason :: term()}). {ok, Pid :: pid()} | ignore | {error, Reason :: term()}).
start_link(Name, Id) when is_atom(Name), is_integer(Id) -> start_link(Name, Id) when is_atom(Name), is_binary(Id) ->
gen_server:start_link({local, Name}, ?MODULE, [Id], []). gen_server:start_link({local, Name}, ?MODULE, [Id], []).
%%%=================================================================== %%%===================================================================
@ -153,17 +158,17 @@ start_link(Name, Id) when is_atom(Name), is_integer(Id) ->
-spec(init(Args :: term()) -> -spec(init(Args :: term()) ->
{ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} | {ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} |
{stop, Reason :: term()} | ignore). {stop, Reason :: term()} | ignore).
init([Id]) when is_integer(Id) -> init([Id]) ->
erlang:process_flag(trap_exit, true), erlang:process_flag(trap_exit, true),
case sdlan_api:get_network(Id) of case sdlan_api:get_network(Id) of
{ok, #{<<"ipaddr">> := Null}} when Null == <<"null">>; Null == <<"NULL">> -> {ok, #{<<"ipaddr">> := Null}} when Null == <<"null">>; Null == <<"NULL">> ->
ignore; ignore;
{ok, #{<<"id">> := Id, <<"name">> := Name, <<"domain">> := Domain, <<"ipaddr">> := IpAddr0, <<"owner_id">> := OwnerId}} -> {ok, #{<<"id">> := Id, <<"name">> := Name, <<"ipaddr">> := IpAddr0, <<"owner_id">> := OwnerId}} ->
{IpAddr, MaskLen} = parse_ipaddr(IpAddr0), {IpAddr, MaskLen} = parse_ipaddr(IpAddr0),
Ips = sdlan_ipaddr:ips(IpAddr, MaskLen), Ips = sdlan_ipaddr:ips(IpAddr, MaskLen),
AesKey = sdlan_util:rand_byte(32), AesKey = sdlan_util:rand_byte(32),
%% key %% key
ThrottleKey = list_to_atom("network_throttle:" ++ integer_to_list(Id)), ThrottleKey = list_to_atom("network_throttle:" ++ binary_to_list(Id)),
%% %%
sdlan_network_coordinator:attach(self(), ThrottleKey), sdlan_network_coordinator:attach(self(), ThrottleKey),
@ -173,13 +178,11 @@ init([Id]) when is_integer(Id) ->
%% %%
create_mnesia_table(Id), create_mnesia_table(Id),
logger:debug("[sdlan_network] network: ~p, ips: ~p", [Id, lists:map(fun sdlan_ipaddr:int_to_ipv4/1, Ips)]), lager:debug("[sdlan_network] network: ~p, ips: ~p", [Id, lists:map(fun sdlan_ipaddr:int_to_ipv4/1, Ips)]),
sdlan_domain_regedit:insert(Domain), {ok, #state{network_id = Id, name = Name, ipaddr = IpAddr, owner_id = OwnerId, mask_len = MaskLen, ips = Ips, aes_key = AesKey, throttle_key = ThrottleKey}};
{ok, #state{network_id = Id, name = Name, domain = Domain, ipaddr = IpAddr, owner_id = OwnerId, mask_len = MaskLen, ips = Ips, aes_key = AesKey, throttle_key = ThrottleKey}};
{error, Reason} -> {error, Reason} ->
logger:warning("[sdlan_network] load network: ~p, get error: ~p", [Id, Reason]), lager:warning("[sdlan_network] load network: ~p, get error: ~p", [Id, Reason]),
ignore ignore
end. end.
@ -202,7 +205,7 @@ handle_call(reload, _From, State = #state{network_id = Id, ipaddr = OldIpAddr, m
true -> true ->
{reply, ok, State#state{name = Name, owner_id = OwnerId}}; {reply, ok, State#state{name = Name, owner_id = OwnerId}};
false -> false ->
logger:debug("[sdlan_networkd] network_id: ~p, reload will close all channels", [Id]), lager:debug("[sdlan_networkd] network_id: ~p, reload will close all channels", [Id]),
Ips = sdlan_ipaddr:ips(IpAddr, MaskLen), Ips = sdlan_ipaddr:ips(IpAddr, MaskLen),
%% %%
maps:foreach(fun(_, #host{channel_pid = ChannelPid, monitor_ref = MRef}) -> maps:foreach(fun(_, #host{channel_pid = ChannelPid, monitor_ref = MRef}) ->
@ -216,37 +219,28 @@ handle_call(reload, _From, State = #state{network_id = Id, ipaddr = OldIpAddr, m
owner_id = OwnerId, mask_len = MaskLen, ips = Ips, used_map = maps:new()}} owner_id = OwnerId, mask_len = MaskLen, ips = Ips, used_map = maps:new()}}
end; end;
{error, Reason} -> {error, Reason} ->
logger:warning("[sdlan_network] reload network: ~p, get error: ~p", [Id, Reason]), lager:warning("[sdlan_network] reload network: ~p, get error: ~p", [Id, Reason]),
{reply, {error, Reason}, State} {reply, {error, Reason}, State}
end; end;
%% ip地址 %% ip地址
handle_call({assign_ip_addr, ChannelPid, ClientId, Mac, NetAddr0, HostName}, _From, handle_call({assign_ip_addr, ChannelPid, ClientId, Mac, NetAddr0}, _From,
State = #state{network_id = NetworkId, domain = Domain, ips = Ips, used_map = UsedMap, mask_len = MaskLen, aes_key = AesKey}) -> State = #state{network_id = NetworkId, ips = Ips, used_map = UsedMap, mask_len = MaskLen, aes_key = AesKey}) ->
%% ip地址的时候mac地址为唯一基准 %% ip地址的时候mac地址为唯一基准
logger:debug("[sdlan_network] alloc_ip, network_id: ~p, ips: ~p, client_id: ~p, mac: ~p, net_addr: ~p", lager:debug("[sdlan_network] alloc_ip, network_id: ~p, ips: ~p, client_id: ~p, mac: ~p, net_addr: ~p",
[NetworkId, Ips, ClientId, sdlan_util:format_mac(Mac), sdlan_ipaddr:int_to_ipv4(NetAddr0)]), [NetworkId, Ips, ClientId, sdlan_util:format_mac(Mac), sdlan_ipaddr:int_to_ipv4(NetAddr0)]),
case client_model:alloc_ip(NetworkId, Ips, ClientId, Mac, NetAddr0, HostName) of case client_model:alloc_ip(NetworkId, Ips, ClientId, Mac, NetAddr0) of
{ok, Ip} -> {ok, Ip} ->
%% channel %% channel
maybe_close_channel(maps:get(Mac, UsedMap, undefined)), maybe_close_channel(maps:get(Mac, UsedMap, undefined)),
%% ->ip的映射关系
case HostName =/= <<>> of
true ->
FullHostname = <<HostName/binary, ".", Domain/binary>>,
sdlan_hostname_regedit:insert(FullHostname, Ip);
false ->
ok
end,
%% channel之间的关系 %% channel之间的关系
MRef = monitor(process, ChannelPid), MRef = monitor(process, ChannelPid),
NUsedMap = maps:put(Mac, #host{client_id = ClientId, channel_pid = ChannelPid, monitor_ref = MRef}, UsedMap), NUsedMap = maps:put(Mac, #host{client_id = ClientId, mac = Mac, ip = Ip, channel_pid = ChannelPid, monitor_ref = MRef}, UsedMap),
{reply, {ok, Domain, Ip, MaskLen, AesKey}, State#state{used_map = NUsedMap}}; {reply, {ok, Ip, MaskLen, AesKey}, State#state{used_map = NUsedMap}};
{error, Reason} -> {error, Reason} ->
{reply, {error, Reason}, State} {reply, {error, Reason}, State}
end; end;
@ -307,12 +301,9 @@ handle_call({dropout_client, ClientId}, _From, State = #state{network_id = Netwo
is_reference(MRef) andalso demonitor(MRef), is_reference(MRef) andalso demonitor(MRef),
NUsedMap = maps:remove(Mac, UsedMap), NUsedMap = maps:remove(Mac, UsedMap),
%% %%
case client_model:delete_client(NetworkId, ClientId) of client_model:delete_client(NetworkId, ClientId),
{ok, #client{host_name = HostName}} ->
{reply, {ok, ChannelPid, HostName}, State#state{used_map = NUsedMap}}; {reply, {ok, ChannelPid}, State#state{used_map = NUsedMap}};
{error, _} ->
{reply, error, State}
end;
false -> false ->
{reply, error, State} {reply, error, State}
end; end;
@ -350,14 +341,7 @@ handle_call(debug_info, _From, State = #state{network_id = NetworkId, ipaddr = I
<<"mask_len">> => MaskLen, <<"mask_len">> => MaskLen,
<<"owner_id">> => OwnerId, <<"owner_id">> => OwnerId,
<<"ips">> => lists:map(fun sdlan_ipaddr:int_to_ipv4/1, Ips), <<"ips">> => lists:map(fun sdlan_ipaddr:int_to_ipv4/1, Ips),
<<"used_ips">> => lists:map(fun({_, Host = #host{client_id = ClientId}}) -> <<"used_ips">> => lists:map(fun({_, Host}) -> format_host(Host) end, maps:to_list(UsedMap))
case client_model:get_client(NetworkId, ClientId) of
error ->
#{};
{ok, #client{mac = Mac, ip = Ip}} ->
format_host(Host, Ip, Mac)
end
end, maps:to_list(UsedMap))
}, },
{reply, Reply, State}. {reply, Reply, State}.
@ -377,7 +361,7 @@ handle_cast({forward, Sock, SrcMac, DstMac, Packet}, State = #state{network_id =
case throttle:check(sdlan_network, ThrottleKey) of case throttle:check(sdlan_network, ThrottleKey) of
{ok, _RestCount, _LeftToReset} -> {ok, _RestCount, _LeftToReset} ->
%% client和stun之间必须有心跳机制保持nat映射可用udp包肯定可以到达对端的nat %% client和stun之间必须有心跳机制保持nat映射可用udp包肯定可以到达对端的nat
logger:debug("[sdlan_network] forward data networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p", lager:debug("[sdlan_network] forward data networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]), [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]),
gen_udp:send(Sock, Ip, Port, Packet), gen_udp:send(Sock, Ip, Port, Packet),
@ -386,23 +370,23 @@ handle_cast({forward, Sock, SrcMac, DstMac, Packet}, State = #state{network_id =
%% %%
case sdlan_network_coordinator:checkout() of case sdlan_network_coordinator:checkout() of
ok -> ok ->
logger:debug("[sdlan_network] use release forward data networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p", lager:debug("[sdlan_network] use release forward data networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]), [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]),
gen_udp:send(Sock, Ip, Port, Packet), gen_udp:send(Sock, Ip, Port, Packet),
{noreply, State#state{forward_bytes = ForwardBytes + PacketBytes}}; {noreply, State#state{forward_bytes = ForwardBytes + PacketBytes}};
error -> error ->
logger:notice("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, rate limited, discard", lager:notice("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, rate limited, discard",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{noreply, State} {noreply, State}
end end
end; end;
{ok, _} -> {ok, _} ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole not found", lager:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole not found",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{noreply, State}; {noreply, State};
error -> error ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p not found", lager:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p not found",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{noreply, State} {noreply, State}
end; end;
@ -418,7 +402,7 @@ handle_cast({forward, Sock, SrcMac, DstMac, Packet}, State = #state{network_id =
maps:foreach(fun(Mac, #host{hole = Hole}) -> maps:foreach(fun(Mac, #host{hole = Hole}) ->
case {Mac =/= SrcMac, Hole} of case {Mac =/= SrcMac, Hole} of
{true, #hole{peer = {NatIp, NatPort}}} -> {true, #hole{peer = {NatIp, NatPort}}} ->
logger:debug("[sdlan_network] call me here"), lager:debug("[sdlan_network] call me here"),
gen_udp:send(Sock, NatIp, NatPort, Packet); gen_udp:send(Sock, NatIp, NatPort, Packet);
_ -> _ ->
ok ok
@ -426,24 +410,24 @@ handle_cast({forward, Sock, SrcMac, DstMac, Packet}, State = #state{network_id =
end, UsedMap), end, UsedMap),
%% client和stun之间必须有心跳机制保持nat映射可用udp包肯定可以到达对端的nat %% client和stun之间必须有心跳机制保持nat映射可用udp包肯定可以到达对端的nat
logger:debug("[sdlan_network] broadcast data networkd_id: ~p, src_mac: ~p, dst_mac: ~p", lager:debug("[sdlan_network] broadcast data networkd_id: ~p, src_mac: ~p, dst_mac: ~p",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{noreply, State#state{forward_bytes = ForwardBytes + PacketBytes}}; {noreply, State#state{forward_bytes = ForwardBytes + PacketBytes}};
false -> false ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard 1", lager:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard 1",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{noreply, State} {noreply, State}
end; end;
handle_cast({forward, _Sock, SrcMac, DstMac, _Packet}, State = #state{network_id = NetworkId}) -> handle_cast({forward, _Sock, SrcMac, DstMac, _Packet}, State = #state{network_id = NetworkId}) ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard 2", lager:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard 2",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{noreply, State}; {noreply, State};
%% ip的占用并关闭channel %% ip的占用并关闭channel
handle_cast({unregister, _ClientId, Mac}, State = #state{network_id = NetworkId, used_map = UsedMap}) -> handle_cast({unregister, _ClientId, Mac}, State = #state{network_id = NetworkId, used_map = UsedMap}) ->
logger:debug("[sdlan_network] networkd_id: ~p, unregister Mac: ~p", [NetworkId, sdlan_util:format_mac(Mac)]), lager:debug("[sdlan_network] networkd_id: ~p, unregister Mac: ~p", [NetworkId, sdlan_util:format_mac(Mac)]),
case maps:take(Mac, UsedMap) of case maps:take(Mac, UsedMap) of
error -> error ->
{noreply, State}; {noreply, State};
@ -454,9 +438,9 @@ handle_cast({unregister, _ClientId, Mac}, State = #state{network_id = NetworkId,
end; end;
%% client是属于当前网络的 %% client是属于当前网络的
handle_cast({update_hole, ClientId, Mac, Peer, NatType, V6Info}, State = #state{network_id = NetworkId, used_map = UsedMap}) -> handle_cast({update_hole, _ClientId, Mac, Peer, NatType, V6Info}, State = #state{used_map = UsedMap}) ->
case {maps:find(Mac, UsedMap), client_model:get_client(NetworkId, ClientId)} of case maps:find(Mac, UsedMap) of
{{ok, Host0 = #host{client_id = ClientId0, hole = OldHole}}, {ok, #client{ip = Ip}}} when ClientId =:= ClientId0 -> {ok, Host0 = #host{hole = OldHole, ip = Ip}} ->
case OldHole =:= undefined orelse (OldHole#hole.peer =/= Peer orelse OldHole#hole.nat_type =/= NatType) of case OldHole =:= undefined orelse (OldHole#hole.peer =/= Peer orelse OldHole#hole.nat_type =/= NatType) of
true -> true ->
NatChangedEvent = sdlan_pb:encode_msg(#sdl_nat_changed_event { NatChangedEvent = sdlan_pb:encode_msg(#sdl_nat_changed_event {
@ -470,7 +454,7 @@ handle_cast({update_hole, ClientId, Mac, Peer, NatType, V6Info}, State = #state{
Host = Host0#host{hole = #hole{peer = Peer, nat_type = NatType}, v6_info = V6Info}, Host = Host0#host{hole = #hole{peer = Peer, nat_type = NatType}, v6_info = V6Info},
{noreply, State#state{used_map = maps:put(Mac, Host, UsedMap)}}; {noreply, State#state{used_map = maps:put(Mac, Host, UsedMap)}};
_ -> error ->
{noreply, State} {noreply, State}
end. end.
@ -486,12 +470,12 @@ handle_info({timeout, _, flow_report_ticker}, State = #state{network_id = Networ
{noreply, State#state{forward_bytes = 0}}; {noreply, State#state{forward_bytes = 0}};
handle_info({'EXIT', _Pid, shutdown}, State = #state{network_id = NetworkId, used_map = UsedMap}) -> handle_info({'EXIT', _Pid, shutdown}, State = #state{network_id = NetworkId, used_map = UsedMap}) ->
logger:warning("[sdlan_network] network: ~p, get shutdown message", [NetworkId]), lager:warning("[sdlan_network] network: ~p, get shutdown message", [NetworkId]),
broadcast_shutdown(UsedMap), broadcast_shutdown(UsedMap),
{stop, shutdown, State}; {stop, shutdown, State};
%% Channel进程退出, hole里面的数据也需要清理 %% Channel进程退出, hole里面的数据也需要清理
handle_info({'DOWN', _MRef, process, ChannelPid, Reason}, State = #state{network_id = NetworkId, used_map = UsedMap}) -> handle_info({'DOWN', _MRef, process, ChannelPid, Reason}, State = #state{network_id = NetworkId, used_map = UsedMap}) ->
logger:notice("[sdlan_network] network_id: ~p, channel_pid: ~p, close with reason: ~p", [NetworkId, ChannelPid, Reason]), lager:notice("[sdlan_network] network_id: ~p, channel_pid: ~p, close with reason: ~p", [NetworkId, ChannelPid, Reason]),
NUsedMap = maps:filter(fun(_, #host{channel_pid = ChannelPid0}) -> ChannelPid =/= ChannelPid0 end, UsedMap), NUsedMap = maps:filter(fun(_, #host{channel_pid = ChannelPid0}) -> ChannelPid =/= ChannelPid0 end, UsedMap),
{noreply, State#state{used_map = NUsedMap}}. {noreply, State#state{used_map = NUsedMap}}.
@ -503,7 +487,7 @@ handle_info({'DOWN', _MRef, process, ChannelPid, Reason}, State = #state{network
-spec(terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()), -spec(terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()),
State :: #state{}) -> term()). State :: #state{}) -> term()).
terminate(Reason, #state{network_id = NetworkId, used_map = UsedMap}) -> terminate(Reason, #state{network_id = NetworkId, used_map = UsedMap}) ->
logger:debug("[sdlan_network] network: ~p, will terminate with reason: ~p", [NetworkId, Reason]), lager:debug("[sdlan_network] network: ~p, will terminate with reason: ~p", [NetworkId, Reason]),
broadcast_shutdown(UsedMap), broadcast_shutdown(UsedMap),
ok. ok.
@ -520,8 +504,8 @@ code_change(_OldVsn, State = #state{}, _Extra) ->
%%%=================================================================== %%%===================================================================
%% %%
-spec create_mnesia_table(NetworkId :: integer()) -> no_return(). -spec create_mnesia_table(NetworkId :: binary()) -> no_return().
create_mnesia_table(NetworkId) when is_integer(NetworkId) -> create_mnesia_table(NetworkId) when is_binary(NetworkId) ->
Tab = client_model:get_table_name(NetworkId), Tab = client_model:get_table_name(NetworkId),
Tables = mnesia:system_info(tables), Tables = mnesia:system_info(tables),
case lists:member(Tab, Tables) of case lists:member(Tab, Tables) of
@ -529,7 +513,7 @@ create_mnesia_table(NetworkId) when is_integer(NetworkId) ->
ok; ok;
false -> false ->
Res = client_model:create_table(Tab), Res = client_model:create_table(Tab),
logger:debug("[sdlan_network] create table result: ~p", [Res]) lager:debug("[sdlan_network] create table result: ~p", [Res])
end. end.
-spec maybe_close_channel(undefined | #host{}) -> no_return(). -spec maybe_close_channel(undefined | #host{}) -> no_return().
@ -580,8 +564,8 @@ parse_ipaddr(IpAddr0) when is_binary(IpAddr0) ->
{IpAddr0, 24} {IpAddr0, 24}
end. end.
-spec format_host(Host :: #host{}, Ip :: integer(), Mac :: binary()) -> map(). -spec format_host(Host :: #host{}) -> map().
format_host(#host{client_id = ClientId, hole = Hole, v6_info = V6Info}, Ip, Mac) when is_integer(Ip), is_binary(Mac) -> format_host(#host{client_id = ClientId, mac = Mac, ip = Ip, hole = Hole, v6_info = V6Info}) ->
HoleMap = case Hole of HoleMap = case Hole of
undefined -> undefined ->
#{}; #{};

View File

@ -104,10 +104,10 @@ handle_info({timeout, _, release_ticker}, State = #state{network_map = ChannelMa
Acc Acc
end end
end, 0, maps:keys(ChannelMap)), end, 0, maps:keys(ChannelMap)),
% logger:debug("[sdlan_network_coordinator] can release count is: ~p", [AccReleaseCount]), % lager:debug("[sdlan_network_coordinator] can release count is: ~p", [AccReleaseCount]),
{noreply, State#state{release_count = AccReleaseCount}}; {noreply, State#state{release_count = AccReleaseCount}};
handle_info({'DOWN', _, process, NetworkPid, Reason}, State = #state{network_map = NetworkMap}) -> handle_info({'DOWN', _, process, NetworkPid, Reason}, State = #state{network_map = NetworkMap}) ->
logger:debug("[sdlan_network_coordinator] network_pid close with reason: ~p", [Reason]), lager:debug("[sdlan_network_coordinator] network_pid close with reason: ~p", [Reason]),
{noreply, State#state{network_map = maps:remove(NetworkPid, NetworkMap)}}. {noreply, State#state{network_map = maps:remove(NetworkPid, NetworkMap)}}.
%% @private %% @private

View File

@ -41,7 +41,7 @@ start_link() ->
init([]) -> init([]) ->
SupFlags = #{strategy => one_for_one, intensity => 1000, period => 3600}, SupFlags = #{strategy => one_for_one, intensity => 1000, period => 3600},
{ok, NetworkIds} = sdlan_api:get_all_networks(), {ok, NetworkIds} = sdlan_api:get_all_networks(),
Specs = lists:map(fun child_spec/1, []), Specs = lists:map(fun child_spec/1, NetworkIds),
set_network_bind(length(Specs)), set_network_bind(length(Specs)),
@ -51,8 +51,8 @@ init([]) ->
%%% Internal functions %%% Internal functions
%%%=================================================================== %%%===================================================================
-spec ensured_network_started(Id :: integer()) -> {ok, Pid :: pid()} | {error, Reason :: any()}. -spec ensured_network_started(Id :: binary()) -> {ok, Pid :: pid()} | {error, Reason :: any()}.
ensured_network_started(Id) when is_integer(Id) -> ensured_network_started(Id) when is_binary(Id) ->
case sdlan_network:get_pid(Id) of case sdlan_network:get_pid(Id) of
undefined -> undefined ->
case supervisor:start_child(?MODULE, child_spec(Id)) of case supervisor:start_child(?MODULE, child_spec(Id)) of
@ -67,8 +67,8 @@ ensured_network_started(Id) when is_integer(Id) ->
{ok, Pid} {ok, Pid}
end. end.
-spec start_network(Id :: integer()) -> {ok, Pid :: pid()} | {error, Reason :: any()}. -spec start_network(Id :: binary()) -> {ok, Pid :: pid()} | {error, Reason :: any()}.
start_network(Id) when is_integer(Id) -> start_network(Id) when is_binary(Id) ->
case supervisor:start_child(?MODULE, child_spec(Id)) of case supervisor:start_child(?MODULE, child_spec(Id)) of
{ok, Pid} when is_pid(Pid) -> {ok, Pid} when is_pid(Pid) ->
{ok, Pid}; {ok, Pid};
@ -88,8 +88,8 @@ reallocate_bind_width() ->
ChildPids = lists:map(fun({_Id, ChildPid, _Type, _Modules}) -> ChildPid end, supervisor:which_children(?MODULE)), ChildPids = lists:map(fun({_Id, ChildPid, _Type, _Modules}) -> ChildPid end, supervisor:which_children(?MODULE)),
set_network_bind(length(ChildPids)). set_network_bind(length(ChildPids)).
-spec delete_network(NetworkId :: integer()) -> ok | {error, Reason :: any()}. -spec delete_network(NetworkId :: binary()) -> ok | {error, Reason :: any()}.
delete_network(NetworkId) when is_integer(NetworkId) -> delete_network(NetworkId) when is_binary(NetworkId) ->
ChildId = sdlan_network:get_name(NetworkId), ChildId = sdlan_network:get_name(NetworkId),
case supervisor:terminate_child(?MODULE, ChildId) of case supervisor:terminate_child(?MODULE, ChildId) of
ok -> ok ->
@ -98,8 +98,8 @@ delete_network(NetworkId) when is_integer(NetworkId) ->
Error Error
end. end.
-spec child_spec(Id :: integer()) -> map(). -spec child_spec(Id :: binary()) -> map().
child_spec(Id) when is_integer(Id) -> child_spec(Id) when is_binary(Id) ->
Name = sdlan_network:get_name(Id), Name = sdlan_network:get_name(Id),
#{ #{
id => Name, id => Name,
@ -110,8 +110,6 @@ child_spec(Id) when is_integer(Id) ->
modules => ['sdlan_network'] modules => ['sdlan_network']
}. }.
set_network_bind(0) ->
ok;
set_network_bind(Count) when is_integer(Count) -> set_network_bind(Count) when is_integer(Count) ->
{ok, BindWidth} = application:get_env(sdlan, band_width), {ok, BindWidth} = application:get_env(sdlan, band_width),
NetworkBindWidth = BindWidth div Count, NetworkBindWidth = BindWidth div Count,

View File

@ -213,13 +213,14 @@ encode_msg_sdl_v6_info(#sdl_v6_info{port = F1, v6 = F2}, Bin, TrUserData) ->
encode_msg_sdl_dev_addr(Msg, TrUserData) -> encode_msg_sdl_dev_addr(Msg, <<>>, TrUserData). encode_msg_sdl_dev_addr(Msg, TrUserData) -> encode_msg_sdl_dev_addr(Msg, <<>>, TrUserData).
encode_msg_sdl_dev_addr(#sdl_dev_addr{network_id = F1, mac = F2, net_addr = F3, net_bit_len = F4, network_domain = F5}, Bin, TrUserData) -> encode_msg_sdl_dev_addr(#sdl_dev_addr{network_id = F1, mac = F2, net_addr = F3, net_bit_len = F4}, Bin, TrUserData) ->
B1 = if F1 == undefined -> Bin; B1 = if F1 == undefined -> Bin;
true -> true ->
begin begin
TrF1 = id(F1, TrUserData), TrF1 = id(F1, TrUserData),
if TrF1 =:= 0 -> Bin; case is_empty_string(TrF1) of
true -> e_varint(TrF1, <<Bin/binary, 8>>, TrUserData) true -> Bin;
false -> e_type_string(TrF1, <<Bin/binary, 10>>, TrUserData)
end end
end end
end, end,
@ -242,7 +243,7 @@ encode_msg_sdl_dev_addr(#sdl_dev_addr{network_id = F1, mac = F2, net_addr = F3,
end end
end end
end, end,
B4 = if F4 == undefined -> B3; if F4 == undefined -> B3;
true -> true ->
begin begin
TrF4 = id(F4, TrUserData), TrF4 = id(F4, TrUserData),
@ -250,16 +251,6 @@ encode_msg_sdl_dev_addr(#sdl_dev_addr{network_id = F1, mac = F2, net_addr = F3,
true -> e_varint(TrF4, <<B3/binary, 32>>, TrUserData) true -> e_varint(TrF4, <<B3/binary, 32>>, TrUserData)
end end
end end
end,
if F5 == undefined -> B4;
true ->
begin
TrF5 = id(F5, TrUserData),
case is_empty_string(TrF5) of
true -> B4;
false -> e_type_string(TrF5, <<B4/binary, 42>>, TrUserData)
end
end
end. end.
encode_msg_sdl_empty(_Msg, _TrUserData) -> <<>>. encode_msg_sdl_empty(_Msg, _TrUserData) -> <<>>.
@ -267,7 +258,7 @@ encode_msg_sdl_empty(_Msg, _TrUserData) -> <<>>.
encode_msg_sdl_register_super(Msg, TrUserData) -> encode_msg_sdl_register_super(Msg, <<>>, TrUserData). encode_msg_sdl_register_super(Msg, TrUserData) -> encode_msg_sdl_register_super(Msg, <<>>, TrUserData).
encode_msg_sdl_register_super(#sdl_register_super{version = F1, installed_channel = F2, client_id = F3, dev_addr = F4, pub_key = F5, token = F6, network_code = F7, hostname = F8}, Bin, TrUserData) -> encode_msg_sdl_register_super(#sdl_register_super{version = F1, installed_channel = F2, client_id = F3, dev_addr = F4, pub_key = F5, token = F6, network_id = F7}, Bin, TrUserData) ->
B1 = if F1 == undefined -> Bin; B1 = if F1 == undefined -> Bin;
true -> true ->
begin begin
@ -326,7 +317,7 @@ encode_msg_sdl_register_super(#sdl_register_super{version = F1, installed_channe
end end
end end
end, end,
B7 = if F7 == undefined -> B6; if F7 == undefined -> B6;
true -> true ->
begin begin
TrF7 = id(F7, TrUserData), TrF7 = id(F7, TrUserData),
@ -335,16 +326,6 @@ encode_msg_sdl_register_super(#sdl_register_super{version = F1, installed_channe
false -> e_type_string(TrF7, <<B6/binary, 58>>, TrUserData) false -> e_type_string(TrF7, <<B6/binary, 58>>, TrUserData)
end end
end end
end,
if F8 == undefined -> B7;
true ->
begin
TrF8 = id(F8, TrUserData),
case is_empty_string(TrF8) of
true -> B7;
false -> e_type_string(TrF8, <<B7/binary, 66>>, TrUserData)
end
end
end. end.
encode_msg_sdl_register_super_ack(Msg, TrUserData) -> encode_msg_sdl_register_super_ack(Msg, <<>>, TrUserData). encode_msg_sdl_register_super_ack(Msg, TrUserData) -> encode_msg_sdl_register_super_ack(Msg, <<>>, TrUserData).
@ -636,8 +617,9 @@ encode_msg_sdl_stun_request(#sdl_stun_request{cookie = F1, client_id = F2, netwo
true -> true ->
begin begin
TrF3 = id(F3, TrUserData), TrF3 = id(F3, TrUserData),
if TrF3 =:= 0 -> B2; case is_empty_string(TrF3) of
true -> e_varint(TrF3, <<B2/binary, 24>>, TrUserData) true -> B2;
false -> e_type_string(TrF3, <<B2/binary, 26>>, TrUserData)
end end
end end
end, end,
@ -695,8 +677,9 @@ encode_msg_sdl_data(#sdl_data{network_id = F1, src_mac = F2, dst_mac = F3, is_p2
true -> true ->
begin begin
TrF1 = id(F1, TrUserData), TrF1 = id(F1, TrUserData),
if TrF1 =:= 0 -> Bin; case is_empty_string(TrF1) of
true -> e_varint(TrF1, <<Bin/binary, 8>>, TrUserData) true -> Bin;
false -> e_type_string(TrF1, <<Bin/binary, 10>>, TrUserData)
end end
end end
end, end,
@ -757,8 +740,9 @@ encode_msg_sdl_register(#sdl_register{network_id = F1, src_mac = F2, dst_mac = F
true -> true ->
begin begin
TrF1 = id(F1, TrUserData), TrF1 = id(F1, TrUserData),
if TrF1 =:= 0 -> Bin; case is_empty_string(TrF1) of
true -> e_varint(TrF1, <<Bin/binary, 8>>, TrUserData) true -> Bin;
false -> e_type_string(TrF1, <<Bin/binary, 10>>, TrUserData)
end end
end end
end, end,
@ -791,8 +775,9 @@ encode_msg_sdl_register_ack(#sdl_register_ack{network_id = F1, src_mac = F2, dst
true -> true ->
begin begin
TrF1 = id(F1, TrUserData), TrF1 = id(F1, TrUserData),
if TrF1 =:= 0 -> Bin; case is_empty_string(TrF1) of
true -> e_varint(TrF1, <<Bin/binary, 8>>, TrUserData) true -> Bin;
false -> e_type_string(TrF1, <<Bin/binary, 10>>, TrUserData)
end end
end end
end, end,
@ -1179,77 +1164,70 @@ skip_32_sdl_v6_info(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) ->
skip_64_sdl_v6_info(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_sdl_v6_info(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData). skip_64_sdl_v6_info(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_sdl_v6_info(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData).
decode_msg_sdl_dev_addr(Bin, TrUserData) -> dfp_read_field_def_sdl_dev_addr(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), TrUserData). decode_msg_sdl_dev_addr(Bin, TrUserData) -> dfp_read_field_def_sdl_dev_addr(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(0, TrUserData), TrUserData).
dfp_read_field_def_sdl_dev_addr(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_dev_addr_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dfp_read_field_def_sdl_dev_addr(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_dev_addr_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_sdl_dev_addr(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_dev_addr_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dfp_read_field_def_sdl_dev_addr(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_dev_addr_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_sdl_dev_addr(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_dev_addr_net_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dfp_read_field_def_sdl_dev_addr(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_dev_addr_net_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_sdl_dev_addr(<<32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_dev_addr_net_bit_len(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dfp_read_field_def_sdl_dev_addr(<<32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_dev_addr_net_bit_len(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dfp_read_field_def_sdl_dev_addr(<<42, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_dev_addr_network_domain(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dfp_read_field_def_sdl_dev_addr(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_dev_addr{network_id = F@_1, mac = F@_2, net_addr = F@_3, net_bit_len = F@_4};
dfp_read_field_def_sdl_dev_addr(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, _) -> #sdl_dev_addr{network_id = F@_1, mac = F@_2, net_addr = F@_3, net_bit_len = F@_4, network_domain = F@_5}; dfp_read_field_def_sdl_dev_addr(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dg_read_field_def_sdl_dev_addr(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).
dfp_read_field_def_sdl_dev_addr(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dg_read_field_def_sdl_dev_addr(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData).
dg_read_field_def_sdl_dev_addr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_dev_addr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dg_read_field_def_sdl_dev_addr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_dev_addr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
dg_read_field_def_sdl_dev_addr(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dg_read_field_def_sdl_dev_addr(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, TrUserData) ->
Key = X bsl N + Acc, Key = X bsl N + Acc,
case Key of case Key of
8 -> d_field_sdl_dev_addr_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); 10 -> d_field_sdl_dev_addr_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
18 -> d_field_sdl_dev_addr_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); 18 -> d_field_sdl_dev_addr_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
24 -> d_field_sdl_dev_addr_net_addr(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); 24 -> d_field_sdl_dev_addr_net_addr(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
32 -> d_field_sdl_dev_addr_net_bit_len(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); 32 -> d_field_sdl_dev_addr_net_bit_len(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData);
42 -> d_field_sdl_dev_addr_network_domain(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
_ -> _ ->
case Key band 7 of case Key band 7 of
0 -> skip_varint_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); 0 -> skip_varint_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
1 -> skip_64_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); 1 -> skip_64_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
2 -> skip_length_delimited_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); 2 -> skip_length_delimited_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
3 -> skip_group_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); 3 -> skip_group_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData);
5 -> skip_32_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) 5 -> skip_32_sdl_dev_addr(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData)
end end
end; end;
dg_read_field_def_sdl_dev_addr(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, _) -> #sdl_dev_addr{network_id = F@_1, mac = F@_2, net_addr = F@_3, net_bit_len = F@_4, network_domain = F@_5}. dg_read_field_def_sdl_dev_addr(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_dev_addr{network_id = F@_1, mac = F@_2, net_addr = F@_3, net_bit_len = F@_4}.
d_field_sdl_dev_addr_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_sdl_dev_addr_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); d_field_sdl_dev_addr_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_dev_addr_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
d_field_sdl_dev_addr_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_dev_addr_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
dfp_read_field_def_sdl_dev_addr(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, TrUserData).
d_field_sdl_dev_addr_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_sdl_dev_addr_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
d_field_sdl_dev_addr_mac(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, F@_5, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_dev_addr(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, F@_5, TrUserData). dfp_read_field_def_sdl_dev_addr(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, TrUserData).
d_field_sdl_dev_addr_net_addr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_sdl_dev_addr_net_addr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); d_field_sdl_dev_addr_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_dev_addr_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
d_field_sdl_dev_addr_net_addr(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, TrUserData) -> d_field_sdl_dev_addr_mac(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
dfp_read_field_def_sdl_dev_addr(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, TrUserData).
d_field_sdl_dev_addr_net_bit_len(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_sdl_dev_addr_net_bit_len(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
d_field_sdl_dev_addr_net_bit_len(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, F@_5, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
dfp_read_field_def_sdl_dev_addr(RestF, 0, 0, F, F@_1, F@_2, F@_3, NewFValue, F@_5, TrUserData).
d_field_sdl_dev_addr_network_domain(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_sdl_dev_addr_network_domain(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData);
d_field_sdl_dev_addr_network_domain(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, _, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_dev_addr(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, NewFValue, TrUserData). dfp_read_field_def_sdl_dev_addr(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, TrUserData).
skip_varint_sdl_dev_addr(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> skip_varint_sdl_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); d_field_sdl_dev_addr_net_addr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_dev_addr_net_addr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
skip_varint_sdl_dev_addr(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). d_field_sdl_dev_addr_net_addr(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
dfp_read_field_def_sdl_dev_addr(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, TrUserData).
skip_length_delimited_sdl_dev_addr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> skip_length_delimited_sdl_dev_addr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); d_field_sdl_dev_addr_net_bit_len(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_dev_addr_net_bit_len(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
skip_length_delimited_sdl_dev_addr(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_dev_addr_net_bit_len(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
dfp_read_field_def_sdl_dev_addr(RestF, 0, 0, F, F@_1, F@_2, F@_3, NewFValue, TrUserData).
skip_varint_sdl_dev_addr(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> skip_varint_sdl_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
skip_varint_sdl_dev_addr(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_sdl_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).
skip_length_delimited_sdl_dev_addr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> skip_length_delimited_sdl_dev_addr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData);
skip_length_delimited_sdl_dev_addr(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) ->
Length = X bsl N + Acc, Length = X bsl N + Acc,
<<_:Length/binary, Rest2/binary>> = Rest, <<_:Length/binary, Rest2/binary>> = Rest,
dfp_read_field_def_sdl_dev_addr(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). dfp_read_field_def_sdl_dev_addr(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, TrUserData).
skip_group_sdl_dev_addr(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> skip_group_sdl_dev_addr(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData) ->
{_, Rest} = read_group(Bin, FNum), {_, Rest} = read_group(Bin, FNum),
dfp_read_field_def_sdl_dev_addr(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). dfp_read_field_def_sdl_dev_addr(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData).
skip_32_sdl_dev_addr(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). skip_32_sdl_dev_addr(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_sdl_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).
skip_64_sdl_dev_addr(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). skip_64_sdl_dev_addr(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_sdl_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData).
decode_msg_sdl_empty(Bin, TrUserData) -> dfp_read_field_def_sdl_empty(Bin, 0, 0, 0, TrUserData). decode_msg_sdl_empty(Bin, TrUserData) -> dfp_read_field_def_sdl_empty(Bin, 0, 0, 0, TrUserData).
@ -1286,67 +1264,62 @@ skip_32_sdl_empty(<<_:32, Rest/binary>>, Z1, Z2, F, TrUserData) -> dfp_read_fiel
skip_64_sdl_empty(<<_:64, Rest/binary>>, Z1, Z2, F, TrUserData) -> dfp_read_field_def_sdl_empty(Rest, Z1, Z2, F, TrUserData). skip_64_sdl_empty(<<_:64, Rest/binary>>, Z1, Z2, F, TrUserData) -> dfp_read_field_def_sdl_empty(Rest, Z1, Z2, F, TrUserData).
decode_msg_sdl_register_super(Bin, TrUserData) -> decode_msg_sdl_register_super(Bin, TrUserData) ->
dfp_read_field_def_sdl_register_super(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(undefined, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData). dfp_read_field_def_sdl_register_super(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(undefined, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData).
dfp_read_field_def_sdl_register_super(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_version(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); dfp_read_field_def_sdl_register_super(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_register_super_version(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_register_super(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> dfp_read_field_def_sdl_register_super(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_register_super_installed_channel(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_register_super_installed_channel(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); dfp_read_field_def_sdl_register_super(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_register_super_client_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_register_super(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_client_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); dfp_read_field_def_sdl_register_super(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_register_super_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_register_super(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_dev_addr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); dfp_read_field_def_sdl_register_super(<<42, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_register_super_pub_key(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_register_super(<<42, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_pub_key(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); dfp_read_field_def_sdl_register_super(<<50, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_register_super_token(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_register_super(<<50, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_token(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); dfp_read_field_def_sdl_register_super(<<58, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_register_super_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_register_super(<<58, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_network_code(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); dfp_read_field_def_sdl_register_super(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, _) -> #sdl_register_super{version = F@_1, installed_channel = F@_2, client_id = F@_3, dev_addr = F@_4, pub_key = F@_5, token = F@_6, network_id = F@_7};
dfp_read_field_def_sdl_register_super(<<66, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_hostname(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); dfp_read_field_def_sdl_register_super(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> dg_read_field_def_sdl_register_super(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData).
dfp_read_field_def_sdl_register_super(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, _) ->
#sdl_register_super{version = F@_1, installed_channel = F@_2, client_id = F@_3, dev_addr = F@_4, pub_key = F@_5, token = F@_6, network_code = F@_7, hostname = F@_8};
dfp_read_field_def_sdl_register_super(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> dg_read_field_def_sdl_register_super(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData).
dg_read_field_def_sdl_register_super(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_register_super(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 32 - 7 ->
dg_read_field_def_sdl_register_super(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); dg_read_field_def_sdl_register_super(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dg_read_field_def_sdl_register_super(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> dg_read_field_def_sdl_register_super(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) ->
Key = X bsl N + Acc, Key = X bsl N + Acc,
case Key of case Key of
8 -> d_field_sdl_register_super_version(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 8 -> d_field_sdl_register_super_version(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
18 -> d_field_sdl_register_super_installed_channel(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 18 -> d_field_sdl_register_super_installed_channel(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
26 -> d_field_sdl_register_super_client_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 26 -> d_field_sdl_register_super_client_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
34 -> d_field_sdl_register_super_dev_addr(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 34 -> d_field_sdl_register_super_dev_addr(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
42 -> d_field_sdl_register_super_pub_key(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 42 -> d_field_sdl_register_super_pub_key(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
50 -> d_field_sdl_register_super_token(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 50 -> d_field_sdl_register_super_token(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
58 -> d_field_sdl_register_super_network_code(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 58 -> d_field_sdl_register_super_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
66 -> d_field_sdl_register_super_hostname(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData);
_ -> _ ->
case Key band 7 of case Key band 7 of
0 -> skip_varint_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 0 -> skip_varint_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
1 -> skip_64_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 1 -> skip_64_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
2 -> skip_length_delimited_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 2 -> skip_length_delimited_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
3 -> skip_group_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); 3 -> skip_group_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
5 -> skip_32_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) 5 -> skip_32_sdl_register_super(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData)
end end
end; end;
dg_read_field_def_sdl_register_super(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, _) -> dg_read_field_def_sdl_register_super(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, _) -> #sdl_register_super{version = F@_1, installed_channel = F@_2, client_id = F@_3, dev_addr = F@_4, pub_key = F@_5, token = F@_6, network_id = F@_7}.
#sdl_register_super{version = F@_1, installed_channel = F@_2, client_id = F@_3, dev_addr = F@_4, pub_key = F@_5, token = F@_6, network_code = F@_7, hostname = F@_8}.
d_field_sdl_register_super_version(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 57 -> d_field_sdl_register_super_version(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 ->
d_field_sdl_register_super_version(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); d_field_sdl_register_super_version(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_register_super_version(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_version(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest},
dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData). dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData).
d_field_sdl_register_super_installed_channel(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 57 -> d_field_sdl_register_super_installed_channel(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 ->
d_field_sdl_register_super_installed_channel(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); d_field_sdl_register_super_installed_channel(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_register_super_installed_channel(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_installed_channel(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData). dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData).
d_field_sdl_register_super_client_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 57 -> d_field_sdl_register_super_client_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 ->
d_field_sdl_register_super_client_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); d_field_sdl_register_super_client_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_register_super_client_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_client_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, F@_6, F@_7, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData). dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, F@_6, F@_7, TrUserData).
d_field_sdl_register_super_dev_addr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 57 -> d_field_sdl_register_super_dev_addr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 ->
d_field_sdl_register_super_dev_addr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); d_field_sdl_register_super_dev_addr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_register_super_dev_addr(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, Prev, F@_5, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_dev_addr(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, Prev, F@_5, F@_6, F@_7, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_sdl_dev_addr(Bs, TrUserData), TrUserData), Rest2} end, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bs:Len/binary, Rest2/binary>> = Rest, {id(decode_msg_sdl_dev_addr(Bs, TrUserData), TrUserData), Rest2} end,
dfp_read_field_def_sdl_register_super(RestF, dfp_read_field_def_sdl_register_super(RestF,
0, 0,
@ -1361,50 +1334,43 @@ d_field_sdl_register_super_dev_addr(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1,
F@_5, F@_5,
F@_6, F@_6,
F@_7, F@_7,
F@_8,
TrUserData). TrUserData).
d_field_sdl_register_super_pub_key(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 57 -> d_field_sdl_register_super_pub_key(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 ->
d_field_sdl_register_super_pub_key(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); d_field_sdl_register_super_pub_key(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_register_super_pub_key(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, _, F@_6, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_pub_key(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, _, F@_6, F@_7, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, NewFValue, F@_6, F@_7, F@_8, TrUserData). dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, NewFValue, F@_6, F@_7, TrUserData).
d_field_sdl_register_super_token(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 57 -> d_field_sdl_register_super_token(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 ->
d_field_sdl_register_super_token(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); d_field_sdl_register_super_token(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_register_super_token(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, _, F@_7, F@_8, TrUserData) -> d_field_sdl_register_super_token(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, _, F@_7, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, NewFValue, F@_7, F@_8, TrUserData). dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, NewFValue, F@_7, TrUserData).
d_field_sdl_register_super_network_code(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 57 -> d_field_sdl_register_super_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 ->
d_field_sdl_register_super_network_code(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); d_field_sdl_register_super_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_register_super_network_code(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, _, F@_8, TrUserData) -> d_field_sdl_register_super_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, _, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, NewFValue, F@_8, TrUserData). dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, NewFValue, TrUserData).
d_field_sdl_register_super_hostname(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 57 -> skip_varint_sdl_register_super(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> skip_varint_sdl_register_super(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_register_super_hostname(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); skip_varint_sdl_register_super(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> dfp_read_field_def_sdl_register_super(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData).
d_field_sdl_register_super_hostname(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, _, TrUserData) ->
{NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_register_super(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, NewFValue, TrUserData).
skip_varint_sdl_register_super(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> skip_varint_sdl_register_super(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData); skip_length_delimited_sdl_register_super(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 ->
skip_varint_sdl_register_super(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> dfp_read_field_def_sdl_register_super(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData). skip_length_delimited_sdl_register_super(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
skip_length_delimited_sdl_register_super(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) ->
skip_length_delimited_sdl_register_super(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) when N < 57 ->
skip_length_delimited_sdl_register_super(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData);
skip_length_delimited_sdl_register_super(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) ->
Length = X bsl N + Acc, Length = X bsl N + Acc,
<<_:Length/binary, Rest2/binary>> = Rest, <<_:Length/binary, Rest2/binary>> = Rest,
dfp_read_field_def_sdl_register_super(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData). dfp_read_field_def_sdl_register_super(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData).
skip_group_sdl_register_super(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> skip_group_sdl_register_super(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) ->
{_, Rest} = read_group(Bin, FNum), {_, Rest} = read_group(Bin, FNum),
dfp_read_field_def_sdl_register_super(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData). dfp_read_field_def_sdl_register_super(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData).
skip_32_sdl_register_super(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> dfp_read_field_def_sdl_register_super(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData). skip_32_sdl_register_super(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> dfp_read_field_def_sdl_register_super(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData).
skip_64_sdl_register_super(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData) -> dfp_read_field_def_sdl_register_super(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, TrUserData). skip_64_sdl_register_super(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> dfp_read_field_def_sdl_register_super(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData).
decode_msg_sdl_register_super_ack(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Bin, 0, 0, 0, id(undefined, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(undefined, TrUserData), id(undefined, TrUserData), TrUserData). decode_msg_sdl_register_super_ack(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Bin, 0, 0, 0, id(undefined, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(undefined, TrUserData), id(undefined, TrUserData), TrUserData).
@ -2014,11 +1980,11 @@ skip_32_sdl_flows(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData
skip_64_sdl_flows(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_flows(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). skip_64_sdl_flows(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_flows(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).
decode_msg_sdl_stun_request(Bin, TrUserData) -> decode_msg_sdl_stun_request(Bin, TrUserData) ->
dfp_read_field_def_sdl_stun_request(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(0, TrUserData), id(undefined, TrUserData), TrUserData). dfp_read_field_def_sdl_stun_request(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(0, TrUserData), id(undefined, TrUserData), TrUserData).
dfp_read_field_def_sdl_stun_request(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_cookie(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); dfp_read_field_def_sdl_stun_request(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_cookie(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_stun_request(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_client_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); dfp_read_field_def_sdl_stun_request(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_client_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_stun_request(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); dfp_read_field_def_sdl_stun_request(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_stun_request(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); dfp_read_field_def_sdl_stun_request(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_stun_request(<<40, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_ip(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); dfp_read_field_def_sdl_stun_request(<<40, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_ip(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
dfp_read_field_def_sdl_stun_request(<<48, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_nat_type(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); dfp_read_field_def_sdl_stun_request(<<48, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_nat_type(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
@ -2033,7 +1999,7 @@ dg_read_field_def_sdl_stun_request(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F
case Key of case Key of
8 -> d_field_sdl_stun_request_cookie(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); 8 -> d_field_sdl_stun_request_cookie(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
18 -> d_field_sdl_stun_request_client_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); 18 -> d_field_sdl_stun_request_client_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
24 -> d_field_sdl_stun_request_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); 26 -> d_field_sdl_stun_request_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
34 -> d_field_sdl_stun_request_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); 34 -> d_field_sdl_stun_request_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
40 -> d_field_sdl_stun_request_ip(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); 40 -> d_field_sdl_stun_request_ip(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
48 -> d_field_sdl_stun_request_nat_type(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); 48 -> d_field_sdl_stun_request_nat_type(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
@ -2064,7 +2030,7 @@ d_field_sdl_stun_request_client_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _
d_field_sdl_stun_request_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 -> d_field_sdl_stun_request_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 ->
d_field_sdl_stun_request_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); d_field_sdl_stun_request_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
d_field_sdl_stun_request_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, F@_6, F@_7, TrUserData) -> d_field_sdl_stun_request_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, F@_6, F@_7, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_stun_request(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, F@_6, F@_7, TrUserData). dfp_read_field_def_sdl_stun_request(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, F@_6, F@_7, TrUserData).
d_field_sdl_stun_request_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 -> d_field_sdl_stun_request_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); d_field_sdl_stun_request_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData) when N < 57 -> d_field_sdl_stun_request_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData);
@ -2164,9 +2130,9 @@ skip_32_sdl_stun_reply(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> df
skip_64_sdl_stun_reply(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_sdl_stun_reply(Rest, Z1, Z2, F, F@_1, TrUserData). skip_64_sdl_stun_reply(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_sdl_stun_reply(Rest, Z1, Z2, F, F@_1, TrUserData).
decode_msg_sdl_data(Bin, TrUserData) -> dfp_read_field_def_sdl_data(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(false, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), TrUserData). decode_msg_sdl_data(Bin, TrUserData) -> dfp_read_field_def_sdl_data(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(false, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), TrUserData).
dfp_read_field_def_sdl_data(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_sdl_data_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); dfp_read_field_def_sdl_data(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_sdl_data_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dfp_read_field_def_sdl_data(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_sdl_data_src_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); dfp_read_field_def_sdl_data(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_sdl_data_src_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dfp_read_field_def_sdl_data(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_sdl_data_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); dfp_read_field_def_sdl_data(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_sdl_data_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
dfp_read_field_def_sdl_data(<<32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_sdl_data_is_p2p(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); dfp_read_field_def_sdl_data(<<32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_sdl_data_is_p2p(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
@ -2179,7 +2145,7 @@ dg_read_field_def_sdl_data(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_
dg_read_field_def_sdl_data(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> dg_read_field_def_sdl_data(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) ->
Key = X bsl N + Acc, Key = X bsl N + Acc,
case Key of case Key of
8 -> d_field_sdl_data_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); 10 -> d_field_sdl_data_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
18 -> d_field_sdl_data_src_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); 18 -> d_field_sdl_data_src_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
26 -> d_field_sdl_data_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); 26 -> d_field_sdl_data_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
32 -> d_field_sdl_data_is_p2p(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); 32 -> d_field_sdl_data_is_p2p(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
@ -2198,7 +2164,7 @@ dg_read_field_def_sdl_data(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, _)
d_field_sdl_data_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 -> d_field_sdl_data_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); d_field_sdl_data_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 -> d_field_sdl_data_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
d_field_sdl_data_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> d_field_sdl_data_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_data(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData). dfp_read_field_def_sdl_data(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData).
d_field_sdl_data_src_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 -> d_field_sdl_data_src_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData); d_field_sdl_data_src_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) when N < 57 -> d_field_sdl_data_src_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData);
@ -2243,9 +2209,9 @@ skip_32_sdl_data(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5,
skip_64_sdl_data(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> dfp_read_field_def_sdl_data(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData). skip_64_sdl_data(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData) -> dfp_read_field_def_sdl_data(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, TrUserData).
decode_msg_sdl_register(Bin, TrUserData) -> dfp_read_field_def_sdl_register(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData). decode_msg_sdl_register(Bin, TrUserData) -> dfp_read_field_def_sdl_register(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData).
dfp_read_field_def_sdl_register(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); dfp_read_field_def_sdl_register(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_sdl_register(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_src_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); dfp_read_field_def_sdl_register(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_src_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_sdl_register(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); dfp_read_field_def_sdl_register(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_sdl_register(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register{network_id = F@_1, src_mac = F@_2, dst_mac = F@_3}; dfp_read_field_def_sdl_register(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register{network_id = F@_1, src_mac = F@_2, dst_mac = F@_3};
@ -2255,7 +2221,7 @@ dg_read_field_def_sdl_register(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2,
dg_read_field_def_sdl_register(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_sdl_register(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) ->
Key = X bsl N + Acc, Key = X bsl N + Acc,
case Key of case Key of
8 -> d_field_sdl_register_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); 10 -> d_field_sdl_register_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
18 -> d_field_sdl_register_src_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); 18 -> d_field_sdl_register_src_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
26 -> d_field_sdl_register_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); 26 -> d_field_sdl_register_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
_ -> _ ->
@ -2271,7 +2237,7 @@ dg_read_field_def_sdl_register(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_regis
d_field_sdl_register_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); d_field_sdl_register_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
d_field_sdl_register_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, TrUserData) -> d_field_sdl_register_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_register(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData). dfp_read_field_def_sdl_register(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData).
d_field_sdl_register_src_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_src_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); d_field_sdl_register_src_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_src_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
@ -2301,9 +2267,9 @@ skip_32_sdl_register(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserD
skip_64_sdl_register(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). skip_64_sdl_register(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData).
decode_msg_sdl_register_ack(Bin, TrUserData) -> dfp_read_field_def_sdl_register_ack(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData). decode_msg_sdl_register_ack(Bin, TrUserData) -> dfp_read_field_def_sdl_register_ack(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData).
dfp_read_field_def_sdl_register_ack(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_ack_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); dfp_read_field_def_sdl_register_ack(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_ack_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_sdl_register_ack(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_ack_src_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); dfp_read_field_def_sdl_register_ack(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_ack_src_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_sdl_register_ack(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_ack_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); dfp_read_field_def_sdl_register_ack(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_ack_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData);
dfp_read_field_def_sdl_register_ack(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register_ack{network_id = F@_1, src_mac = F@_2, dst_mac = F@_3}; dfp_read_field_def_sdl_register_ack(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register_ack{network_id = F@_1, src_mac = F@_2, dst_mac = F@_3};
@ -2313,7 +2279,7 @@ dg_read_field_def_sdl_register_ack(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F
dg_read_field_def_sdl_register_ack(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_sdl_register_ack(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) ->
Key = X bsl N + Acc, Key = X bsl N + Acc,
case Key of case Key of
8 -> d_field_sdl_register_ack_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); 10 -> d_field_sdl_register_ack_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
18 -> d_field_sdl_register_ack_src_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); 18 -> d_field_sdl_register_ack_src_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
26 -> d_field_sdl_register_ack_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); 26 -> d_field_sdl_register_ack_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData);
_ -> _ ->
@ -2329,7 +2295,7 @@ dg_read_field_def_sdl_register_ack(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_r
d_field_sdl_register_ack_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_ack_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); d_field_sdl_register_ack_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_ack_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
d_field_sdl_register_ack_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, TrUserData) -> d_field_sdl_register_ack_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, TrUserData) ->
{NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, {NewFValue, RestF} = begin Len = X bsl N + Acc, <<Bytes:Len/binary, Rest2/binary>> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end,
dfp_read_field_def_sdl_register_ack(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData). dfp_read_field_def_sdl_register_ack(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData).
d_field_sdl_register_ack_src_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_ack_src_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); d_field_sdl_register_ack_src_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_ack_src_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData);
@ -2585,8 +2551,7 @@ merge_msg_sdl_v6_info(#sdl_v6_info{port = PFport, v6 = PFv6}, #sdl_v6_info{port
end}. end}.
-compile({nowarn_unused_function,merge_msg_sdl_dev_addr/3}). -compile({nowarn_unused_function,merge_msg_sdl_dev_addr/3}).
merge_msg_sdl_dev_addr(#sdl_dev_addr{network_id = PFnetwork_id, mac = PFmac, net_addr = PFnet_addr, net_bit_len = PFnet_bit_len, network_domain = PFnetwork_domain}, merge_msg_sdl_dev_addr(#sdl_dev_addr{network_id = PFnetwork_id, mac = PFmac, net_addr = PFnet_addr, net_bit_len = PFnet_bit_len}, #sdl_dev_addr{network_id = NFnetwork_id, mac = NFmac, net_addr = NFnet_addr, net_bit_len = NFnet_bit_len}, _) ->
#sdl_dev_addr{network_id = NFnetwork_id, mac = NFmac, net_addr = NFnet_addr, net_bit_len = NFnet_bit_len, network_domain = NFnetwork_domain}, _) ->
#sdl_dev_addr{network_id = #sdl_dev_addr{network_id =
if NFnetwork_id =:= undefined -> PFnetwork_id; if NFnetwork_id =:= undefined -> PFnetwork_id;
true -> NFnetwork_id true -> NFnetwork_id
@ -2602,19 +2567,14 @@ merge_msg_sdl_dev_addr(#sdl_dev_addr{network_id = PFnetwork_id, mac = PFmac, net
net_bit_len = net_bit_len =
if NFnet_bit_len =:= undefined -> PFnet_bit_len; if NFnet_bit_len =:= undefined -> PFnet_bit_len;
true -> NFnet_bit_len true -> NFnet_bit_len
end,
network_domain =
if NFnetwork_domain =:= undefined -> PFnetwork_domain;
true -> NFnetwork_domain
end}. end}.
-compile({nowarn_unused_function,merge_msg_sdl_empty/3}). -compile({nowarn_unused_function,merge_msg_sdl_empty/3}).
merge_msg_sdl_empty(_Prev, New, _TrUserData) -> New. merge_msg_sdl_empty(_Prev, New, _TrUserData) -> New.
-compile({nowarn_unused_function,merge_msg_sdl_register_super/3}). -compile({nowarn_unused_function,merge_msg_sdl_register_super/3}).
merge_msg_sdl_register_super(#sdl_register_super{version = PFversion, installed_channel = PFinstalled_channel, client_id = PFclient_id, dev_addr = PFdev_addr, pub_key = PFpub_key, token = PFtoken, network_code = PFnetwork_code, merge_msg_sdl_register_super(#sdl_register_super{version = PFversion, installed_channel = PFinstalled_channel, client_id = PFclient_id, dev_addr = PFdev_addr, pub_key = PFpub_key, token = PFtoken, network_id = PFnetwork_id},
hostname = PFhostname}, #sdl_register_super{version = NFversion, installed_channel = NFinstalled_channel, client_id = NFclient_id, dev_addr = NFdev_addr, pub_key = NFpub_key, token = NFtoken, network_id = NFnetwork_id}, TrUserData) ->
#sdl_register_super{version = NFversion, installed_channel = NFinstalled_channel, client_id = NFclient_id, dev_addr = NFdev_addr, pub_key = NFpub_key, token = NFtoken, network_code = NFnetwork_code, hostname = NFhostname}, TrUserData) ->
#sdl_register_super{version = #sdl_register_super{version =
if NFversion =:= undefined -> PFversion; if NFversion =:= undefined -> PFversion;
true -> NFversion true -> NFversion
@ -2640,13 +2600,9 @@ merge_msg_sdl_register_super(#sdl_register_super{version = PFversion, installed_
if NFtoken =:= undefined -> PFtoken; if NFtoken =:= undefined -> PFtoken;
true -> NFtoken true -> NFtoken
end, end,
network_code = network_id =
if NFnetwork_code =:= undefined -> PFnetwork_code; if NFnetwork_id =:= undefined -> PFnetwork_id;
true -> NFnetwork_code true -> NFnetwork_id
end,
hostname =
if NFhostname =:= undefined -> PFhostname;
true -> NFhostname
end}. end}.
-compile({nowarn_unused_function,merge_msg_sdl_register_super_ack/3}). -compile({nowarn_unused_function,merge_msg_sdl_register_super_ack/3}).
@ -2992,9 +2948,9 @@ v_submsg_sdl_dev_addr(Msg, Path, TrUserData) -> v_msg_sdl_dev_addr(Msg, Path, Tr
-compile({nowarn_unused_function,v_msg_sdl_dev_addr/3}). -compile({nowarn_unused_function,v_msg_sdl_dev_addr/3}).
-dialyzer({nowarn_function,v_msg_sdl_dev_addr/3}). -dialyzer({nowarn_function,v_msg_sdl_dev_addr/3}).
v_msg_sdl_dev_addr(#sdl_dev_addr{network_id = F1, mac = F2, net_addr = F3, net_bit_len = F4, network_domain = F5}, Path, TrUserData) -> v_msg_sdl_dev_addr(#sdl_dev_addr{network_id = F1, mac = F2, net_addr = F3, net_bit_len = F4}, Path, TrUserData) ->
if F1 == undefined -> ok; if F1 == undefined -> ok;
true -> v_type_uint32(F1, [network_id | Path], TrUserData) true -> v_type_string(F1, [network_id | Path], TrUserData)
end, end,
if F2 == undefined -> ok; if F2 == undefined -> ok;
true -> v_type_bytes(F2, [mac | Path], TrUserData) true -> v_type_bytes(F2, [mac | Path], TrUserData)
@ -3005,9 +2961,6 @@ v_msg_sdl_dev_addr(#sdl_dev_addr{network_id = F1, mac = F2, net_addr = F3, net_b
if F4 == undefined -> ok; if F4 == undefined -> ok;
true -> v_type_uint32(F4, [net_bit_len | Path], TrUserData) true -> v_type_uint32(F4, [net_bit_len | Path], TrUserData)
end, end,
if F5 == undefined -> ok;
true -> v_type_string(F5, [network_domain | Path], TrUserData)
end,
ok; ok;
v_msg_sdl_dev_addr(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_dev_addr}, X, Path). v_msg_sdl_dev_addr(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_dev_addr}, X, Path).
@ -3018,7 +2971,7 @@ v_msg_sdl_empty(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_empty}
-compile({nowarn_unused_function,v_msg_sdl_register_super/3}). -compile({nowarn_unused_function,v_msg_sdl_register_super/3}).
-dialyzer({nowarn_function,v_msg_sdl_register_super/3}). -dialyzer({nowarn_function,v_msg_sdl_register_super/3}).
v_msg_sdl_register_super(#sdl_register_super{version = F1, installed_channel = F2, client_id = F3, dev_addr = F4, pub_key = F5, token = F6, network_code = F7, hostname = F8}, Path, TrUserData) -> v_msg_sdl_register_super(#sdl_register_super{version = F1, installed_channel = F2, client_id = F3, dev_addr = F4, pub_key = F5, token = F6, network_id = F7}, Path, TrUserData) ->
if F1 == undefined -> ok; if F1 == undefined -> ok;
true -> v_type_uint32(F1, [version | Path], TrUserData) true -> v_type_uint32(F1, [version | Path], TrUserData)
end, end,
@ -3038,10 +2991,7 @@ v_msg_sdl_register_super(#sdl_register_super{version = F1, installed_channel = F
true -> v_type_string(F6, [token | Path], TrUserData) true -> v_type_string(F6, [token | Path], TrUserData)
end, end,
if F7 == undefined -> ok; if F7 == undefined -> ok;
true -> v_type_string(F7, [network_code | Path], TrUserData) true -> v_type_string(F7, [network_id | Path], TrUserData)
end,
if F8 == undefined -> ok;
true -> v_type_string(F8, [hostname | Path], TrUserData)
end, end,
ok; ok;
v_msg_sdl_register_super(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_register_super}, X, Path). v_msg_sdl_register_super(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_register_super}, X, Path).
@ -3194,7 +3144,7 @@ v_msg_sdl_stun_request(#sdl_stun_request{cookie = F1, client_id = F2, network_id
true -> v_type_string(F2, [client_id | Path], TrUserData) true -> v_type_string(F2, [client_id | Path], TrUserData)
end, end,
if F3 == undefined -> ok; if F3 == undefined -> ok;
true -> v_type_uint32(F3, [network_id | Path], TrUserData) true -> v_type_string(F3, [network_id | Path], TrUserData)
end, end,
if F4 == undefined -> ok; if F4 == undefined -> ok;
true -> v_type_bytes(F4, [mac | Path], TrUserData) true -> v_type_bytes(F4, [mac | Path], TrUserData)
@ -3224,7 +3174,7 @@ v_msg_sdl_stun_reply(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_s
-dialyzer({nowarn_function,v_msg_sdl_data/3}). -dialyzer({nowarn_function,v_msg_sdl_data/3}).
v_msg_sdl_data(#sdl_data{network_id = F1, src_mac = F2, dst_mac = F3, is_p2p = F4, ttl = F5, data = F6}, Path, TrUserData) -> v_msg_sdl_data(#sdl_data{network_id = F1, src_mac = F2, dst_mac = F3, is_p2p = F4, ttl = F5, data = F6}, Path, TrUserData) ->
if F1 == undefined -> ok; if F1 == undefined -> ok;
true -> v_type_uint32(F1, [network_id | Path], TrUserData) true -> v_type_string(F1, [network_id | Path], TrUserData)
end, end,
if F2 == undefined -> ok; if F2 == undefined -> ok;
true -> v_type_bytes(F2, [src_mac | Path], TrUserData) true -> v_type_bytes(F2, [src_mac | Path], TrUserData)
@ -3248,7 +3198,7 @@ v_msg_sdl_data(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_data},
-dialyzer({nowarn_function,v_msg_sdl_register/3}). -dialyzer({nowarn_function,v_msg_sdl_register/3}).
v_msg_sdl_register(#sdl_register{network_id = F1, src_mac = F2, dst_mac = F3}, Path, TrUserData) -> v_msg_sdl_register(#sdl_register{network_id = F1, src_mac = F2, dst_mac = F3}, Path, TrUserData) ->
if F1 == undefined -> ok; if F1 == undefined -> ok;
true -> v_type_uint32(F1, [network_id | Path], TrUserData) true -> v_type_string(F1, [network_id | Path], TrUserData)
end, end,
if F2 == undefined -> ok; if F2 == undefined -> ok;
true -> v_type_bytes(F2, [src_mac | Path], TrUserData) true -> v_type_bytes(F2, [src_mac | Path], TrUserData)
@ -3263,7 +3213,7 @@ v_msg_sdl_register(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_reg
-dialyzer({nowarn_function,v_msg_sdl_register_ack/3}). -dialyzer({nowarn_function,v_msg_sdl_register_ack/3}).
v_msg_sdl_register_ack(#sdl_register_ack{network_id = F1, src_mac = F2, dst_mac = F3}, Path, TrUserData) -> v_msg_sdl_register_ack(#sdl_register_ack{network_id = F1, src_mac = F2, dst_mac = F3}, Path, TrUserData) ->
if F1 == undefined -> ok; if F1 == undefined -> ok;
true -> v_type_uint32(F1, [network_id | Path], TrUserData) true -> v_type_string(F1, [network_id | Path], TrUserData)
end, end,
if F2 == undefined -> ok; if F2 == undefined -> ok;
true -> v_type_bytes(F2, [src_mac | Path], TrUserData) true -> v_type_bytes(F2, [src_mac | Path], TrUserData)
@ -3376,11 +3326,10 @@ get_msg_defs() ->
#field{name = nat_type, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}]}, #field{name = nat_type, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}]},
{{msg, sdl_v6_info}, [#field{name = port, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = v6, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}]}, {{msg, sdl_v6_info}, [#field{name = port, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = v6, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}]},
{{msg, sdl_dev_addr}, {{msg, sdl_dev_addr},
[#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = network_id, fnum = 1, rnum = 2, type = string, occurrence = defaulty, opts = []},
#field{name = mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
#field{name = net_addr, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}, #field{name = net_addr, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []},
#field{name = net_bit_len, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}, #field{name = net_bit_len, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}]},
#field{name = network_domain, fnum = 5, rnum = 6, type = string, occurrence = defaulty, opts = []}]},
{{msg, sdl_empty}, []}, {{msg, sdl_empty}, []},
{{msg, sdl_register_super}, {{msg, sdl_register_super},
[#field{name = version, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = version, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []},
@ -3389,8 +3338,7 @@ get_msg_defs() ->
#field{name = dev_addr, fnum = 4, rnum = 5, type = {msg, sdl_dev_addr}, occurrence = defaulty, opts = []}, #field{name = dev_addr, fnum = 4, rnum = 5, type = {msg, sdl_dev_addr}, occurrence = defaulty, opts = []},
#field{name = pub_key, fnum = 5, rnum = 6, type = string, occurrence = defaulty, opts = []}, #field{name = pub_key, fnum = 5, rnum = 6, type = string, occurrence = defaulty, opts = []},
#field{name = token, fnum = 6, rnum = 7, type = string, occurrence = defaulty, opts = []}, #field{name = token, fnum = 6, rnum = 7, type = string, occurrence = defaulty, opts = []},
#field{name = network_code, fnum = 7, rnum = 8, type = string, occurrence = defaulty, opts = []}, #field{name = network_id, fnum = 7, rnum = 8, type = string, occurrence = defaulty, opts = []}]},
#field{name = hostname, fnum = 8, rnum = 9, type = string, occurrence = defaulty, opts = []}]},
{{msg, sdl_register_super_ack}, {{msg, sdl_register_super_ack},
[#field{name = dev_addr, fnum = 1, rnum = 2, type = {msg, sdl_dev_addr}, occurrence = defaulty, opts = []}, [#field{name = dev_addr, fnum = 1, rnum = 2, type = {msg, sdl_dev_addr}, occurrence = defaulty, opts = []},
#field{name = aes_key, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = aes_key, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
@ -3420,25 +3368,25 @@ get_msg_defs() ->
{{msg, sdl_stun_request}, {{msg, sdl_stun_request},
[#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []},
#field{name = client_id, fnum = 2, rnum = 3, type = string, occurrence = defaulty, opts = []}, #field{name = client_id, fnum = 2, rnum = 3, type = string, occurrence = defaulty, opts = []},
#field{name = network_id, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}, #field{name = network_id, fnum = 3, rnum = 4, type = string, occurrence = defaulty, opts = []},
#field{name = mac, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []}, #field{name = mac, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []},
#field{name = ip, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []}, #field{name = ip, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []},
#field{name = nat_type, fnum = 6, rnum = 7, type = uint32, occurrence = defaulty, opts = []}, #field{name = nat_type, fnum = 6, rnum = 7, type = uint32, occurrence = defaulty, opts = []},
#field{name = v6_info, fnum = 7, rnum = 8, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}]}, #field{name = v6_info, fnum = 7, rnum = 8, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}]},
{{msg, sdl_stun_reply}, [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}]}, {{msg, sdl_stun_reply}, [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}]},
{{msg, sdl_data}, {{msg, sdl_data},
[#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = network_id, fnum = 1, rnum = 2, type = string, occurrence = defaulty, opts = []},
#field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
#field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}, #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []},
#field{name = is_p2p, fnum = 4, rnum = 5, type = bool, occurrence = defaulty, opts = []}, #field{name = is_p2p, fnum = 4, rnum = 5, type = bool, occurrence = defaulty, opts = []},
#field{name = ttl, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []}, #field{name = ttl, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []},
#field{name = data, fnum = 6, rnum = 7, type = bytes, occurrence = defaulty, opts = []}]}, #field{name = data, fnum = 6, rnum = 7, type = bytes, occurrence = defaulty, opts = []}]},
{{msg, sdl_register}, {{msg, sdl_register},
[#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = network_id, fnum = 1, rnum = 2, type = string, occurrence = defaulty, opts = []},
#field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
#field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]}, #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]},
{{msg, sdl_register_ack}, {{msg, sdl_register_ack},
[#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = network_id, fnum = 1, rnum = 2, type = string, occurrence = defaulty, opts = []},
#field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
#field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]}, #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]},
{{msg, sdl_stun_probe}, [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = attr, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}]}, {{msg, sdl_stun_probe}, [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = attr, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}]},
@ -3521,11 +3469,10 @@ find_msg_def(sdl_v4_info) ->
#field{name = nat_type, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}]; #field{name = nat_type, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}];
find_msg_def(sdl_v6_info) -> [#field{name = port, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = v6, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}]; find_msg_def(sdl_v6_info) -> [#field{name = port, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = v6, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}];
find_msg_def(sdl_dev_addr) -> find_msg_def(sdl_dev_addr) ->
[#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = network_id, fnum = 1, rnum = 2, type = string, occurrence = defaulty, opts = []},
#field{name = mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
#field{name = net_addr, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}, #field{name = net_addr, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []},
#field{name = net_bit_len, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}, #field{name = net_bit_len, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}];
#field{name = network_domain, fnum = 5, rnum = 6, type = string, occurrence = defaulty, opts = []}];
find_msg_def(sdl_empty) -> []; find_msg_def(sdl_empty) -> [];
find_msg_def(sdl_register_super) -> find_msg_def(sdl_register_super) ->
[#field{name = version, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = version, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []},
@ -3534,8 +3481,7 @@ find_msg_def(sdl_register_super) ->
#field{name = dev_addr, fnum = 4, rnum = 5, type = {msg, sdl_dev_addr}, occurrence = defaulty, opts = []}, #field{name = dev_addr, fnum = 4, rnum = 5, type = {msg, sdl_dev_addr}, occurrence = defaulty, opts = []},
#field{name = pub_key, fnum = 5, rnum = 6, type = string, occurrence = defaulty, opts = []}, #field{name = pub_key, fnum = 5, rnum = 6, type = string, occurrence = defaulty, opts = []},
#field{name = token, fnum = 6, rnum = 7, type = string, occurrence = defaulty, opts = []}, #field{name = token, fnum = 6, rnum = 7, type = string, occurrence = defaulty, opts = []},
#field{name = network_code, fnum = 7, rnum = 8, type = string, occurrence = defaulty, opts = []}, #field{name = network_id, fnum = 7, rnum = 8, type = string, occurrence = defaulty, opts = []}];
#field{name = hostname, fnum = 8, rnum = 9, type = string, occurrence = defaulty, opts = []}];
find_msg_def(sdl_register_super_ack) -> find_msg_def(sdl_register_super_ack) ->
[#field{name = dev_addr, fnum = 1, rnum = 2, type = {msg, sdl_dev_addr}, occurrence = defaulty, opts = []}, [#field{name = dev_addr, fnum = 1, rnum = 2, type = {msg, sdl_dev_addr}, occurrence = defaulty, opts = []},
#field{name = aes_key, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = aes_key, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
@ -3565,25 +3511,25 @@ find_msg_def(sdl_flows) ->
find_msg_def(sdl_stun_request) -> find_msg_def(sdl_stun_request) ->
[#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []},
#field{name = client_id, fnum = 2, rnum = 3, type = string, occurrence = defaulty, opts = []}, #field{name = client_id, fnum = 2, rnum = 3, type = string, occurrence = defaulty, opts = []},
#field{name = network_id, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}, #field{name = network_id, fnum = 3, rnum = 4, type = string, occurrence = defaulty, opts = []},
#field{name = mac, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []}, #field{name = mac, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []},
#field{name = ip, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []}, #field{name = ip, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []},
#field{name = nat_type, fnum = 6, rnum = 7, type = uint32, occurrence = defaulty, opts = []}, #field{name = nat_type, fnum = 6, rnum = 7, type = uint32, occurrence = defaulty, opts = []},
#field{name = v6_info, fnum = 7, rnum = 8, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}]; #field{name = v6_info, fnum = 7, rnum = 8, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}];
find_msg_def(sdl_stun_reply) -> [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}]; find_msg_def(sdl_stun_reply) -> [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}];
find_msg_def(sdl_data) -> find_msg_def(sdl_data) ->
[#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = network_id, fnum = 1, rnum = 2, type = string, occurrence = defaulty, opts = []},
#field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
#field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}, #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []},
#field{name = is_p2p, fnum = 4, rnum = 5, type = bool, occurrence = defaulty, opts = []}, #field{name = is_p2p, fnum = 4, rnum = 5, type = bool, occurrence = defaulty, opts = []},
#field{name = ttl, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []}, #field{name = ttl, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []},
#field{name = data, fnum = 6, rnum = 7, type = bytes, occurrence = defaulty, opts = []}]; #field{name = data, fnum = 6, rnum = 7, type = bytes, occurrence = defaulty, opts = []}];
find_msg_def(sdl_register) -> find_msg_def(sdl_register) ->
[#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = network_id, fnum = 1, rnum = 2, type = string, occurrence = defaulty, opts = []},
#field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
#field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]; #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}];
find_msg_def(sdl_register_ack) -> find_msg_def(sdl_register_ack) ->
[#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, [#field{name = network_id, fnum = 1, rnum = 2, type = string, occurrence = defaulty, opts = []},
#field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, #field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []},
#field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]; #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}];
find_msg_def(sdl_stun_probe) -> [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = attr, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}]; find_msg_def(sdl_stun_probe) -> [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = attr, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}];

View File

@ -23,7 +23,8 @@
-define(SERVER, ?MODULE). -define(SERVER, ?MODULE).
-record(state, { -record(state, {
socket socket,
stun_assist
}). }).
%%%=================================================================== %%%===================================================================
@ -51,20 +52,18 @@ start_link(Name, Port) when is_atom(Name), is_integer(Port) ->
{stop, Reason :: term()} | ignore). {stop, Reason :: term()} | ignore).
init([Port]) -> init([Port]) ->
%% %%
erlang:process_flag(priority, high), erlang:process_flag(priority, max),
Opts = [
binary,
{reuseaddr, true},
{reuseport, true},
{active, true},
{recbuf, 5 * 1024 * 1024},
{sndbuf, 5 * 1024 * 1024}
],
{ok, Socket} = gen_udp:open(Port, Opts),
inet_udp:controlling_process(Socket, self()),
logger:debug("[sdlan_stun] start at port: ~p", [Port]), {ok, Socket} = gen_udp:open(Port, [binary, {active, true}, {recbuf, 5 * 1024 * 1024}, {sndbuf, 5 * 1024 * 1024}]),
{ok, #state{socket = Socket}}. inet_udp:controlling_process(Socket, self()),
lager:debug("[sdlan_stun] start at port: ~p", [Port]),
case application:get_env(sdlan, stun_assist) of
undefined ->
{ok, #state{socket = Socket, stun_assist = undefined}};
{ok, StunAssist} ->
{ok, #state{socket = Socket, stun_assist = StunAssist}}
end.
%% @private %% @private
%% @doc Handling call messages %% @doc Handling call messages
@ -104,7 +103,7 @@ handle_info({udp, Sock, Ip, Port, <<?PACKET_STUN_REQUEST:8, Body/binary>>}, Stat
case sdlan_network:get_pid(NetworkId) of case sdlan_network:get_pid(NetworkId) of
undefined -> undefined ->
logger:debug("[sdlan_stun] stun_request network_id: ~p, client_id: ~p, not found", [NetworkId, ClientId]), lager:debug("call me here stun request 11: ~p", [NetworkId]),
{noreply, State}; {noreply, State};
NetworkPid when is_pid(NetworkPid) -> NetworkPid when is_pid(NetworkPid) ->
sdlan_network:update_hole(NetworkPid, ClientId, Mac, {Ip, Port}, NatType, V6Info), sdlan_network:update_hole(NetworkPid, ClientId, Mac, {Ip, Port}, NatType, V6Info),
@ -112,44 +111,48 @@ handle_info({udp, Sock, Ip, Port, <<?PACKET_STUN_REQUEST:8, Body/binary>>}, Stat
cookie = Cookie cookie = Cookie
}), }),
ok = gen_udp:send(Sock, Ip, Port, <<?PACKET_STUN_REPLY, StunReply/binary>>), ok = gen_udp:send(Sock, Ip, Port, <<?PACKET_STUN_REPLY, StunReply/binary>>),
logger:debug("[sdlan_stun] stun_request network_id: ~p, client_id: ~p, hole: ~p", [NetworkId, ClientId, {Ip, Port}]), lager:debug("call me here stun request 12"),
{noreply, State} {noreply, State}
end; end;
%% nat类型的探测机制, %% nat类型的探测机制,
%% assist的配置attr = 2 %% assist的配置attr = 2
handle_info({udp, Sock, ClientIp, ClientPort, <<?PACKET_STUN_PROBE:8, Body/binary>>}, State = #state{socket = Sock}) -> handle_info({udp, Sock, Ip = {Ip0, Ip1, Ip2, Ip3}, Port, <<?PACKET_STUN_PROBE:8, Body/binary>>}, State = #state{socket = Sock, stun_assist = StunAssist}) ->
#sdl_stun_probe{cookie = Cookie, attr = Attr} = sdlan_pb:decode_msg(Body, sdl_stun_probe), #sdl_stun_probe{cookie = Cookie, attr = Attr} = sdlan_pb:decode_msg(Body, sdl_stun_probe),
logger:debug("[sdlan_stun] get stun_probe request, att: ~p", [Attr]), lager:debug("[sdlan_stun] get stun_probe request, att: ~p", [Attr]),
ProbeReplyPkt = sdlan_pb:encode_msg(#sdl_stun_probe_reply { ProbeReply = sdlan_pb:encode_msg(#sdl_stun_probe_reply {
cookie = Cookie, cookie = Cookie,
port = ClientPort, port = Port,
ip = int_ip(ClientIp) ip = int_ip(Ip)
}), }),
Packet = <<?PACKET_STUN_PROBE_REPLY, ProbeReply/binary>>,
case Attr of case Attr of
?STUN_ATTR_CHANGE_NONE -> ?STUN_ATTR_CHANGE_NONE ->
ok = gen_udp:send(Sock, ClientIp, ClientPort, <<?PACKET_STUN_PROBE_REPLY, ProbeReplyPkt/binary>>); ok = gen_udp:send(Sock, Ip, Port, Packet);
?STUN_ATTR_CHANGE_PORT -> ?STUN_ATTR_CHANGE_PORT ->
%% ip gen_server:cast('sdlan_stun:1:2', {stun_relay, Ip, Port, Packet});
sdlan_stun_peer_assist:stun_relay(ClientIp, ClientPort, ProbeReplyPkt);
?STUN_ATTR_CHANGE_PEER -> ?STUN_ATTR_CHANGE_PEER ->
%% case StunAssist of
sdlan_stun_port_assist:stun_relay(ClientIp, ClientPort, ProbeReplyPkt) {AssistIp, AssistPort} ->
gen_udp:send(Sock, AssistIp, AssistPort, <<?PACKET_STUN_PROBE_RELAY, Ip0, Ip1, Ip2, Ip3, Port:16, Packet/binary>>);
undefined ->
ok
end
end, end,
{noreply, State}; {noreply, State};
%% , stun_reply的转发通过socket来转发 %% , stun_reply的转发通过socket来转发
handle_info({udp, Sock, _, _, <<?PACKET_STUN_PROBE_RELAY:8, Ip0, Ip1, Ip2, Ip3, Port:16, Reply/binary>>}, State = #state{socket = Sock}) -> handle_info({udp, Sock, _, _, <<?PACKET_STUN_PROBE_RELAY:8, Ip0, Ip1, Ip2, Ip3, Port:16, Reply/binary>>}, State = #state{socket = Sock}) ->
logger:debug("[sdlan_stun] get stun_probe_replay request, reply: ~p", [Reply]), lager:debug("[sdlan_stun] get stun_probe_replay request, reply: ~p", [Reply]),
gen_udp:send(Sock, {Ip0, Ip1, Ip2, Ip3}, Port, Reply), gen_udp:send(Sock, {Ip0, Ip1, Ip2, Ip3}, Port, Reply),
{noreply, State}; {noreply, State};
handle_info({udp, _, _Ip, _Port, <<?PACKET_STUN_DATA, Body/binary>>}, State = #state{socket = Sock}) -> handle_info({udp, _, _Ip, _Port, <<?PACKET_STUN_DATA, Body/binary>>}, State = #state{socket = Sock}) ->
Data = #sdl_data{network_id = NetworkId, src_mac = SrcMac, dst_mac = DstMac, ttl = TTL} = sdlan_pb:decode_msg(Body, sdl_data), Data = #sdl_data{network_id = NetworkId, src_mac = SrcMac, dst_mac = DstMac, ttl = TTL} = sdlan_pb:decode_msg(Body, sdl_data),
logger:debug("[sdlan_stun] stun data, src_mac: ~p, dst_mac: ~p", [sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), lager:debug("[sdlan_stun] stun data, src_mac: ~p, dst_mac: ~p", [sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
%% ttl需要减1 %% ttl需要减1
case sdlan_network:get_pid(NetworkId) of case sdlan_network:get_pid(NetworkId) of
@ -163,7 +166,7 @@ handle_info({udp, _, _Ip, _Port, <<?PACKET_STUN_DATA, Body/binary>>}, State = #s
{noreply, State}; {noreply, State};
handle_info(Info, State) -> handle_info(Info, State) ->
logger:error("[sdlan_stun] get a unknown message: ~p, channel will closed", [Info]), lager:error("[sdlan_stun] get a unknown message: ~p, channel will closed", [Info]),
{noreply, State}. {noreply, State}.
%% @private %% @private

View File

@ -1,117 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2026, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 22. 1 2026 16:01
%%%-------------------------------------------------------------------
-module(sdlan_stun_peer_assist).
-author("anlicheng").
-behaviour(gen_server).
%% API
-export([start_link/0]).
-export([stun_relay/3]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-define(SERVER, ?MODULE).
-record(state, {
socket :: inet:socket(),
assist_ip :: inet:ip4_address(),
assist_port :: integer()
}).
%%%===================================================================
%%% API
%%%===================================================================
-spec stun_relay(Ip :: inet:ip_address(), Port :: integer(), Reply :: binary()) -> no_return().
stun_relay(Ip, Port, Reply) when is_integer(Port), is_binary(Reply) ->
gen_server:cast(?SERVER, {stun_relay, Ip, Port, Reply}).
%% @doc Spawns the server and registers the local name (unique)
-spec(start_link() ->
{ok, Pid :: pid()} | ignore | {error, Reason :: term()}).
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
%% @private
%% @doc Initializes the server
-spec(init(Args :: term()) ->
{ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} |
{stop, Reason :: term()} | ignore).
init([]) ->
{ok, Props} = application:get_env(sdlan, stun_peer_assist),
AssistIp = proplists:get_value(ip, Props),
AssistPort = proplists:get_value(port, Props),
Opts = [binary, {reuseaddr, true}],
{ok, Socket} = gen_udp:open(0, Opts),
inet_udp:controlling_process(Socket, self()),
logger:debug("[sdlan_stun_peer_assist] started"),
{ok, #state{socket = Socket, assist_ip = AssistIp, assist_port = AssistPort}}.
%% @private
%% @doc Handling call messages
-spec(handle_call(Request :: term(), From :: {pid(), Tag :: term()},
State :: #state{}) ->
{reply, Reply :: term(), NewState :: #state{}} |
{reply, Reply :: term(), NewState :: #state{}, timeout() | hibernate} |
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), Reply :: term(), NewState :: #state{}} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_call(_Request, _From, State = #state{}) ->
{reply, ok, State}.
%% @private
%% @doc Handling cast messages
-spec(handle_cast(Request :: term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_cast({stun_relay, _Ip = {Ip0, Ip1, Ip2, Ip3}, Port, Reply}, State = #state{socket = Sock, assist_ip = AssistIp, assist_port = AssistPort}) ->
Packet = <<Ip0, Ip1, Ip2, Ip3, Port:16, Reply/binary>>,
ok = gen_udp:send(Sock, AssistIp, AssistPort, Packet),
{noreply, State}.
%% @private
%% @doc Handling all non call/cast messages
-spec(handle_info(Info :: timeout() | term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_info(_Info, State = #state{}) ->
{noreply, State}.
%% @private
%% @doc This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any
%% necessary cleaning up. When it returns, the gen_server terminates
%% with Reason. The return value is ignored.
-spec(terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()),
State :: #state{}) -> term()).
terminate(_Reason, _State = #state{}) ->
ok.
%% @private
%% @doc Convert process state when code is changed
-spec(code_change(OldVsn :: term() | {down, term()}, State :: #state{},
Extra :: term()) ->
{ok, NewState :: #state{}} | {error, Reason :: term()}).
code_change(_OldVsn, State = #state{}, _Extra) ->
{ok, State}.
%%%===================================================================
%%% Internal functions
%%%===================================================================

View File

@ -1,113 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2026, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 22. 1 2026 16:01
%%%-------------------------------------------------------------------
-module(sdlan_stun_port_assist).
-author("anlicheng").
-behaviour(gen_server).
%% API
-export([start_link/0]).
-export([stun_relay/3]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-define(SERVER, ?MODULE).
-record(state, {
socket :: inet:socket()
}).
%%%===================================================================
%%% API
%%%===================================================================
-spec stun_relay(Ip :: inet:ip_address(), Port :: integer(), Reply :: binary()) -> no_return().
stun_relay(Ip, Port, Reply) when is_integer(Port), is_binary(Reply) ->
gen_server:cast(?SERVER, {stun_relay, Ip, Port, Reply}).
%% @doc Spawns the server and registers the local name (unique)
-spec(start_link() ->
{ok, Pid :: pid()} | ignore | {error, Reason :: term()}).
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
%% @private
%% @doc Initializes the server
-spec(init(Args :: term()) ->
{ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} |
{stop, Reason :: term()} | ignore).
init([]) ->
{ok, Props} = application:get_env(sdlan, stun_port_assist),
Port = proplists:get_value(port, Props),
Opts = [binary, {reuseaddr, true}],
{ok, Socket} = gen_udp:open(Port, Opts),
inet_udp:controlling_process(Socket, self()),
logger:debug("[sdlan_stun_port_assist] start at port: ~p", [Port]),
{ok, #state{socket = Socket}}.
%% @private
%% @doc Handling call messages
-spec(handle_call(Request :: term(), From :: {pid(), Tag :: term()},
State :: #state{}) ->
{reply, Reply :: term(), NewState :: #state{}} |
{reply, Reply :: term(), NewState :: #state{}, timeout() | hibernate} |
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), Reply :: term(), NewState :: #state{}} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_call(_Request, _From, State = #state{}) ->
{reply, ok, State}.
%% @private
%% @doc Handling cast messages
-spec(handle_cast(Request :: term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_cast({stun_relay, Ip, Port, Reply}, State = #state{socket = Sock}) ->
ok = gen_udp:send(Sock, Ip, Port, Reply),
{noreply, State}.
%% @private
%% @doc Handling all non call/cast messages
-spec(handle_info(Info :: timeout() | term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}).
handle_info(_Info, State = #state{}) ->
{noreply, State}.
%% @private
%% @doc This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any
%% necessary cleaning up. When it returns, the gen_server terminates
%% with Reason. The return value is ignored.
-spec(terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()),
State :: #state{}) -> term()).
terminate(_Reason, _State = #state{}) ->
ok.
%% @private
%% @doc Convert process state when code is changed
-spec(code_change(OldVsn :: term() | {down, term()}, State :: #state{},
Extra :: term()) ->
{ok, NewState :: #state{}} | {error, Reason :: term()}).
code_change(_OldVsn, State = #state{}, _Extra) ->
{ok, State}.
%%%===================================================================
%%% Internal functions
%%%===================================================================

View File

@ -1,65 +0,0 @@
%%%-------------------------------------------------------------------
%% @doc sdlan top level supervisor.
%% @end
%%%-------------------------------------------------------------------
-module(sdlan_stun_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
-define(SERVER, ?MODULE).
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%% sup_flags() = #{strategy => strategy(), % optional
%% intensity => non_neg_integer(), % optional
%% period => pos_integer()} % optional
%% child_spec() = #{id => child_id(), % mandatory
%% start => mfargs(), % mandatory
%% restart => restart(), % optional
%% shutdown => shutdown(), % optional
%% type => worker(), % optional
%% modules => modules()} % optional
init([]) ->
SupFlags = #{strategy => one_for_one, intensity => 1000, period => 3600},
Specs = [
#{
id => sdlan_stun_port_assist,
start => {sdlan_stun_port_assist, start_link, []},
restart => permanent,
shutdown => 2000,
type => worker,
modules => ['sdlan_stun_port_assist']
},
#{
id => sdlan_stun_peer_assist,
start => {sdlan_stun_peer_assist, start_link, []},
restart => permanent,
shutdown => 2000,
type => worker,
modules => ['sdlan_stun_peer_assist']
}
],
{ok, {SupFlags, Specs ++ stun_acceptors()}}.
stun_acceptors() ->
{ok, StunServers} = application:get_env(sdlan, stun_servers),
Port = proplists:get_value(port, StunServers),
AcceptorNums = proplists:get_value(acceptor_nums, StunServers),
lists:map(fun(Id) ->
Name = sdlan_stun:get_name(Id),
#{
id => Name,
start => {sdlan_stun, start_link, [Name, Port]},
restart => permanent,
shutdown => 2000,
type => worker,
modules => ['sdlan_stun']
}
end, lists:seq(1, AcceptorNums)).

View File

@ -29,14 +29,6 @@ init([]) ->
SupFlags = #{strategy => one_for_one, intensity => 1000, period => 3600}, SupFlags = #{strategy => one_for_one, intensity => 1000, period => 3600},
Specs = [ Specs = [
#{
id => dns_proxy_sup,
start => {dns_proxy_sup, start_link, []},
restart => permanent,
shutdown => 2000,
type => supervisor,
modules => ['dns_proxy_sup']
},
#{ #{
id => sdlan_network_coordinator, id => sdlan_network_coordinator,
start => {sdlan_network_coordinator, start_link, []}, start => {sdlan_network_coordinator, start_link, []},
@ -52,24 +44,28 @@ init([]) ->
shutdown => 2000, shutdown => 2000,
type => supervisor, type => supervisor,
modules => ['sdlan_network_sup'] modules => ['sdlan_network_sup']
},
#{
id => sdlan_stun_sup,
start => {sdlan_stun_sup, start_link, []},
restart => permanent,
shutdown => 2000,
type => supervisor,
modules => ['sdlan_stun_sup']
} }
], ],
{ok, {SupFlags, pools() ++ Specs}}. {ok, {SupFlags, Specs ++ stun_specs()}}.
%% internal functions %% internal functions
pools() -> %pools() ->
{ok, Pools} = application:get_env(sdlan, pools), % {ok, Pools} = application:get_env(sdlan, pools),
lists:map(fun({Name, PoolArgs, WorkerArgs}) -> % lists:map(fun({Name, PoolArgs, WorkerArgs}) ->
poolboy:child_spec(Name, [{name, {local, Name}}|PoolArgs], WorkerArgs) % poolboy:child_spec(Name, [{name, {local, Name}}|PoolArgs], WorkerArgs)
end, Pools). % end, Pools).
stun_specs() ->
{ok, StunServers} = application:get_env(sdlan, stun_servers),
lists:map(fun({Name, Port}) ->
#{
id => Name,
start => {sdlan_stun, start_link, [Name, Port]},
restart => permanent,
shutdown => 2000,
type => worker,
modules => ['sdlan_stun']
}
end, StunServers).

View File

@ -1,20 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2026, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 11. 2 2026 15:49
%%%-------------------------------------------------------------------
-module(sdlan_quicer_test).
-author("anlicheng").
%% API
-export([test/0]).
test() ->
{ok, Conn} = quicer:connect("http3.is", 443, [{alpn, ["h3"]},
{verify, verify_peer},
{peer_unidi_stream_count, 3}], 5000),
logger:debug("conn is: ~p", [Conn]),
quicer:shutdown_connection(Conn).

View File

@ -86,7 +86,7 @@ handle_cast(_Info, State) ->
handle_info({udp, Sock, _Ip, _Port, Data}, State = #state{socket = Sock, bytes = Bytes}) -> handle_info({udp, Sock, _Ip, _Port, Data}, State = #state{socket = Sock, bytes = Bytes}) ->
{noreply, State#state{bytes = Bytes + byte_size(Data)}}; {noreply, State#state{bytes = Bytes + byte_size(Data)}};
handle_info({timeout, _, qps_ticker}, State = #state{bytes = Bytes}) -> handle_info({timeout, _, qps_ticker}, State = #state{bytes = Bytes}) ->
logger:debug("[sdlan_udp_wget] qps is: ~p(M)", [Bytes / 1024 / 1024]), lager:debug("[sdlan_udp_wget] qps is: ~p(M)", [Bytes / 1024 / 1024]),
erlang:start_timer(5000, self(), qps_ticker), erlang:start_timer(5000, self(), qps_ticker),
{noreply, State#state{bytes = 0}}. {noreply, State#state{bytes = 0}}.

View File

@ -111,7 +111,7 @@ handle_call(register, _From, State = #state{socket = Socket, client_id = ClientI
token = <<"1234567890">> token = <<"1234567890">>
}, },
logger:debug("register is: ~p", [Register]), lager:debug("register is: ~p", [Register]),
Packet = jiffy:encode(Req, [force_utf8]), Packet = jiffy:encode(Req, [force_utf8]),
ok = gen_tcp:send(Socket, <<1:32, 101, Packet/binary>>), ok = gen_tcp:send(Socket, <<1:32, 101, Packet/binary>>),
@ -145,7 +145,7 @@ handle_info({tcp, Socket, <<1:32, 5, Data/binary>>}, State = #state{socket = Soc
<<"lifetime">> := Lifetime <<"lifetime">> := Lifetime
} = Response, } = Response,
logger:debug("[stun_client] get a register super response: ~p, alloc ip addr: ~p", [Response, sdlan_ipaddr:int_to_ipv4(NetAddr)]), lager:debug("[stun_client] get a register super response: ~p, alloc ip addr: ~p", [Response, sdlan_ipaddr:int_to_ipv4(NetAddr)]),
%% tun信息 %% tun信息
gen_udp:send(TunSocket, "localhost", 1265, <<1, Cookie:32, ClientId/binary, NetworkId:32, NetAddr:32>>), gen_udp:send(TunSocket, "localhost", 1265, <<1, Cookie:32, ClientId/binary, NetworkId:32, NetAddr:32>>),
@ -153,36 +153,36 @@ handle_info({tcp, Socket, <<1:32, 5, Data/binary>>}, State = #state{socket = Soc
{noreply, State#state{network_id = NetworkId, net_addr = NetAddr, mask_len = NetBitLen, aes_key = AesKey, cookie = Cookie + 1}}; {noreply, State#state{network_id = NetworkId, net_addr = NetAddr, mask_len = NetBitLen, aes_key = AesKey, cookie = Cookie + 1}};
handle_info({udp, _, _, _, <<2, Cookie:32, Family, Port:16, Ip0, Ip1, Ip2, Ip3>>}, State = #state{}) -> handle_info({udp, _, _, _, <<2, Cookie:32, Family, Port:16, Ip0, Ip1, Ip2, Ip3>>}, State = #state{}) ->
logger:debug("[stun_client] tun register ack, cookie: ~p, ack: ~p", [Cookie, {Family, Port, {Ip0, Ip1, Ip2, Ip3}}]), lager:debug("[stun_client] tun register ack, cookie: ~p, ack: ~p", [Cookie, {Family, Port, {Ip0, Ip1, Ip2, Ip3}}]),
{noreply, State}; {noreply, State};
handle_info({udp, _, Ip, Port, <<?STUN_REGISTER:8, NetworkId:32, SrcIp:32, DstIp:32>>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) -> handle_info({udp, _, Ip, Port, <<?STUN_REGISTER:8, NetworkId:32, SrcIp:32, DstIp:32>>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) ->
Packet = <<?STUN_REGISTER_ACK, NetworkId:32, DstIp:32, SrcIp:32>>, Packet = <<?STUN_REGISTER_ACK, NetworkId:32, DstIp:32, SrcIp:32>>,
logger:debug("[stun_client] will send stun reply: ~p, peer: ~p", [Packet, {Ip, Port}]), lager:debug("[stun_client] will send stun reply: ~p, peer: ~p", [Packet, {Ip, Port}]),
ok = gen_udp:send(TunSocket, Ip, Port, Packet), ok = gen_udp:send(TunSocket, Ip, Port, Packet),
NSessions = maps:put(SrcIp, {Ip, Port}, Sessions), NSessions = maps:put(SrcIp, {Ip, Port}, Sessions),
{noreply, State#state{sessions = NSessions}}; {noreply, State#state{sessions = NSessions}};
handle_info({udp, _, Ip, Port, <<?STUN_REGISTER_ACK, NetworkId:32, SrcIp:32, DstIp:32>>}, State = #state{sessions = Sessions}) -> handle_info({udp, _, Ip, Port, <<?STUN_REGISTER_ACK, NetworkId:32, SrcIp:32, DstIp:32>>}, State = #state{sessions = Sessions}) ->
logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, register_ack!!!", [NetworkId, SrcIp, DstIp]), lager:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, register_ack!!!", [NetworkId, SrcIp, DstIp]),
NSessions = maps:put(SrcIp, {Ip, Port}, Sessions), NSessions = maps:put(SrcIp, {Ip, Port}, Sessions),
{noreply, State#state{sessions = NSessions}}; {noreply, State#state{sessions = NSessions}};
handle_info({udp, _, _Ip0, _Port0, <<?STUN_DATA, NetworkId:32, SrcIp:32, DstIp:32, TTL:8, Data/binary>>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) -> handle_info({udp, _, _Ip0, _Port0, <<?STUN_DATA, NetworkId:32, SrcIp:32, DstIp:32, TTL:8, Data/binary>>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) ->
logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, data!!!", [NetworkId, SrcIp, DstIp]), lager:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, data!!!", [NetworkId, SrcIp, DstIp]),
case maps:is_key(SrcIp, Sessions) of case maps:is_key(SrcIp, Sessions) of
true -> true ->
{Ip, Port} = maps:get(SrcIp, Sessions), {Ip, Port} = maps:get(SrcIp, Sessions),
ok = gen_udp:send(TunSocket, Ip, Port, <<?STUN_DATA, NetworkId:32, DstIp:32, SrcIp:32, 255, Data/binary>>), ok = gen_udp:send(TunSocket, Ip, Port, <<?STUN_DATA, NetworkId:32, DstIp:32, SrcIp:32, 255, Data/binary>>),
logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, reply data!!!", [NetworkId, SrcIp, DstIp]); lager:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, reply data!!!", [NetworkId, SrcIp, DstIp]);
false -> false ->
logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, no session", [NetworkId, SrcIp, DstIp]) lager:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, no session", [NetworkId, SrcIp, DstIp])
end, end,
{noreply, State}; {noreply, State};
handle_info(Info, State = #state{}) -> handle_info(Info, State = #state{}) ->
logger:debug("[stun_client] get info: ~p", [Info]), lager:debug("[stun_client] get info: ~p", [Info]),
{noreply, State}. {noreply, State}.
%% @private %% @private

View File

@ -2,14 +2,14 @@
{sdlan, [ {sdlan, [
{http_server, [ {http_server, [
{port, 18082}, {port, 19082},
{acceptors, 500}, {acceptors, 500},
{max_connections, 10240}, {max_connections, 10240},
{backlog, 10240} {backlog, 10240}
]}, ]},
{tcp_server, [ {tcp_server, [
{port, 18083}, {port, 19083},
{acceptors, 500}, {acceptors, 500},
{max_connections, 10240}, {max_connections, 10240},
{backlog, 10240} {backlog, 10240}
@ -18,50 +18,10 @@
%% 网络带宽, 单位为: kb %% 网络带宽, 单位为: kb
{band_width, 2048}, {band_width, 2048},
%% stun类型探测相当于有个类型 {stun_servers, [{'sdlan_stun:1:1', 1265}, {'sdlan_stun:1:2', 1266}]},
{stun_servers, [ {stun_assist, {{47,98,178,3}, 1266}},
{port, 1265},
{acceptor_nums, 5}
]},
{stun_port_assist, [ {api_url, "http://127.0.0.1:19082/test/"}
{port, 1266}
]},
{stun_peer_assist, [
{ip, {47,98,178,3}},
{port, 1266}
]},
%% 公共的dns域名解析服务
{public_dns_servers, [
{{114, 114, 114, 114}, 53},
{{8,8,8,8}, 53}
]},
{pools, [
%% mysql连接池配置
{mysql_sdlan,
[{size, 10}, {max_overflow, 20}, {worker_module, mysql}],
[
{host, {39, 98, 184, 67}},
{port, 3306},
{user, "sdlanuser"},
{connect_mode, lazy},
{keep_alive, true},
{password, "sdlan@J1c8WGu"},
{database, "sdlan"},
{queries, [<<"set names utf8">>]}
]
},
{dns_resolver_pool,
[{size, 20}, {max_overflow, 100}, {worker_module, dns_resolver}],
[]
}
]},
{api_url, "http://127.0.0.1:18082/test/"}
]}, ]},
@ -71,29 +31,37 @@
]}, ]},
%% 系统日志配置系统日志为lager, 支持日志按日期自动分割 %% 系统日志配置系统日志为lager, 支持日志按日期自动分割
{kernel, [ {lager, [
%% 设置 Logger 的 primary log level {colored, true},
{logger_level, debug}, %% Whether to write a crash log, and where. Undefined means no crash logger.
{logger, [ {crash_log, "trade_hub.crash.log"},
{handler, default, logger_std_h, %% Maximum size in bytes of events in the crash log - defaults to 65536
#{ {crash_log_msg_size, 65536},
level => debug, %% Maximum size of the crash log in bytes, before its rotated, set
formatter => {logger_formatter, #{template => [time, " [", level, "] ", msg, "\n"]}} %% to 0 to disable rotation - default is 0
} {crash_log_size, 10485760},
}, %% What time to rotate the crash log - default is no time
%% rotation. See the README for a description of this format.
{crash_log_date, "$D0"},
%% Number of rotated crash logs to keep, 0 means keep only the
%% current one - default is 0
{crash_log_count, 5},
%% Whether to redirect error_logger messages into lager - defaults to true
{error_logger_redirect, true},
{handler, disk, logger_disk_log_h, %% How big the gen_event mailbox can get before it is switched into sync mode
#{ {async_threshold, 20},
level => debug, %% Switch back to async mode, when gen_event mailbox size decrease from `async_threshold'
config => #{ %% to async_threshold - async_threshold_window
file => "log/debug.log", {async_threshold_window, 5},
max_no_files => 10,
max_no_bytes => 524288000
},
formatter => {logger_formatter, #{template => [time, " [", level, "] ", msg, "\n"]}}
}
}
{handlers, [
%% debug | info | warning | error, 日志级别
{lager_console_backend, debug},
{lager_file_backend, [{file, "debug.log"}, {level, debug}, {size, 314572800}]},
{lager_file_backend, [{file, "notice.log"}, {level, notice}, {size, 314572800}]},
{lager_file_backend, [{file, "error.log"}, {level, error}, {size, 314572800}]},
{lager_file_backend, [{file, "info.log"}, {level, info}, {size, 314572800}]}
]} ]}
]} ]}
]. ].

View File

@ -18,52 +18,12 @@
%% 网络带宽, 单位为: kb %% 网络带宽, 单位为: kb
{band_width, 2048}, {band_width, 2048},
%% stun类型探测相当于有个类型 {stun_servers, [{'sdlan_stun:1:1', 1265}, {'sdlan_stun:1:2', 1266}]},
{stun_servers, [ {stun_assist, {{47,98,178,3}, 1266}},
{port, 1265},
{acceptor_nums, 1}
]},
{stun_port_assist, [ % {stun_servers, [{'sdlan_stun:2:1', 1265}, {'sdlan_stun:2:2', 1266}]},
{port, 1266}
]},
{stun_peer_assist, [
{ip, {47,98,178,3}},
{port, 1266}
]},
%% 公共的dns域名解析服务
{public_dns_servers, [
{{114, 114, 114, 114}, 53},
{{8,8,8,8}, 53}
]},
{pools, [
%% mysql连接池配置
{mysql_sdlan,
[{size, 10}, {max_overflow, 20}, {worker_module, mysql}],
[
{host, {118, 178, 229, 213}},
{port, 3306},
{user, "sdlanuser"},
{connect_mode, lazy},
{keep_alive, true},
{password, "sdlan@J1c8WGu"},
{database, "sdlan"},
{queries, [<<"set names utf8">>]}
]
},
{dns_resolver_pool,
[{size, 20}, {max_overflow, 100}, {worker_module, dns_resolver}],
[]
}
]},
{api_url, "https://punchnet.aioe.tech/api/"} {api_url, "https://punchnet.aioe.tech/api/"}
]}, ]},
{throttle, [ {throttle, [
@ -72,29 +32,37 @@
]}, ]},
%% 系统日志配置系统日志为lager, 支持日志按日期自动分割 %% 系统日志配置系统日志为lager, 支持日志按日期自动分割
{kernel, [ {lager, [
%% 设置 Logger 的 primary log level {colored, true},
{logger_level, debug}, %% Whether to write a crash log, and where. Undefined means no crash logger.
{logger, [ {crash_log, "trade_hub.crash.log"},
{handler, default, logger_std_h, %% Maximum size in bytes of events in the crash log - defaults to 65536
#{ {crash_log_msg_size, 65536},
level => debug, %% Maximum size of the crash log in bytes, before its rotated, set
formatter => {logger_formatter, #{template => [time, " [", level, "] ", msg, "\n"]}} %% to 0 to disable rotation - default is 0
} {crash_log_size, 10485760},
}, %% What time to rotate the crash log - default is no time
%% rotation. See the README for a description of this format.
{crash_log_date, "$D0"},
%% Number of rotated crash logs to keep, 0 means keep only the
%% current one - default is 0
{crash_log_count, 5},
%% Whether to redirect error_logger messages into lager - defaults to true
{error_logger_redirect, true},
{handler, disk, logger_disk_log_h, %% How big the gen_event mailbox can get before it is switched into sync mode
#{ {async_threshold, 20},
level => debug, %% Switch back to async mode, when gen_event mailbox size decrease from `async_threshold'
config => #{ %% to async_threshold - async_threshold_window
file => "log/debug.log", {async_threshold_window, 5},
max_no_files => 10,
max_no_bytes => 524288000
},
formatter => {logger_formatter, #{template => [time, " [", level, "] ", msg, "\n"]}}
}
}
{handlers, [
%% debug | info | warning | error, 日志级别
{lager_console_backend, debug},
{lager_file_backend, [{file, "debug.log"}, {level, debug}, {size, 314572800}]},
{lager_file_backend, [{file, "notice.log"}, {level, notice}, {size, 314572800}]},
{lager_file_backend, [{file, "error.log"}, {level, error}, {size, 314572800}]},
{lager_file_backend, [{file, "info.log"}, {level, info}, {size, 314572800}]}
]} ]}
]} ]}
]. ].

View File

@ -15,11 +15,10 @@ message SDLV6Info {
// //
message SDLDevAddr { message SDLDevAddr {
uint32 network_id = 1; string network_id = 1;
bytes mac = 2; bytes mac = 2;
uint32 net_addr = 3; uint32 net_addr = 3;
uint32 net_bit_len = 4; uint32 net_bit_len = 4;
string network_domain = 5;
} }
// tcp通讯消息 // tcp通讯消息
@ -34,8 +33,7 @@ message SDLRegisterSuper {
SDLDevAddr dev_addr = 4; SDLDevAddr dev_addr = 4;
string pub_key = 5; string pub_key = 5;
string token = 6; string token = 6;
string network_code = 7; string network_id = 7;
string hostname = 8;
} }
message SDLRegisterSuperAck { message SDLRegisterSuperAck {
@ -109,7 +107,7 @@ message SDLFlows {
message SDLStunRequest { message SDLStunRequest {
uint32 cookie = 1; uint32 cookie = 1;
string client_id = 2; string client_id = 2;
uint32 network_id = 3; string network_id = 3;
bytes mac = 4; bytes mac = 4;
uint32 ip = 5; uint32 ip = 5;
uint32 nat_type = 6; uint32 nat_type = 6;
@ -121,7 +119,7 @@ message SDLStunReply {
} }
message SDLData { message SDLData {
uint32 network_id = 1; string network_id = 1;
bytes src_mac = 2; bytes src_mac = 2;
bytes dst_mac = 3; bytes dst_mac = 3;
bool is_p2p = 4; bool is_p2p = 4;
@ -130,13 +128,13 @@ message SDLData {
} }
message SDLRegister { message SDLRegister {
uint32 network_id = 1; string network_id = 1;
bytes src_mac = 2; bytes src_mac = 2;
bytes dst_mac = 3; bytes dst_mac = 3;
} }
message SDLRegisterAck { message SDLRegisterAck {
uint32 network_id = 1; string network_id = 1;
bytes src_mac = 2; bytes src_mac = 2;
bytes dst_mac = 3; bytes dst_mac = 3;
} }

View File

@ -1,18 +1,15 @@
{erl_opts, [ {erl_opts, [debug_info]}.
debug_info
]}.
{deps, [ {deps, [
{poolboy, ".*", {git, "https://github.com/devinus/poolboy.git", {tag, "1.5.1"}}}, {poolboy, ".*", {git, "https://github.com/devinus/poolboy.git", {tag, "1.5.1"}}},
{hackney, ".*", {git, "https://github.com/benoitc/hackney.git", {tag, "1.16.0"}}}, {hackney, ".*", {git, "https://github.com/benoitc/hackney.git", {tag, "1.16.0"}}},
{sync, ".*", {git, "https://github.com/rustyio/sync.git", {branch, "master"}}},
{jiffy, ".*", {git, "https://github.com/davisp/jiffy.git", {tag, "1.1.1"}}}, {jiffy, ".*", {git, "https://github.com/davisp/jiffy.git", {tag, "1.1.1"}}},
{cowboy, ".*", {git, "https://github.com/ninenines/cowboy.git", {tag, "2.12.0"}}}, {cowboy, ".*", {git, "https://github.com/ninenines/cowboy.git", {tag, "2.14.2"}}},
{mysql, ".*", {git, "https://github.com/mysql-otp/mysql-otp", {tag, "1.8.0"}}}, {mysql, ".*", {git, "https://github.com/mysql-otp/mysql-otp", {tag, "1.8.0"}}},
{gpb, ".*", {git, "https://github.com/tomas-abrahamsson/gpb.git", {tag, "4.21.1"}}}, {gpb, ".*", {git, "https://github.com/tomas-abrahamsson/gpb.git", {tag, "4.21.1"}}},
{throttle, ".*", {git, "https://github.com/lambdaclass/throttle.git", {tag, "0.3.0"}}}, {throttle, ".*", {git, "https://github.com/lambdaclass/throttle.git", {tag, "0.3.0"}}},
{dns_erlang, ".*", {git, "https://github.com/dnsimple/dns_erlang.git", {tag, "v4.4.0"}}}, {parse_trans, ".*", {git, "https://github.com/uwiger/parse_trans", {tag, "3.0.0"}}},
{quicer, ".*", {git, "https://github.com/emqx/quic.git", {tag, "0.4.0"}}}, {lager, ".*", {git,"https://github.com/erlang-lager/lager.git", {tag, "3.9.2"}}}
{pkt, ".*", {git, "https://github.com/msantos/pkt.git", {tag, "0.6.0"}}},
{sync, ".*", {git, "https://github.com/rustyio/sync.git", {branch, "master"}}}
]}. ]}.
{relx, [{release, {sdlan, "0.1.0"}, {relx, [{release, {sdlan, "0.1.0"},
@ -45,4 +42,6 @@
] ]
}]}]}. }]}]}.
{erl_opts, [{parse_transform,lager_transform}]}.
{rebar_packages_cdn, "https://hexpm.upyun.com"}. {rebar_packages_cdn, "https://hexpm.upyun.com"}.

View File

@ -1,22 +1,13 @@
{"1.2.0", {"1.2.0",
[{<<"base32">>,{pkg,<<"base32">>,<<"1.0.0">>},2}, [{<<"certifi">>,{pkg,<<"certifi">>,<<"2.5.2">>},1},
{<<"certifi">>,{pkg,<<"certifi">>,<<"2.5.2">>},1},
{<<"cowboy">>, {<<"cowboy">>,
{git,"https://github.com/ninenines/cowboy.git", {git,"https://github.com/ninenines/cowboy.git",
{ref,"3ea8395eb8f53a57acb5d3c00b99c70296e7cdbd"}}, {ref,"495e74ada88d0876d7e438d53f11af767a9cdcc4"}},
0}, 0},
{<<"cowlib">>, {<<"cowlib">>,
{git,"https://github.com/ninenines/cowlib", {git,"https://github.com/ninenines/cowlib",
{ref,"1eb7f4293a652adcfe43b1835d22c58d8def839f"}}, {ref,"aca0ad953417b29bab2c41eeb4c37c98606c848b"}},
1}, 1},
{<<"dns_erlang">>,
{git,"https://github.com/dnsimple/dns_erlang.git",
{ref,"e1149a2dd6f49c6560aa245bc6f3d40a5cbe70e1"}},
1},
{<<"dns_proxy">>,
{git,"https://gitea.s5s8.com/anlicheng/dns_proxy.git",
{ref,"5ed832359e42ec99d148bf2ada1729b540017ab8"}},
0},
{<<"fs">>,{pkg,<<"fs">>,<<"6.1.1">>},1}, {<<"fs">>,{pkg,<<"fs">>,<<"6.1.1">>},1},
{<<"goldrush">>,{pkg,<<"goldrush">>,<<"0.1.9">>},1}, {<<"goldrush">>,{pkg,<<"goldrush">>,<<"0.1.9">>},1},
{<<"gpb">>, {<<"gpb">>,
@ -46,27 +37,18 @@
{git,"https://github.com/uwiger/parse_trans", {git,"https://github.com/uwiger/parse_trans",
{ref,"6f3645afb43c7c57d61b54ef59aecab288ce1013"}}, {ref,"6f3645afb43c7c57d61b54ef59aecab288ce1013"}},
0}, 0},
{<<"pkt">>,
{git,"https://github.com/msantos/pkt.git",
{ref,"67a4a14f596fded5ad5f2d8f94318faa8ad2c288"}},
1},
{<<"poolboy">>, {<<"poolboy">>,
{git,"https://github.com/devinus/poolboy.git", {git,"https://github.com/devinus/poolboy.git",
{ref,"3bb48a893ff5598f7c73731ac17545206d259fac"}}, {ref,"3bb48a893ff5598f7c73731ac17545206d259fac"}},
0}, 0},
{<<"quicer">>,
{git,"https://github.com/emqx/quic.git",
{ref,"c2962fd732caa29d513de7c645ea307cf89aaa9c"}},
0},
{<<"ranch">>, {<<"ranch">>,
{git,"https://github.com/ninenines/ranch", {git,"https://github.com/ninenines/ranch",
{ref,"a692f44567034dacf5efcaa24a24183788594eb7"}}, {ref,"10b51304b26062e0dbfd5e74824324e9a911e269"}},
1}, 1},
{<<"snabbkaffe">>,{pkg,<<"snabbkaffe">>,<<"1.0.10">>},1},
{<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.6">>},1}, {<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.6">>},1},
{<<"sync">>, {<<"sync">>,
{git,"https://github.com/rustyio/sync.git", {git,"https://github.com/rustyio/sync.git",
{ref,"4e909f69d3d0db21a6d7128b20748819e415c9eb"}}, {ref,"7dc303ed4ce8d26db82e171dbbd7c41067852c65"}},
0}, 0},
{<<"throttle">>, {<<"throttle">>,
{git,"https://github.com/lambdaclass/throttle.git", {git,"https://github.com/lambdaclass/throttle.git",
@ -75,25 +57,21 @@
{<<"unicode_util_compat">>,{pkg,<<"unicode_util_compat">>,<<"0.5.0">>},2}]}. {<<"unicode_util_compat">>,{pkg,<<"unicode_util_compat">>,<<"0.5.0">>},2}]}.
[ [
{pkg_hash,[ {pkg_hash,[
{<<"base32">>, <<"1AB331F812FCC254C8F7D4348E1E5A6F2B9B32B7A260BF2BC3358E3BF14C841A">>},
{<<"certifi">>, <<"B7CFEAE9D2ED395695DD8201C57A2D019C0C43ECAF8B8BCB9320B40D6662F340">>}, {<<"certifi">>, <<"B7CFEAE9D2ED395695DD8201C57A2D019C0C43ECAF8B8BCB9320B40D6662F340">>},
{<<"fs">>, <<"9D147B944D60CFA48A349F12D06C8EE71128F610C90870BDF9A6773206452ED0">>}, {<<"fs">>, <<"9D147B944D60CFA48A349F12D06C8EE71128F610C90870BDF9A6773206452ED0">>},
{<<"goldrush">>, <<"F06E5D5F1277DA5C413E84D5A2924174182FB108DABB39D5EC548B27424CD106">>}, {<<"goldrush">>, <<"F06E5D5F1277DA5C413E84D5A2924174182FB108DABB39D5EC548B27424CD106">>},
{<<"idna">>, <<"1D038FB2E7668CE41FBF681D2C45902E52B3CB9E9C77B55334353B222C2EE50C">>}, {<<"idna">>, <<"1D038FB2E7668CE41FBF681D2C45902E52B3CB9E9C77B55334353B222C2EE50C">>},
{<<"metrics">>, <<"25F094DEA2CDA98213CECC3AEFF09E940299D950904393B2A29D191C346A8486">>}, {<<"metrics">>, <<"25F094DEA2CDA98213CECC3AEFF09E940299D950904393B2A29D191C346A8486">>},
{<<"mimerl">>, <<"67E2D3F571088D5CFD3E550C383094B47159F3EEE8FFA08E64106CDF5E981BE3">>}, {<<"mimerl">>, <<"67E2D3F571088D5CFD3E550C383094B47159F3EEE8FFA08E64106CDF5E981BE3">>},
{<<"snabbkaffe">>, <<"9BE2F54F61FC6862391B666B2B5B76C3FA53598E2989A17CEF1B48CF347A8A63">>},
{<<"ssl_verify_fun">>, <<"CF344F5692C82D2CD7554F5EC8FD961548D4FD09E7D22F5B62482E5AEAEBD4B0">>}, {<<"ssl_verify_fun">>, <<"CF344F5692C82D2CD7554F5EC8FD961548D4FD09E7D22F5B62482E5AEAEBD4B0">>},
{<<"unicode_util_compat">>, <<"8516502659002CEC19E244EBD90D312183064BE95025A319A6C7E89F4BCCD65B">>}]}, {<<"unicode_util_compat">>, <<"8516502659002CEC19E244EBD90D312183064BE95025A319A6C7E89F4BCCD65B">>}]},
{pkg_hash_ext,[ {pkg_hash_ext,[
{<<"base32">>, <<"0449285348ED0C4CD83C7198E76C5FD5A0451C4EF18695B9FD43792A503E551A">>},
{<<"certifi">>, <<"3B3B5F36493004AC3455966991EAF6E768CE9884693D9968055AEEEB1E575040">>}, {<<"certifi">>, <<"3B3B5F36493004AC3455966991EAF6E768CE9884693D9968055AEEEB1E575040">>},
{<<"fs">>, <<"EF94E95FFE79916860649FED80AC62B04C322B0BB70F5128144C026B4D171F8B">>}, {<<"fs">>, <<"EF94E95FFE79916860649FED80AC62B04C322B0BB70F5128144C026B4D171F8B">>},
{<<"goldrush">>, <<"99CB4128CFFCB3227581E5D4D803D5413FA643F4EB96523F77D9E6937D994CEB">>}, {<<"goldrush">>, <<"99CB4128CFFCB3227581E5D4D803D5413FA643F4EB96523F77D9E6937D994CEB">>},
{<<"idna">>, <<"A02C8A1C4FD601215BB0B0324C8A6986749F807CE35F25449EC9E69758708122">>}, {<<"idna">>, <<"A02C8A1C4FD601215BB0B0324C8A6986749F807CE35F25449EC9E69758708122">>},
{<<"metrics">>, <<"69B09ADDDC4F74A40716AE54D140F93BEB0FB8978D8636EADED0C31B6F099F16">>}, {<<"metrics">>, <<"69B09ADDDC4F74A40716AE54D140F93BEB0FB8978D8636EADED0C31B6F099F16">>},
{<<"mimerl">>, <<"F278585650AA581986264638EBF698F8BB19DF297F66AD91B18910DFC6E19323">>}, {<<"mimerl">>, <<"F278585650AA581986264638EBF698F8BB19DF297F66AD91B18910DFC6E19323">>},
{<<"snabbkaffe">>, <<"70A98DF36AE756908D55B5770891D443D63C903833E3E87D544036E13D4FAC26">>},
{<<"ssl_verify_fun">>, <<"BDB0D2471F453C88FF3908E7686F86F9BE327D065CC1EC16FA4540197EA04680">>}, {<<"ssl_verify_fun">>, <<"BDB0D2471F453C88FF3908E7686F86F9BE327D065CC1EC16FA4540197EA04680">>},
{<<"unicode_util_compat">>, <<"D48D002E15F5CC105A696CF2F1BBB3FC72B4B770A184D8420C8DB20DA2674B38">>}]} {<<"unicode_util_compat">>, <<"D48D002E15F5CC105A696CF2F1BBB3FC72B4B770A184D8420C8DB20DA2674B38">>}]}
]. ].