From e12424f4cf6ef4ab555e1529d4bb4ba7b3710c03 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Fri, 1 May 2026 17:15:59 +0800 Subject: [PATCH] fix network --- src/sdlan_network.erl | 85 ++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 34 deletions(-) diff --git a/src/sdlan_network.erl b/src/sdlan_network.erl index fb5ec2b..01f30e7 100644 --- a/src/sdlan_network.erl +++ b/src/sdlan_network.erl @@ -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()) -> {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 - #endpoint{} -> - case sdlan_util:is_broadcast_mac(DstMac) orelse sdlan_util:is_multicast_mac(DstMac) of - true -> - forward_broadcast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet); - false -> - forward_unicast_by_ets(NetworkId, Sock, SrcMac, DstMac, Packet) + 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 -> + 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; - 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} + 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,27 +507,32 @@ 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 - #endpoint{hole = #hole{peer = Peer = {NatIp, NatPort}}} -> - case limiting_check(throttle_key(NetworkId)) of - pass -> - logger:debug("[sdlan_network] forward data by ets networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p", - [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]), - gen_udp:send(Sock, NatIp, NatPort, Packet), - {ok, PacketBytes}; - denied -> - logger:notice("[sdlan_network] networkd_id: ~p, src_mac: ~p, dst_mac: ~p, rate limited, discard", + 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 -> + logger:debug("[sdlan_network] forward data by ets networkd_id: ~p, src_mac: ~p, dst_mac: ~p, hole: ~p", + [NetworkId, sdlan_util:format_mac(SrcMac), sdlan_util:format_mac(DstMac), Peer]), + gen_udp:send(Sock, NatIp, NatPort, Packet), + {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)]), - {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; - #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)]), - {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} + error -> + {error, table_not_found} end. -spec forward_broadcast_by_ets(NetworkId :: integer(), Sock :: any(), SrcMac :: binary(), DstMac :: binary(), Packet :: binary()) ->