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