diff --git a/apps/sdlan/include/sdlan_pb.hrl b/apps/sdlan/include/sdlan_pb.hrl index d7b9c60..c21022b 100644 --- a/apps/sdlan/include/sdlan_pb.hrl +++ b/apps/sdlan/include/sdlan_pb.hrl @@ -28,7 +28,7 @@ -ifndef('SDL_REGISTER_SUPER_PB_H'). -define('SDL_REGISTER_SUPER_PB_H', true). -record(sdl_register_super, - {version = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits + {pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits client_id = <<>> :: unicode:chardata() | undefined, % = 2, optional network_id = 0 :: non_neg_integer() | undefined, % = 3, optional, 32 bits mac = <<>> :: iodata() | undefined, % = 4, optional @@ -43,36 +43,49 @@ -ifndef('SDL_REGISTER_SUPER_ACK_PB_H'). -define('SDL_REGISTER_SUPER_ACK_PB_H', true). -record(sdl_register_super_ack, - {aes_key = <<>> :: iodata() | undefined, % = 1, optional - session_token = <<>> :: iodata() | undefined % = 2, optional + {pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits + aes_key = <<>> :: iodata() | undefined, % = 2, optional + session_token = <<>> :: iodata() | undefined % = 3, optional }). -endif. -ifndef('SDL_REGISTER_SUPER_NAK_PB_H'). -define('SDL_REGISTER_SUPER_NAK_PB_H', true). -record(sdl_register_super_nak, - {error_code = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits - error_message = <<>> :: unicode:chardata() | undefined % = 2, optional + {pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits + error_code = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits + error_message = <<>> :: unicode:chardata() | undefined % = 3, optional }). -endif. -ifndef('SDL_QUERY_INFO_PB_H'). -define('SDL_QUERY_INFO_PB_H', true). -record(sdl_query_info, - {network_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits - src_mac = <<>> :: iodata() | undefined, % = 2, optional - dst_mac = <<>> :: iodata() | undefined, % = 3, optional - session_token = <<>> :: iodata() | undefined % = 4, optional + {pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits + network_id = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits + src_mac = <<>> :: iodata() | undefined, % = 3, optional + dst_mac = <<>> :: iodata() | undefined, % = 4, optional + session_token = <<>> :: iodata() | undefined % = 5, optional }). -endif. -ifndef('SDL_PEER_INFO_PB_H'). -define('SDL_PEER_INFO_PB_H', true). -record(sdl_peer_info, - {network_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits - dst_mac = <<>> :: iodata() | undefined, % = 2, optional - v4_info = undefined :: sdlan_pb:sdl_v4_info() | undefined, % = 3, optional - v6_info :: sdlan_pb:sdl_v6_info() | undefined % = 4, optional + {pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits + network_id = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits + dst_mac = <<>> :: iodata() | undefined, % = 3, optional + v4_info = undefined :: sdlan_pb:sdl_v4_info() | undefined, % = 4, optional + v6_info :: sdlan_pb:sdl_v6_info() | undefined % = 5, optional + }). +-endif. + +-ifndef('SDL_EMPTY_PEER_INFO_PB_H'). +-define('SDL_EMPTY_PEER_INFO_PB_H', true). +-record(sdl_empty_peer_info, + {pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits + network_id = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits + dst_mac = <<>> :: iodata() | undefined % = 3, optional }). -endif. @@ -133,6 +146,15 @@ }). -endif. +-ifndef('SDL_STUN_REPLY_PB_H'). +-define('SDL_STUN_REPLY_PB_H', true). +-record(sdl_stun_reply, + {network_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits + code = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits + message = <<>> :: unicode:chardata() | undefined % = 3, optional + }). +-endif. + -ifndef('SDL_DATA_PB_H'). -define('SDL_DATA_PB_H', true). -record(sdl_data, diff --git a/apps/sdlan/src/sdlan_cipher.erl b/apps/sdlan/src/sdlan_cipher.erl index 8282a31..4a484c6 100644 --- a/apps/sdlan/src/sdlan_cipher.erl +++ b/apps/sdlan/src/sdlan_cipher.erl @@ -8,19 +8,12 @@ %%%------------------------------------------------------------------- -module(sdlan_cipher). -author("anlicheng"). +-include_lib("public_key/include/public_key.hrl"). %% API --export([rsa_encrypt/2, rsa_pem_decode/1]). +-export([rsa_encrypt/2, rsa_pem_decode/1, rsa_decrypt/2]). -export([aes_encrypt/3, aes_decrypt/3]). --export([test/0]). - -test() -> - Key = <<"abcdabcdabcdabcd">>, - X = aes_encrypt(Key, Key, <<"hello world">>), - logger:debug("x is: ~p, raw: ~p", [X, aes_decrypt(Key, Key, X)]), - - - ok. +-export([rsa_generate_key/0]). -spec rsa_pem_decode(PubKey :: binary()) -> public_key:rsa_public_key(). rsa_pem_decode(PubKey) when is_binary(PubKey) -> @@ -32,6 +25,23 @@ rsa_pem_decode(PubKey) when is_binary(PubKey) -> rsa_encrypt(BinData, PublicKey) when is_binary(BinData) -> public_key:encrypt_public(BinData, PublicKey, [{rsa_padding, rsa_pkcs1_padding}]). +-spec rsa_decrypt(EncData :: binary(), PrivateKey :: public_key:rsa_private_key()) -> binary(). +rsa_decrypt(EncData, PrivateKey) when is_binary(EncData) -> + public_key:decrypt_private(EncData, PrivateKey, [{rsa_padding, rsa_pkcs1_padding}]). + +rsa_generate_key() -> + PrivateKey = public_key:generate_key({rsa, 2048, 65537}), + PublicKey = #'RSAPublicKey'{ + modulus = PrivateKey#'RSAPrivateKey'.modulus, + publicExponent = PrivateKey#'RSAPrivateKey'.publicExponent + }, + + PemBin = public_key:pem_encode([ + public_key:pem_entry_encode('RSAPublicKey', PublicKey) + ]), + PK = binary_to_list(PemBin), + {PK, PrivateKey}. + %% 基于aes的加密算法 -spec aes_encrypt(binary(), binary(), binary()) -> binary(). aes_encrypt(Key, IVec, PlainText) when is_binary(Key), is_binary(IVec), is_binary(PlainText) -> @@ -40,4 +50,5 @@ aes_encrypt(Key, IVec, PlainText) when is_binary(Key), is_binary(IVec), is_binar %% 基于aes的解密算法 -spec aes_decrypt(binary(), binary(), binary()) -> binary(). aes_decrypt(Key, IVec, CipherText) when is_binary(Key), is_binary(IVec), is_binary(CipherText) -> - crypto:crypto_one_time(aes_128_ofb, Key, IVec, CipherText, [{encrypt, false}, {padding, pkcs_padding}]). \ No newline at end of file + crypto:crypto_one_time(aes_128_ofb, Key, IVec, CipherText, [{encrypt, false}, {padding, pkcs_padding}]). + diff --git a/apps/sdlan/src/sdlan_network.erl b/apps/sdlan/src/sdlan_network.erl index 4db495c..928febe 100644 --- a/apps/sdlan/src/sdlan_network.erl +++ b/apps/sdlan/src/sdlan_network.erl @@ -24,7 +24,7 @@ %% API -export([start_link/2]). --export([get_name/1, get_pid/1, lookup_pid/1, attach/6, peer_info/5, unregister/3, debug_info/1, get_network_id/1, arp_query/2]). +-export([get_name/1, get_pid/1, lookup_pid/1, attach/6, peer_info/4, unregister/3, debug_info/1, get_network_id/1, arp_query/2]). -export([forward/5, stun_request/4, disable_client/2, dropout_client/2]). -export([test_event/1]). @@ -107,9 +107,9 @@ arp_query(Pid, TargetIp) when is_pid(Pid), is_integer(TargetIp) -> unregister(Pid, ClientId, Mac) when is_pid(Pid), is_binary(ClientId), is_binary(Mac) -> gen_server:cast(Pid, {unregister, ClientId, Mac}). --spec peer_info(Pid :: pid(), Sock :: inet:socket(), Peer :: {inet:ip4_address(), integer()}, PacketId :: integer(), Query :: #sdl_query_info{}) -> no_return(). -peer_info(Pid, Sock, ClientPeer, PacketId, Query) when is_pid(Pid) -> - gen_server:cast(Pid, {peer_info, Sock, ClientPeer, PacketId, Query}). +-spec peer_info(Pid :: pid(), Sock :: inet:socket(), Peer :: {inet:ip4_address(), integer()}, Query :: #sdl_query_info{}) -> no_return(). +peer_info(Pid, Sock, ClientPeer, Query) when is_pid(Pid) -> + gen_server:cast(Pid, {peer_info, Sock, ClientPeer, Query}). -spec forward(pid(), Sock :: any(), SrcMac :: binary(), DstMac :: binary(), Packet :: binary()) -> no_return(). forward(Pid, Sock, SrcMac, DstMac, Packet) when is_pid(Pid), is_binary(SrcMac), is_binary(DstMac), is_binary(Packet) -> @@ -253,13 +253,17 @@ handle_call(debug_info, _From, State = #state{network_id = NetworkId, ipaddr = I %% 网络存在的nat_peer信息 %% TODO SrcMac不存在的时候需要重新校验 -handle_cast({peer_info, Sock, {ClientIp, ClientPort}, PacketId, #sdl_query_info{src_mac = SrcMac, dst_mac = DstMac}}, State = #state{endpoints = Endpoints}) -> +handle_cast({peer_info, Sock, {ClientIp, ClientPort}, #sdl_query_info{pkt_id = PktId, src_mac = SrcMac, dst_mac = DstMac}}, + State = #state{network_id = NetworkId, endpoints = Endpoints}) -> + case maps:find(DstMac, Endpoints) of {ok, #endpoint{hole = #hole{peer = DstNatPeer = {{Ip0, Ip1, Ip2, Ip3}, DstNatPort}, nat_type = DstNatType}, v6_info = DstV6Info}} -> %% 让目标服务器发送sendRegister事件(2024-06-25 新增,提高打洞的成功率) maybe_preload_hole(DstNatPeer, maps:get(SrcMac, Endpoints, undefined)), PeerInfo = sdlan_pb:encode_msg(#sdl_peer_info{ + pkt_id = PktId, + network_id = NetworkId, dst_mac = DstMac, v4_info = #sdl_v4_info { port = DstNatPort, @@ -268,10 +272,15 @@ handle_cast({peer_info, Sock, {ClientIp, ClientPort}, PacketId, #sdl_query_info{ }, v6_info = DstV6Info }), - PeerPacket = <>, + PeerPacket = <>, gen_udp:send(Sock, ClientIp, ClientPort, PeerPacket); _ -> - EmptyPeerPacket = <>, + EmptyPeerInfo = sdlan_pb:encode_msg(#sdl_empty_peer_info{ + pkt_id = PktId, + network_id = NetworkId, + dst_mac = DstMac + }), + EmptyPeerPacket = <>, gen_udp:send(Sock, ClientIp, ClientPort, EmptyPeerPacket) end, {noreply, State}; diff --git a/apps/sdlan/src/sdlan_pb.erl b/apps/sdlan/src/sdlan_pb.erl index 56ae441..0ac9b26 100644 --- a/apps/sdlan/src/sdlan_pb.erl +++ b/apps/sdlan/src/sdlan_pb.erl @@ -69,6 +69,8 @@ -type sdl_peer_info() :: #sdl_peer_info{}. +-type sdl_empty_peer_info() :: #sdl_empty_peer_info{}. + -type sdl_nat_changed_event() :: #sdl_nat_changed_event{}. -type sdl_drop_macs_event() :: #sdl_drop_macs_event{}. @@ -81,6 +83,8 @@ -type sdl_stun_request() :: #sdl_stun_request{}. +-type sdl_stun_reply() :: #sdl_stun_reply{}. + -type sdl_data() :: #sdl_data{}. -type sdl_register() :: #sdl_register{}. @@ -95,9 +99,9 @@ -type sdl_arp_response() :: #sdl_arp_response{}. --export_type(['sdl_v4_info'/0, 'sdl_v6_info'/0, 'sdl_register_super'/0, 'sdl_register_super_ack'/0, 'sdl_register_super_nak'/0, 'sdl_query_info'/0, 'sdl_peer_info'/0, 'sdl_nat_changed_event'/0, 'sdl_drop_macs_event'/0, 'sdl_refresh_auth_event'/0, 'sdl_send_register_event'/0, 'sdl_network_shutdown_event'/0, 'sdl_stun_request'/0, 'sdl_data'/0, 'sdl_register'/0, 'sdl_register_ack'/0, 'sdl_stun_probe'/0, 'sdl_stun_probe_reply'/0, 'sdl_arp_request'/0, 'sdl_arp_response'/0]). --type '$msg_name'() :: sdl_v4_info | sdl_v6_info | sdl_register_super | sdl_register_super_ack | sdl_register_super_nak | sdl_query_info | sdl_peer_info | sdl_nat_changed_event | sdl_drop_macs_event | sdl_refresh_auth_event | sdl_send_register_event | sdl_network_shutdown_event | sdl_stun_request | sdl_data | sdl_register | sdl_register_ack | sdl_stun_probe | sdl_stun_probe_reply | sdl_arp_request | sdl_arp_response. --type '$msg'() :: sdl_v4_info() | sdl_v6_info() | sdl_register_super() | sdl_register_super_ack() | sdl_register_super_nak() | sdl_query_info() | sdl_peer_info() | sdl_nat_changed_event() | sdl_drop_macs_event() | sdl_refresh_auth_event() | sdl_send_register_event() | sdl_network_shutdown_event() | sdl_stun_request() | sdl_data() | sdl_register() | sdl_register_ack() | sdl_stun_probe() | sdl_stun_probe_reply() | sdl_arp_request() | sdl_arp_response(). +-export_type(['sdl_v4_info'/0, 'sdl_v6_info'/0, 'sdl_register_super'/0, 'sdl_register_super_ack'/0, 'sdl_register_super_nak'/0, 'sdl_query_info'/0, 'sdl_peer_info'/0, 'sdl_empty_peer_info'/0, 'sdl_nat_changed_event'/0, 'sdl_drop_macs_event'/0, 'sdl_refresh_auth_event'/0, 'sdl_send_register_event'/0, 'sdl_network_shutdown_event'/0, 'sdl_stun_request'/0, 'sdl_stun_reply'/0, 'sdl_data'/0, 'sdl_register'/0, 'sdl_register_ack'/0, 'sdl_stun_probe'/0, 'sdl_stun_probe_reply'/0, 'sdl_arp_request'/0, 'sdl_arp_response'/0]). +-type '$msg_name'() :: sdl_v4_info | sdl_v6_info | sdl_register_super | sdl_register_super_ack | sdl_register_super_nak | sdl_query_info | sdl_peer_info | sdl_empty_peer_info | sdl_nat_changed_event | sdl_drop_macs_event | sdl_refresh_auth_event | sdl_send_register_event | sdl_network_shutdown_event | sdl_stun_request | sdl_stun_reply | sdl_data | sdl_register | sdl_register_ack | sdl_stun_probe | sdl_stun_probe_reply | sdl_arp_request | sdl_arp_response. +-type '$msg'() :: sdl_v4_info() | sdl_v6_info() | sdl_register_super() | sdl_register_super_ack() | sdl_register_super_nak() | sdl_query_info() | sdl_peer_info() | sdl_empty_peer_info() | sdl_nat_changed_event() | sdl_drop_macs_event() | sdl_refresh_auth_event() | sdl_send_register_event() | sdl_network_shutdown_event() | sdl_stun_request() | sdl_stun_reply() | sdl_data() | sdl_register() | sdl_register_ack() | sdl_stun_probe() | sdl_stun_probe_reply() | sdl_arp_request() | sdl_arp_response(). -export_type(['$msg_name'/0, '$msg'/0]). -if(?OTP_RELEASE >= 24). @@ -131,12 +135,14 @@ encode_msg(Msg, MsgName, Opts) -> sdl_register_super_nak -> encode_msg_sdl_register_super_nak(id(Msg, TrUserData), TrUserData); sdl_query_info -> encode_msg_sdl_query_info(id(Msg, TrUserData), TrUserData); sdl_peer_info -> encode_msg_sdl_peer_info(id(Msg, TrUserData), TrUserData); + sdl_empty_peer_info -> encode_msg_sdl_empty_peer_info(id(Msg, TrUserData), TrUserData); sdl_nat_changed_event -> encode_msg_sdl_nat_changed_event(id(Msg, TrUserData), TrUserData); sdl_drop_macs_event -> encode_msg_sdl_drop_macs_event(id(Msg, TrUserData), TrUserData); sdl_refresh_auth_event -> encode_msg_sdl_refresh_auth_event(id(Msg, TrUserData), TrUserData); sdl_send_register_event -> encode_msg_sdl_send_register_event(id(Msg, TrUserData), TrUserData); sdl_network_shutdown_event -> encode_msg_sdl_network_shutdown_event(id(Msg, TrUserData), TrUserData); sdl_stun_request -> encode_msg_sdl_stun_request(id(Msg, TrUserData), TrUserData); + sdl_stun_reply -> encode_msg_sdl_stun_reply(id(Msg, TrUserData), TrUserData); sdl_data -> encode_msg_sdl_data(id(Msg, TrUserData), TrUserData); sdl_register -> encode_msg_sdl_register(id(Msg, TrUserData), TrUserData); sdl_register_ack -> encode_msg_sdl_register_ack(id(Msg, TrUserData), TrUserData); @@ -207,7 +213,7 @@ encode_msg_sdl_v6_info(#sdl_v6_info{port = F1, v6 = F2}, Bin, 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, client_id = F2, network_id = F3, mac = F4, ip = F5, mask_len = F6, hostname = F7, pub_key = F8, access_token = F9}, Bin, TrUserData) -> +encode_msg_sdl_register_super(#sdl_register_super{pkt_id = F1, client_id = F2, network_id = F3, mac = F4, ip = F5, mask_len = F6, hostname = F7, pub_key = F8, access_token = F9}, Bin, TrUserData) -> B1 = if F1 == undefined -> Bin; true -> begin @@ -298,56 +304,7 @@ encode_msg_sdl_register_super(#sdl_register_super{version = F1, client_id = F2, encode_msg_sdl_register_super_ack(Msg, TrUserData) -> encode_msg_sdl_register_super_ack(Msg, <<>>, TrUserData). -encode_msg_sdl_register_super_ack(#sdl_register_super_ack{aes_key = F1, session_token = F2}, Bin, TrUserData) -> - B1 = if F1 == undefined -> Bin; - true -> - begin - TrF1 = id(F1, TrUserData), - case iolist_size(TrF1) of - 0 -> Bin; - _ -> e_type_bytes(TrF1, <>, TrUserData) - end - end - end, - if F2 == undefined -> B1; - true -> - begin - TrF2 = id(F2, TrUserData), - case iolist_size(TrF2) of - 0 -> B1; - _ -> e_type_bytes(TrF2, <>, TrUserData) - end - end - end. - -encode_msg_sdl_register_super_nak(Msg, TrUserData) -> encode_msg_sdl_register_super_nak(Msg, <<>>, TrUserData). - - -encode_msg_sdl_register_super_nak(#sdl_register_super_nak{error_code = F1, error_message = F2}, Bin, TrUserData) -> - B1 = if F1 == undefined -> Bin; - true -> - begin - TrF1 = id(F1, TrUserData), - if TrF1 =:= 0 -> Bin; - true -> e_varint(TrF1, <>, TrUserData) - end - end - end, - if F2 == undefined -> B1; - true -> - begin - TrF2 = id(F2, TrUserData), - case is_empty_string(TrF2) of - true -> B1; - false -> e_type_string(TrF2, <>, TrUserData) - end - end - end. - -encode_msg_sdl_query_info(Msg, TrUserData) -> encode_msg_sdl_query_info(Msg, <<>>, TrUserData). - - -encode_msg_sdl_query_info(#sdl_query_info{network_id = F1, src_mac = F2, dst_mac = F3, session_token = F4}, Bin, TrUserData) -> +encode_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = F1, aes_key = F2, session_token = F3}, Bin, TrUserData) -> B1 = if F1 == undefined -> Bin; true -> begin @@ -367,6 +324,72 @@ encode_msg_sdl_query_info(#sdl_query_info{network_id = F1, src_mac = F2, dst_mac end end end, + if F3 == undefined -> B2; + true -> + begin + TrF3 = id(F3, TrUserData), + case iolist_size(TrF3) of + 0 -> B2; + _ -> e_type_bytes(TrF3, <>, TrUserData) + end + end + end. + +encode_msg_sdl_register_super_nak(Msg, TrUserData) -> encode_msg_sdl_register_super_nak(Msg, <<>>, TrUserData). + + +encode_msg_sdl_register_super_nak(#sdl_register_super_nak{pkt_id = F1, error_code = F2, error_message = F3}, Bin, TrUserData) -> + B1 = if F1 == undefined -> Bin; + true -> + begin + TrF1 = id(F1, TrUserData), + if TrF1 =:= 0 -> Bin; + true -> e_varint(TrF1, <>, TrUserData) + end + end + end, + B2 = if F2 == undefined -> B1; + true -> + begin + TrF2 = id(F2, TrUserData), + if TrF2 =:= 0 -> B1; + true -> e_varint(TrF2, <>, TrUserData) + end + end + end, + if F3 == undefined -> B2; + true -> + begin + TrF3 = id(F3, TrUserData), + case is_empty_string(TrF3) of + true -> B2; + false -> e_type_string(TrF3, <>, TrUserData) + end + end + end. + +encode_msg_sdl_query_info(Msg, TrUserData) -> encode_msg_sdl_query_info(Msg, <<>>, TrUserData). + + +encode_msg_sdl_query_info(#sdl_query_info{pkt_id = F1, network_id = F2, src_mac = F3, dst_mac = F4, session_token = F5}, Bin, TrUserData) -> + B1 = if F1 == undefined -> Bin; + true -> + begin + TrF1 = id(F1, TrUserData), + if TrF1 =:= 0 -> Bin; + true -> e_varint(TrF1, <>, TrUserData) + end + end + end, + B2 = if F2 == undefined -> B1; + true -> + begin + TrF2 = id(F2, TrUserData), + if TrF2 =:= 0 -> B1; + true -> e_varint(TrF2, <>, TrUserData) + end + end + end, B3 = if F3 == undefined -> B2; true -> begin @@ -377,13 +400,23 @@ encode_msg_sdl_query_info(#sdl_query_info{network_id = F1, src_mac = F2, dst_mac end end end, - if F4 == undefined -> B3; + B4 = if F4 == undefined -> B3; + true -> + begin + TrF4 = id(F4, TrUserData), + case iolist_size(TrF4) of + 0 -> B3; + _ -> e_type_bytes(TrF4, <>, TrUserData) + end + end + end, + if F5 == undefined -> B4; true -> begin - TrF4 = id(F4, TrUserData), - case iolist_size(TrF4) of - 0 -> B3; - _ -> e_type_bytes(TrF4, <>, TrUserData) + TrF5 = id(F5, TrUserData), + case iolist_size(TrF5) of + 0 -> B4; + _ -> e_type_bytes(TrF5, <>, TrUserData) end end end. @@ -391,7 +424,7 @@ encode_msg_sdl_query_info(#sdl_query_info{network_id = F1, src_mac = F2, dst_mac encode_msg_sdl_peer_info(Msg, TrUserData) -> encode_msg_sdl_peer_info(Msg, <<>>, TrUserData). -encode_msg_sdl_peer_info(#sdl_peer_info{network_id = F1, dst_mac = F2, v4_info = F3, v6_info = F4}, Bin, TrUserData) -> +encode_msg_sdl_peer_info(#sdl_peer_info{pkt_id = F1, network_id = F2, dst_mac = F3, v4_info = F4, v6_info = F5}, Bin, TrUserData) -> B1 = if F1 == undefined -> Bin; true -> begin @@ -405,9 +438,8 @@ encode_msg_sdl_peer_info(#sdl_peer_info{network_id = F1, dst_mac = F2, v4_info = true -> begin TrF2 = id(F2, TrUserData), - case iolist_size(TrF2) of - 0 -> B1; - _ -> e_type_bytes(TrF2, <>, TrUserData) + if TrF2 =:= 0 -> B1; + true -> e_varint(TrF2, <>, TrUserData) end end end, @@ -415,13 +447,56 @@ encode_msg_sdl_peer_info(#sdl_peer_info{network_id = F1, dst_mac = F2, v4_info = true -> begin TrF3 = id(F3, TrUserData), - if TrF3 =:= undefined -> B2; - true -> e_mfield_sdl_peer_info_v4_info(TrF3, <>, TrUserData) + case iolist_size(TrF3) of + 0 -> B2; + _ -> e_type_bytes(TrF3, <>, TrUserData) end end end, - if F4 == undefined -> B3; - true -> begin TrF4 = id(F4, TrUserData), e_mfield_sdl_peer_info_v6_info(TrF4, <>, TrUserData) end + B4 = if F4 == undefined -> B3; + true -> + begin + TrF4 = id(F4, TrUserData), + if TrF4 =:= undefined -> B3; + true -> e_mfield_sdl_peer_info_v4_info(TrF4, <>, TrUserData) + end + end + end, + if F5 == undefined -> B4; + true -> begin TrF5 = id(F5, TrUserData), e_mfield_sdl_peer_info_v6_info(TrF5, <>, TrUserData) end + end. + +encode_msg_sdl_empty_peer_info(Msg, TrUserData) -> encode_msg_sdl_empty_peer_info(Msg, <<>>, TrUserData). + + +encode_msg_sdl_empty_peer_info(#sdl_empty_peer_info{pkt_id = F1, network_id = F2, dst_mac = F3}, Bin, TrUserData) -> + B1 = if F1 == undefined -> Bin; + true -> + begin + TrF1 = id(F1, TrUserData), + if TrF1 =:= 0 -> Bin; + true -> e_varint(TrF1, <>, TrUserData) + end + end + end, + B2 = if F2 == undefined -> B1; + true -> + begin + TrF2 = id(F2, TrUserData), + if TrF2 =:= 0 -> B1; + true -> e_varint(TrF2, <>, TrUserData) + end + end + end, + if F3 == undefined -> B2; + true -> + begin + TrF3 = id(F3, TrUserData), + case iolist_size(TrF3) of + 0 -> B2; + _ -> e_type_bytes(TrF3, <>, TrUserData) + end + end end. encode_msg_sdl_nat_changed_event(Msg, TrUserData) -> encode_msg_sdl_nat_changed_event(Msg, <<>>, TrUserData). @@ -634,6 +709,39 @@ encode_msg_sdl_stun_request(#sdl_stun_request{client_id = F1, network_id = F2, m end end. +encode_msg_sdl_stun_reply(Msg, TrUserData) -> encode_msg_sdl_stun_reply(Msg, <<>>, TrUserData). + + +encode_msg_sdl_stun_reply(#sdl_stun_reply{network_id = F1, code = F2, message = F3}, Bin, TrUserData) -> + B1 = if F1 == undefined -> Bin; + true -> + begin + TrF1 = id(F1, TrUserData), + if TrF1 =:= 0 -> Bin; + true -> e_varint(TrF1, <>, TrUserData) + end + end + end, + B2 = if F2 == undefined -> B1; + true -> + begin + TrF2 = id(F2, TrUserData), + if TrF2 =:= 0 -> B1; + true -> e_varint(TrF2, <>, TrUserData) + end + end + end, + if F3 == undefined -> B2; + true -> + begin + TrF3 = id(F3, TrUserData), + case is_empty_string(TrF3) of + true -> B2; + false -> e_type_string(TrF3, <>, TrUserData) + end + end + end. + encode_msg_sdl_data(Msg, TrUserData) -> encode_msg_sdl_data(Msg, <<>>, TrUserData). @@ -1066,12 +1174,14 @@ decode_msg_2_doit(sdl_register_super_ack, Bin, TrUserData) -> id(decode_msg_sdl_ decode_msg_2_doit(sdl_register_super_nak, Bin, TrUserData) -> id(decode_msg_sdl_register_super_nak(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_query_info, Bin, TrUserData) -> id(decode_msg_sdl_query_info(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_peer_info, Bin, TrUserData) -> id(decode_msg_sdl_peer_info(Bin, TrUserData), TrUserData); +decode_msg_2_doit(sdl_empty_peer_info, Bin, TrUserData) -> id(decode_msg_sdl_empty_peer_info(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_nat_changed_event, Bin, TrUserData) -> id(decode_msg_sdl_nat_changed_event(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_drop_macs_event, Bin, TrUserData) -> id(decode_msg_sdl_drop_macs_event(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_refresh_auth_event, Bin, TrUserData) -> id(decode_msg_sdl_refresh_auth_event(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_send_register_event, Bin, TrUserData) -> id(decode_msg_sdl_send_register_event(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_network_shutdown_event, Bin, TrUserData) -> id(decode_msg_sdl_network_shutdown_event(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_stun_request, Bin, TrUserData) -> id(decode_msg_sdl_stun_request(Bin, TrUserData), TrUserData); +decode_msg_2_doit(sdl_stun_reply, Bin, TrUserData) -> id(decode_msg_sdl_stun_reply(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_data, Bin, TrUserData) -> id(decode_msg_sdl_data(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_register, Bin, TrUserData) -> id(decode_msg_sdl_register(Bin, TrUserData), TrUserData); decode_msg_2_doit(sdl_register_ack, Bin, TrUserData) -> id(decode_msg_sdl_register_ack(Bin, TrUserData), TrUserData); @@ -1195,7 +1305,7 @@ decode_msg_sdl_register_super(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(0, 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, F@_9, 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, F@_9, TrUserData); + d_field_sdl_register_super_pkt_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, 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, F@_9, 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, F@_9, TrUserData); dfp_read_field_def_sdl_register_super(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, TrUserData) -> @@ -1213,7 +1323,7 @@ dfp_read_field_def_sdl_register_super(<<66, Rest/binary>>, Z1, Z2, F, F@_1, F@_2 dfp_read_field_def_sdl_register_super(<<74, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, TrUserData) -> d_field_sdl_register_super_access_token(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, 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, F@_9, _) -> - #sdl_register_super{version = F@_1, client_id = F@_2, network_id = F@_3, mac = F@_4, ip = F@_5, mask_len = F@_6, hostname = F@_7, pub_key = F@_8, access_token = F@_9}; + #sdl_register_super{pkt_id = F@_1, client_id = F@_2, network_id = F@_3, mac = F@_4, ip = F@_5, mask_len = F@_6, hostname = F@_7, pub_key = F@_8, access_token = F@_9}; 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, F@_9, 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, F@_9, 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, F@_9, TrUserData) when N < 32 - 7 -> @@ -1221,7 +1331,7 @@ dg_read_field_def_sdl_register_super(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, 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, F@_9, TrUserData) -> Key = X bsl N + Acc, 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, F@_9, TrUserData); + 8 -> d_field_sdl_register_super_pkt_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, TrUserData); 18 -> 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, F@_9, TrUserData); 24 -> 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, F@_8, F@_9, TrUserData); 34 -> d_field_sdl_register_super_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, TrUserData); @@ -1240,11 +1350,11 @@ dg_read_field_def_sdl_register_super(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, 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, F@_9, _) -> - #sdl_register_super{version = F@_1, client_id = F@_2, network_id = F@_3, mac = F@_4, ip = F@_5, mask_len = F@_6, hostname = F@_7, pub_key = F@_8, access_token = F@_9}. + #sdl_register_super{pkt_id = F@_1, client_id = F@_2, network_id = F@_3, mac = F@_4, ip = F@_5, mask_len = F@_6, hostname = F@_7, pub_key = F@_8, access_token = F@_9}. -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, F@_9, 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, F@_9, 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, F@_9, TrUserData) -> +d_field_sdl_register_super_pkt_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, F@_9, TrUserData) when N < 57 -> + d_field_sdl_register_super_pkt_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, F@_9, TrUserData); +d_field_sdl_register_super_pkt_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, TrUserData) -> {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, F@_9, TrUserData). @@ -1318,229 +1428,242 @@ skip_32_sdl_register_super(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F 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, F@_9, 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, F@_9, TrUserData). -decode_msg_sdl_register_super_ack(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData). +decode_msg_sdl_register_super_ack(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData). -dfp_read_field_def_sdl_register_super_ack(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_sdl_register_super_ack_aes_key(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData); -dfp_read_field_def_sdl_register_super_ack(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_sdl_register_super_ack_session_token(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData); -dfp_read_field_def_sdl_register_super_ack(<<>>, 0, 0, _, F@_1, F@_2, _) -> #sdl_register_super_ack{aes_key = F@_1, session_token = F@_2}; -dfp_read_field_def_sdl_register_super_ack(Other, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dg_read_field_def_sdl_register_super_ack(Other, Z1, Z2, F, F@_1, F@_2, TrUserData). +dfp_read_field_def_sdl_register_super_ack(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_super_ack_pkt_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_register_super_ack(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_super_ack_aes_key(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_register_super_ack(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_super_ack_session_token(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_register_super_ack(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register_super_ack{pkt_id = F@_1, aes_key = F@_2, session_token = F@_3}; +dfp_read_field_def_sdl_register_super_ack(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_sdl_register_super_ack(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -dg_read_field_def_sdl_register_super_ack(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_register_super_ack(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData); -dg_read_field_def_sdl_register_super_ack(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, TrUserData) -> +dg_read_field_def_sdl_register_super_ack(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_register_super_ack(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +dg_read_field_def_sdl_register_super_ack(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) -> Key = X bsl N + Acc, case Key of - 10 -> d_field_sdl_register_super_ack_aes_key(Rest, 0, 0, 0, F@_1, F@_2, TrUserData); - 18 -> d_field_sdl_register_super_ack_session_token(Rest, 0, 0, 0, F@_1, F@_2, TrUserData); + 8 -> d_field_sdl_register_super_ack_pkt_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 18 -> d_field_sdl_register_super_ack_aes_key(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 26 -> d_field_sdl_register_super_ack_session_token(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); _ -> case Key band 7 of - 0 -> skip_varint_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData); - 1 -> skip_64_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData); - 2 -> skip_length_delimited_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData); - 3 -> skip_group_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData); - 5 -> skip_32_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData) + 0 -> skip_varint_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 1 -> skip_64_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 2 -> skip_length_delimited_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 3 -> skip_group_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 5 -> skip_32_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData) end end; -dg_read_field_def_sdl_register_super_ack(<<>>, 0, 0, _, F@_1, F@_2, _) -> #sdl_register_super_ack{aes_key = F@_1, session_token = F@_2}. +dg_read_field_def_sdl_register_super_ack(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register_super_ack{pkt_id = F@_1, aes_key = F@_2, session_token = F@_3}. -d_field_sdl_register_super_ack_aes_key(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_aes_key(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData); -d_field_sdl_register_super_ack_aes_key(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, TrUserData) -> +d_field_sdl_register_super_ack_pkt_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_pkt_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_register_super_ack_pkt_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}, + dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData). + +d_field_sdl_register_super_ack_aes_key(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_aes_key(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_register_super_ack_aes_key(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, NewFValue, F@_2, TrUserData). + dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, F@_1, NewFValue, F@_3, TrUserData). -d_field_sdl_register_super_ack_session_token(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_session_token(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData); -d_field_sdl_register_super_ack_session_token(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, TrUserData) -> +d_field_sdl_register_super_ack_session_token(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_session_token(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_register_super_ack_session_token(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, F@_1, NewFValue, TrUserData). + dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, F@_1, F@_2, NewFValue, TrUserData). -skip_varint_sdl_register_super_ack(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> skip_varint_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData); -skip_varint_sdl_register_super_ack(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData). +skip_varint_sdl_register_super_ack(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> skip_varint_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +skip_varint_sdl_register_super_ack(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -skip_length_delimited_sdl_register_super_ack(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> skip_length_delimited_sdl_register_super_ack(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData); -skip_length_delimited_sdl_register_super_ack(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) -> +skip_length_delimited_sdl_register_super_ack(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> skip_length_delimited_sdl_register_super_ack(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +skip_length_delimited_sdl_register_super_ack(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) -> Length = X bsl N + Acc, <<_:Length/binary, Rest2/binary>> = Rest, - dfp_read_field_def_sdl_register_super_ack(Rest2, 0, 0, F, F@_1, F@_2, TrUserData). + dfp_read_field_def_sdl_register_super_ack(Rest2, 0, 0, F, F@_1, F@_2, F@_3, TrUserData). -skip_group_sdl_register_super_ack(Bin, _, Z2, FNum, F@_1, F@_2, TrUserData) -> +skip_group_sdl_register_super_ack(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, TrUserData) -> {_, Rest} = read_group(Bin, FNum), - dfp_read_field_def_sdl_register_super_ack(Rest, 0, Z2, FNum, F@_1, F@_2, TrUserData). + dfp_read_field_def_sdl_register_super_ack(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, TrUserData). -skip_32_sdl_register_super_ack(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData). +skip_32_sdl_register_super_ack(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -skip_64_sdl_register_super_ack(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData). +skip_64_sdl_register_super_ack(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -decode_msg_sdl_register_super_nak(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super_nak(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), TrUserData). +decode_msg_sdl_register_super_nak(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super_nak(Bin, 0, 0, 0, id(0, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), TrUserData). -dfp_read_field_def_sdl_register_super_nak(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_sdl_register_super_nak_error_code(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData); -dfp_read_field_def_sdl_register_super_nak(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> d_field_sdl_register_super_nak_error_message(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData); -dfp_read_field_def_sdl_register_super_nak(<<>>, 0, 0, _, F@_1, F@_2, _) -> #sdl_register_super_nak{error_code = F@_1, error_message = F@_2}; -dfp_read_field_def_sdl_register_super_nak(Other, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dg_read_field_def_sdl_register_super_nak(Other, Z1, Z2, F, F@_1, F@_2, TrUserData). +dfp_read_field_def_sdl_register_super_nak(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_super_nak_pkt_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_register_super_nak(<<16, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_super_nak_error_code(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_register_super_nak(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_super_nak_error_message(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_register_super_nak(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register_super_nak{pkt_id = F@_1, error_code = F@_2, error_message = F@_3}; +dfp_read_field_def_sdl_register_super_nak(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_sdl_register_super_nak(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -dg_read_field_def_sdl_register_super_nak(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_register_super_nak(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData); -dg_read_field_def_sdl_register_super_nak(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, TrUserData) -> +dg_read_field_def_sdl_register_super_nak(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_register_super_nak(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +dg_read_field_def_sdl_register_super_nak(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) -> Key = X bsl N + Acc, case Key of - 8 -> d_field_sdl_register_super_nak_error_code(Rest, 0, 0, 0, F@_1, F@_2, TrUserData); - 18 -> d_field_sdl_register_super_nak_error_message(Rest, 0, 0, 0, F@_1, F@_2, TrUserData); + 8 -> d_field_sdl_register_super_nak_pkt_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 16 -> d_field_sdl_register_super_nak_error_code(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 26 -> d_field_sdl_register_super_nak_error_message(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); _ -> case Key band 7 of - 0 -> skip_varint_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData); - 1 -> skip_64_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData); - 2 -> skip_length_delimited_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData); - 3 -> skip_group_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData); - 5 -> skip_32_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, TrUserData) + 0 -> skip_varint_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 1 -> skip_64_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 2 -> skip_length_delimited_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 3 -> skip_group_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 5 -> skip_32_sdl_register_super_nak(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData) end end; -dg_read_field_def_sdl_register_super_nak(<<>>, 0, 0, _, F@_1, F@_2, _) -> #sdl_register_super_nak{error_code = F@_1, error_message = F@_2}. +dg_read_field_def_sdl_register_super_nak(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register_super_nak{pkt_id = F@_1, error_code = F@_2, error_message = F@_3}. -d_field_sdl_register_super_nak_error_code(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_sdl_register_super_nak_error_code(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData); -d_field_sdl_register_super_nak_error_code(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, TrUserData) -> +d_field_sdl_register_super_nak_pkt_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_super_nak_pkt_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_register_super_nak_pkt_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}, - dfp_read_field_def_sdl_register_super_nak(RestF, 0, 0, F, NewFValue, F@_2, TrUserData). + dfp_read_field_def_sdl_register_super_nak(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData). -d_field_sdl_register_super_nak_error_message(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> d_field_sdl_register_super_nak_error_message(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData); -d_field_sdl_register_super_nak_error_message(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, TrUserData) -> +d_field_sdl_register_super_nak_error_code(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_super_nak_error_code(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_register_super_nak_error_code(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, TrUserData) -> + {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, + dfp_read_field_def_sdl_register_super_nak(RestF, 0, 0, F, F@_1, NewFValue, F@_3, TrUserData). + +d_field_sdl_register_super_nak_error_message(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_super_nak_error_message(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_register_super_nak_error_message(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_sdl_register_super_nak(RestF, 0, 0, F, F@_1, NewFValue, TrUserData). + dfp_read_field_def_sdl_register_super_nak(RestF, 0, 0, F, F@_1, F@_2, NewFValue, TrUserData). -skip_varint_sdl_register_super_nak(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> skip_varint_sdl_register_super_nak(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData); -skip_varint_sdl_register_super_nak(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_sdl_register_super_nak(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData). +skip_varint_sdl_register_super_nak(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> skip_varint_sdl_register_super_nak(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +skip_varint_sdl_register_super_nak(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_super_nak(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -skip_length_delimited_sdl_register_super_nak(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) when N < 57 -> skip_length_delimited_sdl_register_super_nak(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, TrUserData); -skip_length_delimited_sdl_register_super_nak(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, TrUserData) -> +skip_length_delimited_sdl_register_super_nak(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> skip_length_delimited_sdl_register_super_nak(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +skip_length_delimited_sdl_register_super_nak(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) -> Length = X bsl N + Acc, <<_:Length/binary, Rest2/binary>> = Rest, - dfp_read_field_def_sdl_register_super_nak(Rest2, 0, 0, F, F@_1, F@_2, TrUserData). + dfp_read_field_def_sdl_register_super_nak(Rest2, 0, 0, F, F@_1, F@_2, F@_3, TrUserData). -skip_group_sdl_register_super_nak(Bin, _, Z2, FNum, F@_1, F@_2, TrUserData) -> +skip_group_sdl_register_super_nak(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, TrUserData) -> {_, Rest} = read_group(Bin, FNum), - dfp_read_field_def_sdl_register_super_nak(Rest, 0, Z2, FNum, F@_1, F@_2, TrUserData). + dfp_read_field_def_sdl_register_super_nak(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, TrUserData). -skip_32_sdl_register_super_nak(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_sdl_register_super_nak(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData). +skip_32_sdl_register_super_nak(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_super_nak(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -skip_64_sdl_register_super_nak(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, TrUserData) -> dfp_read_field_def_sdl_register_super_nak(Rest, Z1, Z2, F, F@_1, F@_2, TrUserData). +skip_64_sdl_register_super_nak(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_super_nak(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -decode_msg_sdl_query_info(Bin, TrUserData) -> dfp_read_field_def_sdl_query_info(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData). +decode_msg_sdl_query_info(Bin, TrUserData) -> dfp_read_field_def_sdl_query_info(Bin, 0, 0, 0, id(0, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData). -dfp_read_field_def_sdl_query_info(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_query_info_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_query_info(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_query_info_src_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_query_info(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_query_info_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_query_info(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_query_info_session_token(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_query_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_query_info{network_id = F@_1, src_mac = F@_2, dst_mac = F@_3, session_token = F@_4}; -dfp_read_field_def_sdl_query_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dg_read_field_def_sdl_query_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData). +dfp_read_field_def_sdl_query_info(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_query_info_pkt_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_query_info(<<16, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_query_info_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_query_info(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_query_info_src_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_query_info(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_query_info_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_query_info(<<42, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_query_info_session_token(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_query_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, _) -> #sdl_query_info{pkt_id = F@_1, network_id = F@_2, src_mac = F@_3, dst_mac = F@_4, session_token = F@_5}; +dfp_read_field_def_sdl_query_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dg_read_field_def_sdl_query_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -dg_read_field_def_sdl_query_info(<<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_query_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dg_read_field_def_sdl_query_info(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, TrUserData) -> +dg_read_field_def_sdl_query_info(<<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_query_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dg_read_field_def_sdl_query_info(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> Key = X bsl N + Acc, case Key of - 8 -> d_field_sdl_query_info_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); - 18 -> d_field_sdl_query_info_src_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); - 26 -> d_field_sdl_query_info_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); - 34 -> d_field_sdl_query_info_session_token(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); + 8 -> d_field_sdl_query_info_pkt_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 16 -> d_field_sdl_query_info_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 26 -> d_field_sdl_query_info_src_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 34 -> d_field_sdl_query_info_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 42 -> d_field_sdl_query_info_session_token(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); _ -> case Key band 7 of - 0 -> skip_varint_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData); - 1 -> skip_64_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData); - 2 -> skip_length_delimited_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData); - 3 -> skip_group_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData); - 5 -> skip_32_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData) + 0 -> skip_varint_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 1 -> skip_64_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 2 -> skip_length_delimited_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 3 -> skip_group_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 5 -> skip_32_sdl_query_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) end end; -dg_read_field_def_sdl_query_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_query_info{network_id = F@_1, src_mac = F@_2, dst_mac = F@_3, session_token = F@_4}. +dg_read_field_def_sdl_query_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, _) -> #sdl_query_info{pkt_id = F@_1, network_id = F@_2, src_mac = F@_3, dst_mac = F@_4, session_token = F@_5}. -d_field_sdl_query_info_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_query_info_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_query_info_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, TrUserData) -> +d_field_sdl_query_info_pkt_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_query_info_pkt_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_query_info_pkt_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, TrUserData) -> {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, - dfp_read_field_def_sdl_query_info(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, TrUserData). + dfp_read_field_def_sdl_query_info(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, TrUserData). -d_field_sdl_query_info_src_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_query_info_src_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_query_info_src_mac(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, TrUserData) -> +d_field_sdl_query_info_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_query_info_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_query_info_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, F@_5, TrUserData) -> + {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, + dfp_read_field_def_sdl_query_info(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, F@_5, TrUserData). + +d_field_sdl_query_info_src_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_query_info_src_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_query_info_src_mac(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_sdl_query_info(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, TrUserData). + dfp_read_field_def_sdl_query_info(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, TrUserData). -d_field_sdl_query_info_dst_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_query_info_dst_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_query_info_dst_mac(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, TrUserData) -> +d_field_sdl_query_info_dst_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_query_info_dst_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_query_info_dst_mac(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, F@_5, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_sdl_query_info(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, TrUserData). + dfp_read_field_def_sdl_query_info(RestF, 0, 0, F, F@_1, F@_2, F@_3, NewFValue, F@_5, TrUserData). -d_field_sdl_query_info_session_token(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_query_info_session_token(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_query_info_session_token(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, TrUserData) -> +d_field_sdl_query_info_session_token(<<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_query_info_session_token(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_query_info_session_token(<<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, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_sdl_query_info(RestF, 0, 0, F, F@_1, F@_2, F@_3, NewFValue, TrUserData). + dfp_read_field_def_sdl_query_info(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, NewFValue, TrUserData). -skip_varint_sdl_query_info(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> skip_varint_sdl_query_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -skip_varint_sdl_query_info(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_sdl_query_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData). +skip_varint_sdl_query_info(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> skip_varint_sdl_query_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +skip_varint_sdl_query_info(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_query_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_length_delimited_sdl_query_info(<<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_query_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -skip_length_delimited_sdl_query_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> +skip_length_delimited_sdl_query_info(<<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_query_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +skip_length_delimited_sdl_query_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> Length = X bsl N + Acc, <<_:Length/binary, Rest2/binary>> = Rest, - dfp_read_field_def_sdl_query_info(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, TrUserData). + dfp_read_field_def_sdl_query_info(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_group_sdl_query_info(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData) -> +skip_group_sdl_query_info(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> {_, Rest} = read_group(Bin, FNum), - dfp_read_field_def_sdl_query_info(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData). + dfp_read_field_def_sdl_query_info(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_32_sdl_query_info(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_sdl_query_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData). +skip_32_sdl_query_info(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_query_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_64_sdl_query_info(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_sdl_query_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData). +skip_64_sdl_query_info(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_query_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -decode_msg_sdl_peer_info(Bin, TrUserData) -> dfp_read_field_def_sdl_peer_info(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(undefined, TrUserData), id(undefined, TrUserData), TrUserData). +decode_msg_sdl_peer_info(Bin, TrUserData) -> dfp_read_field_def_sdl_peer_info(Bin, 0, 0, 0, id(0, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), id(undefined, TrUserData), id(undefined, TrUserData), TrUserData). -dfp_read_field_def_sdl_peer_info(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_peer_info_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_peer_info(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_peer_info_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_peer_info(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_peer_info_v4_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_peer_info(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_peer_info_v6_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_peer_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_peer_info{network_id = F@_1, dst_mac = F@_2, v4_info = F@_3, v6_info = F@_4}; -dfp_read_field_def_sdl_peer_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dg_read_field_def_sdl_peer_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData). +dfp_read_field_def_sdl_peer_info(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_peer_info_pkt_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_peer_info(<<16, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_peer_info_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_peer_info(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_peer_info_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_peer_info(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_peer_info_v4_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_peer_info(<<42, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_peer_info_v6_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_peer_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, _) -> #sdl_peer_info{pkt_id = F@_1, network_id = F@_2, dst_mac = F@_3, v4_info = F@_4, v6_info = F@_5}; +dfp_read_field_def_sdl_peer_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dg_read_field_def_sdl_peer_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -dg_read_field_def_sdl_peer_info(<<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_peer_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dg_read_field_def_sdl_peer_info(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, TrUserData) -> +dg_read_field_def_sdl_peer_info(<<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_peer_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dg_read_field_def_sdl_peer_info(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> Key = X bsl N + Acc, case Key of - 8 -> d_field_sdl_peer_info_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); - 18 -> d_field_sdl_peer_info_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); - 26 -> d_field_sdl_peer_info_v4_info(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); - 34 -> d_field_sdl_peer_info_v6_info(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); + 8 -> d_field_sdl_peer_info_pkt_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 16 -> d_field_sdl_peer_info_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 26 -> d_field_sdl_peer_info_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 34 -> d_field_sdl_peer_info_v4_info(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 42 -> d_field_sdl_peer_info_v6_info(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); _ -> case Key band 7 of - 0 -> skip_varint_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData); - 1 -> skip_64_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData); - 2 -> skip_length_delimited_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData); - 3 -> skip_group_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData); - 5 -> skip_32_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData) + 0 -> skip_varint_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 1 -> skip_64_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 2 -> skip_length_delimited_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 3 -> skip_group_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 5 -> skip_32_sdl_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) end end; -dg_read_field_def_sdl_peer_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_peer_info{network_id = F@_1, dst_mac = F@_2, v4_info = F@_3, v6_info = F@_4}. +dg_read_field_def_sdl_peer_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, _) -> #sdl_peer_info{pkt_id = F@_1, network_id = F@_2, dst_mac = F@_3, v4_info = F@_4, v6_info = F@_5}. -d_field_sdl_peer_info_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_peer_info_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_peer_info_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, TrUserData) -> +d_field_sdl_peer_info_pkt_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_peer_info_pkt_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_peer_info_pkt_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, TrUserData) -> {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, - dfp_read_field_def_sdl_peer_info(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, TrUserData). + dfp_read_field_def_sdl_peer_info(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, TrUserData). -d_field_sdl_peer_info_dst_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_peer_info_dst_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_peer_info_dst_mac(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, TrUserData) -> +d_field_sdl_peer_info_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_peer_info_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_peer_info_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, F@_5, TrUserData) -> + {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, + dfp_read_field_def_sdl_peer_info(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, F@_5, TrUserData). + +d_field_sdl_peer_info_dst_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_peer_info_dst_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_peer_info_dst_mac(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_sdl_peer_info(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, TrUserData). + dfp_read_field_def_sdl_peer_info(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, TrUserData). -d_field_sdl_peer_info_v4_info(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_peer_info_v4_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_peer_info_v4_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, Prev, F@_4, TrUserData) -> +d_field_sdl_peer_info_v4_info(<<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_peer_info_v4_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_peer_info_v4_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, Prev, F@_5, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, {id(decode_msg_sdl_v4_info(Bs, TrUserData), TrUserData), Rest2} end, - dfp_read_field_def_sdl_peer_info(RestF, - 0, - 0, - F, - F@_1, - F@_2, - if Prev == undefined -> NewFValue; - true -> merge_msg_sdl_v4_info(Prev, NewFValue, TrUserData) - end, - F@_4, - TrUserData). - -d_field_sdl_peer_info_v6_info(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_peer_info_v6_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_peer_info_v6_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, Prev, TrUserData) -> - {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, {id(decode_msg_sdl_v6_info(Bs, TrUserData), TrUserData), Rest2} end, dfp_read_field_def_sdl_peer_info(RestF, 0, 0, @@ -1548,27 +1671,102 @@ d_field_sdl_peer_info_v6_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_1, F@_2, F@_3, + if Prev == undefined -> NewFValue; + true -> merge_msg_sdl_v4_info(Prev, NewFValue, TrUserData) + end, + F@_5, + TrUserData). + +d_field_sdl_peer_info_v6_info(<<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_peer_info_v6_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_peer_info_v6_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, Prev, TrUserData) -> + {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, {id(decode_msg_sdl_v6_info(Bs, TrUserData), TrUserData), Rest2} end, + dfp_read_field_def_sdl_peer_info(RestF, + 0, + 0, + F, + F@_1, + F@_2, + F@_3, + F@_4, if Prev == undefined -> NewFValue; true -> merge_msg_sdl_v6_info(Prev, NewFValue, TrUserData) end, TrUserData). -skip_varint_sdl_peer_info(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> skip_varint_sdl_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -skip_varint_sdl_peer_info(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_sdl_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData). +skip_varint_sdl_peer_info(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> skip_varint_sdl_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +skip_varint_sdl_peer_info(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_length_delimited_sdl_peer_info(<<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_peer_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -skip_length_delimited_sdl_peer_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> +skip_length_delimited_sdl_peer_info(<<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_peer_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +skip_length_delimited_sdl_peer_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> Length = X bsl N + Acc, <<_:Length/binary, Rest2/binary>> = Rest, - dfp_read_field_def_sdl_peer_info(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, TrUserData). + dfp_read_field_def_sdl_peer_info(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_group_sdl_peer_info(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData) -> +skip_group_sdl_peer_info(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> {_, Rest} = read_group(Bin, FNum), - dfp_read_field_def_sdl_peer_info(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, TrUserData). + dfp_read_field_def_sdl_peer_info(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_32_sdl_peer_info(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_sdl_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData). +skip_32_sdl_peer_info(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_64_sdl_peer_info(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dfp_read_field_def_sdl_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData). +skip_64_sdl_peer_info(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). + +decode_msg_sdl_empty_peer_info(Bin, TrUserData) -> dfp_read_field_def_sdl_empty_peer_info(Bin, 0, 0, 0, id(0, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), TrUserData). + +dfp_read_field_def_sdl_empty_peer_info(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_empty_peer_info_pkt_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_empty_peer_info(<<16, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_empty_peer_info_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_empty_peer_info(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_empty_peer_info_dst_mac(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_empty_peer_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_empty_peer_info{pkt_id = F@_1, network_id = F@_2, dst_mac = F@_3}; +dfp_read_field_def_sdl_empty_peer_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_sdl_empty_peer_info(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). + +dg_read_field_def_sdl_empty_peer_info(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_empty_peer_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +dg_read_field_def_sdl_empty_peer_info(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) -> + Key = X bsl N + Acc, + case Key of + 8 -> d_field_sdl_empty_peer_info_pkt_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 16 -> d_field_sdl_empty_peer_info_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 26 -> d_field_sdl_empty_peer_info_dst_mac(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + _ -> + case Key band 7 of + 0 -> skip_varint_sdl_empty_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 1 -> skip_64_sdl_empty_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 2 -> skip_length_delimited_sdl_empty_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 3 -> skip_group_sdl_empty_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 5 -> skip_32_sdl_empty_peer_info(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData) + end + end; +dg_read_field_def_sdl_empty_peer_info(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_empty_peer_info{pkt_id = F@_1, network_id = F@_2, dst_mac = F@_3}. + +d_field_sdl_empty_peer_info_pkt_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_empty_peer_info_pkt_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_empty_peer_info_pkt_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}, + dfp_read_field_def_sdl_empty_peer_info(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData). + +d_field_sdl_empty_peer_info_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_empty_peer_info_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_empty_peer_info_network_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, TrUserData) -> + {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, + dfp_read_field_def_sdl_empty_peer_info(RestF, 0, 0, F, F@_1, NewFValue, F@_3, TrUserData). + +d_field_sdl_empty_peer_info_dst_mac(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_empty_peer_info_dst_mac(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_empty_peer_info_dst_mac(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, TrUserData) -> + {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, + dfp_read_field_def_sdl_empty_peer_info(RestF, 0, 0, F, F@_1, F@_2, NewFValue, TrUserData). + +skip_varint_sdl_empty_peer_info(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> skip_varint_sdl_empty_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +skip_varint_sdl_empty_peer_info(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_empty_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). + +skip_length_delimited_sdl_empty_peer_info(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> skip_length_delimited_sdl_empty_peer_info(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +skip_length_delimited_sdl_empty_peer_info(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) -> + Length = X bsl N + Acc, + <<_:Length/binary, Rest2/binary>> = Rest, + dfp_read_field_def_sdl_empty_peer_info(Rest2, 0, 0, F, F@_1, F@_2, F@_3, TrUserData). + +skip_group_sdl_empty_peer_info(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, TrUserData) -> + {_, Rest} = read_group(Bin, FNum), + dfp_read_field_def_sdl_empty_peer_info(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, TrUserData). + +skip_32_sdl_empty_peer_info(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_empty_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). + +skip_64_sdl_empty_peer_info(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_empty_peer_info(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). decode_msg_sdl_nat_changed_event(Bin, TrUserData) -> dfp_read_field_def_sdl_nat_changed_event(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), TrUserData). @@ -1980,6 +2178,64 @@ skip_32_sdl_stun_request(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_ skip_64_sdl_stun_request(<<_: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_stun_request(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData). +decode_msg_sdl_stun_reply(Bin, TrUserData) -> dfp_read_field_def_sdl_stun_reply(Bin, 0, 0, 0, id(0, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), TrUserData). + +dfp_read_field_def_sdl_stun_reply(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_stun_reply_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_stun_reply(<<16, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_stun_reply_code(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_stun_reply(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_stun_reply_message(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_stun_reply(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_stun_reply{network_id = F@_1, code = F@_2, message = F@_3}; +dfp_read_field_def_sdl_stun_reply(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_sdl_stun_reply(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). + +dg_read_field_def_sdl_stun_reply(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_stun_reply(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +dg_read_field_def_sdl_stun_reply(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) -> + Key = X bsl N + Acc, + case Key of + 8 -> d_field_sdl_stun_reply_network_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 16 -> d_field_sdl_stun_reply_code(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 26 -> d_field_sdl_stun_reply_message(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + _ -> + case Key band 7 of + 0 -> skip_varint_sdl_stun_reply(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 1 -> skip_64_sdl_stun_reply(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 2 -> skip_length_delimited_sdl_stun_reply(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 3 -> skip_group_sdl_stun_reply(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 5 -> skip_32_sdl_stun_reply(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData) + end + end; +dg_read_field_def_sdl_stun_reply(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_stun_reply{network_id = F@_1, code = F@_2, message = F@_3}. + +d_field_sdl_stun_reply_network_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_stun_reply_network_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_stun_reply_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}, + dfp_read_field_def_sdl_stun_reply(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData). + +d_field_sdl_stun_reply_code(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_stun_reply_code(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_stun_reply_code(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, TrUserData) -> + {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, + dfp_read_field_def_sdl_stun_reply(RestF, 0, 0, F, F@_1, NewFValue, F@_3, TrUserData). + +d_field_sdl_stun_reply_message(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_stun_reply_message(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_stun_reply_message(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, TrUserData) -> + {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, + dfp_read_field_def_sdl_stun_reply(RestF, 0, 0, F, F@_1, F@_2, NewFValue, TrUserData). + +skip_varint_sdl_stun_reply(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> skip_varint_sdl_stun_reply(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +skip_varint_sdl_stun_reply(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_stun_reply(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). + +skip_length_delimited_sdl_stun_reply(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> skip_length_delimited_sdl_stun_reply(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +skip_length_delimited_sdl_stun_reply(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) -> + Length = X bsl N + Acc, + <<_:Length/binary, Rest2/binary>> = Rest, + dfp_read_field_def_sdl_stun_reply(Rest2, 0, 0, F, F@_1, F@_2, F@_3, TrUserData). + +skip_group_sdl_stun_reply(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, TrUserData) -> + {_, Rest} = read_group(Bin, FNum), + dfp_read_field_def_sdl_stun_reply(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, TrUserData). + +skip_32_sdl_stun_reply(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_stun_reply(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). + +skip_64_sdl_stun_reply(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_stun_reply(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, 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), 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, F@_7, TrUserData) -> d_field_sdl_data_network_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, TrUserData); @@ -2482,12 +2738,14 @@ merge_msgs(Prev, New, MsgName, Opts) -> sdl_register_super_nak -> merge_msg_sdl_register_super_nak(Prev, New, TrUserData); sdl_query_info -> merge_msg_sdl_query_info(Prev, New, TrUserData); sdl_peer_info -> merge_msg_sdl_peer_info(Prev, New, TrUserData); + sdl_empty_peer_info -> merge_msg_sdl_empty_peer_info(Prev, New, TrUserData); sdl_nat_changed_event -> merge_msg_sdl_nat_changed_event(Prev, New, TrUserData); sdl_drop_macs_event -> merge_msg_sdl_drop_macs_event(Prev, New, TrUserData); sdl_refresh_auth_event -> merge_msg_sdl_refresh_auth_event(Prev, New, TrUserData); sdl_send_register_event -> merge_msg_sdl_send_register_event(Prev, New, TrUserData); sdl_network_shutdown_event -> merge_msg_sdl_network_shutdown_event(Prev, New, TrUserData); sdl_stun_request -> merge_msg_sdl_stun_request(Prev, New, TrUserData); + sdl_stun_reply -> merge_msg_sdl_stun_reply(Prev, New, TrUserData); sdl_data -> merge_msg_sdl_data(Prev, New, TrUserData); sdl_register -> merge_msg_sdl_register(Prev, New, TrUserData); sdl_register_ack -> merge_msg_sdl_register_ack(Prev, New, TrUserData); @@ -2524,11 +2782,11 @@ merge_msg_sdl_v6_info(#sdl_v6_info{port = PFport, v6 = PFv6}, #sdl_v6_info{port end}. -compile({nowarn_unused_function,merge_msg_sdl_register_super/3}). -merge_msg_sdl_register_super(#sdl_register_super{version = PFversion, client_id = PFclient_id, network_id = PFnetwork_id, mac = PFmac, ip = PFip, mask_len = PFmask_len, hostname = PFhostname, pub_key = PFpub_key, access_token = PFaccess_token}, - #sdl_register_super{version = NFversion, client_id = NFclient_id, network_id = NFnetwork_id, mac = NFmac, ip = NFip, mask_len = NFmask_len, hostname = NFhostname, pub_key = NFpub_key, access_token = NFaccess_token}, _) -> - #sdl_register_super{version = - if NFversion =:= undefined -> PFversion; - true -> NFversion +merge_msg_sdl_register_super(#sdl_register_super{pkt_id = PFpkt_id, client_id = PFclient_id, network_id = PFnetwork_id, mac = PFmac, ip = PFip, mask_len = PFmask_len, hostname = PFhostname, pub_key = PFpub_key, access_token = PFaccess_token}, + #sdl_register_super{pkt_id = NFpkt_id, client_id = NFclient_id, network_id = NFnetwork_id, mac = NFmac, ip = NFip, mask_len = NFmask_len, hostname = NFhostname, pub_key = NFpub_key, access_token = NFaccess_token}, _) -> + #sdl_register_super{pkt_id = + if NFpkt_id =:= undefined -> PFpkt_id; + true -> NFpkt_id end, client_id = if NFclient_id =:= undefined -> PFclient_id; @@ -2564,8 +2822,12 @@ merge_msg_sdl_register_super(#sdl_register_super{version = PFversion, client_id end}. -compile({nowarn_unused_function,merge_msg_sdl_register_super_ack/3}). -merge_msg_sdl_register_super_ack(#sdl_register_super_ack{aes_key = PFaes_key, session_token = PFsession_token}, #sdl_register_super_ack{aes_key = NFaes_key, session_token = NFsession_token}, _) -> - #sdl_register_super_ack{aes_key = +merge_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = PFpkt_id, aes_key = PFaes_key, session_token = PFsession_token}, #sdl_register_super_ack{pkt_id = NFpkt_id, aes_key = NFaes_key, session_token = NFsession_token}, _) -> + #sdl_register_super_ack{pkt_id = + if NFpkt_id =:= undefined -> PFpkt_id; + true -> NFpkt_id + end, + aes_key = if NFaes_key =:= undefined -> PFaes_key; true -> NFaes_key end, @@ -2575,8 +2837,12 @@ merge_msg_sdl_register_super_ack(#sdl_register_super_ack{aes_key = PFaes_key, se end}. -compile({nowarn_unused_function,merge_msg_sdl_register_super_nak/3}). -merge_msg_sdl_register_super_nak(#sdl_register_super_nak{error_code = PFerror_code, error_message = PFerror_message}, #sdl_register_super_nak{error_code = NFerror_code, error_message = NFerror_message}, _) -> - #sdl_register_super_nak{error_code = +merge_msg_sdl_register_super_nak(#sdl_register_super_nak{pkt_id = PFpkt_id, error_code = PFerror_code, error_message = PFerror_message}, #sdl_register_super_nak{pkt_id = NFpkt_id, error_code = NFerror_code, error_message = NFerror_message}, _) -> + #sdl_register_super_nak{pkt_id = + if NFpkt_id =:= undefined -> PFpkt_id; + true -> NFpkt_id + end, + error_code = if NFerror_code =:= undefined -> PFerror_code; true -> NFerror_code end, @@ -2586,9 +2852,13 @@ merge_msg_sdl_register_super_nak(#sdl_register_super_nak{error_code = PFerror_co end}. -compile({nowarn_unused_function,merge_msg_sdl_query_info/3}). -merge_msg_sdl_query_info(#sdl_query_info{network_id = PFnetwork_id, src_mac = PFsrc_mac, dst_mac = PFdst_mac, session_token = PFsession_token}, - #sdl_query_info{network_id = NFnetwork_id, src_mac = NFsrc_mac, dst_mac = NFdst_mac, session_token = NFsession_token}, _) -> - #sdl_query_info{network_id = +merge_msg_sdl_query_info(#sdl_query_info{pkt_id = PFpkt_id, network_id = PFnetwork_id, src_mac = PFsrc_mac, dst_mac = PFdst_mac, session_token = PFsession_token}, + #sdl_query_info{pkt_id = NFpkt_id, network_id = NFnetwork_id, src_mac = NFsrc_mac, dst_mac = NFdst_mac, session_token = NFsession_token}, _) -> + #sdl_query_info{pkt_id = + if NFpkt_id =:= undefined -> PFpkt_id; + true -> NFpkt_id + end, + network_id = if NFnetwork_id =:= undefined -> PFnetwork_id; true -> NFnetwork_id end, @@ -2606,8 +2876,13 @@ merge_msg_sdl_query_info(#sdl_query_info{network_id = PFnetwork_id, src_mac = PF end}. -compile({nowarn_unused_function,merge_msg_sdl_peer_info/3}). -merge_msg_sdl_peer_info(#sdl_peer_info{network_id = PFnetwork_id, dst_mac = PFdst_mac, v4_info = PFv4_info, v6_info = PFv6_info}, #sdl_peer_info{network_id = NFnetwork_id, dst_mac = NFdst_mac, v4_info = NFv4_info, v6_info = NFv6_info}, TrUserData) -> - #sdl_peer_info{network_id = +merge_msg_sdl_peer_info(#sdl_peer_info{pkt_id = PFpkt_id, network_id = PFnetwork_id, dst_mac = PFdst_mac, v4_info = PFv4_info, v6_info = PFv6_info}, + #sdl_peer_info{pkt_id = NFpkt_id, network_id = NFnetwork_id, dst_mac = NFdst_mac, v4_info = NFv4_info, v6_info = NFv6_info}, TrUserData) -> + #sdl_peer_info{pkt_id = + if NFpkt_id =:= undefined -> PFpkt_id; + true -> NFpkt_id + end, + network_id = if NFnetwork_id =:= undefined -> PFnetwork_id; true -> NFnetwork_id end, @@ -2626,6 +2901,21 @@ merge_msg_sdl_peer_info(#sdl_peer_info{network_id = PFnetwork_id, dst_mac = PFds NFv6_info == undefined -> PFv6_info end}. +-compile({nowarn_unused_function,merge_msg_sdl_empty_peer_info/3}). +merge_msg_sdl_empty_peer_info(#sdl_empty_peer_info{pkt_id = PFpkt_id, network_id = PFnetwork_id, dst_mac = PFdst_mac}, #sdl_empty_peer_info{pkt_id = NFpkt_id, network_id = NFnetwork_id, dst_mac = NFdst_mac}, _) -> + #sdl_empty_peer_info{pkt_id = + if NFpkt_id =:= undefined -> PFpkt_id; + true -> NFpkt_id + end, + network_id = + if NFnetwork_id =:= undefined -> PFnetwork_id; + true -> NFnetwork_id + end, + dst_mac = + if NFdst_mac =:= undefined -> PFdst_mac; + true -> NFdst_mac + end}. + -compile({nowarn_unused_function,merge_msg_sdl_nat_changed_event/3}). merge_msg_sdl_nat_changed_event(#sdl_nat_changed_event{network_id = PFnetwork_id, mac = PFmac, ip = PFip}, #sdl_nat_changed_event{network_id = NFnetwork_id, mac = NFmac, ip = NFip}, _) -> #sdl_nat_changed_event{network_id = @@ -2733,6 +3023,21 @@ merge_msg_sdl_stun_request(#sdl_stun_request{client_id = PFclient_id, network_id true -> NFsession_token end}. +-compile({nowarn_unused_function,merge_msg_sdl_stun_reply/3}). +merge_msg_sdl_stun_reply(#sdl_stun_reply{network_id = PFnetwork_id, code = PFcode, message = PFmessage}, #sdl_stun_reply{network_id = NFnetwork_id, code = NFcode, message = NFmessage}, _) -> + #sdl_stun_reply{network_id = + if NFnetwork_id =:= undefined -> PFnetwork_id; + true -> NFnetwork_id + end, + code = + if NFcode =:= undefined -> PFcode; + true -> NFcode + end, + message = + if NFmessage =:= undefined -> PFmessage; + true -> NFmessage + end}. + -compile({nowarn_unused_function,merge_msg_sdl_data/3}). merge_msg_sdl_data(#sdl_data{network_id = PFnetwork_id, src_mac = PFsrc_mac, dst_mac = PFdst_mac, is_p2p = PFis_p2p, ttl = PFttl, data = PFdata, session_token = PFsession_token}, #sdl_data{network_id = NFnetwork_id, src_mac = NFsrc_mac, dst_mac = NFdst_mac, is_p2p = NFis_p2p, ttl = NFttl, data = NFdata, session_token = NFsession_token}, _) -> @@ -2869,12 +3174,14 @@ verify_msg(Msg, MsgName, Opts) -> sdl_register_super_nak -> v_msg_sdl_register_super_nak(Msg, [MsgName], TrUserData); sdl_query_info -> v_msg_sdl_query_info(Msg, [MsgName], TrUserData); sdl_peer_info -> v_msg_sdl_peer_info(Msg, [MsgName], TrUserData); + sdl_empty_peer_info -> v_msg_sdl_empty_peer_info(Msg, [MsgName], TrUserData); sdl_nat_changed_event -> v_msg_sdl_nat_changed_event(Msg, [MsgName], TrUserData); sdl_drop_macs_event -> v_msg_sdl_drop_macs_event(Msg, [MsgName], TrUserData); sdl_refresh_auth_event -> v_msg_sdl_refresh_auth_event(Msg, [MsgName], TrUserData); sdl_send_register_event -> v_msg_sdl_send_register_event(Msg, [MsgName], TrUserData); sdl_network_shutdown_event -> v_msg_sdl_network_shutdown_event(Msg, [MsgName], TrUserData); sdl_stun_request -> v_msg_sdl_stun_request(Msg, [MsgName], TrUserData); + sdl_stun_reply -> v_msg_sdl_stun_reply(Msg, [MsgName], TrUserData); sdl_data -> v_msg_sdl_data(Msg, [MsgName], TrUserData); sdl_register -> v_msg_sdl_register(Msg, [MsgName], TrUserData); sdl_register_ack -> v_msg_sdl_register_ack(Msg, [MsgName], TrUserData); @@ -2923,9 +3230,9 @@ v_msg_sdl_v6_info(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_v6_i -compile({nowarn_unused_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, client_id = F2, network_id = F3, mac = F4, ip = F5, mask_len = F6, hostname = F7, pub_key = F8, access_token = F9}, Path, TrUserData) -> +v_msg_sdl_register_super(#sdl_register_super{pkt_id = F1, client_id = F2, network_id = F3, mac = F4, ip = F5, mask_len = F6, hostname = F7, pub_key = F8, access_token = F9}, Path, TrUserData) -> if F1 == undefined -> ok; - true -> v_type_uint32(F1, [version | Path], TrUserData) + true -> v_type_uint32(F1, [pkt_id | Path], TrUserData) end, if F2 == undefined -> ok; true -> v_type_string(F2, [client_id | Path], TrUserData) @@ -2956,64 +3263,91 @@ v_msg_sdl_register_super(X, Path, _TrUserData) -> mk_type_error({expected_msg, s -compile({nowarn_unused_function,v_msg_sdl_register_super_ack/3}). -dialyzer({nowarn_function,v_msg_sdl_register_super_ack/3}). -v_msg_sdl_register_super_ack(#sdl_register_super_ack{aes_key = F1, session_token = F2}, Path, TrUserData) -> +v_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = F1, aes_key = F2, session_token = F3}, Path, TrUserData) -> if F1 == undefined -> ok; - true -> v_type_bytes(F1, [aes_key | Path], TrUserData) + true -> v_type_uint32(F1, [pkt_id | Path], TrUserData) end, if F2 == undefined -> ok; - true -> v_type_bytes(F2, [session_token | Path], TrUserData) + true -> v_type_bytes(F2, [aes_key | Path], TrUserData) + end, + if F3 == undefined -> ok; + true -> v_type_bytes(F3, [session_token | Path], TrUserData) end, ok; v_msg_sdl_register_super_ack(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_register_super_ack}, X, Path). -compile({nowarn_unused_function,v_msg_sdl_register_super_nak/3}). -dialyzer({nowarn_function,v_msg_sdl_register_super_nak/3}). -v_msg_sdl_register_super_nak(#sdl_register_super_nak{error_code = F1, error_message = F2}, Path, TrUserData) -> +v_msg_sdl_register_super_nak(#sdl_register_super_nak{pkt_id = F1, error_code = F2, error_message = F3}, Path, TrUserData) -> if F1 == undefined -> ok; - true -> v_type_uint32(F1, [error_code | Path], TrUserData) + true -> v_type_uint32(F1, [pkt_id | Path], TrUserData) end, if F2 == undefined -> ok; - true -> v_type_string(F2, [error_message | Path], TrUserData) + true -> v_type_uint32(F2, [error_code | Path], TrUserData) + end, + if F3 == undefined -> ok; + true -> v_type_string(F3, [error_message | Path], TrUserData) end, ok; v_msg_sdl_register_super_nak(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_register_super_nak}, X, Path). -compile({nowarn_unused_function,v_msg_sdl_query_info/3}). -dialyzer({nowarn_function,v_msg_sdl_query_info/3}). -v_msg_sdl_query_info(#sdl_query_info{network_id = F1, src_mac = F2, dst_mac = F3, session_token = F4}, Path, TrUserData) -> +v_msg_sdl_query_info(#sdl_query_info{pkt_id = F1, network_id = F2, src_mac = F3, dst_mac = F4, session_token = F5}, Path, TrUserData) -> if F1 == undefined -> ok; - true -> v_type_uint32(F1, [network_id | Path], TrUserData) + true -> v_type_uint32(F1, [pkt_id | Path], TrUserData) end, if F2 == undefined -> ok; - true -> v_type_bytes(F2, [src_mac | Path], TrUserData) + true -> v_type_uint32(F2, [network_id | Path], TrUserData) end, if F3 == undefined -> ok; - true -> v_type_bytes(F3, [dst_mac | Path], TrUserData) + true -> v_type_bytes(F3, [src_mac | Path], TrUserData) end, if F4 == undefined -> ok; - true -> v_type_bytes(F4, [session_token | Path], TrUserData) + true -> v_type_bytes(F4, [dst_mac | Path], TrUserData) + end, + if F5 == undefined -> ok; + true -> v_type_bytes(F5, [session_token | Path], TrUserData) end, ok; v_msg_sdl_query_info(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_query_info}, X, Path). -compile({nowarn_unused_function,v_msg_sdl_peer_info/3}). -dialyzer({nowarn_function,v_msg_sdl_peer_info/3}). -v_msg_sdl_peer_info(#sdl_peer_info{network_id = F1, dst_mac = F2, v4_info = F3, v6_info = F4}, Path, TrUserData) -> +v_msg_sdl_peer_info(#sdl_peer_info{pkt_id = F1, network_id = F2, dst_mac = F3, v4_info = F4, v6_info = F5}, Path, TrUserData) -> if F1 == undefined -> ok; - true -> v_type_uint32(F1, [network_id | Path], TrUserData) + true -> v_type_uint32(F1, [pkt_id | Path], TrUserData) end, if F2 == undefined -> ok; - true -> v_type_bytes(F2, [dst_mac | Path], TrUserData) + true -> v_type_uint32(F2, [network_id | Path], TrUserData) end, if F3 == undefined -> ok; - true -> v_submsg_sdl_v4_info(F3, [v4_info | Path], TrUserData) + true -> v_type_bytes(F3, [dst_mac | Path], TrUserData) end, if F4 == undefined -> ok; - true -> v_submsg_sdl_v6_info(F4, [v6_info | Path], TrUserData) + true -> v_submsg_sdl_v4_info(F4, [v4_info | Path], TrUserData) + end, + if F5 == undefined -> ok; + true -> v_submsg_sdl_v6_info(F5, [v6_info | Path], TrUserData) end, ok; v_msg_sdl_peer_info(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_peer_info}, X, Path). +-compile({nowarn_unused_function,v_msg_sdl_empty_peer_info/3}). +-dialyzer({nowarn_function,v_msg_sdl_empty_peer_info/3}). +v_msg_sdl_empty_peer_info(#sdl_empty_peer_info{pkt_id = F1, network_id = F2, dst_mac = F3}, Path, TrUserData) -> + if F1 == undefined -> ok; + true -> v_type_uint32(F1, [pkt_id | Path], TrUserData) + end, + if F2 == undefined -> ok; + true -> v_type_uint32(F2, [network_id | Path], TrUserData) + end, + if F3 == undefined -> ok; + true -> v_type_bytes(F3, [dst_mac | Path], TrUserData) + end, + ok; +v_msg_sdl_empty_peer_info(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_empty_peer_info}, X, Path). + -compile({nowarn_unused_function,v_msg_sdl_nat_changed_event/3}). -dialyzer({nowarn_function,v_msg_sdl_nat_changed_event/3}). v_msg_sdl_nat_changed_event(#sdl_nat_changed_event{network_id = F1, mac = F2, ip = F3}, Path, TrUserData) -> @@ -3115,6 +3449,21 @@ v_msg_sdl_stun_request(#sdl_stun_request{client_id = F1, network_id = F2, mac = ok; v_msg_sdl_stun_request(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_stun_request}, X, Path). +-compile({nowarn_unused_function,v_msg_sdl_stun_reply/3}). +-dialyzer({nowarn_function,v_msg_sdl_stun_reply/3}). +v_msg_sdl_stun_reply(#sdl_stun_reply{network_id = F1, code = F2, message = F3}, Path, TrUserData) -> + if F1 == undefined -> ok; + true -> v_type_uint32(F1, [network_id | Path], TrUserData) + end, + if F2 == undefined -> ok; + true -> v_type_uint32(F2, [code | Path], TrUserData) + end, + if F3 == undefined -> ok; + true -> v_type_string(F3, [message | Path], TrUserData) + end, + ok; +v_msg_sdl_stun_reply(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_stun_reply}, X, Path). + -compile({nowarn_unused_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, session_token = F7}, Path, TrUserData) -> @@ -3304,7 +3653,7 @@ get_msg_defs() -> #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_register_super}, - [#field{name = version, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, 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 = mac, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []}, @@ -3313,18 +3662,30 @@ get_msg_defs() -> #field{name = hostname, fnum = 7, rnum = 8, type = string, occurrence = defaulty, opts = []}, #field{name = pub_key, fnum = 8, rnum = 9, type = string, occurrence = defaulty, opts = []}, #field{name = access_token, fnum = 9, rnum = 10, type = string, occurrence = defaulty, opts = []}]}, - {{msg, sdl_register_super_ack}, [#field{name = aes_key, fnum = 1, rnum = 2, type = bytes, occurrence = defaulty, opts = []}, #field{name = session_token, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}]}, - {{msg, sdl_register_super_nak}, [#field{name = error_code, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = error_message, fnum = 2, rnum = 3, type = string, occurrence = defaulty, opts = []}]}, + {{msg, sdl_register_super_ack}, + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = aes_key, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, + #field{name = session_token, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]}, + {{msg, sdl_register_super_nak}, + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = error_code, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = error_message, fnum = 3, rnum = 4, type = string, occurrence = defaulty, opts = []}]}, {{msg, sdl_query_info}, - [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, 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 = session_token, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []}]}, + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = network_id, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = src_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}, + #field{name = dst_mac, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []}, + #field{name = session_token, fnum = 5, rnum = 6, type = bytes, occurrence = defaulty, opts = []}]}, {{msg, sdl_peer_info}, - [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, - #field{name = dst_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, - #field{name = v4_info, fnum = 3, rnum = 4, type = {msg, sdl_v4_info}, occurrence = defaulty, opts = []}, - #field{name = v6_info, fnum = 4, rnum = 5, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}]}, + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = network_id, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}, + #field{name = v4_info, fnum = 4, rnum = 5, type = {msg, sdl_v4_info}, occurrence = defaulty, opts = []}, + #field{name = v6_info, fnum = 5, rnum = 6, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}]}, + {{msg, sdl_empty_peer_info}, + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = network_id, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]}, {{msg, sdl_nat_changed_event}, [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, @@ -3347,6 +3708,10 @@ get_msg_defs() -> #field{name = nat_type, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []}, #field{name = v6_info, fnum = 6, rnum = 7, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}, #field{name = session_token, fnum = 7, rnum = 8, type = bytes, occurrence = defaulty, opts = []}]}, + {{msg, sdl_stun_reply}, + [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = code, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = message, fnum = 3, rnum = 4, type = string, occurrence = defaulty, opts = []}]}, {{msg, sdl_data}, [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, @@ -3386,12 +3751,14 @@ get_msg_names() -> sdl_register_super_nak, sdl_query_info, sdl_peer_info, + sdl_empty_peer_info, sdl_nat_changed_event, sdl_drop_macs_event, sdl_refresh_auth_event, sdl_send_register_event, sdl_network_shutdown_event, sdl_stun_request, + sdl_stun_reply, sdl_data, sdl_register, sdl_register_ack, @@ -3412,12 +3779,14 @@ get_msg_or_group_names() -> sdl_register_super_nak, sdl_query_info, sdl_peer_info, + sdl_empty_peer_info, sdl_nat_changed_event, sdl_drop_macs_event, sdl_refresh_auth_event, sdl_send_register_event, sdl_network_shutdown_event, sdl_stun_request, + sdl_stun_reply, sdl_data, sdl_register, sdl_register_ack, @@ -3447,7 +3816,7 @@ find_msg_def(sdl_v4_info) -> #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_register_super) -> - [#field{name = version, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, 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 = mac, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []}, @@ -3456,18 +3825,30 @@ find_msg_def(sdl_register_super) -> #field{name = hostname, fnum = 7, rnum = 8, type = string, occurrence = defaulty, opts = []}, #field{name = pub_key, fnum = 8, rnum = 9, type = string, occurrence = defaulty, opts = []}, #field{name = access_token, fnum = 9, rnum = 10, type = string, occurrence = defaulty, opts = []}]; -find_msg_def(sdl_register_super_ack) -> [#field{name = aes_key, fnum = 1, rnum = 2, type = bytes, occurrence = defaulty, opts = []}, #field{name = session_token, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}]; -find_msg_def(sdl_register_super_nak) -> [#field{name = error_code, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = error_message, fnum = 2, rnum = 3, type = string, occurrence = defaulty, opts = []}]; +find_msg_def(sdl_register_super_ack) -> + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = aes_key, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, + #field{name = session_token, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]; +find_msg_def(sdl_register_super_nak) -> + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = error_code, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = error_message, fnum = 3, rnum = 4, type = string, occurrence = defaulty, opts = []}]; find_msg_def(sdl_query_info) -> - [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, 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 = session_token, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []}]; + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = network_id, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = src_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}, + #field{name = dst_mac, fnum = 4, rnum = 5, type = bytes, occurrence = defaulty, opts = []}, + #field{name = session_token, fnum = 5, rnum = 6, type = bytes, occurrence = defaulty, opts = []}]; find_msg_def(sdl_peer_info) -> - [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, - #field{name = dst_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, - #field{name = v4_info, fnum = 3, rnum = 4, type = {msg, sdl_v4_info}, occurrence = defaulty, opts = []}, - #field{name = v6_info, fnum = 4, rnum = 5, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}]; + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = network_id, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}, + #field{name = v4_info, fnum = 4, rnum = 5, type = {msg, sdl_v4_info}, occurrence = defaulty, opts = []}, + #field{name = v6_info, fnum = 5, rnum = 6, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}]; +find_msg_def(sdl_empty_peer_info) -> + [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = network_id, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = dst_mac, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]; find_msg_def(sdl_nat_changed_event) -> [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, @@ -3490,6 +3871,10 @@ find_msg_def(sdl_stun_request) -> #field{name = nat_type, fnum = 5, rnum = 6, type = uint32, occurrence = defaulty, opts = []}, #field{name = v6_info, fnum = 6, rnum = 7, type = {msg, sdl_v6_info}, occurrence = optional, opts = []}, #field{name = session_token, fnum = 7, rnum = 8, type = bytes, occurrence = defaulty, opts = []}]; +find_msg_def(sdl_stun_reply) -> + [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = code, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = message, fnum = 3, rnum = 4, type = string, occurrence = defaulty, opts = []}]; find_msg_def(sdl_data) -> [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = src_mac, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, @@ -3584,12 +3969,14 @@ fqbin_to_msg_name(<<"SDLRegisterSuperAck">>) -> sdl_register_super_ack; fqbin_to_msg_name(<<"SDLRegisterSuperNak">>) -> sdl_register_super_nak; fqbin_to_msg_name(<<"SDLQueryInfo">>) -> sdl_query_info; fqbin_to_msg_name(<<"SDLPeerInfo">>) -> sdl_peer_info; +fqbin_to_msg_name(<<"SDLEmptyPeerInfo">>) -> sdl_empty_peer_info; fqbin_to_msg_name(<<"SDLNatChangedEvent">>) -> sdl_nat_changed_event; fqbin_to_msg_name(<<"SDLDropMacsEvent">>) -> sdl_drop_macs_event; fqbin_to_msg_name(<<"SDLRefreshAuthEvent">>) -> sdl_refresh_auth_event; fqbin_to_msg_name(<<"SDLSendRegisterEvent">>) -> sdl_send_register_event; fqbin_to_msg_name(<<"SDLNetworkShutdownEvent">>) -> sdl_network_shutdown_event; fqbin_to_msg_name(<<"SDLStunRequest">>) -> sdl_stun_request; +fqbin_to_msg_name(<<"SDLStunReply">>) -> sdl_stun_reply; fqbin_to_msg_name(<<"SDLData">>) -> sdl_data; fqbin_to_msg_name(<<"SDLRegister">>) -> sdl_register; fqbin_to_msg_name(<<"SDLRegisterAck">>) -> sdl_register_ack; @@ -3607,12 +3994,14 @@ msg_name_to_fqbin(sdl_register_super_ack) -> <<"SDLRegisterSuperAck">>; msg_name_to_fqbin(sdl_register_super_nak) -> <<"SDLRegisterSuperNak">>; msg_name_to_fqbin(sdl_query_info) -> <<"SDLQueryInfo">>; msg_name_to_fqbin(sdl_peer_info) -> <<"SDLPeerInfo">>; +msg_name_to_fqbin(sdl_empty_peer_info) -> <<"SDLEmptyPeerInfo">>; msg_name_to_fqbin(sdl_nat_changed_event) -> <<"SDLNatChangedEvent">>; msg_name_to_fqbin(sdl_drop_macs_event) -> <<"SDLDropMacsEvent">>; msg_name_to_fqbin(sdl_refresh_auth_event) -> <<"SDLRefreshAuthEvent">>; msg_name_to_fqbin(sdl_send_register_event) -> <<"SDLSendRegisterEvent">>; msg_name_to_fqbin(sdl_network_shutdown_event) -> <<"SDLNetworkShutdownEvent">>; msg_name_to_fqbin(sdl_stun_request) -> <<"SDLStunRequest">>; +msg_name_to_fqbin(sdl_stun_reply) -> <<"SDLStunReply">>; msg_name_to_fqbin(sdl_data) -> <<"SDLData">>; msg_name_to_fqbin(sdl_register) -> <<"SDLRegister">>; msg_name_to_fqbin(sdl_register_ack) -> <<"SDLRegisterAck">>; @@ -3663,6 +4052,7 @@ get_msg_containment("sdlan_pb") -> sdl_arp_response, sdl_data, sdl_drop_macs_event, + sdl_empty_peer_info, sdl_nat_changed_event, sdl_network_shutdown_event, sdl_peer_info, @@ -3676,6 +4066,7 @@ get_msg_containment("sdlan_pb") -> sdl_send_register_event, sdl_stun_probe, sdl_stun_probe_reply, + sdl_stun_reply, sdl_stun_request, sdl_v4_info, sdl_v6_info]; @@ -3710,6 +4101,7 @@ get_proto_by_msg_name_as_fqbin(<<"SDLDropMacsEvent">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(<<"SDLArpRequest">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(<<"SDLStunProbe">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(<<"SDLArpResponse">>) -> "sdlan_pb"; +get_proto_by_msg_name_as_fqbin(<<"SDLStunReply">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(<<"SDLStunProbeReply">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(<<"SDLRegisterSuperNak">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(<<"SDLRegisterSuperAck">>) -> "sdlan_pb"; @@ -3718,6 +4110,7 @@ get_proto_by_msg_name_as_fqbin(<<"SDLV6Info">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(<<"SDLV4Info">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(<<"SDLQueryInfo">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(<<"SDLPeerInfo">>) -> "sdlan_pb"; +get_proto_by_msg_name_as_fqbin(<<"SDLEmptyPeerInfo">>) -> "sdlan_pb"; get_proto_by_msg_name_as_fqbin(E) -> error({gpb_error, {badmsg, E}}). diff --git a/apps/sdlan/src/sdlan_register_worker.erl b/apps/sdlan/src/sdlan_register_worker.erl index 4a7d179..d164da2 100644 --- a/apps/sdlan/src/sdlan_register_worker.erl +++ b/apps/sdlan/src/sdlan_register_worker.erl @@ -27,22 +27,13 @@ %% API -export([start_link/4, do_register/4]). --spec start_link(Sock :: inet:socket(), Ip :: inet:ip4_address(), Port :: integer(), Packet :: binary()) -> {ok, pid()}. +-spec start_link(Sock :: inet:socket(), Ip :: inet:ip4_address(), Port :: integer(), Packet :: #sdl_register_super{}) -> {ok, pid()}. start_link(Sock, Ip, Port, Packet) -> {ok, erlang:spawn_link(?MODULE, do_register, [Sock, Ip, Port, Packet])}. -do_register(Sock, SrcIp, SrcPort, <>) -> - #sdl_register_super{ - version = _Version, - client_id = ClientId, - network_id = NetworkId, - mac = Mac, - ip = Ip, - mask_len = MaskLen, - hostname = HostName, - pub_key = PubKey, - access_token = AccessToken - } = sdlan_pb:decode_msg(Body, sdl_register_super), +do_register(Sock, SrcIp, SrcPort, #sdl_register_super{ + pkt_id = PktId, client_id = ClientId, network_id = NetworkId, mac = Mac, ip = Ip, mask_len = MaskLen, + hostname = HostName, pub_key = PubKey, access_token = AccessToken}) -> %% 参数检查 logger:debug("[sdlan_channel] client_id: ~p, ip: ~p, mac: ~p, host_name: ~p, access_token: ~p, network_id: ~p", @@ -73,12 +64,13 @@ do_register(Sock, SrcIp, SrcPort, <>) -> EncodedAesKey = rsa_encode(AesKey, RsaPubKey), RegisterSuperAck = sdlan_pb:encode_msg(#sdl_register_super_ack { + pkt_id = PktId, aes_key = EncodedAesKey, session_token = SessionToken }), %% 发送确认信息 - Reply = <>, + Reply = <>, gen_udp:send(Sock, SrcIp, SrcPort, Reply), %% 设置节点的在线状态 @@ -86,34 +78,35 @@ do_register(Sock, SrcIp, SrcPort, <>) -> logger:debug("[sdlan_channel] client_id: ~p, set none online result is: ~p", [ClientId, Result]); {error, no_ip} -> logger:warning("[sdlan_channel] client_id: ~p, register get error: no_ip", [ClientId]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PacketId, ?NAK_NO_IP, <<"No Ip address">>)); + gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_NO_IP, <<"No Ip address">>)); {error, host_name_used} -> logger:warning("[sdlan_channel] client_id: ~p, register get error: host_name_used", [ClientId]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PacketId, ?NAK_HOSTNAME_USED, <<"Host Name Used">>)); + gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_HOSTNAME_USED, <<"Host Name Used">>)); {error, client_disabled} -> logger:warning("[sdlan_channel] client_id: ~p, register get error: client_disabled", [ClientId]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PacketId, ?NAK_NODE_DISABLE, <<"Client Connection Disable">>)) + gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_NODE_DISABLE, <<"Client Connection Disable">>)) end; undefined -> logger:warning("[sdlan_channel] client_id: ~p, register get error: network not found", [ClientId]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PacketId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)) + gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)) end; {ok, #{<<"error">> := #{<<"code">> := Code, <<"message">> := Message}}} -> logger:warning("[sdlan_channel] network_id: ~p, client_id: ~p, register get error: ~ts, error_code: ~p", [NetworkId, ClientId, Message, Code]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PacketId, Code, Message)); + gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, Code, Message)); {error, Reason} -> logger:warning("[sdlan_channel] network_id: ~p, client_id: ~p, register get error: ~p", [NetworkId, ClientId, Reason]), - gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PacketId, ?NAK_NETWORK_FAULT, <<"Network Error">>)) + gen_udp:send(Sock, SrcIp, SrcPort, register_nak_reply(PktId, ?NAK_NETWORK_FAULT, <<"Network Error">>)) end, exit(normal). -spec register_nak_reply(PacketId :: integer(), ErrorCode :: integer(), ErrorMsg :: binary()) -> binary(). register_nak_reply(PacketId, ErrorCode, ErrorMsg) when is_integer(PacketId), is_integer(ErrorCode), is_binary(ErrorMsg) -> RegisterNakReply = sdlan_pb:encode_msg(#sdl_register_super_nak { + pkt_id = PacketId, error_code = ErrorCode, error_message = ErrorMsg }), - <>. + <>. -spec rsa_encode(PlainText :: binary(), RsaPubKey :: public_key:rsa_public_key()) -> binary(). rsa_encode(PlainText, RsaPubKey) when is_binary(PlainText) -> diff --git a/apps/sdlan/src/sdlan_register_worker_sup.erl b/apps/sdlan/src/sdlan_register_worker_sup.erl index 63b5465..f8f914c 100644 --- a/apps/sdlan/src/sdlan_register_worker_sup.erl +++ b/apps/sdlan/src/sdlan_register_worker_sup.erl @@ -8,6 +8,7 @@ %%%------------------------------------------------------------------- -module(sdlan_register_worker_sup). -author("anlicheng"). +-include("sdlan_pb.hrl"). -behaviour(supervisor). @@ -59,7 +60,7 @@ init([]) -> %%% Internal functions %%%=================================================================== --spec start_worker(Sock :: inet:socket(), Ip :: inet:ip4_address(), Port :: integer(), Packet :: binary()) -> supervisor:startchild_ret(). +-spec start_worker(Sock :: inet:socket(), Ip :: inet:ip4_address(), Port :: integer(), Packet :: #sdl_register_super{}) -> supervisor:startchild_ret(). start_worker(Sock, Ip, Port, Packet) -> %% Start a temporary worker under the supervisor supervisor:start_child(?SERVER, [Sock, Ip, Port, Packet]). \ No newline at end of file diff --git a/apps/sdlan/src/sdlan_stun.erl b/apps/sdlan/src/sdlan_stun.erl index ea40b8e..da9764c 100644 --- a/apps/sdlan/src/sdlan_stun.erl +++ b/apps/sdlan/src/sdlan_stun.erl @@ -117,16 +117,20 @@ code_change(_OldVsn, State = #state{}, _Extra) -> -spec handle_packet(Sock :: inet:socket(), Ip :: inet:ip4_address(), Port :: integer(), Packet :: binary()) -> no_return(). %% 带上token或者网络id来注册 handle_packet(Sock, Ip, Port, <>) -> - sdlan_register_worker_sup:start_worker(Sock, Ip, Port, Body); + maybe + Register = catch sdlan_pb:decode_msg(Body, sdl_register_super), + #sdl_register_super{} ?= Register, + sdlan_register_worker_sup:start_worker(Sock, Ip, Port, Register) + end; %% 查询信息 -handle_packet(Sock, ClientIp, ClientPort, <>) -> +handle_packet(Sock, ClientIp, ClientPort, <>) -> maybe Query = catch sdlan_pb:decode_msg(Body, sdl_query_info), #sdl_query_info{network_id = NetworkId} ?= Query, {ok, NetworkPid} ?= sdlan_network:lookup_pid(NetworkId), - sdlan_network:peer_info(NetworkPid, Sock, {ClientIp, ClientPort}, PacketId, Query) + sdlan_network:peer_info(NetworkPid, Sock, {ClientIp, ClientPort}, Query) end; %% 处理心跳逻辑 diff --git a/apps/sdlan/src/test/stun_client.erl b/apps/sdlan/src/test/stun_client.erl index 8848138..89c21fe 100644 --- a/apps/sdlan/src/test/stun_client.erl +++ b/apps/sdlan/src/test/stun_client.erl @@ -9,12 +9,14 @@ -module(stun_client). -author("anlicheng"). -include("sdlan_pb.hrl"). +-include("sdlan.hrl"). -behaviour(gen_server). %% API -export([start_link/0]). -export([register/1, debug_info/1]). +-export([test/0]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, @@ -25,19 +27,25 @@ -define(STUN_REGISTER, 3). %% 响应 -define(STUN_REGISTER_ACK, 4). - -define(STUN_DATA, 5). +-define(SUPER_HOST, "127.0.0.1"). +-define(SUPER_PORT, 1265). + -record(state, { - socket, tun_socket, client_id :: binary(), + mac :: binary(), network_id, - net_addr, + ip, mask_len, aes_key, cookie = 1, + session_token :: binary(), + + private_key, + sessions = #{} }). @@ -45,6 +53,11 @@ %%% API %%%=================================================================== +test() -> + {ok, Pid} = start_link(), + register(Pid), + ok. + register(Pid) when is_pid(Pid) -> gen_server:call(Pid, register). @@ -67,11 +80,8 @@ start_link() -> {ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} | {stop, Reason :: term()} | ignore). init([]) -> - {ok, Socket} = gen_tcp:connect("localhost", 18083, [binary, {packet, 2}, {active, true}]), - inet_tcp:controlling_process(Socket, self()), - {ok, TunSocket} = gen_udp:open(12345, [binary, {active, true}]), - - {ok, #state{socket = Socket, tun_socket = TunSocket, client_id = <<"22222222222222222222222222222222">>}}. + {ok, TunSocket} = gen_udp:open(0, [binary, {active, true}]), + {ok, #state{tun_socket = TunSocket, network_id = 8, mac = <<11, 12, 13, 14, 15, 16>>, ip = x, mask_len = 24, client_id = <<"22222222222222222222222222222222">>}}. %% @private %% @doc Handling call messages @@ -86,35 +96,26 @@ init([]) -> handle_call(debug_info, _From, State) -> {reply, {ok, State}, State}; -handle_call(register, _From, State = #state{socket = Socket, client_id = ClientId}) -> - Req = #{ - <<"version">> => 1, - <<"client_id">> => ClientId, - <<"dev_addr">> => #{ - <<"net_addr">> => 0, - <<"net_bit_len">> => 0 - }, - <<"token">> => <<"1234567890">> - }, +handle_call(register, _From, State = #state{tun_socket = Socket, network_id = NId, client_id = ClientId, ip = Ip, mac = Mac, mask_len = MaskLen}) -> + {PublicKeyBin, PrivateKey} = sdlan_cipher:rsa_generate_key(), Register = #sdl_register_super { - version = 0, + pkt_id = 1, client_id = ClientId, - network_id = 8, - mac = <<11, 12, 13, 14, 15, 16>>, - ip = 0, - mask_len = 0, + network_id = NId, + mac = Mac, + ip = Ip, + mask_len = MaskLen, hostname = <<"mysql1">>, - pub_key = <<>>, + pub_key = PublicKeyBin, access_token = <<"access_token1234">> }, - logger:debug("register is: ~p", [Register]), - Packet = jiffy:encode(Req, [force_utf8]), - ok = gen_tcp:send(Socket, <<1:32, 101, Packet/binary>>), + Pkt = sdlan_pb:encode_msg(Register), + ok = gen_udp:send(Socket, ?SUPER_HOST, ?SUPER_PORT, <>), - {reply, ok, State}. + {reply, ok, State#state{private_key = PrivateKey}}. %% @private %% @doc Handling cast messages @@ -131,56 +132,33 @@ handle_cast(_Request, State = #state{}) -> {noreply, NewState :: #state{}} | {noreply, NewState :: #state{}, timeout() | hibernate} | {stop, Reason :: term(), NewState :: #state{}}). -handle_info({tcp, Socket, <<1:32, 5, Data/binary>>}, State = #state{socket = Socket, tun_socket = TunSocket, client_id = ClientId, cookie = Cookie}) -> - Response = jiffy:decode(Data, [return_maps]), - #{ - <<"dev_addr">> := #{ - <<"network_id">> := NetworkId, - <<"net_addr">> := NetAddr, - <<"net_bit_len">> := NetBitLen - }, - <<"aes_key">> := AesKey, - <<"lifetime">> := Lifetime - } = Response, +handle_info({udp, _Socket, _ServerIp, _ServerPort, <>}, State = #state{private_key = PrivateKey}) -> + SuperAck = #sdl_register_super_ack{session_token = SessionToken, aes_key = EncAesKey} = sdlan_pb:decode_msg(Data, sdl_register_super_ack), - logger:debug("[stun_client] get a register super response: ~p, alloc ip addr: ~p", [Response, sdlan_ipaddr:int_to_ipv4(NetAddr)]), + AesKey = sdlan_cipher:rsa_decrypt(EncAesKey, PrivateKey), + logger:debug("[stun_client] get a register super ack: ~p, aes_key: ~p", [SuperAck, AesKey]), - %% 开始注册自己的tun信息 - gen_udp:send(TunSocket, "localhost", 1265, <<1, Cookie:32, ClientId/binary, NetworkId:32, NetAddr:32>>), + erlang:start_timer(5000, self(), stun_request_ticker), - {noreply, State#state{network_id = NetworkId, net_addr = NetAddr, mask_len = NetBitLen, aes_key = AesKey, cookie = Cookie + 1}}; + {noreply, State#state{session_token = SessionToken}}; -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}}]), - {noreply, State}; +handle_info({udp, _Socket, _ServerIp, _ServerPort, <>}, State) -> + SuperNak = #sdl_register_super_nak{} = sdlan_pb:decode_msg(Data, sdl_register_super_nak), + logger:debug("[stun_client] get a register super nak: ~p", [SuperNak]), + {noreply, State#state{}}; -handle_info({udp, _, Ip, Port, <>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) -> - Packet = <>, - logger:debug("[stun_client] will send stun reply: ~p, peer: ~p", [Packet, {Ip, Port}]), - ok = gen_udp:send(TunSocket, Ip, Port, Packet), +handle_info({timeout, _, stun_request_ticker}, State = #state{tun_socket = TunSocket, client_id = ClientId, mac = Mac, ip = Ip, session_token = SessionToken}) -> + Packet = sdlan_pb:encode_msg(#sdl_stun_request{ + client_id = ClientId, + network_id = 8, + mac = Mac, + ip = Ip, + nat_type = 0, + session_token = SessionToken + }), + gen_udp:send(TunSocket, ?SUPER_HOST, ?SUPER_PORT, <>), + erlang:start_timer(5000, self(), stun_request_ticker), - NSessions = maps:put(SrcIp, {Ip, Port}, Sessions), - {noreply, State#state{sessions = NSessions}}; - -handle_info({udp, _, Ip, Port, <>}, State = #state{sessions = Sessions}) -> - logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, register_ack!!!", [NetworkId, SrcIp, DstIp]), - NSessions = maps:put(SrcIp, {Ip, Port}, Sessions), - {noreply, State#state{sessions = NSessions}}; - -handle_info({udp, _, _Ip0, _Port0, <>}, State = #state{tun_socket = TunSocket, sessions = Sessions}) -> - logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, data!!!", [NetworkId, SrcIp, DstIp]), - case maps:is_key(SrcIp, Sessions) of - true -> - {Ip, Port} = maps:get(SrcIp, Sessions), - ok = gen_udp:send(TunSocket, Ip, Port, <>), - logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, reply data!!!", [NetworkId, SrcIp, DstIp]); - false -> - logger:debug("[stun_client] stun_data: network_id: ~p, src: ~p, dst: ~p, no session", [NetworkId, SrcIp, DstIp]) - end, - {noreply, State}; - -handle_info(Info, State = #state{}) -> - logger:debug("[stun_client] get info: ~p", [Info]), {noreply, State}. %% @private diff --git a/message.proto b/message.proto index a3aa260..d20dcb7 100644 --- a/message.proto +++ b/message.proto @@ -19,7 +19,7 @@ message SDLV6Info { // 只是验证凭证是否合法 (access_token) // 这里修改成了扁平的结构, 否则有些字段不好找放的位置 message SDLRegisterSuper { - uint32 version = 1; + uint32 pkt_id = 1; string client_id = 2; uint32 network_id = 3; bytes mac = 4; @@ -32,29 +32,39 @@ message SDLRegisterSuper { // 这里修改成了udp的方式,后续需要验证: session_token message SDLRegisterSuperAck { - bytes aes_key = 1; - bytes session_token = 2; + uint32 pkt_id = 1; + bytes aes_key = 2; + bytes session_token = 3; } // 注册失败时候的消息体 message SDLRegisterSuperNak { - uint32 error_code = 1; - string error_message = 2; + uint32 pkt_id = 1; + uint32 error_code = 2; + string error_message = 3; } // 网络地址查询 message SDLQueryInfo { - uint32 network_id = 1; - bytes src_mac = 2; - bytes dst_mac = 3; - bytes session_token = 4; + uint32 pkt_id = 1; + uint32 network_id = 2; + bytes src_mac = 3; + bytes dst_mac = 4; + bytes session_token = 5; } message SDLPeerInfo { - uint32 network_id = 1; - bytes dst_mac = 2; - SDLV4Info v4_info = 3; - optional SDLV6Info v6_info = 4; + uint32 pkt_id = 1; + uint32 network_id = 2; + bytes dst_mac = 3; + SDLV4Info v4_info = 4; + optional SDLV6Info v6_info = 5; +} + +message SDLEmptyPeerInfo { + uint32 pkt_id = 1; + uint32 network_id = 2; + bytes dst_mac = 3; } // 事件定义, 下面的事件是服务器主动推送的,不需要响应