fix network

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

View File

@ -129,7 +129,9 @@ 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()) ->
{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) ->
case lookup_endpoint(NetworkId, SrcMac) of
case endpoint_existing_table_name(NetworkId) of
{ok, Table} ->
case lookup_endpoint(Table, SrcMac) of
#endpoint{} ->
case sdlan_util:is_broadcast_mac(DstMac) orelse sdlan_util:is_multicast_mac(DstMac) of
true ->
@ -141,6 +143,9 @@ forward_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) when is_integer(NetworkI
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;
error ->
{error, table_not_found}
end.
%% ip地址对应的nat关系
@ -434,7 +439,16 @@ limiting_check(ThrottleKey) ->
-spec endpoint_table_name(NetworkId :: integer()) -> atom().
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().
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) ->
ets:delete(Table, Mac).
-spec lookup_endpoint(NetworkIdOrTable :: integer() | ets:tid(), Mac :: binary()) -> #endpoint{} | undefined.
lookup_endpoint(NetworkId, Mac) when is_integer(NetworkId), is_binary(Mac) ->
lookup_endpoint(endpoint_table_name(NetworkId), Mac);
-spec lookup_endpoint(ets:tid(), Mac :: binary()) -> #endpoint{} | undefined.
lookup_endpoint(Table, Mac) when is_binary(Mac) ->
try ets:lookup(Table, Mac) of
[{Mac, Endpoint = #endpoint{}}] ->
@ -495,7 +507,9 @@ remove_channel_endpoints(ChannelPid, Table) when is_pid(ChannelPid) ->
{ok, integer()} | {error, any()}.
forward_unicast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) ->
PacketBytes = byte_size(Packet),
case lookup_endpoint(NetworkId, DstMac) of
case endpoint_existing_table_name(NetworkId) of
{ok, Table} ->
case lookup_endpoint(Table, DstMac) of
#endpoint{hole = #hole{peer = Peer = {NatIp, NatPort}}} ->
case limiting_check(throttle_key(NetworkId)) of
pass ->
@ -516,6 +530,9 @@ forward_unicast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) ->
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;
error ->
{error, table_not_found}
end.
-spec forward_broadcast_by_ets(NetworkId :: integer(), Sock :: any(), SrcMac :: binary(), DstMac :: binary(), Packet :: binary()) ->