diff --git a/apps/sdlan/include/sdlan.hrl b/apps/sdlan/include/sdlan.hrl index 38f5868..89e43b1 100644 --- a/apps/sdlan/include/sdlan.hrl +++ b/apps/sdlan/include/sdlan.hrl @@ -59,8 +59,6 @@ %% 请求 -define(PACKET_STUN_REQUEST, 16#30). -%% 响应 --define(PACKET_STUN_REPLY, 16#31). %% stun网络类型检测 %% 请求 diff --git a/apps/sdlan/include/sdlan_pb.hrl b/apps/sdlan/include/sdlan_pb.hrl index a005988..92b4af8 100644 --- a/apps/sdlan/include/sdlan_pb.hrl +++ b/apps/sdlan/include/sdlan_pb.hrl @@ -146,15 +146,6 @@ }). -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, @@ -190,7 +181,9 @@ -ifndef('SDL_STUN_PROBE_PB_H'). -define('SDL_STUN_PROBE_PB_H', true). -record(sdl_stun_probe, - {cookie = 0 :: non_neg_integer() | undefined % = 1, optional, 32 bits + {cookie = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits + attr = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits + step = 0 :: non_neg_integer() | undefined % = 3, optional, 32 bits }). -endif. @@ -198,9 +191,9 @@ -define('SDL_STUN_PROBE_REPLY_PB_H', true). -record(sdl_stun_probe_reply, {cookie = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits - port = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits - ip = 0 :: non_neg_integer() | undefined, % = 3, optional, 32 bits - attr = 0 :: non_neg_integer() | undefined % = 4, optional, 32 bits + step = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits + port = 0 :: non_neg_integer() | undefined, % = 3, optional, 32 bits + ip = 0 :: non_neg_integer() | undefined % = 4, optional, 32 bits }). -endif. diff --git a/apps/sdlan/src/sdlan_pb.erl b/apps/sdlan/src/sdlan_pb.erl index 49ad8c5..a5ca60c 100644 --- a/apps/sdlan/src/sdlan_pb.erl +++ b/apps/sdlan/src/sdlan_pb.erl @@ -83,8 +83,6 @@ -type sdl_stun_request() :: #sdl_stun_request{}. --type sdl_stun_reply() :: #sdl_stun_reply{}. - -type sdl_data() :: #sdl_data{}. -type sdl_register() :: #sdl_register{}. @@ -99,9 +97,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_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(['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_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_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_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). @@ -142,7 +140,6 @@ encode_msg(Msg, MsgName, Opts) -> 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); @@ -709,39 +706,6 @@ 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). @@ -894,13 +858,31 @@ encode_msg_sdl_register_ack(#sdl_register_ack{network_id = F1, src_mac = F2, dst encode_msg_sdl_stun_probe(Msg, TrUserData) -> encode_msg_sdl_stun_probe(Msg, <<>>, TrUserData). -encode_msg_sdl_stun_probe(#sdl_stun_probe{cookie = F1}, Bin, TrUserData) -> - if F1 == undefined -> Bin; +encode_msg_sdl_stun_probe(#sdl_stun_probe{cookie = F1, attr = F2, step = 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 - TrF1 = id(F1, TrUserData), - if TrF1 =:= 0 -> Bin; - true -> e_varint(TrF1, <>, TrUserData) + TrF3 = id(F3, TrUserData), + if TrF3 =:= 0 -> B2; + true -> e_varint(TrF3, <>, TrUserData) end end end. @@ -908,7 +890,7 @@ encode_msg_sdl_stun_probe(#sdl_stun_probe{cookie = F1}, Bin, TrUserData) -> encode_msg_sdl_stun_probe_reply(Msg, TrUserData) -> encode_msg_sdl_stun_probe_reply(Msg, <<>>, TrUserData). -encode_msg_sdl_stun_probe_reply(#sdl_stun_probe_reply{cookie = F1, port = F2, ip = F3, attr = F4}, Bin, TrUserData) -> +encode_msg_sdl_stun_probe_reply(#sdl_stun_probe_reply{cookie = F1, step = F2, port = F3, ip = F4}, Bin, TrUserData) -> B1 = if F1 == undefined -> Bin; true -> begin @@ -1190,7 +1172,6 @@ decode_msg_2_doit(sdl_refresh_auth_event, Bin, TrUserData) -> id(decode_msg_sdl_ 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); @@ -2187,64 +2168,6 @@ 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), id(0, TrUserData), TrUserData). @@ -2463,57 +2386,71 @@ skip_32_sdl_register_ack(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrU skip_64_sdl_register_ack(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -decode_msg_sdl_stun_probe(Bin, TrUserData) -> dfp_read_field_def_sdl_stun_probe(Bin, 0, 0, 0, id(0, TrUserData), TrUserData). +decode_msg_sdl_stun_probe(Bin, TrUserData) -> dfp_read_field_def_sdl_stun_probe(Bin, 0, 0, 0, id(0, TrUserData), id(0, TrUserData), id(0, TrUserData), TrUserData). -dfp_read_field_def_sdl_stun_probe(<<8, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> d_field_sdl_stun_probe_cookie(Rest, Z1, Z2, F, F@_1, TrUserData); -dfp_read_field_def_sdl_stun_probe(<<>>, 0, 0, _, F@_1, _) -> #sdl_stun_probe{cookie = F@_1}; -dfp_read_field_def_sdl_stun_probe(Other, Z1, Z2, F, F@_1, TrUserData) -> dg_read_field_def_sdl_stun_probe(Other, Z1, Z2, F, F@_1, TrUserData). +dfp_read_field_def_sdl_stun_probe(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_stun_probe_cookie(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_stun_probe(<<16, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_stun_probe_attr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_stun_probe(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_stun_probe_step(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +dfp_read_field_def_sdl_stun_probe(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_stun_probe{cookie = F@_1, attr = F@_2, step = F@_3}; +dfp_read_field_def_sdl_stun_probe(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_sdl_stun_probe(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -dg_read_field_def_sdl_stun_probe(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_stun_probe(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData); -dg_read_field_def_sdl_stun_probe(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, TrUserData) -> +dg_read_field_def_sdl_stun_probe(<<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_probe(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +dg_read_field_def_sdl_stun_probe(<<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_probe_cookie(Rest, 0, 0, 0, F@_1, TrUserData); + 8 -> d_field_sdl_stun_probe_cookie(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 16 -> d_field_sdl_stun_probe_attr(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 24 -> d_field_sdl_stun_probe_step(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); _ -> case Key band 7 of - 0 -> skip_varint_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, TrUserData); - 1 -> skip_64_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, TrUserData); - 2 -> skip_length_delimited_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, TrUserData); - 3 -> skip_group_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, TrUserData); - 5 -> skip_32_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, TrUserData) + 0 -> skip_varint_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 1 -> skip_64_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 2 -> skip_length_delimited_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 3 -> skip_group_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); + 5 -> skip_32_sdl_stun_probe(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData) end end; -dg_read_field_def_sdl_stun_probe(<<>>, 0, 0, _, F@_1, _) -> #sdl_stun_probe{cookie = F@_1}. +dg_read_field_def_sdl_stun_probe(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_stun_probe{cookie = F@_1, attr = F@_2, step = F@_3}. -d_field_sdl_stun_probe_cookie(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> d_field_sdl_stun_probe_cookie(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData); -d_field_sdl_stun_probe_cookie(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, TrUserData) -> +d_field_sdl_stun_probe_cookie(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_stun_probe_cookie(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_stun_probe_cookie(<<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_probe(RestF, 0, 0, F, NewFValue, TrUserData). + dfp_read_field_def_sdl_stun_probe(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData). -skip_varint_sdl_stun_probe(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> skip_varint_sdl_stun_probe(Rest, Z1, Z2, F, F@_1, TrUserData); -skip_varint_sdl_stun_probe(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_sdl_stun_probe(Rest, Z1, Z2, F, F@_1, TrUserData). +d_field_sdl_stun_probe_attr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_stun_probe_attr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_stun_probe_attr(<<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_probe(RestF, 0, 0, F, F@_1, NewFValue, F@_3, TrUserData). -skip_length_delimited_sdl_stun_probe(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) when N < 57 -> skip_length_delimited_sdl_stun_probe(Rest, N + 7, X bsl N + Acc, F, F@_1, TrUserData); -skip_length_delimited_sdl_stun_probe(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, TrUserData) -> +d_field_sdl_stun_probe_step(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_stun_probe_step(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +d_field_sdl_stun_probe_step(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, TrUserData) -> + {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, + dfp_read_field_def_sdl_stun_probe(RestF, 0, 0, F, F@_1, F@_2, NewFValue, TrUserData). + +skip_varint_sdl_stun_probe(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> skip_varint_sdl_stun_probe(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); +skip_varint_sdl_stun_probe(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_stun_probe(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). + +skip_length_delimited_sdl_stun_probe(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> skip_length_delimited_sdl_stun_probe(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); +skip_length_delimited_sdl_stun_probe(<<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_probe(Rest2, 0, 0, F, F@_1, TrUserData). + dfp_read_field_def_sdl_stun_probe(Rest2, 0, 0, F, F@_1, F@_2, F@_3, TrUserData). -skip_group_sdl_stun_probe(Bin, _, Z2, FNum, F@_1, TrUserData) -> +skip_group_sdl_stun_probe(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, TrUserData) -> {_, Rest} = read_group(Bin, FNum), - dfp_read_field_def_sdl_stun_probe(Rest, 0, Z2, FNum, F@_1, TrUserData). + dfp_read_field_def_sdl_stun_probe(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, TrUserData). -skip_32_sdl_stun_probe(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_sdl_stun_probe(Rest, Z1, Z2, F, F@_1, TrUserData). +skip_32_sdl_stun_probe(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_stun_probe(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). -skip_64_sdl_stun_probe(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_sdl_stun_probe(Rest, Z1, Z2, F, F@_1, TrUserData). +skip_64_sdl_stun_probe(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_stun_probe(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). decode_msg_sdl_stun_probe_reply(Bin, TrUserData) -> dfp_read_field_def_sdl_stun_probe_reply(Bin, 0, 0, 0, id(0, TrUserData), id(0, TrUserData), id(0, TrUserData), id(0, TrUserData), TrUserData). dfp_read_field_def_sdl_stun_probe_reply(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_stun_probe_reply_cookie(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_stun_probe_reply(<<16, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_stun_probe_reply_port(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_stun_probe_reply(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_stun_probe_reply_ip(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_stun_probe_reply(<<32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_stun_probe_reply_attr(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -dfp_read_field_def_sdl_stun_probe_reply(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_stun_probe_reply{cookie = F@_1, port = F@_2, ip = F@_3, attr = F@_4}; +dfp_read_field_def_sdl_stun_probe_reply(<<16, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_stun_probe_reply_step(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); +dfp_read_field_def_sdl_stun_probe_reply(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_stun_probe_reply_port(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); +dfp_read_field_def_sdl_stun_probe_reply(<<32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> d_field_sdl_stun_probe_reply_ip(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData); +dfp_read_field_def_sdl_stun_probe_reply(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_stun_probe_reply{cookie = F@_1, step = F@_2, port = F@_3, ip = F@_4}; dfp_read_field_def_sdl_stun_probe_reply(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData) -> dg_read_field_def_sdl_stun_probe_reply(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, TrUserData). dg_read_field_def_sdl_stun_probe_reply(<<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_stun_probe_reply(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); @@ -2521,9 +2458,9 @@ dg_read_field_def_sdl_stun_probe_reply(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_ Key = X bsl N + Acc, case Key of 8 -> d_field_sdl_stun_probe_reply_cookie(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); - 16 -> d_field_sdl_stun_probe_reply_port(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); - 24 -> d_field_sdl_stun_probe_reply_ip(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); - 32 -> d_field_sdl_stun_probe_reply_attr(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); + 16 -> d_field_sdl_stun_probe_reply_step(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); + 24 -> d_field_sdl_stun_probe_reply_port(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); + 32 -> d_field_sdl_stun_probe_reply_ip(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, TrUserData); _ -> case Key band 7 of 0 -> skip_varint_sdl_stun_probe_reply(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData); @@ -2533,25 +2470,25 @@ dg_read_field_def_sdl_stun_probe_reply(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_ 5 -> skip_32_sdl_stun_probe_reply(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, TrUserData) end end; -dg_read_field_def_sdl_stun_probe_reply(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_stun_probe_reply{cookie = F@_1, port = F@_2, ip = F@_3, attr = F@_4}. +dg_read_field_def_sdl_stun_probe_reply(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, _) -> #sdl_stun_probe_reply{cookie = F@_1, step = F@_2, port = F@_3, ip = F@_4}. d_field_sdl_stun_probe_reply_cookie(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_stun_probe_reply_cookie(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); d_field_sdl_stun_probe_reply_cookie(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, TrUserData) -> {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, dfp_read_field_def_sdl_stun_probe_reply(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, TrUserData). -d_field_sdl_stun_probe_reply_port(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_stun_probe_reply_port(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_stun_probe_reply_port(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, TrUserData) -> +d_field_sdl_stun_probe_reply_step(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_stun_probe_reply_step(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); +d_field_sdl_stun_probe_reply_step(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, TrUserData) -> {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, dfp_read_field_def_sdl_stun_probe_reply(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, TrUserData). -d_field_sdl_stun_probe_reply_ip(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_stun_probe_reply_ip(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_stun_probe_reply_ip(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, TrUserData) -> +d_field_sdl_stun_probe_reply_port(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_stun_probe_reply_port(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); +d_field_sdl_stun_probe_reply_port(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, TrUserData) -> {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, dfp_read_field_def_sdl_stun_probe_reply(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, TrUserData). -d_field_sdl_stun_probe_reply_attr(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_stun_probe_reply_attr(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); -d_field_sdl_stun_probe_reply_attr(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, TrUserData) -> +d_field_sdl_stun_probe_reply_ip(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData) when N < 57 -> d_field_sdl_stun_probe_reply_ip(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, TrUserData); +d_field_sdl_stun_probe_reply_ip(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, TrUserData) -> {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, dfp_read_field_def_sdl_stun_probe_reply(RestF, 0, 0, F, F@_1, F@_2, F@_3, NewFValue, TrUserData). @@ -2768,7 +2705,6 @@ merge_msgs(Prev, New, MsgName, Opts) -> 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); @@ -3046,21 +2982,6 @@ 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, identity_id = PFidentity_id}, #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, identity_id = NFidentity_id}, _) -> @@ -3128,18 +3049,30 @@ merge_msg_sdl_register_ack(#sdl_register_ack{network_id = PFnetwork_id, src_mac end}. -compile({nowarn_unused_function,merge_msg_sdl_stun_probe/3}). -merge_msg_sdl_stun_probe(#sdl_stun_probe{cookie = PFcookie}, #sdl_stun_probe{cookie = NFcookie}, _) -> +merge_msg_sdl_stun_probe(#sdl_stun_probe{cookie = PFcookie, attr = PFattr, step = PFstep}, #sdl_stun_probe{cookie = NFcookie, attr = NFattr, step = NFstep}, _) -> #sdl_stun_probe{cookie = if NFcookie =:= undefined -> PFcookie; true -> NFcookie + end, + attr = + if NFattr =:= undefined -> PFattr; + true -> NFattr + end, + step = + if NFstep =:= undefined -> PFstep; + true -> NFstep end}. -compile({nowarn_unused_function,merge_msg_sdl_stun_probe_reply/3}). -merge_msg_sdl_stun_probe_reply(#sdl_stun_probe_reply{cookie = PFcookie, port = PFport, ip = PFip, attr = PFattr}, #sdl_stun_probe_reply{cookie = NFcookie, port = NFport, ip = NFip, attr = NFattr}, _) -> +merge_msg_sdl_stun_probe_reply(#sdl_stun_probe_reply{cookie = PFcookie, step = PFstep, port = PFport, ip = PFip}, #sdl_stun_probe_reply{cookie = NFcookie, step = NFstep, port = NFport, ip = NFip}, _) -> #sdl_stun_probe_reply{cookie = if NFcookie =:= undefined -> PFcookie; true -> NFcookie end, + step = + if NFstep =:= undefined -> PFstep; + true -> NFstep + end, port = if NFport =:= undefined -> PFport; true -> NFport @@ -3147,10 +3080,6 @@ merge_msg_sdl_stun_probe_reply(#sdl_stun_probe_reply{cookie = PFcookie, port = P ip = if NFip =:= undefined -> PFip; true -> NFip - end, - attr = - if NFattr =:= undefined -> PFattr; - true -> NFattr end}. -compile({nowarn_unused_function,merge_msg_sdl_arp_request/3}). @@ -3208,7 +3137,6 @@ verify_msg(Msg, MsgName, Opts) -> 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); @@ -3476,21 +3404,6 @@ 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, identity_id = F8}, Path, TrUserData) -> @@ -3553,27 +3466,33 @@ v_msg_sdl_register_ack(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl -compile({nowarn_unused_function,v_msg_sdl_stun_probe/3}). -dialyzer({nowarn_function,v_msg_sdl_stun_probe/3}). -v_msg_sdl_stun_probe(#sdl_stun_probe{cookie = F1}, Path, TrUserData) -> +v_msg_sdl_stun_probe(#sdl_stun_probe{cookie = F1, attr = F2, step = F3}, Path, TrUserData) -> if F1 == undefined -> ok; true -> v_type_uint32(F1, [cookie | Path], TrUserData) end, + if F2 == undefined -> ok; + true -> v_type_uint32(F2, [attr | Path], TrUserData) + end, + if F3 == undefined -> ok; + true -> v_type_uint32(F3, [step | Path], TrUserData) + end, ok; v_msg_sdl_stun_probe(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_stun_probe}, X, Path). -compile({nowarn_unused_function,v_msg_sdl_stun_probe_reply/3}). -dialyzer({nowarn_function,v_msg_sdl_stun_probe_reply/3}). -v_msg_sdl_stun_probe_reply(#sdl_stun_probe_reply{cookie = F1, port = F2, ip = F3, attr = F4}, Path, TrUserData) -> +v_msg_sdl_stun_probe_reply(#sdl_stun_probe_reply{cookie = F1, step = F2, port = F3, ip = F4}, Path, TrUserData) -> if F1 == undefined -> ok; true -> v_type_uint32(F1, [cookie | Path], TrUserData) end, if F2 == undefined -> ok; - true -> v_type_uint32(F2, [port | Path], TrUserData) + true -> v_type_uint32(F2, [step | Path], TrUserData) end, if F3 == undefined -> ok; - true -> v_type_uint32(F3, [ip | Path], TrUserData) + true -> v_type_uint32(F3, [port | Path], TrUserData) end, if F4 == undefined -> ok; - true -> v_type_uint32(F4, [attr | Path], TrUserData) + true -> v_type_uint32(F4, [ip | Path], TrUserData) end, ok; v_msg_sdl_stun_probe_reply(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_stun_probe_reply}, X, Path). @@ -3738,10 +3657,6 @@ 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 = []}, @@ -3759,12 +3674,15 @@ get_msg_defs() -> [#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 = []}]}, - {{msg, sdl_stun_probe}, [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}]}, + {{msg, sdl_stun_probe}, + [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = attr, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = step, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}]}, {{msg, sdl_stun_probe_reply}, [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, - #field{name = port, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, - #field{name = ip, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}, - #field{name = attr, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}]}, + #field{name = step, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = port, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}, + #field{name = ip, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}]}, {{msg, sdl_arp_request}, [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = target_ip, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, @@ -3790,7 +3708,6 @@ get_msg_names() -> sdl_send_register_event, sdl_network_shutdown_event, sdl_stun_request, - sdl_stun_reply, sdl_data, sdl_register, sdl_register_ack, @@ -3818,7 +3735,6 @@ get_msg_or_group_names() -> sdl_send_register_event, sdl_network_shutdown_event, sdl_stun_request, - sdl_stun_reply, sdl_data, sdl_register, sdl_register_ack, @@ -3903,10 +3819,6 @@ 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 = []}, @@ -3924,12 +3836,15 @@ find_msg_def(sdl_register_ack) -> [#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 = []}]; -find_msg_def(sdl_stun_probe) -> [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}]; +find_msg_def(sdl_stun_probe) -> + [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, + #field{name = attr, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = step, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}]; find_msg_def(sdl_stun_probe_reply) -> [#field{name = cookie, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, - #field{name = port, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, - #field{name = ip, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}, - #field{name = attr, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}]; + #field{name = step, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, + #field{name = port, fnum = 3, rnum = 4, type = uint32, occurrence = defaulty, opts = []}, + #field{name = ip, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}]; find_msg_def(sdl_arp_request) -> [#field{name = network_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = target_ip, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, @@ -4010,7 +3925,6 @@ 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; @@ -4035,7 +3949,6 @@ 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">>; @@ -4100,7 +4013,6 @@ 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]; @@ -4135,7 +4047,6 @@ 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"; diff --git a/apps/sdlan/src/sdlan_stun.erl b/apps/sdlan/src/sdlan_stun.erl index 051c2f0..f53bfb8 100644 --- a/apps/sdlan/src/sdlan_stun.erl +++ b/apps/sdlan/src/sdlan_stun.erl @@ -165,27 +165,27 @@ handle_packet(Sock, ClientIp, ClientPort, < %% 辅助节点没有assist的配置,不支持attr = 2的探测 handle_packet(Sock, Ip, Port, <>) -> maybe - #sdl_stun_probe{cookie = Cookie} ?= sdlan_pb:decode_msg(Body, sdl_stun_probe), + #sdl_stun_probe{cookie = Cookie, step = Step, attr = Attr} ?= sdlan_pb:decode_msg(Body, sdl_stun_probe), logger:debug("[sdlan_stun] get stun_probe request, cookie: ~p", [Cookie]), - ProbeReply = #sdl_stun_probe_reply { + ProbeReplyPacket = sdlan_pb:encode_msg(#sdl_stun_probe_reply { cookie = Cookie, ip = int_ip(Ip), port = Port, - attr = ?STUN_ATTR_CHANGE_NONE - }, + step = Step + }), - %% 什么不都改变 - ProbeReplyNonePacket = sdlan_pb:encode_msg(ProbeReply), - gen_udp:send(Sock, Ip, Port, <>), - - %% 切换端口返回 - ProbeReplyPortPacket = sdlan_pb:encode_msg(ProbeReply#sdl_stun_probe_reply{attr = ?STUN_ATTR_CHANGE_PORT}), - sdlan_stun_port_assist:stun_relay(Ip, Port, ProbeReplyPortPacket), - - %% 切换端口和ip - ProbeReplyPeerPacket = sdlan_pb:encode_msg(ProbeReply#sdl_stun_probe_reply{attr = ?STUN_ATTR_CHANGE_PEER}), - sdlan_stun_peer_assist:stun_relay(Ip, Port, ProbeReplyPeerPacket) + case Attr of + ?STUN_ATTR_CHANGE_NONE -> + %% 什么不都改变 + gen_udp:send(Sock, Ip, Port, <>); + ?STUN_ATTR_CHANGE_PEER -> + %% 切换端口和ip + sdlan_stun_peer_assist:stun_relay(Ip, Port, ProbeReplyPacket); + ?STUN_ATTR_CHANGE_PORT -> + %% 切换端口返回 + sdlan_stun_port_assist:stun_relay(Ip, Port, ProbeReplyPacket) + end end; %% 转发消息, 跨服务器的stun_reply的转发通过socket来转发 diff --git a/message.proto b/message.proto index 1bf4e02..fe921ea 100644 --- a/message.proto +++ b/message.proto @@ -111,12 +111,6 @@ message SDLStunRequest { bytes session_token = 7; } -message SDLStunReply { - uint32 network_id = 1; - uint32 code = 2; - string message = 3; -} - message SDLData { uint32 network_id = 1; bytes src_mac = 2; @@ -146,13 +140,15 @@ message SDLRegisterAck { message SDLStunProbe { uint32 cookie = 1; + uint32 attr = 2; + uint32 step = 3; } message SDLStunProbeReply { uint32 cookie = 1; - uint32 port = 2; - uint32 ip = 3; - uint32 attr = 4; + uint32 step = 2; + uint32 port = 3; + uint32 ip = 4; } // ARP查询相关