fix network ets
This commit is contained in:
parent
128a937029
commit
e931721728
@ -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) ->
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user