@@ -41,3 +41,110 @@
# Setting this value to zero means there's no timeout.
# Defaults to 60.
#ProvTimeout = 60
+
+
+[SARTransmitter]
+
+# Transmission interval step between segments of a message.
+# Interval is measured in milliseconds and calculated using the following
+# formula:
+#
+# (SegIntervalStep + 1) * 10 ms.
+#
+# Valid range 0-15.
+# Defaults to 5.
+#SegIntervalStep = 5
+
+# Maximum number of retransmissions of segments to a unicast destination.
+# Valid range 0-15.
+# Defaults to 2.
+#UnicastRetransCount = 2
+
+# Maximum number of retransmissions of segments to a unicast destination when no
+# acknowledgment is newly received during the retransmission interval.
+# This value sould be set to greater than AckRetransCount on a peer node.
+# Valid range 0-15.
+# Defaults to 2.
+#UnicastRetransWithoutProgressCount = 2
+
+# Retransmission interval step between segments of a meesage to a unicast
+# destination.
+# Interval is measured in milliseconds and calculated using the following
+# formula:
+#
+# (UnicastRetransIntervalStep + 1) * 25 ms
+#
+# Valid range 0-15.
+# Defaults to 7.
+#UnicastRetransIntervalStep = 7
+
+# Interval step between segments of a message to a unicast destination that
+# increases proportionally to (ttl - 1) when ttl is over 0.
+# Increment is measured in milliseconds and calculated using the following
+# formula:
+#
+# (UnicastRetransIntervalIncrement + 1) * 25 ms
+#
+# Valid range 0-15.
+# Defaults to 1.
+#UnicastRetransIntervalIncrement = 1
+
+# Maximum number of retransmissions of segments to a multicast destination.
+# Valid range 0-15.
+# Defaults to 2.
+#MulticastRetransCount = 2
+
+# Retransmission interval step between segments of a meesage to a multicast
+# destination.
+# Interval is measured in milliseconds and calculated using the following
+# formula:
+#
+# (MulticastRetransIntervalStep + 1) * 25 ms
+#
+# Valid range 0-15.
+# Defaults to 8.
+#MulticastRetransIntervalStep = 8
+
+[SARReceiver]
+
+# Threshold number of segments in a message to retransmit acknowledgment
+# messages. If the number of segments in a message exceeds SegmentsThreshold,
+# retransmit the Acknowledgment message by AckRetransCount.
+# Valid range 0-31.
+# Defaults to 3
+#SegmentsThreshold = 3
+
+# Interval increment between acknowledgment messages.
+# Increment is measured in segments and calculated using the following formula:
+#
+# AckDelayIncrement + 1.5
+#
+# Valid range 0-7
+# Defaults to 1
+#AckDelayIncrement = 1
+
+# Maximum number of retransmissions of acknowledgment messages.
+# Valid range 0-3
+# Defaults to 0
+#AckRetransCount = 0
+
+# Timeout to discard a segmented message when no more new segments of the
+# message are coming in.
+# Timeout is measured in seconds and calculated using the following formula:
+#
+# (DiscardTimeout + 1) * 5 sec
+#
+# Valid range 0-15
+# Defaults to 1
+#DiscardTimeout = 1
+
+# Interval between received segments of a message. This is used to control rate
+# of transmission of acknowledgment messages.
+# Increment is measured in milliseconds and calculated using the following
+# formula:
+#
+# (ReceiverSegIntervalStep + 1) * 10 ms
+#
+# Valid range 0-15
+# Defaults to 5
+#ReceiverSegIntervalStep = 5
@@ -248,16 +248,11 @@ void mesh_get_sar_receiver(void *sar_rxr)
memcpy(sar_rxr, &mesh_sar_rxr, sizeof(struct mesh_sar_receiver));
}
-static void parse_settings(const char *mesh_conf_fname)
+static void parse_mesh_general(const struct l_settings *settings)
{
- struct l_settings *settings;
char *str;
uint32_t value;
- settings = l_settings_new();
- if (!l_settings_load_from_file(settings, mesh_conf_fname))
- goto done;
-
str = l_settings_get_string(settings, "General", "Beacon");
if (str) {
if (!strcasecmp(str, "true"))
@@ -290,6 +285,79 @@ static void parse_settings(const char *mesh_conf_fname)
if (l_settings_get_uint(settings, "General", "ProvTimeout", &value))
mesh.prov_timeout = value;
+}
+
+static void parse_mesh_sar(const struct l_settings *settings)
+{
+ uint32_t value;
+
+ if (l_settings_get_uint(settings, "SARTransmitter", "SegIntervalStep",
+ &value) && value <= 15)
+ mesh_sar_txr.seg_int_step = value;
+
+ if (l_settings_get_uint(settings, "SARTransmitter",
+ "UnicastRetransCount",
+ &value) && value <= 15)
+ mesh_sar_txr.unicast_rtx_cnt = value;
+
+ if (l_settings_get_uint(settings, "SARTransmitter",
+ "UnicastRetransWithoutProgressCount",
+ &value) && value <= 15)
+ mesh_sar_txr.unicast_rtx_without_prog_cnt = value;
+
+ if (l_settings_get_uint(settings, "SARTransmitter",
+ "UnicastRetransIntervalStep",
+ &value) && value <= 15)
+ mesh_sar_txr.unicast_rtx_int_step = value;
+
+ if (l_settings_get_uint(settings, "SARTransmitter",
+ "UnicastRetransIntervalIncrement",
+ &value) && value <= 15)
+ mesh_sar_txr.unicast_rtx_int_inc = value;
+
+ if (l_settings_get_uint(settings, "SARTransmitter",
+ "MulticastRetransCount",
+ &value) && value <= 15)
+ mesh_sar_txr.multicast_rtx_cnt = value;
+
+ if (l_settings_get_uint(settings, "SARTransmitter",
+ "MulticastRetransIntervalStep",
+ &value) && value <= 15)
+ mesh_sar_txr.multicast_rtx_int_step = value;
+
+ if (l_settings_get_uint(settings, "SARReceiver", "SegmentsThreshold",
+ &value) && value <= 31)
+ mesh_sar_rxr.seg_threshold = value;
+
+ if (l_settings_get_uint(settings, "SARReceiver", "AckDelayIncrement",
+ &value) && value <= 7)
+ mesh_sar_rxr.ack_delay_inc = value;
+
+ if (l_settings_get_uint(settings, "SARReceiver", "AckRetransCount",
+ &value) && value <= 3)
+ mesh_sar_rxr.ack_rtx_cnt = value;
+
+ if (l_settings_get_uint(settings, "SARReceiver", "DiscardTimeout",
+ &value) && value <= 15)
+ mesh_sar_rxr.discard_timeout = value;
+
+ if (l_settings_get_uint(settings, "SARReceiver",
+ "ReceiverSegIntervalStep",
+ &value) && value <= 15)
+ mesh_sar_rxr.receiver_seg_int_step = value;
+}
+
+static void parse_settings(const char *mesh_conf_fname)
+{
+ struct l_settings *settings;
+
+ settings = l_settings_new();
+ if (!l_settings_load_from_file(settings, mesh_conf_fname))
+ goto done;
+
+ parse_mesh_general(settings);
+ parse_mesh_sar(settings);
+
done:
l_settings_free(settings);
}