pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/libosmo-gprs/+/33159 )


Change subject: rlcmac: tbf_ul: Handle SBA from CCCH Imm Ass
......................................................................

rlcmac: tbf_ul: Handle SBA from CCCH Imm Ass

Change-Id: I8563b6d61b93d86c15282995352ca9312e167160
---
M src/rlcmac/csn1_ts_44_018.c
M src/rlcmac/rlcmac.c
M src/rlcmac/tbf_ul_ass_fsm.c
3 files changed, 26 insertions(+), 5 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-gprs refs/changes/59/33159/1

diff --git a/src/rlcmac/csn1_ts_44_018.c b/src/rlcmac/csn1_ts_44_018.c
index 3606346..2a1de42 100644
--- a/src/rlcmac/csn1_ts_44_018.c
+++ b/src/rlcmac/csn1_ts_44_018.c
@@ -648,6 +648,7 @@
                                        data, data_len);
 }

+/* TS 44.018 10.5.2.16 IA Rest Octets */
 int osmo_gprs_rlcmac_decode_imm_ass_ro(IA_RestOctets_t *storage,
                                       const uint8_t *data, size_t data_len)
 {
diff --git a/src/rlcmac/rlcmac.c b/src/rlcmac/rlcmac.c
index 22464b1..318e3a7 100644
--- a/src/rlcmac/rlcmac.c
+++ b/src/rlcmac/rlcmac.c
@@ -260,6 +260,7 @@
                return rc;
        }

+       /* TS 44.018 10.5.2.16 IA Rest Octets */
        rc = osmo_gprs_rlcmac_decode_imm_ass_ro(&iaro, iaro_raw, iaro_raw_len);
        if (rc != 0) {
                LOGRLCMAC(LOGL_ERROR, "Failed to decode IA Rest Octets IE\n");
@@ -294,8 +295,7 @@
                        case 0: /* 
iaro.u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.* 
(Packet_Uplink_ImmAssignment_t) */
                                switch 
(iaro.u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.UnionType)
 {
                                case 0: /* 
iaro.u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.SingleBlockAllocation.*
 (GPRS_SingleBlockAllocation_t) */
-                                       /* TODO: 2phase access support: 
Schedule transmit of PKT_RES_REQ on 
FN=(GPRS_SingleBlockAllocation_t).TBF_STARTING_TIME */
-                                       LOGRLCMAC(LOGL_ERROR, "ImmAss 
SingleBlock (2phase access) not yet supported!\n");
+                                       rc = 
gprs_rlcmac_handle_ccch_imm_ass_ul_tbf(ch_ts, fn, ia, &iaro);
                                        break;
                                case 1: /* 
iaro.u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.DynamicOrFixedAllocation.*
 (GPRS_DynamicOrFixedAllocation_t) */
                                        switch 
(iaro.u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.DynamicOrFixedAllocation.UnionType)
 {
diff --git a/src/rlcmac/tbf_ul_ass_fsm.c b/src/rlcmac/tbf_ul_ass_fsm.c
index 103af97..da6e7a7 100644
--- a/src/rlcmac/tbf_ul_ass_fsm.c
+++ b/src/rlcmac/tbf_ul_ass_fsm.c
@@ -128,6 +128,7 @@

 static int handle_imm_ass(struct gprs_rlcmac_tbf_ul_ass_fsm_ctx *ctx, const 
struct tbf_ul_ass_ev_rx_ccch_imm_ass_ctx *d)
 {
+       /* TS 44.018 10.5.2.16 IA Rest Octets */
        switch (d->iaro->UnionType) {
        case 1: /* d->iaro->u.lh.* (IA_RestOctetsLH_t) */
                switch (d->iaro->u.lh.lh0x.UnionType) {
@@ -142,7 +143,16 @@
                                switch 
(d->iaro->u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.UnionType)
 {
                                case 0: /* 
d->iaro->u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.SingleBlockAllocation.*
 (GPRS_SingleBlockAllocation_t) */
                                        /* TODO: 2phase access support: 
Schedule transmit of PKT_RES_REQ on 
FN=(GPRS_SingleBlockAllocation_t).TBF_STARTING_TIME */
-                                       LOGPFSML(ctx->fi, LOGL_ERROR, "ImmAss 
SingleBlock (2phase access) not yet supported!\n");
+                                       if (ctx->ass_type == 
GPRS_RLCMAC_TBF_UL_ASS_TYPE_1PHASE) {
+                                               LOGPFSML(ctx->fi, LOGL_INFO, 
"MS requested 1-Phase-Access, but Network forces 2-Phase-Access\n");
+                                               ctx->ass_type = 
GPRS_RLCMAC_TBF_UL_ASS_TYPE_2PHASE;
+                                       }
+                                       ctx->tbf_starting_time_exists = true;
+                                       ctx->tbf_starting_time = 
TBF_StartingTime_to_fn(&d->iaro->u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.SingleBlockAllocation.TBF_STARTING_TIME,
+                                                                               
        d->fn);
+                                       
ctx->phase1_alloc.ts[d->ts_nr].allocated = true;
+                                       ctx->phase1_alloc.num_ts = 1;
+                                       LOGPFSML(ctx->fi, LOGL_INFO, "ImmAss 
SingleBlock (2phase access) ts_nr=%u start_fn=%u\n", d->ts_nr, 
ctx->tbf_starting_time);
                                        return -ENOTSUP;
                                case 1: /* 
d->iaro->u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.DynamicOrFixedAllocation.*
 (GPRS_DynamicOrFixedAllocation_t) */
                                        ctx->phase1_alloc.ul_tfi = 
d->iaro->u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.DynamicOrFixedAllocation.TFI_ASSIGNMENT;
@@ -155,7 +165,6 @@
                                                 ctx->phase1_alloc.ul_tfi, 
gprs_rlcmac_mcs_name(ctx->ul_tbf->tx_cs), ctx->tbf_starting_time);
                                        switch 
(d->iaro->u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.DynamicOrFixedAllocation.UnionType)
 {
                                        case 0: /* 
d->iaro->u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.DynamicOrFixedAllocation.Allocation.DynamicAllocation
 (DynamicAllocation_t) */
-                                               /* TODO: 2phase access support: 
Schedule transmit of PKT_RES_REQ on 
FN=(GPRS_SingleBlockAllocation_t).TBF_STARTING_TIME */
                                                
ctx->phase1_alloc.ts[d->ts_nr].allocated = true;
                                                
ctx->phase1_alloc.ts[d->ts_nr].usf = 
d->iaro->u.hh.u.UplinkDownlinkAssignment.ul_dl.Packet_Uplink_ImmAssignment.Access.DynamicOrFixedAllocation.Allocation.DynamicAllocation.USF;
                                                ctx->phase1_alloc.num_ts = 1;
@@ -638,7 +647,9 @@
 {
        OSMO_ASSERT(gprs_rlcmac_tbf_ul_ass_waiting_tbf_starting_time(ul_tbf));
        OSMO_ASSERT(ul_tbf->ul_ass_fsm.tbf_starting_time_exists);
-       if (fn != ul_tbf->ul_ass_fsm.tbf_starting_time)
+       OSMO_ASSERT(ul_tbf->ul_ass_fsm.phase1_alloc.num_ts > 0);
+       if (fn != ul_tbf->ul_ass_fsm.tbf_starting_time ||
+           !ul_tbf->ul_ass_fsm.phase1_alloc.ts[ts_nr].allocated)
                return;

        osmo_fsm_inst_dispatch(ul_tbf->ul_ass_fsm.fi, 
GPRS_RLCMAC_TBF_UL_ASS_EV_TBF_STARTING_TIME, NULL);

--
To view, visit https://gerrit.osmocom.org/c/libosmo-gprs/+/33159
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmo-gprs
Gerrit-Branch: master
Gerrit-Change-Id: I8563b6d61b93d86c15282995352ca9312e167160
Gerrit-Change-Number: 33159
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pes...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to