aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-07-08 12:18:33 +0200
committerJacob Erlbeck <jerlbeck@sysmocom.de>2015-07-16 10:24:37 +0200
commit57cf69a18ccceac4b250dceb56c4e0d5f0018a95 (patch)
treedd72f2e89f87913317b9529284be7dee65dafe8f
parentdd08ac86e6fa1ea69e78c344424d72fc9d79d6d7 (diff)
alloc: Fix MS_B/MS_C interpretation
Currently the handling of MS_B and MS_C is not compliant with TS 45.002, annex B.1. These values may only interpreted as 0, if frequency hopping is not enabled and if there is no change from Rx to Tx or vice-versa. This commit sets Ttb/Trb to 1 if the table entry is MS_B/MS_C, since only combined down/up access modes are supported. Sponsored-by: On-Waves ehf
-rw-r--r--src/gprs_rlcmac_ts_alloc.cpp16
-rw-r--r--tests/alloc/AllocTest.ok418
2 files changed, 221 insertions, 213 deletions
diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index b9d4e41a..ec228d1a 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -405,13 +405,21 @@ static int find_multi_slots(struct gprs_rlcmac_bts *bts,
Trb = ms_class->rb;
Type = ms_class->type;
- /* Tta and Ttb may depend on hopping or frequency change */
- /* TODO: Set them to 1 */
- if (Ttb == MS_A || Ttb == MS_B)
+ /* MS_A maps to 0 if frequency hopping is disabled */
+ /* TODO: Set it to 1 if FH is implemented and enabled */
+ if (Ttb == MS_A)
Ttb = 0;
- if (Trb == MS_A || Trb == MS_C)
+ if (Trb == MS_A)
Trb = 0;
+ /* MS_A and MS_B are 0 iff FH is disabled and there is no Tx/Rx change.
+ * This is never the case with the current implementation, so 1 will
+ * always be used. */
+ if (Ttb == MS_B)
+ Ttb = 1;
+ if (Trb == MS_C)
+ Trb = 1;
+
LOGP(DRLCMAC, LOGL_DEBUG, "- Rx=%d Tx=%d Sum Rx+Tx=%s Tta=%s Ttb=%d "
" Tra=%d Trb=%d Type=%d\n", ms_class->rx, Tx,
(Sum == MS_NA) ? "N/A" : digit[Sum],
diff --git a/tests/alloc/AllocTest.ok b/tests/alloc/AllocTest.ok
index 79b5dbf4..823595a7 100644
--- a/tests/alloc/AllocTest.ok
+++ b/tests/alloc/AllocTest.ok
@@ -588,356 +588,356 @@ PDCH[1] is control_ts for DL
PDCH[1] is first common for DL
Going to test multislot assignment MS_CLASS=19
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=20
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=21
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=22
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=23
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=24
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=25
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=26
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=27
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=28
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Going to test multislot assignment MS_CLASS=29
Testing UL then DL assignment.
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing DL then UL assignment followed by update
-PDCH[5] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
-PDCH[5] is used for UL
-PDCH[5] is control_ts for UL
-PDCH[5] is first common for UL
+PDCH[6] is used for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
+PDCH[6] is used for UL
+PDCH[6] is control_ts for UL
+PDCH[6] is first common for UL
PDCH[5] is used for DL
PDCH[6] is used for DL
PDCH[7] is used for DL
-PDCH[5] is control_ts for DL
-PDCH[5] is first common for DL
+PDCH[6] is control_ts for DL
+PDCH[6] is first common for DL
Testing jolly example
-PDCH[2] is used for UL
-PDCH[2] is control_ts for UL
-PDCH[2] is first common for UL
+PDCH[3] is used for UL
+PDCH[3] is control_ts for UL
+PDCH[3] is first common for UL
PDCH[1] is used for DL
PDCH[2] is used for DL
PDCH[3] is used for DL
PDCH[4] is used for DL
-PDCH[2] is control_ts for DL
-PDCH[2] is first common for DL
+PDCH[3] is control_ts for DL
+PDCH[3] is first common for DL
Mass test: TS0(xxxxxxxO)TS7 MS_Class=0
Mass test: TS0(xxxxxxxO)TS7 MS_Class=1
Mass test: TS0(xxxxxxxO)TS7 MS_Class=2
@@ -8743,20 +8743,20 @@ Going to test assignment with many TBF, algorithm B class 1-29 (UL and DL)
TBF[15] class 16 reserves ...CDDDD
TBF[16] class 17 reserves ...DCDDD
TBF[17] class 18 reserves ...DDCDD
- TBF[18] class 19 reserves ....DDCD
- TBF[19] class 20 reserves ...DCDD.
- TBF[20] class 21 reserves ....DCDD
- TBF[21] class 22 reserves ...DCDD.
- TBF[22] class 23 reserves ....DDCD
- TBF[23] class 24 reserves ...DDCD.
- TBF[24] class 25 reserves ....DDCD
- TBF[25] class 26 reserves ...DCDD.
- TBF[26] class 27 reserves ....DCDD
- TBF[27] class 28 reserves .....DDC
+ TBF[18] class 19 reserves .....DCD
+ TBF[19] class 20 reserves ...DCD..
+ TBF[20] class 21 reserves .....DDC
+ TBF[21] class 22 reserves ...DDC..
+ TBF[22] class 23 reserves .....DCD
+ TBF[23] class 24 reserves ...DCD..
+ TBF[24] class 25 reserves .....DDC
+ TBF[25] class 26 reserves ...DDC..
+ TBF[26] class 27 reserves .....DCD
+ TBF[27] class 28 reserves ...DCD..
TBF[28] class 29 reserves .....DDC
TBF[29] class 1 reserves ...C....
TBF[30] class 2 reserves ......DC
- TBF[31] class 3 reserves ......DC
+ TBF[31] class 3 reserves ....DC..
Successfully allocated 32 UL TBFs
Going to test assignment with many TBF, algorithm A (DL and UL)
TBF[0] class 1 reserves ...C....