aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-07-14 13:31:48 +0200
committerJacob Erlbeck <jerlbeck@sysmocom.de>2015-07-16 19:24:15 +0200
commit400ec02e8a0415a59eae9dcdae43de38247897a3 (patch)
tree554d9aff5b7f5a96ab54418192b4aeb2e7037646 /src
parent40da3e17e5b3d4cf199cb868d561f98c35b93147 (diff)
alloc: Add 'dynamic' allocation algorithm
The idea behind this meta algorithm is to automatically select one of the other algorithms based on the system state. Basically algorithm B will be selected if the PDCH usage is low to improve throughput and latency. Algorithm A will be selected to support more concurrent MS. This commit adds a first simple state-less version of this algorithm that always tries B first and only if that fails A is tried afterwards. The following VTY command is added to the 'pcu' node: - alloc-algorithm dynamic Ticket: #1934 Sponsored-by: On-Waves ehf
Diffstat (limited to 'src')
-rw-r--r--src/gprs_rlcmac.h5
-rw-r--r--src/gprs_rlcmac_ts_alloc.cpp23
-rw-r--r--src/pcu_vty.c13
3 files changed, 38 insertions, 3 deletions
diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h
index 3fc95e6..3c1f1a0 100644
--- a/src/gprs_rlcmac.h
+++ b/src/gprs_rlcmac.h
@@ -104,6 +104,11 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts,
struct GprsMs *ms,
struct gprs_rlcmac_tbf *tbf, uint32_t cust, uint8_t single,
int use_trx);
+
+int alloc_algorithm_dynamic(struct gprs_rlcmac_bts *bts,
+ struct GprsMs *ms,
+ struct gprs_rlcmac_tbf *tbf, uint32_t cust, uint8_t single,
+ int use_trx);
#ifdef __cplusplus
}
#endif
diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index a29e5db..d664bbc 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -996,3 +996,26 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts,
return 0;
}
+
+/* Slot Allocation: Algorithm dynamic
+ *
+ * This meta algorithm automatically selects on of the other algorithms based
+ * on the current system state.
+ *
+ * The goal is to support as many MS and TBF as possible. On low usage, the
+ * goal is to provide the highest possible bandwidth per MS.
+ *
+ */
+int alloc_algorithm_dynamic(struct gprs_rlcmac_bts *bts,
+ GprsMs *ms_, struct gprs_rlcmac_tbf *tbf_,
+ uint32_t cust, uint8_t single, int use_trx)
+{
+ int rc;
+
+ rc = alloc_algorithm_b(bts, ms_, tbf_, cust, single, use_trx);
+ if (rc >= 0)
+ return rc;
+
+ rc = alloc_algorithm_a(bts, ms_, tbf_, cust, single, use_trx);
+ return rc;
+}
diff --git a/src/pcu_vty.c b/src/pcu_vty.c
index 4c0730c..ed708f8 100644
--- a/src/pcu_vty.c
+++ b/src/pcu_vty.c
@@ -120,6 +120,8 @@ static int config_write_pcu(struct vty *vty)
vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
if (bts->alloc_algorithm == alloc_algorithm_b)
vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
+ if (bts->alloc_algorithm == alloc_algorithm_dynamic)
+ vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
if (bts->force_two_phase)
vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
@@ -447,10 +449,12 @@ DEFUN(cfg_pcu_no_queue_idle_ack_delay,
DEFUN(cfg_pcu_alloc,
cfg_pcu_alloc_cmd,
- "alloc-algorithm (a|b)",
+ "alloc-algorithm (a|b|dynamic)",
"Select slot allocation algorithm to use when assigning timeslots on "
- "PACCH\nSingle slot is assigned only\nMultiple slots are assigned for "
- "semi-duplex operation")
+ "PACCH\n"
+ "Single slot is assigned only\n"
+ "Multiple slots are assigned for semi-duplex operation\n"
+ "Dynamically select the algorithm based on the system state\n")
{
struct gprs_rlcmac_bts *bts = bts_main_data();
@@ -461,6 +465,9 @@ DEFUN(cfg_pcu_alloc,
case 'b':
bts->alloc_algorithm = alloc_algorithm_b;
break;
+ default:
+ bts->alloc_algorithm = alloc_algorithm_dynamic;
+ break;
}
return CMD_SUCCESS;