File 7221-snmp-manager-is_known_engine_id.patch of Package erlang
From ca4df3e70563c9478c3595d0eb2de3e25efb7168 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Wed, 26 Mar 2025 11:58:08 +0100
Subject: [PATCH 1/3] [snmp|manager] is_known_engine_id
Do not base this check on the address and port (of the inform sender).
Just use the context engine id.
ERIERL-1207
---
lib/snmp/src/manager/snmpm.erl | 18 +++++++++++++++--
lib/snmp/src/manager/snmpm_config.erl | 29 +++++++++++++++++++++------
lib/snmp/src/manager/snmpm_mpd.erl | 11 ++++++----
3 files changed, 46 insertions(+), 12 deletions(-)
diff --git a/lib/snmp/src/manager/snmpm.erl b/lib/snmp/src/manager/snmpm.erl
index 049a0ba2e4..6a8227c601 100644
--- a/lib/snmp/src/manager/snmpm.erl
+++ b/lib/snmp/src/manager/snmpm.erl
@@ -55,7 +55,7 @@ The module `snmpm` contains interface functions to the SNMP manager.
register_agent/2, register_agent/3, register_agent/4,
unregister_agent/2, unregister_agent/3,
- which_agents/0, which_agents/1,
+ which_agents/0, which_agents/1, which_agents/2,
agent_info/2, update_agent_info/3, update_agent_info/4,
register_usm_user/3, unregister_usm_user/2,
@@ -949,6 +949,19 @@ which_agents(UserId) ->
snmpm_config:which_agents(UserId).
+-spec which_agents(Key, Id) -> Agents when
+ Key :: user_id,
+ Id :: term(),
+ Agents :: [target_name()];
+ (Key, Id) -> Agents when
+ Key :: engine_id,
+ Id :: snmp:engine_id(),
+ Agents :: [target_name()].
+
+which_agents(Key, Id) ->
+ snmpm_config:which_agents(Key, Id).
+
+
%% -- USM users --
register_usm_user(EngineID, UserName, Conf)
diff --git a/lib/snmp/src/manager/snmpm_config.erl b/lib/snmp/src/manager/snmpm_config.erl
index 2d3b19fd66..512dd79959 100644
--- a/lib/snmp/src/manager/snmpm_config.erl
+++ b/lib/snmp/src/manager/snmpm_config.erl
@@ -40,9 +40,9 @@
register_agent/3, unregister_agent/2,
agent_info/0, agent_info/2, agent_info/3,
update_agent_info/3,
- which_agents/0, which_agents/1,
+ which_agents/0, which_agents/1, which_agents/2,
- is_known_engine_id/2,
+ is_known_engine_id/1, is_known_engine_id/2,
get_agent_engine_id/1,
get_agent_engine_max_message_size/1,
get_agent_version/1,
@@ -522,15 +522,32 @@ which_agents() ->
which_agents('_').
which_agents(UserId) ->
- Pat = {{'$1', user_id}, UserId},
- Agents = ets:match(snmpm_agent_table, Pat),
- [TargetName || [TargetName] <- Agents].
+ which_agents(user_id, UserId).
+%% Choose agent(s) based on UserId or EngineID
+which_agents(Key = user_id, UserId) ->
+ do_which_agents(Key, UserId);
+which_agents(Key = engine_id, EngineID) ->
+ do_which_agents(Key, EngineID).
+do_which_agents(Key, Value) ->
+ Pat = {{'$1', Key}, Value},
+ [TargetName || [TargetName] <- ets:match(snmpm_agent_table, Pat)].
+
update_agent_info(UserId, TargetName, Info) ->
call({update_agent_info, UserId, TargetName, Info}).
+is_known_engine_id(EngineID) ->
+ case which_agents(engine_id, EngineID) of
+ [] ->
+ false;
+ Targets ->
+ ?vdebug("~w -> Targets: "
+ "~n ~p", [?FUNCTION_NAME, Targets]),
+ true
+ end.
+
is_known_engine_id(EngineID, TargetName) ->
case agent_info(TargetName, engine_id) of
{ok, EngineID} ->
diff --git a/lib/snmp/src/manager/snmpm_mpd.erl b/lib/snmp/src/manager/snmpm_mpd.erl
index 3894e79f6b..ffda751da3 100644
--- a/lib/snmp/src/manager/snmpm_mpd.erl
+++ b/lib/snmp/src/manager/snmpm_mpd.erl
@@ -495,7 +495,8 @@ process_v3_msg(NoteStore, Msg, Hdr, Data, Address, Log) ->
%% handle CtxEngineID to ourselves
%% Check that we actually know of an agent with this
%% CtxEngineID and Address
- case is_known_engine_id(CtxEngineID, Address) of
+ %% case is_known_engine_id(CtxEngineID, Address) of
+ case is_known_engine_id(CtxEngineID) of
true ->
?vtrace("and the agent EngineID (~p) "
"is know to us", [CtxEngineID]),
@@ -1087,8 +1088,10 @@ get_engine_id() ->
get_agent_engine_id(Name) ->
snmpm_config:get_agent_engine_id(Name).
-is_known_engine_id(EngineID, {Addr, Port}) ->
- snmpm_config:is_known_engine_id(EngineID, Addr, Port).
+%% is_known_engine_id(EngineID, {Addr, Port}) ->
+%% snmpm_config:is_known_engine_id(EngineID, Addr, Port).
+is_known_engine_id(EngineID) ->
+ snmpm_config:is_known_engine_id(EngineID).
%%-----------------------------------------------------------------
--
2.43.0