From b0582c6963f6dc203f05ed810c9446cf3fa0f0ae Mon Sep 17 00:00:00 2001
From: Anders Svensson
Date: Thu, 24 Aug 2017 13:21:28 +0200
Subject: Let strict_mbit and incoming_maxlen be configured per transport
Since these can make sense per peer. The remaining service-only options
either belong there or make little sense being configured per transport.
---
lib/diameter/doc/src/diameter.xml | 112 +++++++++++++++---------------
lib/diameter/src/base/diameter.erl | 4 +-
lib/diameter/src/base/diameter_config.erl | 12 ++--
3 files changed, 64 insertions(+), 64 deletions(-)
diff --git a/lib/diameter/doc/src/diameter.xml b/lib/diameter/doc/src/diameter.xml
index 8d39b9efce..30a26ed845 100644
--- a/lib/diameter/doc/src/diameter.xml
+++ b/lib/diameter/doc/src/diameter.xml
@@ -826,19 +826,6 @@ field of diameter_packet records independently of
-
-{incoming_maxlen, 0..16777215}
--
-
-Bound on the expected size of incoming Diameter messages.
-Messages larger than the specified number of bytes are discarded.
-
-
-Defaults to 16777215, the maximum value of the 24-bit Message
-Length field in a Diameter Header.
-
-
-
{restrict_connections, false
| node
| nodes
@@ -974,49 +961,6 @@ of arity 1 as bare values, not wrapped in a list.
-
-{strict_mbit, boolean()}
--
-
-Whether or not to regard an AVP setting the M-bit as erroneous when
-the command grammar in question does not explicitly allow the AVP.
-If true then such AVPs are regarded as 5001 errors,
-DIAMETER_AVP_UNSUPPORTED.
-If false then the M-bit is ignored and policing
-it becomes the receiver's responsibility.
-
-
-Defaults to true.
-
-
-
-RFC 6733 is unclear about the semantics of the M-bit.
-One the one hand, the CCF specification in section 3.2 documents AVP
-in a command grammar as meaning any arbitrary AVP; on the
-other hand, 1.3.4 states that AVPs setting the M-bit cannot be added
-to an existing command: the modified command must instead be
-placed in a new Diameter application.
-
-The reason for the latter is presumably interoperability:
-allowing arbitrary AVPs setting the M-bit in a command makes its
-interpretation implementation-dependent, since there's no
-guarantee that all implementations will understand the same set of
-arbitrary AVPs in the context of a given command.
-However, interpreting AVP in a command grammar as any
-AVP, regardless of M-bit, renders 1.3.4 meaningless, since the receiver
-can simply ignore any AVP it thinks isn't relevant, regardless of the
-sender's intent.
-
-Beware of confusing mandatory in the sense of the M-bit with mandatory
-in the sense of the command grammar.
-The former is a semantic requirement: that the receiver understand the
-semantics of the AVP in the context in question.
-The latter is a syntactic requirement: whether or not the AVP must
-occur in the message in question.
-
-
-
-
{string_decode, boolean()}
-
@@ -1345,6 +1289,19 @@ connection.
Defaults to 5000.
+
+{incoming_maxlen, 0..16777215}
+-
+
+Bound on the expected size of incoming Diameter messages.
+Messages larger than the specified number of bytes are discarded.
+
+
+Defaults to 16777215, the maximum value of the 24-bit Message
+Length field in a Diameter Header.
+
+
+
{length_errors, exit|handle|discard}
-
@@ -1420,6 +1377,49 @@ Changing this results in non-standard behaviour, but can be useful in
case peers are known to be behave badly.
+
+{strict_mbit, boolean()}
+-
+
+Whether or not to regard an AVP setting the M-bit as erroneous when
+the command grammar in question does not explicitly allow the AVP.
+If true then such AVPs are regarded as 5001 errors,
+DIAMETER_AVP_UNSUPPORTED.
+If false then the M-bit is ignored and policing
+it becomes the receiver's responsibility.
+
+
+Defaults to true.
+
+
+
+RFC 6733 is unclear about the semantics of the M-bit.
+One the one hand, the CCF specification in section 3.2 documents AVP
+in a command grammar as meaning any arbitrary AVP; on the
+other hand, 1.3.4 states that AVPs setting the M-bit cannot be added
+to an existing command: the modified command must instead be
+placed in a new Diameter application.
+
+The reason for the latter is presumably interoperability:
+allowing arbitrary AVPs setting the M-bit in a command makes its
+interpretation implementation-dependent, since there's no
+guarantee that all implementations will understand the same set of
+arbitrary AVPs in the context of a given command.
+However, interpreting AVP in a command grammar as any
+AVP, regardless of M-bit, renders 1.3.4 meaningless, since the receiver
+can simply ignore any AVP it thinks isn't relevant, regardless of the
+sender's intent.
+
+Beware of confusing mandatory in the sense of the M-bit with mandatory
+in the sense of the command grammar.
+The former is a semantic requirement: that the receiver understand the
+semantics of the AVP in the context in question.
+The latter is a syntactic requirement: whether or not the AVP must
+occur in the message in question.
+
+
+
+
{transport_config, term()}
{transport_config, term(), &dict_Unsigned32; | infinity}
diff --git a/lib/diameter/src/base/diameter.erl b/lib/diameter/src/base/diameter.erl
index 0f919f6c25..3b41feac0d 100644
--- a/lib/diameter/src/base/diameter.erl
+++ b/lib/diameter/src/base/diameter.erl
@@ -355,9 +355,11 @@ call(SvcName, App, Message) ->
| {capabilities_cb, eval()}
| {capx_timeout, 'Unsigned32'()}
| {strict_capx, boolean()}
+ | {strict_mbit, boolean()}
| {disconnect_cb, eval()}
| {dpr_timeout, 'Unsigned32'()}
| {dpa_timeout, 'Unsigned32'()}
+ | {incoming_maxlen, message_length()}
| {length_errors, exit | handle | discard}
| {connect_timer, 'Unsigned32'()}
| {watchdog_timer, 'Unsigned32'() | {module(), atom(), list()}}
@@ -376,8 +378,6 @@ call(SvcName, App, Message) ->
| {traffic_counters, boolean()}
| {string_decode, boolean()}
| {strict_arities, true | strict_arities()}
- | {strict_mbit, boolean()}
- | {incoming_maxlen, message_length()}
| {use_shared_peers, remotes()}
| common_opt().
diff --git a/lib/diameter/src/base/diameter_config.erl b/lib/diameter/src/base/diameter_config.erl
index a4496f9725..4721be1ca0 100644
--- a/lib/diameter/src/base/diameter_config.erl
+++ b/lib/diameter/src/base/diameter_config.erl
@@ -575,13 +575,11 @@ setopt(K, T) ->
%% opt/2
-opt(service, {incoming_maxlen, N})
- when 0 =< N, N < 1 bsl 24 ->
- true;
+opt(_, {incoming_maxlen, N}) ->
+ is_integer(N) andalso 0 =< N andalso N < 1 bsl 24;
opt(service, {K, B})
- when K == strict_mbit;
- K == string_decode;
+ when K == string_decode;
K == traffic_counters ->
is_boolean(B);
@@ -680,7 +678,9 @@ opt(_, {K, Tmo})
opt(_, {capx_strictness, B}) ->
is_boolean(B) andalso {value, {strict_capx, B}};
-opt(_, {strict_capx, B}) ->
+opt(_, {K, B})
+ when K == strict_capx;
+ K == strict_mbit ->
is_boolean(B);
opt(_, {length_errors, T}) ->
--
cgit v1.2.3