File 7715-kernel-Add-membership-types-and-handling-of-said-typ.patch of Package erlang

From f52357fb06bbce6020e2b7912ce23ccef7b35731 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Fri, 13 May 2022 16:30:21 +0200
Subject: [PATCH 05/11] [kernel] Add membership types and handling of said
 types

OTP-18091
---
 lib/kernel/src/gen_udp.erl | 21 ++++++++++++++++++---
 lib/kernel/src/inet.erl    | 10 ++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/lib/kernel/src/gen_udp.erl b/lib/kernel/src/gen_udp.erl
index e3c1996bbc..b30c13d062 100644
--- a/lib/kernel/src/gen_udp.erl
+++ b/lib/kernel/src/gen_udp.erl
@@ -31,13 +31,13 @@
 
 -type option() ::
         {active,          true | false | once | -32768..32767} |
-        {add_membership,  {inet:ip_address(), inet:ip_address()}} |
+        {add_membership,  membership()} |
         {broadcast,       boolean()} |
         {buffer,          non_neg_integer()} |
         {debug,           boolean()} |
         {deliver,         port | term} |
         {dontroute,       boolean()} |
-        {drop_membership, {inet:ip_address(), inet:ip_address()}} |
+        {drop_membership, membership()} |
         {header,          non_neg_integer()} |
         {high_msgq_watermark, pos_integer()} |
         {low_msgq_watermark, pos_integer()} |
@@ -109,8 +109,23 @@
 -type ip6_multicast_if() :: integer(). % interface index
 -type multicast_if()     :: ip_multicast_if() | ip6_multicast_if().
 
+
+%% Note that for IPv4, the tuple with size 3 is *not*
+%% supported on all platforms.
+%% 'ifindex' defaults to zero (0) on platforms that
+%% supports the 3-tuple variant.
+-type ip_membership()  :: {MultiAddress :: inet:ip4_address(),    % multiaddr
+                           Interface    :: inet:ip4_address()} |  % local addr
+                          {MultiAddress :: inet:ip4_address(),    % multiaddr
+                           Address      :: inet:ip4_address(),    % local addr
+                           IfIndex      :: integer()}.            % ifindex
+-type ip6_membership() :: {MultiAddress :: inet:ip6_address(),    % multiaddr
+                           IfIndex      :: integer()}.            % ifindex
+-type membership()     :: ip_membership() | ip6_membership().
+
 -export_type([option/0, open_option/0, option_name/0, socket/0,
-              multicast_if/0, ip_multicast_if/0, ip6_multicast_if/0]).
+              multicast_if/0, ip_multicast_if/0, ip6_multicast_if/0,
+              membership/0, ip_membership/0, ip6_membership/0]).
 
 
 %% -- open ------------------------------------------------------------------
diff --git a/lib/kernel/src/inet.erl b/lib/kernel/src/inet.erl
index a15c203245..37f1706fb2 100644
--- a/lib/kernel/src/inet.erl
+++ b/lib/kernel/src/inet.erl
@@ -1205,7 +1205,17 @@ udp_opt([Opt | Opts], #udp_opts{ifaddr = IfAddr} = R, As) ->
         {active,N} when is_integer(N), N < 32768, N >= -32768 ->
             NOpts = lists:keydelete(active, 1, R#udp_opts.opts),
             udp_opt(Opts, R#udp_opts { opts = [{active,N}|NOpts] }, As);
+
+        {Membership, {MAddr, If}}
+          when ((Membership =:= add_membership) orelse
+                (Membership =:= drop_membership)) andalso
+               (tuple_size(MAddr) =:= 4) andalso
+               ((If =:= any) orelse (tuple_size(If) =:= 4)) ->
+            MembershipOpt = {Membership, {MAddr, If, 0}},
+            udp_opt(Opts, R#udp_opts{opts = [MembershipOpt|Opts]}, As);
+
 	{Name,Val} when is_atom(Name) -> udp_add(Name, Val, R, Opts, As);
+
 	_ -> {error, badarg}
     end;
 udp_opt([], #udp_opts{} = R, _SockOpts) ->
-- 
2.35.3

openSUSE Build Service is sponsored by