diff --git a/src/sdlan_network.erl b/src/sdlan_network.erl index 45824cc..50429bf 100644 --- a/src/sdlan_network.erl +++ b/src/sdlan_network.erl @@ -228,31 +228,21 @@ handle_call({attach, ChannelPid, ClientId, Mac, Ip, Hostname}, _From, %% 添加域名->ip的映射关系 sdlan_hostname_regedit:insert(Hostname, Domain, Ip), - OldEndpoint = lookup_endpoint(EndpointTable, Mac), %% mac对应的Endpoint存在,并且对应的ip变了,需要通知端上清理arp - maybe - #endpoint{ip = OldIp} ?= OldEndpoint, - true ?= OldIp =/= Ip, - - Event = sdlan_pb:encode_msg(#'SDLEvent'{ - event = {nat_changed, #'SDLEvent.NatChanged' { - mac = Mac, - ip = Ip - }} - }), - logger:debug("Event: nat_changed, for attach"), - - broadcast(fun(#endpoint{channel_pid = ChannelPid0}) -> - sdlan_quic_channel:send_event(ChannelPid0, Event) - end, [Mac], EndpointTable) - end, - %% 重复attach需要清理之前的绑定信息;即使IP未变化,也不能保留旧channel。 - cleanup_endpoint(OldEndpoint, ChannelPid, rebind), + maybe_nat_changed(ChannelPid, Mac, Ip, EndpointTable), ChannelRef = monitor(process, ChannelPid), SessionToken = gen_session_token(), - Endpoint = #endpoint{channel_pid = ChannelPid, channel_ref = ChannelRef, - client_id = ClientId, mac = Mac, ip = Ip, hostname = Hostname, session_token = SessionToken, last_seen = erlang:monotonic_time(second)}, + Endpoint = #endpoint{ + channel_pid = ChannelPid, + channel_ref = ChannelRef, + client_id = ClientId, + mac = Mac, + ip = Ip, + hostname = Hostname, + session_token = SessionToken, + last_seen = erlang:monotonic_time(second) + }, insert_endpoint(EndpointTable, Mac, Endpoint), %% 生成对应的分区id @@ -575,6 +565,28 @@ forward_broadcast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) -> [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), {ok, byte_size(Packet)}. +maybe_nat_changed(ChannelPid, Mac, Ip, EndpointTable) -> + OldEndpoint = lookup_endpoint(EndpointTable, Mac), + %% mac对应的Endpoint存在,并且对应的ip变了,需要通知端上清理arp + maybe + #endpoint{ip = OldIp} ?= OldEndpoint, + true ?= OldIp =/= Ip, + + Event = sdlan_pb:encode_msg(#'SDLEvent'{ + event = {nat_changed, #'SDLEvent.NatChanged' { + mac = Mac, + ip = Ip + }} + }), + logger:debug("Event: nat_changed, for attach"), + + broadcast(fun(#endpoint{channel_pid = ChannelPid0}) -> + sdlan_quic_channel:send_event(ChannelPid0, Event) + end, [Mac], EndpointTable) + end, + %% 重复attach需要清理之前的绑定信息;即使IP未变化,也不能保留旧channel。 + cleanup_endpoint(OldEndpoint, ChannelPid, rebind). + cleanup_endpoint(undefined, _KeepChannelPid, _Reason) -> ok; cleanup_endpoint(#endpoint{channel_ref = ChannelRef, channel_pid = ChannelPid}, KeepChannelPid, Reason) ->