fix network

This commit is contained in:
anlicheng 2026-05-01 17:15:59 +08:00
parent 4844e32b6c
commit e12424f4cf

View File

@ -129,18 +129,23 @@ wait_command_ack(Ref, Timeout) when is_reference(Ref), is_integer(Timeout) ->
-spec forward_by_ets(NetworkId :: integer(), Sock :: any(), SrcMac :: binary(), DstMac :: binary(), Packet :: binary()) -> -spec forward_by_ets(NetworkId :: integer(), Sock :: any(), SrcMac :: binary(), DstMac :: binary(), Packet :: binary()) ->
{ok, ForwardBytes :: integer()} | {error, Reason :: any()}. {ok, ForwardBytes :: integer()} | {error, Reason :: any()}.
forward_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) when is_integer(NetworkId), is_binary(SrcMac), is_binary(DstMac), is_binary(Packet) -> forward_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) when is_integer(NetworkId), is_binary(SrcMac), is_binary(DstMac), is_binary(Packet) ->
case lookup_endpoint(NetworkId, SrcMac) of case endpoint_existing_table_name(NetworkId) of
#endpoint{} -> {ok, Table} ->
case sdlan_util:is_broadcast_mac(DstMac) orelse sdlan_util:is_multicast_mac(DstMac) of case lookup_endpoint(Table, SrcMac) of
true -> #endpoint{} ->
forward_broadcast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet); case sdlan_util:is_broadcast_mac(DstMac) orelse sdlan_util:is_multicast_mac(DstMac) of
false -> true ->
forward_unicast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) forward_broadcast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet);
false ->
forward_unicast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet)
end;
undefined ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard, src not found",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{error, src_not_found}
end; end;
undefined -> error ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, forward discard, src not found", {error, table_not_found}
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{error, src_not_found}
end. end.
%% ip地址对应的nat关系 %% ip地址对应的nat关系
@ -434,7 +439,16 @@ limiting_check(ThrottleKey) ->
-spec endpoint_table_name(NetworkId :: integer()) -> atom(). -spec endpoint_table_name(NetworkId :: integer()) -> atom().
endpoint_table_name(NetworkId) when is_integer(NetworkId) -> endpoint_table_name(NetworkId) when is_integer(NetworkId) ->
list_to_atom("sdlan_network_endpoint:" ++ integer_to_list(NetworkId)). list_to_atom(lists:concat(["sdlan_network_endpoint:", NetworkId])).
-spec endpoint_existing_table_name(NetworkId :: integer()) -> {ok, atom()} | error.
endpoint_existing_table_name(NetworkId) when is_integer(NetworkId) ->
try
Atom = list_to_existing_atom(lists:concat(["sdlan_network_endpoint:", NetworkId])),
{ok, Atom}
catch error:_ ->
error
end.
-spec throttle_key(NetworkId :: integer()) -> atom(). -spec throttle_key(NetworkId :: integer()) -> atom().
throttle_key(NetworkId) when is_integer(NetworkId) -> throttle_key(NetworkId) when is_integer(NetworkId) ->
@ -458,9 +472,7 @@ insert_endpoint(Table, Mac, Endpoint = #endpoint{}) when is_binary(Mac) ->
delete_endpoint(Table, Mac) when is_binary(Mac) -> delete_endpoint(Table, Mac) when is_binary(Mac) ->
ets:delete(Table, Mac). ets:delete(Table, Mac).
-spec lookup_endpoint(NetworkIdOrTable :: integer() | ets:tid(), Mac :: binary()) -> #endpoint{} | undefined. -spec lookup_endpoint(ets:tid(), Mac :: binary()) -> #endpoint{} | undefined.
lookup_endpoint(NetworkId, Mac) when is_integer(NetworkId), is_binary(Mac) ->
lookup_endpoint(endpoint_table_name(NetworkId), Mac);
lookup_endpoint(Table, Mac) when is_binary(Mac) -> lookup_endpoint(Table, Mac) when is_binary(Mac) ->
try ets:lookup(Table, Mac) of try ets:lookup(Table, Mac) of
[{Mac, Endpoint = #endpoint{}}] -> [{Mac, Endpoint = #endpoint{}}] ->
@ -495,27 +507,32 @@ remove_channel_endpoints(ChannelPid, Table) when is_pid(ChannelPid) ->
{ok, integer()} | {error, any()}. {ok, integer()} | {error, any()}.
forward_unicast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) -> forward_unicast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) ->
PacketBytes = byte_size(Packet), PacketBytes = byte_size(Packet),
case lookup_endpoint(NetworkId, DstMac) of case endpoint_existing_table_name(NetworkId) of
#endpoint{hole = #hole{peer = Peer = {NatIp, NatPort}}} -> {ok, Table} ->
case limiting_check(throttle_key(NetworkId)) of case lookup_endpoint(Table, DstMac) of
pass -> #endpoint{hole = #hole{peer = Peer = {NatIp, NatPort}}} ->
logger:debug("[sdlan_network] forward data by ets networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p", case limiting_check(throttle_key(NetworkId)) of
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]), pass ->
gen_udp:send(Sock, NatIp, NatPort, Packet), logger:debug("[sdlan_network] forward data by ets networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p",
{ok, PacketBytes}; [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]),
denied -> gen_udp:send(Sock, NatIp, NatPort, Packet),
logger:notice("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, rate limited, discard", {ok, PacketBytes};
denied ->
logger:notice("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, rate limited, discard",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{error, rate_limited}
end;
#endpoint{} ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole not found",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]), [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{error, rate_limited} {error, hole_not_found};
undefined ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p not found",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{error, dst_not_found}
end; end;
#endpoint{} -> error ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole not found", {error, table_not_found}
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{error, hole_not_found};
undefined ->
logger:debug("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p not found",
[NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac)]),
{error, dst_not_found}
end. end.
-spec forward_broadcast_by_ets(NetworkId :: integer(), Sock :: any(), SrcMac :: binary(), DstMac :: binary(), Packet :: binary()) -> -spec forward_broadcast_by_ets(NetworkId :: integer(), Sock :: any(), SrcMac :: binary(), DstMac :: binary(), Packet :: binary()) ->