bssgp: Adapt flowcontrol MS default to current alloc algorithm

Currently the values Bmax/R default MS are computed under the
assumption than min(4, N_PDCH) DL slots are allocated for an MS, even
if multislot assignment is not enabled.

This commit changes the computation to assume 1 DL slot if algorithm
A is selected or the dynamic algorithm is used and has disabled
multislot assigment due to high load.

Sponsored-by: On-Waves ehf
diff --git a/src/gprs_bssgp_pcu.cpp b/src/gprs_bssgp_pcu.cpp
index dcb1b5b..02395a8 100644
--- a/src/gprs_bssgp_pcu.cpp
+++ b/src/gprs_bssgp_pcu.cpp
@@ -620,13 +620,16 @@
 
 	if (ms_leak_rate == 0) {
 		int ms_num_pdch;
+		int max_pdch = gprs_alloc_max_dl_slots_per_ms(bts);
 
 		if (num_pdch < 0)
 			num_pdch = count_pdch(bts);
 
 		ms_num_pdch = num_pdch;
-		if (ms_num_pdch > FC_MS_MAX_RX_SLOTS)
-			ms_num_pdch = FC_MS_MAX_RX_SLOTS;
+		if (max_pdch > FC_MS_MAX_RX_SLOTS)
+			max_pdch = FC_MS_MAX_RX_SLOTS;
+		if (ms_num_pdch > max_pdch)
+			ms_num_pdch = max_pdch;
 
 		ms_leak_rate = gprs_bssgp_max_leak_rate(bts->initial_cs_dl,
 			ms_num_pdch);
diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h
index 3c1f1a0..f193dfa 100644
--- a/src/gprs_rlcmac.h
+++ b/src/gprs_rlcmac.h
@@ -93,6 +93,9 @@
 	uint8_t trx, uint8_t ts, uint16_t arfcn, 
         uint32_t fn, uint8_t block_nr);
 
+int gprs_alloc_max_dl_slots_per_ms(struct gprs_rlcmac_bts *bts,
+	uint8_t ms_class = 0);
+
 extern "C" {
 #endif
 int alloc_algorithm_a(struct gprs_rlcmac_bts *bts,
diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index 3714b30..0daeaf5 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -1077,3 +1077,24 @@
 	rc = alloc_algorithm_a(bts, ms_, tbf_, cust, single, use_trx);
 	return rc;
 }
+
+int gprs_alloc_max_dl_slots_per_ms(struct gprs_rlcmac_bts *bts, uint8_t ms_class)
+{
+	int rx;
+
+	if (ms_class >= ARRAY_SIZE(gprs_ms_multislot_class))
+		ms_class = 0;
+
+	rx = gprs_ms_multislot_class[ms_class].rx;
+
+	if (rx == MS_NA)
+		rx = 4;
+
+	if (bts->alloc_algorithm == alloc_algorithm_a)
+		return 1;
+
+	if (bts->multislot_disabled)
+		return 1;
+
+	return rx;
+}