File 3511-snmp-agent-Handle-the-udp-error-message.patch of Package erlang

From c66e012e5d3aa95a9eacad13e36ed705ba7187c9 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Mon, 30 Nov 2020 13:55:38 +0100
Subject: [PATCH 1/2] [snmp|agent] Handle the udp-error message

We explicitly handle the udp_error message. The action is
just a error message, but its better then ignoring it.

OTP-17033
---
 lib/snmp/src/agent/snmpa_net_if.erl | 53 +++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/lib/snmp/src/agent/snmpa_net_if.erl b/lib/snmp/src/agent/snmpa_net_if.erl
index 63884f94aa..835b8d4375 100644
--- a/lib/snmp/src/agent/snmpa_net_if.erl
+++ b/lib/snmp/src/agent/snmpa_net_if.erl
@@ -570,6 +570,15 @@ loop(#state{transports = Transports,
 		    loop(S)
 	    end;
 
+	{udp_error, Socket, Error} when is_port(Socket) ->
+	    ?vinfo("got udp-error on ~p: ~w", [Socket, Error]),
+	    case lists:keyfind(Socket, #transport.socket, Transports) of
+		#transport{socket = Socket} = Transport ->
+		    loop(handle_udp_error(S, Transport, Error));
+		false ->
+		    loop(handle_udp_error_unknown(S, Socket, Error))
+	    end;
+
 	{info, ReplyRef, Pid} ->
 	    Info = get_info(S),
 	    Pid ! {ReplyRef, Info, self()},
@@ -796,6 +805,47 @@ loop(#state{transports = Transports,
     end.
 
 
+handle_udp_error(S, #transport{socket = Socket,
+                               kind   = Kind}, Error) ->
+    try inet:sockname(Socket) of
+        {ok, {IP, Port}} ->
+            error_msg("UDP Error for transport: "
+                      "~n      Socket: ~p (~p, ~p)"
+                      "~n      Kind:   ~p"
+                      "~n      Error:  ~p", [Socket, IP, Port, Kind, Error]);
+        {error, _} ->
+            error_msg("UDP Error for transport: "
+                      "~n      Socket: ~p"
+                      "~n      Kind:   ~p"
+                      "~n      Error:  ~p", [Socket, Kind, Error])
+    catch
+        _:_:_ ->
+            error_msg("UDP Error for transport: "
+                      "~n      Socket: ~p"
+                      "~n      Kind:   ~p"
+                      "~n      Error:  ~p", [Socket, Kind, Error])
+    end,
+    S.
+
+handle_udp_error_unknown(S, Socket, Error) ->
+    try inet:sockname(Socket) of
+        {ok, {IP, Port}} ->
+            warning_msg("UDP Error for unknown transport: "
+                        "~n      Socket: ~p (~p, ~p)"
+                        "~n      Error:  ~p", [Socket, IP, Port, Error]);
+        {error, _} ->
+            warning_msg("UDP Error for unknown transport: "
+                        "~n      Socket: ~p"
+                        "~n      Error:  ~p", [Socket, Error])
+    catch
+        _:_:_ ->
+            warning_msg("UDP Error for transport: "
+                        "~n      Socket: ~p"
+                        "~n      Error:  ~p", [Socket, Error])
+    end,
+    S.
+
+
 update_req_counter_incoming(
   #state{limit = infinity} = S,
   #transport{socket = Socket},
@@ -2064,6 +2114,9 @@ get_socket_opt(Opt, Opts, DefaultOpts, DefaultVal) ->
 error_msg(F, A) -> 
     ?snmpa_error("NET-IF server: " ++ F, A).
 
+warning_msg(F, A) -> 
+    ?snmpa_warning("NET-IF server: " ++ F, A).
+
 info_msg(F,A) ->
     ?snmpa_info("NET-IF server: " ++ F, A).
 
-- 
2.26.2

openSUSE Build Service is sponsored by