fix PktId
This commit is contained in:
parent
06e52f18ce
commit
de30e7e520
@ -38,87 +38,96 @@
|
||||
-ifndef('SDL_EMPTY_PB_H').
|
||||
-define('SDL_EMPTY_PB_H', true).
|
||||
-record(sdl_empty,
|
||||
{
|
||||
{pkt_id = 0 :: non_neg_integer() | undefined % = 1, optional, 32 bits
|
||||
}).
|
||||
-endif.
|
||||
|
||||
-ifndef('SDL_REGISTER_SUPER_PB_H').
|
||||
-define('SDL_REGISTER_SUPER_PB_H', true).
|
||||
-record(sdl_register_super,
|
||||
{client_id = <<>> :: unicode:chardata() | undefined, % = 1, optional
|
||||
network_id = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits
|
||||
mac = <<>> :: iodata() | undefined, % = 3, optional
|
||||
ip = 0 :: non_neg_integer() | undefined, % = 4, optional, 32 bits
|
||||
mask_len = 0 :: non_neg_integer() | undefined, % = 5, optional, 32 bits
|
||||
hostname = <<>> :: unicode:chardata() | undefined, % = 6, optional
|
||||
pub_key = <<>> :: unicode:chardata() | undefined, % = 7, optional
|
||||
access_token = <<>> :: unicode:chardata() | undefined % = 8, optional
|
||||
{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
|
||||
ip = 0 :: non_neg_integer() | undefined, % = 5, optional, 32 bits
|
||||
mask_len = 0 :: non_neg_integer() | undefined, % = 6, optional, 32 bits
|
||||
hostname = <<>> :: unicode:chardata() | undefined, % = 7, optional
|
||||
pub_key = <<>> :: unicode:chardata() | undefined, % = 8, optional
|
||||
access_token = <<>> :: unicode:chardata() | undefined % = 9, optional
|
||||
}).
|
||||
-endif.
|
||||
|
||||
-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,
|
||||
{dst_mac = <<>> :: iodata() | undefined % = 1, optional
|
||||
{pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits
|
||||
dst_mac = <<>> :: iodata() | undefined % = 2, optional
|
||||
}).
|
||||
-endif.
|
||||
|
||||
-ifndef('SDL_PEER_INFO_PB_H').
|
||||
-define('SDL_PEER_INFO_PB_H', true).
|
||||
-record(sdl_peer_info,
|
||||
{dst_mac = <<>> :: iodata() | undefined, % = 1, optional
|
||||
v4_info = undefined :: sdlan_pb:sdl_v4_info() | undefined, % = 2, optional
|
||||
v6_info :: sdlan_pb:sdl_v6_info() | undefined % = 3, optional
|
||||
{pkt_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
|
||||
}).
|
||||
-endif.
|
||||
|
||||
-ifndef('SDL_ARP_REQUEST_PB_H').
|
||||
-define('SDL_ARP_REQUEST_PB_H', true).
|
||||
-record(sdl_arp_request,
|
||||
{target_ip = 0 :: non_neg_integer() | undefined % = 1, optional, 32 bits
|
||||
{pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits
|
||||
target_ip = 0 :: non_neg_integer() | undefined % = 2, optional, 32 bits
|
||||
}).
|
||||
-endif.
|
||||
|
||||
-ifndef('SDL_ARP_RESPONSE_PB_H').
|
||||
-define('SDL_ARP_RESPONSE_PB_H', true).
|
||||
-record(sdl_arp_response,
|
||||
{target_ip = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits
|
||||
target_mac = <<>> :: iodata() | undefined % = 2, optional
|
||||
{pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits
|
||||
target_ip = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits
|
||||
target_mac = <<>> :: iodata() | undefined % = 3, optional
|
||||
}).
|
||||
-endif.
|
||||
|
||||
-ifndef('SDL_POLICY_REQUEST_PB_H').
|
||||
-define('SDL_POLICY_REQUEST_PB_H', true).
|
||||
-record(sdl_policy_request,
|
||||
{src_identity_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits
|
||||
dst_identity_id = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits
|
||||
version = 0 :: non_neg_integer() | undefined % = 3, optional, 32 bits
|
||||
{pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits
|
||||
src_identity_id = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits
|
||||
dst_identity_id = 0 :: non_neg_integer() | undefined, % = 3, optional, 32 bits
|
||||
version = 0 :: non_neg_integer() | undefined % = 4, optional, 32 bits
|
||||
}).
|
||||
-endif.
|
||||
|
||||
-ifndef('SDL_POLICY_RESPONSE_PB_H').
|
||||
-define('SDL_POLICY_RESPONSE_PB_H', true).
|
||||
-record(sdl_policy_response,
|
||||
{src_identity_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits
|
||||
dst_identity_id = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits
|
||||
version = 0 :: non_neg_integer() | undefined, % = 3, optional, 32 bits
|
||||
rules = <<>> :: iodata() | undefined % = 4, optional
|
||||
{pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits
|
||||
src_identity_id = 0 :: non_neg_integer() | undefined, % = 2, optional, 32 bits
|
||||
dst_identity_id = 0 :: non_neg_integer() | undefined, % = 3, optional, 32 bits
|
||||
version = 0 :: non_neg_integer() | undefined, % = 4, optional, 32 bits
|
||||
rules = <<>> :: iodata() | undefined % = 5, optional
|
||||
}).
|
||||
-endif.
|
||||
|
||||
|
||||
@ -113,9 +113,9 @@ handle_event(internal, do_init, initializing, State=#state{conn = Conn, max_pack
|
||||
{stop, Reason, State}
|
||||
end;
|
||||
|
||||
handle_event(info, {frame, <<PacketId:32, ?PACKET_REGISTER_SUPER, Body/binary>>}, initialized, State=#state{stream = Stream}) ->
|
||||
handle_event(info, {frame, <<?PACKET_REGISTER_SUPER, Body/binary>>}, initialized, State=#state{stream = Stream}) ->
|
||||
#sdl_register_super{
|
||||
client_id = ClientId, network_id = NetworkId, mac = Mac, ip = Ip, mask_len = MaskLen,
|
||||
pkt_id = PktId, 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),
|
||||
|
||||
true = (Mac =/= <<>> andalso PubKey =/= <<>> andalso ClientId =/= <<>>),
|
||||
@ -145,46 +145,50 @@ handle_event(info, {frame, <<PacketId:32, ?PACKET_REGISTER_SUPER, Body/binary>>}
|
||||
{ok, AesKey, SessionToken} = sdlan_network:attach(NetworkPid, self(), ClientId, Mac, Ip, HostName),
|
||||
RsaPubKey = sdlan_cipher:rsa_pem_decode(PubKey),
|
||||
RegisterSuperAck = sdlan_pb:encode_msg(#sdl_register_super_ack {
|
||||
pkt_id = PktId,
|
||||
aes_key = rsa_encode(AesKey, RsaPubKey),
|
||||
session_token = SessionToken
|
||||
}),
|
||||
|
||||
%% 发送确认信息
|
||||
{ok, _} = quicer:send(Stream, <<PacketId:32, ?PACKET_REGISTER_SUPER_ACK, RegisterSuperAck/binary>>),
|
||||
{ok, _} = quicer:send(Stream, <<?PACKET_REGISTER_SUPER_ACK, RegisterSuperAck/binary>>),
|
||||
%% 设置节点的在线状态
|
||||
Result = sdlan_api:node_online(ClientId, NetworkId, sdlan_ipaddr:int_to_ipv4(Ip)),
|
||||
logger:debug("[sdlan_register_worker] client_id: ~p, set none online result is: ~p", [ClientId, Result]),
|
||||
{next_state, registered, State#state{network_id = NetworkId, network_pid = NetworkPid, client_id = ClientId, mac = Mac, ip = Ip}};
|
||||
undefined ->
|
||||
logger:warning("[sdlan_register_worker] client_id: ~p, register get error: network not found", [ClientId]),
|
||||
{ok, _} = quicer:send(Stream, register_nak_reply(PacketId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)),
|
||||
{ok, _} = quicer:send(Stream, register_nak_reply(PktId, ?NAK_INTERNAL_FAULT, <<"Internal Error">>)),
|
||||
{stop, normal, State}
|
||||
end;
|
||||
{ok, #{<<"error">> := #{<<"code">> := Code, <<"message">> := Message}}} ->
|
||||
logger:warning("[sdlan_register_worker] network_id: ~p, client_id: ~p, register get error: ~ts, error_code: ~p", [NetworkId, ClientId, Message, Code]),
|
||||
{ok, _} = quicer:send(Stream, register_nak_reply(PacketId, Code, Message)),
|
||||
{ok, _} = quicer:send(Stream, register_nak_reply(PktId, Code, Message)),
|
||||
{stop, normal, State};
|
||||
{error, Reason} ->
|
||||
logger:warning("[sdlan_register_worker] network_id: ~p, client_id: ~p, register get error: ~p", [NetworkId, ClientId, Reason]),
|
||||
{ok, _} = quicer:send(Stream, register_nak_reply(PacketId, ?NAK_NETWORK_FAULT, <<"Network Error">>)),
|
||||
{ok, _} = quicer:send(Stream, register_nak_reply(PktId, ?NAK_NETWORK_FAULT, <<"Network Error">>)),
|
||||
{stop, normal, State}
|
||||
end;
|
||||
|
||||
handle_event(info, {frame, <<PacketId:32, ?PACKET_QUERY_INFO, Body/binary>>}, registered, #state{stream = Stream, network_pid = NetworkPid, mac = SrcMac}) when is_pid(NetworkPid) ->
|
||||
#sdl_query_info{dst_mac = DstMac} = sdlan_pb:decode_msg(Body, sdl_query_info),
|
||||
handle_event(info, {frame, <<?PACKET_QUERY_INFO, Body/binary>>}, registered, #state{stream = Stream, network_pid = NetworkPid, mac = SrcMac}) when is_pid(NetworkPid) ->
|
||||
#sdl_query_info{pkt_id = PktId, dst_mac = DstMac} = sdlan_pb:decode_msg(Body, sdl_query_info),
|
||||
case sdlan_network:peer_info(NetworkPid, SrcMac, DstMac) of
|
||||
error ->
|
||||
logger:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer not found",
|
||||
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
|
||||
|
||||
EmptyResponse = sdlan_pb:encode_msg(#sdl_empty{}),
|
||||
{ok, _} = quicer:send(Stream, <<PacketId:32, ?PACKET_PEER_INFO, EmptyResponse/binary>>),
|
||||
EmptyResponse = sdlan_pb:encode_msg(#sdl_empty{
|
||||
pkt_id = PktId
|
||||
}),
|
||||
{ok, _} = quicer:send(Stream, <<?PACKET_PEER_INFO, EmptyResponse/binary>>),
|
||||
keep_state_and_data;
|
||||
{ok, {NatPeer = {{Ip0, Ip1, Ip2, Ip3}, NatPort}, NatType}, V6Info} ->
|
||||
logger:debug("[sdlan_channel] query_info src_mac is: ~p, dst_mac: ~p, nat_peer: ~p",
|
||||
[sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), NatPeer]),
|
||||
|
||||
PeerInfo = sdlan_pb:encode_msg(#sdl_peer_info{
|
||||
pkt_id = PktId,
|
||||
dst_mac = DstMac,
|
||||
v4_info = #sdl_v4_info {
|
||||
port = NatPort,
|
||||
@ -193,12 +197,12 @@ handle_event(info, {frame, <<PacketId:32, ?PACKET_QUERY_INFO, Body/binary>>}, re
|
||||
},
|
||||
v6_info = V6Info
|
||||
}),
|
||||
{ok, _} = quicer:send(Stream, <<PacketId:32, ?PACKET_PEER_INFO, PeerInfo/binary>>),
|
||||
{ok, _} = quicer:send(Stream, <<?PACKET_PEER_INFO, PeerInfo/binary>>),
|
||||
keep_state_and_data
|
||||
end;
|
||||
|
||||
handle_event(info, {frame, <<0:32, ?PACKET_PING>>}, registered, State = #state{stream = Stream, ping_counter = PingCounter}) ->
|
||||
{ok, _} = quicer:send(Stream, <<0:32, ?PACKET_PONG>>),
|
||||
handle_event(info, {frame, <<?PACKET_PING>>}, registered, State = #state{stream = Stream, ping_counter = PingCounter}) ->
|
||||
{ok, _} = quicer:send(Stream, <<?PACKET_PONG>>),
|
||||
{keep_state, State#state{ping_counter = PingCounter + 1}};
|
||||
|
||||
handle_event(info, {timeout, _, ping_ticker}, _, State = #state{client_id = ClientId, ping_counter = PingCounter}) ->
|
||||
@ -215,11 +219,11 @@ handle_event(info, {timeout, _, ping_ticker}, _, State = #state{client_id = Clie
|
||||
%% 发送指令信息
|
||||
handle_event(info, {send_event, EventType, Event}, registered, #state{stream = Stream, client_id = ClientId}) ->
|
||||
logger:debug("[sdlan_channel] client_id: ~p, will send eventType: ~p, event: ~p", [ClientId, EventType, Event]),
|
||||
{ok, _} = quicer:send(Stream, <<0:32, ?PACKET_EVENT, EventType, Event/binary>>),
|
||||
{ok, _} = quicer:send(Stream, <<?PACKET_EVENT, EventType, Event/binary>>),
|
||||
keep_state_and_data;
|
||||
|
||||
%% 取消注册
|
||||
handle_event(info, {frame, <<0:32, ?PACKET_UNREGISTER>>}, registered, State=#state{client_id = ClientId, mac = Mac, network_pid = NetworkPid}) when is_pid(NetworkPid) ->
|
||||
handle_event(info, {frame, <<?PACKET_UNREGISTER>>}, registered, State=#state{client_id = ClientId, mac = Mac, network_pid = NetworkPid}) when is_pid(NetworkPid) ->
|
||||
logger:warning("[sdlan_channel] unregister client_id: ~p", [ClientId]),
|
||||
sdlan_network:unregister(NetworkPid, ClientId, Mac),
|
||||
{stop, normal, State};
|
||||
@ -280,10 +284,11 @@ decode_frames0(Rest, _MaxPacketSize, Frames) ->
|
||||
-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
|
||||
}),
|
||||
<<PacketId:32, ?PACKET_REGISTER_SUPER_NAK, RegisterNakReply/binary>>.
|
||||
<<?PACKET_REGISTER_SUPER_NAK, RegisterNakReply/binary>>.
|
||||
|
||||
rsa_encode(PlainText, RsaPubKey) when is_binary(PlainText) ->
|
||||
iolist_to_binary(sdlan_cipher:rsa_encrypt(PlainText, RsaPubKey)).
|
||||
File diff suppressed because it is too large
Load Diff
@ -29,12 +29,12 @@ message SDLWelcome {
|
||||
|
||||
// quic 通讯消息
|
||||
message SDLEmpty {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
}
|
||||
|
||||
// 这里修改成了扁平的结构, 否则有些字段不好找放的位置
|
||||
message SDLRegisterSuper {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
string client_id = 2;
|
||||
// 网络地址信息已经有https请求分配了
|
||||
// 注册的时候需要带上(network_id, mac, ip, mask_len, hostname)
|
||||
@ -53,13 +53,13 @@ message SDLRegisterSuper {
|
||||
// 客户端的升级逻辑,在https的接口里面去完成
|
||||
// 部分逻辑会脱离quic去通讯,增加session_token校验
|
||||
message SDLRegisterSuperAck {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
bytes aes_key = 2;
|
||||
bytes session_token = 3;
|
||||
}
|
||||
|
||||
message SDLRegisterSuperNak {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
uint32 error_code = 2;
|
||||
string error_message = 3;
|
||||
}
|
||||
@ -67,12 +67,12 @@ message SDLRegisterSuperNak {
|
||||
// 网络地址查询
|
||||
|
||||
message SDLQueryInfo {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
bytes dst_mac = 2;
|
||||
}
|
||||
|
||||
message SDLPeerInfo {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
bytes dst_mac = 2;
|
||||
SDLV4Info v4_info = 3;
|
||||
optional SDLV6Info v6_info = 4;
|
||||
@ -82,19 +82,19 @@ message SDLPeerInfo {
|
||||
// 真实的arp请求是通过广播的形式获取到的,但是针对于macos这种tun的实现;是能够分析出arp请求包的;
|
||||
// 对于当前网络来说,服务端是知道mac对应的ip地址的,因此没有必要广播;直接通过服务器端返回
|
||||
message SDLArpRequest {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
uint32 target_ip = 2;
|
||||
}
|
||||
|
||||
message SDLArpResponse {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
uint32 target_ip = 2;
|
||||
bytes target_mac = 3;
|
||||
}
|
||||
|
||||
// 权限请求查询相关
|
||||
message SDLPolicyRequest {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
uint32 src_identity_id = 2;
|
||||
uint32 dst_identity_id = 3;
|
||||
uint32 version = 4;
|
||||
@ -102,7 +102,7 @@ message SDLPolicyRequest {
|
||||
|
||||
// 基于quic通讯,rules部分已经没有了长度限制
|
||||
message SDLPolicyResponse {
|
||||
uint32 pktId = 1;
|
||||
uint32 pkt_id = 1;
|
||||
uint32 src_identity_id = 2;
|
||||
uint32 dst_identity_id = 3;
|
||||
// 版本号,客户端需要比较版本号确定是否覆盖; 请求端自己去管理版本号,服务端只是原样回写
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user