File 1972-Test-input-handler-from-internal-inet_epmd-cryptcook.patch of Package erlang

From 21dd125dfdbe06c71dcee12882931cf4cc1a891f Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Wed, 3 May 2023 11:20:07 +0200
Subject: [PATCH 2/2] Test input handler from internal inet_epmd cryptcookie
 framework

---
 .../test/inet_epmd_cryptcookie_inet_ktls.erl  | 63 ++++++++++++++++++-
 lib/ssl/test/ssl_dist_bench_SUITE.erl         | 21 ++++++-
 2 files changed, 80 insertions(+), 4 deletions(-)

diff --git a/lib/ssl/test/inet_epmd_cryptcookie_inet_ktls.erl b/lib/ssl/test/inet_epmd_cryptcookie_inet_ktls.erl
index d350cc8139..b2c082969c 100644
--- a/lib/ssl/test/inet_epmd_cryptcookie_inet_ktls.erl
+++ b/lib/ssl/test/inet_epmd_cryptcookie_inet_ktls.erl
@@ -103,7 +103,8 @@ accept_controller(_NetAddress, Controller, Socket) ->
 
 %% ------------------------------------------------------------
 accepted(NetAddress, _Timer, Socket) ->
-    inet_epmd_dist:hs_data(NetAddress, Socket).
+    input_handler_setup(
+      inet_epmd_dist:hs_data(NetAddress, Socket)).
 
 %% ------------------------------------------------------------
 connect(NetAddress, _Timer, Options) ->
@@ -123,7 +124,8 @@ connect(NetAddress, _Timer, Options) ->
             inet_ktls_info(Socket, cryptcookie:ktls_info(CipherState)),
         ok ?= inet_tls_dist:set_ktls(KtlsInfo),
         ok ?= inet:setopts(Socket, [{packet, 2}, {mode, list}]),
-        inet_epmd_dist:hs_data(NetAddress, Socket)
+        input_handler_setup(
+          inet_epmd_dist:hs_data(NetAddress, Socket))
     else
         {error, _} = Error ->
             Error
@@ -204,6 +206,63 @@ stream_controlling_process(Stream = {_, [_ | Socket], _}, Pid) ->
             erlang:error({?MODULE, ?FUNCTION_NAME, Reason})
     end.
 
+%% ------------------------------------------------------------
+
+input_handler_setup(#hs_data{} = HsData) ->
+    case init:get_argument(inet_ktls) of
+        {ok, [["port"]]} ->  % No input_handler process
+            %% Just use the distribution port
+            HsData;
+        {ok, [["input_handler"]]} ->  % Set up an input_handler process
+            %% Add an f_handshake_complete fun that spawns the input handler
+            %% and calls the f_setopts_post_nodeup fun
+            #hs_data{
+               socket = Socket,
+               f_setopts_post_nodeup = FSetoptsPostNodeup} = HsData,
+            HsData#hs_data{
+              f_setopts_post_nodeup =
+                  fun (S) when S =:= Socket ->
+                          ok
+                  end,
+              f_handshake_complete =
+                  fun (S, _Node, DHandle) when S =:= Socket ->
+                          handshake_complete(S, FSetoptsPostNodeup, DHandle)
+                  end}
+    end;
+input_handler_setup({error, _} = Error) ->
+    Error.
+
+handshake_complete(Socket, FSetoptsPostNodeup, DHandle) ->
+    InputHandler =
+        spawn_link(
+          fun () ->
+                  input_handler(Socket, DHandle)
+          end),
+    ok = ?DRIVER:controlling_process(Socket, InputHandler),
+    ok = erlang:dist_ctrl_input_handler(DHandle, InputHandler),
+    ok = FSetoptsPostNodeup(Socket).
+
+input_handler(Socket, DHandle) ->
+    receive
+         {tcp, Socket, Data} ->
+             erlang:dist_ctrl_put_data(DHandle, Data);
+         {tcp_error, Socket, _Error} = Reason ->
+             ?DRIVER:close(Socket),
+             exit(Reason);
+         {tcp_closed, Socket} = Reason ->
+             ?DRIVER:close(Socket),
+             exit(Reason);
+         Other ->
+             Reason = {unexpected_message, Other},
+             error_report([?FUNCTION_NAME, {reason, Reason}]),
+             input_handler(Socket, DHandle)
+     end.
+
+%% ------------------------------------------------------------
+
+error_report(Report) ->
+    error_logger:error_report(Report).
+
 %% ------------------------------------------------------------
 supported() ->
     maybe
diff --git a/lib/ssl/test/ssl_dist_bench_SUITE.erl b/lib/ssl/test/ssl_dist_bench_SUITE.erl
index 989007bec0..8e32e872ad 100644
--- a/lib/ssl/test/ssl_dist_bench_SUITE.erl
+++ b/lib/ssl/test/ssl_dist_bench_SUITE.erl
@@ -77,6 +77,7 @@ groups() ->
      {cryptcookie_socket_ktls, categories()},
      {dist_cryptcookie_inet,   categories()},
      {cryptcookie_inet_ktls,   categories()},
+     {cryptcookie_inet_ktls_ih, categories()},
      %%
      %% categories()
      {setup, [{repeat, 1}],
@@ -110,7 +111,8 @@ cryptcookie_backends() ->
     [{group, dist_cryptcookie_socket},
      {group, cryptcookie_socket_ktls},
      {group, dist_cryptcookie_inet},
-     {group, cryptcookie_inet_ktls}].
+     {group, cryptcookie_inet_ktls},
+     {group, cryptcookie_inet_ktls_ih}].
 
 categories() ->
     [{group, setup},
@@ -290,7 +292,22 @@ init_per_group(cryptcookie_inet_ktls, Config) ->
         ok ->
             [{ssl_dist, false}, {ssl_dist_prefix, "Crypto-Inet-kTLS"},
              {ssl_dist_args,
-              "-proto_dist inet_epmd -inet_epmd cryptcookie_inet_ktls"}
+              "-proto_dist inet_epmd -inet_epmd cryptcookie_inet_ktls "
+              "-inet_ktls port"}
+            | Config];
+        Problem ->
+            {skip, Problem}
+    catch
+        Class : Reason : Stacktrace ->
+            {fail, {Class, Reason, Stacktrace}}
+    end;
+init_per_group(cryptcookie_inet_ktls_ih, Config) ->
+    try inet_epmd_cryptcookie_inet_ktls:supported() of
+        ok ->
+            [{ssl_dist, false}, {ssl_dist_prefix, "Crypto-Inet-kTLS-IH"},
+             {ssl_dist_args,
+              "-proto_dist inet_epmd -inet_epmd cryptcookie_inet_ktls "
+              "-inet_ktls input_handler"}
             | Config];
         Problem ->
             {skip, Problem}
-- 
2.35.3

openSUSE Build Service is sponsored by