pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-pcu/+/29924 )

Change subject: Move UL allocation&assign functions to gprs_ms.c
......................................................................

Move UL allocation&assign functions to gprs_ms.c

Similar structure as what we have with DL-TBF.

Change-Id: I256aeede2a2678c9738539fb6ec4db9766fa85e4
---
M src/bts.cpp
M src/gprs_ms.c
M src/gprs_ms.h
M src/pdch.cpp
M src/tbf.cpp
M src/tbf.h
M src/tbf_fsm.c
M src/tbf_ul.cpp
M src/tbf_ul.h
9 files changed, 69 insertions(+), 54 deletions(-)

Approvals:
  Jenkins Builder: Verified
  osmith: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve



diff --git a/src/bts.cpp b/src/bts.cpp
index 2389987..31c2b0a 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -981,7 +981,7 @@
                bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_UL_TBF_TWO_PHASE);
        } else {
                GprsMs *ms = bts_alloc_ms(bts, 0, chan_req.egprs_mslot_class);
-               tbf = tbf_alloc_ul_ccch(bts, ms);
+               tbf = ms_new_ul_tbf_assigned_agch(ms);
                if (!tbf) {
                        /* Send RR Immediate Assignment Reject */
                        rc = -EBUSY;
diff --git a/src/gprs_ms.c b/src/gprs_ms.c
index 90e8289..bf4d08a 100644
--- a/src/gprs_ms.c
+++ b/src/gprs_ms.c
@@ -1056,6 +1056,46 @@

 }

+/* Alloc a UL TBF to be assigned over PACCH. Called when an MS requests to
+ * create a new UL TBF during the end of life of a previous UL TBF (or an SBA).
+ * In summary, this TBF is allocated as a consequence of receiving a "Pkt
+ * Resource Req" or "Pkt Ctrl Ack" from the MS.
+ * See TS 44.060 9.3.2.4.2 "Non-extended uplink TBF mode".
+ */
+struct gprs_rlcmac_ul_tbf *ms_new_ul_tbf_assigned_pacch(struct GprsMs *ms, 
int8_t use_trx)
+{
+       const bool single_slot = false;
+       struct gprs_rlcmac_ul_tbf *ul_tbf;
+
+       ul_tbf = tbf_alloc_ul_tbf(ms->bts, ms, use_trx, single_slot);
+       if (!ul_tbf) {
+               LOGPMS(ms, DTBF, LOGL_NOTICE, "No PDCH resource\n");
+               /* Caller will most probably send a Imm Ass Reject after return 
*/
+               return NULL;
+       }
+       osmo_fsm_inst_dispatch(tbf_state_fi(ul_tbf_as_tbf(ul_tbf)), 
TBF_EV_ASSIGN_ADD_PACCH, NULL);
+       /* Contention resolution is considered to be done since TLLI is known 
in MS */
+       return ul_tbf;
+}
+
+/* Alloc a UL TBF to be assigned over AGCH. Used by request of a "One phase
+ * packet access", where MS requested only 1 PDCH TS (TS 44.018 Table 
9.1.8.1). */
+struct gprs_rlcmac_ul_tbf *ms_new_ul_tbf_assigned_agch(struct GprsMs *ms)
+{
+       const int8_t trx_no = -1;
+       const bool single_slot = true;
+       struct gprs_rlcmac_ul_tbf *ul_tbf;
+
+       ul_tbf = tbf_alloc_ul_tbf(ms->bts, ms, trx_no, single_slot);
+       if (!ul_tbf) {
+               LOGP(DTBF, LOGL_NOTICE, "No PDCH resource for Uplink TBF\n");
+               /* Caller will most probably send a Imm Ass Reject after return 
*/
+               return NULL;
+       }
+       osmo_fsm_inst_dispatch(tbf_state_fi(ul_tbf_as_tbf(ul_tbf)), 
TBF_EV_ASSIGN_ADD_CCCH, NULL);
+       return ul_tbf;
+}
+
 /* A new DL-TBF is allocated and assigned through PACCH using "tbf".
  * "tbf" may be either a UL-TBF or a DL-TBF.
  * Note: This should be called only when MS is reachable, see 
ms_is_reachable_for_dl_ass().
@@ -1088,7 +1128,6 @@
        struct gprs_rlcmac_dl_tbf *dl_tbf;

        dl_tbf = dl_tbf_alloc(ms->bts, ms, trx_no, single_slot);
-
        if (!dl_tbf) {
                LOGPMS(ms, DTBF, LOGL_NOTICE, "No PDCH resource\n");
                return -EBUSY;
diff --git a/src/gprs_ms.h b/src/gprs_ms.h
index 8014f26..53b0cd6 100644
--- a/src/gprs_ms.h
+++ b/src/gprs_ms.h
@@ -144,6 +144,8 @@
 bool ms_nacc_rts(const struct GprsMs *ms);
 struct msgb *ms_nacc_create_rlcmac_msg(struct GprsMs *ms, struct 
gprs_rlcmac_tbf *tbf, uint32_t fn, uint8_t ts);

+struct gprs_rlcmac_ul_tbf *ms_new_ul_tbf_assigned_pacch(struct GprsMs *ms, 
int8_t use_trx);
+struct gprs_rlcmac_ul_tbf *ms_new_ul_tbf_assigned_agch(struct GprsMs *ms);
 int ms_new_dl_tbf_assigned_on_pacch(struct GprsMs *ms, struct gprs_rlcmac_tbf 
*tbf);
 int ms_new_dl_tbf_assigned_on_pch(struct GprsMs *ms);
 int ms_append_llc_dl_data(struct GprsMs *ms, uint16_t pdu_delay_csec, const 
uint8_t *data, uint16_t len);
diff --git a/src/pdch.cpp b/src/pdch.cpp
index ad521e3..8dd7597 100644
--- a/src/pdch.cpp
+++ b/src/pdch.cpp
@@ -119,7 +119,7 @@
        bts_do_rate_ctr_inc(bts, CTR_CHANNEL_REQUEST_DESCRIPTION);

        /* This call will register the new TBF with the MS on success */
-       gprs_rlcmac_ul_tbf *ul_tbf = tbf_alloc_ul_pacch(bts, tbf->ms(), 
tbf->trx->trx_no);
+       gprs_rlcmac_ul_tbf *ul_tbf = ms_new_ul_tbf_assigned_pacch(tbf->ms(), 
tbf->trx->trx_no);

        /* schedule uplink assignment or reject */
        if (ul_tbf) {
@@ -757,7 +757,7 @@
                get_meas(meas, request);
                ms_update_l1_meas(ms, meas);

-               ul_tbf = tbf_alloc_ul_pacch(bts, ms, trx_no());
+               ul_tbf = ms_new_ul_tbf_assigned_pacch(ms, trx_no());
                if (!ul_tbf) {
                        handle_tbf_reject(bts, ms, trx_no(), ts_no);
                        goto return_unref;
diff --git a/src/tbf.cpp b/src/tbf.cpp
index d855083..58695d2 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -801,6 +801,11 @@
        return (enum tbf_fsm_states)tbf->state_fsm.fi->state;
 }

+struct osmo_fsm_inst *tbf_state_fi(const struct gprs_rlcmac_tbf *tbf)
+{
+       return tbf->state_fsm.fi;
+}
+
 struct osmo_fsm_inst *tbf_ul_ass_fi(const struct gprs_rlcmac_tbf *tbf)
 {
        return tbf->ul_ass_fsm.fi;
diff --git a/src/tbf.h b/src/tbf.h
index 65b131e..616c3e0 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -125,6 +125,7 @@
 enum tbf_fsm_states tbf_state(const struct gprs_rlcmac_tbf *tbf);
 struct osmo_fsm_inst *tbf_ul_ass_fi(const struct gprs_rlcmac_tbf *tbf);
 struct osmo_fsm_inst *tbf_dl_ass_fi(const struct gprs_rlcmac_tbf *tbf);
+struct osmo_fsm_inst *tbf_state_fi(const struct gprs_rlcmac_tbf *tbf);
 enum gprs_rlcmac_tbf_direction tbf_direction(const struct gprs_rlcmac_tbf 
*tbf);
 void tbf_set_ms(struct gprs_rlcmac_tbf *tbf, struct GprsMs *ms);
 struct llist_head *tbf_ms_list(struct gprs_rlcmac_tbf *tbf);
diff --git a/src/tbf_fsm.c b/src/tbf_fsm.c
index 9118fd7..a8e7886 100644
--- a/src/tbf_fsm.c
+++ b/src/tbf_fsm.c
@@ -99,8 +99,13 @@
        switch (event) {
        case TBF_EV_ASSIGN_ADD_CCCH:
                mod_ass_type(ctx, GPRS_RLCMAC_FLAG_CCCH, true);
-               tbf_fsm_state_chg(fi, tbf_direction(ctx->tbf) == 
GPRS_RLCMAC_DL_TBF ?
-                                       TBF_ST_ASSIGN : TBF_ST_FLOW);
+               if (tbf_direction(ctx->tbf) == GPRS_RLCMAC_UL_TBF) {
+                       struct gprs_rlcmac_ul_tbf *ul_tbf = 
tbf_as_ul_tbf(ctx->tbf);
+                       tbf_fsm_state_chg(fi, TBF_ST_FLOW);
+                       ul_tbf_contention_resolution_start(ul_tbf);
+               } else {
+                       tbf_fsm_state_chg(fi, TBF_ST_ASSIGN);
+               }
                break;
        case TBF_EV_ASSIGN_ADD_PACCH:
                mod_ass_type(ctx, GPRS_RLCMAC_FLAG_PACCH, true);
diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp
index 7189b6f..6edf8be 100644
--- a/src/tbf_ul.cpp
+++ b/src/tbf_ul.cpp
@@ -104,7 +104,7 @@
 }

 /* Generic function to alloc a UL TBF, later configured to be assigned either 
over CCCH or PACCH */
-struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, 
GprsMs *ms, int8_t use_trx, bool single_slot)
+struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, 
struct GprsMs *ms, int8_t use_trx, bool single_slot)
 {
        struct gprs_rlcmac_ul_tbf *tbf;
        int rc;
@@ -147,48 +147,6 @@
        return tbf;
 }

-/* Alloc a UL TBF to be assigned over PACCH. Called when an MS requests to
- * create a new UL TBF during the end of life of a previous UL TBF (or an SBA).
- * In summary, this TBF is allocated as a consequence of receiving a "Pkt
- * Resource Req" or "Pkt Ctrl Ack" from the MS.
- * See TS 44.060 9.3.2.4.2 "Non-extended uplink TBF mode".
- */
-gprs_rlcmac_ul_tbf *tbf_alloc_ul_pacch(struct gprs_rlcmac_bts *bts, GprsMs 
*ms, int8_t use_trx)
-{
-       struct gprs_rlcmac_ul_tbf *tbf;
-
-       tbf = tbf_alloc_ul_tbf(bts, ms, use_trx, false);
-       if (!tbf) {
-               LOGPMS(ms, DTBF, LOGL_NOTICE, "No PDCH resource\n");
-               /* Caller will most probably send a Imm Ass Reject after return 
*/
-               return NULL;
-       }
-       /* Contention resolution is considered to be done since TLLI is known 
in MS: */
-       tbf->m_contention_resolution_done = true;
-       osmo_fsm_inst_dispatch(tbf->state_fsm.fi, TBF_EV_ASSIGN_ADD_PACCH, 
NULL);
-
-       return tbf;
-}
-
-/* Alloc a UL TBF to be assigned over CCCH. Used by request of a "One phase
- * packet access", where MS requested only 1 PDCH TS (TS 44.018 Table 
9.1.8.1). */
-struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_ccch(struct gprs_rlcmac_bts *bts, 
struct GprsMs *ms)
-{
-       struct gprs_rlcmac_ul_tbf *tbf;
-
-       tbf = tbf_alloc_ul_tbf(bts, ms, -1, true);
-       if (!tbf) {
-               LOGP(DTBF, LOGL_NOTICE, "No PDCH resource for Uplink TBF\n");
-               /* Caller will most probably send a Imm Ass Reject after return 
*/
-               return NULL;
-       }
-       osmo_fsm_inst_dispatch(tbf->state_fsm.fi, TBF_EV_ASSIGN_ADD_CCCH, NULL);
-       tbf->contention_resolution_start();
-       OSMO_ASSERT(tbf->ms());
-
-       return tbf;
-}
-
 /* Create a temporary dummy TBF to Tx a ImmAssReject if allocating a new one 
during
  * packet resource Request failed. This is similar as tbf_alloc_ul() but 
without
  * calling tbf->setup() (in charge of TFI/USF allocation), and reusing 
resources
@@ -237,7 +195,7 @@
 gprs_rlcmac_ul_tbf::gprs_rlcmac_ul_tbf(struct gprs_rlcmac_bts *bts_, GprsMs 
*ms) :
        gprs_rlcmac_tbf(bts_, ms, GPRS_RLCMAC_UL_TBF),
        m_rx_counter(0),
-       m_contention_resolution_done(false),
+       m_contention_resolution_done(true),
        m_ul_gprs_ctrs(NULL),
        m_ul_egprs_ctrs(NULL)
 {
@@ -311,6 +269,7 @@
         * timeout only for one-phase packet access, since two-phase is handled
         * through SBA structs, which are freed by the PDCH UL Controller if the
         * single allocated block is lost. */
+       m_contention_resolution_done = false;
        T_START(this, T3141, 3141, "Contention resolution (UL-TBF, CCCH)", 
true);
 }
 void gprs_rlcmac_ul_tbf::contention_resolution_success()
@@ -782,6 +741,11 @@
        return tbf->ul_ack_fsm.fi;
 }

+void ul_tbf_contention_resolution_start(struct gprs_rlcmac_ul_tbf *tbf)
+{
+       tbf->contention_resolution_start();
+}
+
 void ul_tbf_contention_resolution_success(struct gprs_rlcmac_ul_tbf *tbf)
 {
        return tbf->contention_resolution_success();
diff --git a/src/tbf_ul.h b/src/tbf_ul.h
index 59e5d66..0812b9d 100644
--- a/src/tbf_ul.h
+++ b/src/tbf_ul.h
@@ -121,9 +121,6 @@
        return m_window.ws();
 }

-struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, 
GprsMs *ms, int8_t use_trx, bool single_slot);
-struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_pacch(struct gprs_rlcmac_bts *bts, 
GprsMs *ms, int8_t use_trx);
-struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_ccch(struct gprs_rlcmac_bts *bts, 
struct GprsMs *ms);
 struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts,
        GprsMs *ms, uint8_t trx_no, uint8_t ts_no);

@@ -135,13 +132,15 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
+struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, 
struct GprsMs *ms, int8_t use_trx, bool single_slot);
 void update_tbf_ta(struct gprs_rlcmac_ul_tbf *tbf, int8_t ta_delta);
 void set_tbf_ta(struct gprs_rlcmac_ul_tbf *tbf, uint8_t ta);
 struct gprs_rlcmac_ul_tbf *tbf_as_ul_tbf(struct gprs_rlcmac_tbf *tbf);
 void tbf_usf_timeout(struct gprs_rlcmac_ul_tbf *tbf);
+void ul_tbf_contention_resolution_start(struct gprs_rlcmac_ul_tbf *tbf);
+void ul_tbf_contention_resolution_success(struct gprs_rlcmac_ul_tbf *tbf);
 bool ul_tbf_contention_resolution_done(const struct gprs_rlcmac_ul_tbf *tbf);
 struct osmo_fsm_inst *tbf_ul_ack_fi(const struct gprs_rlcmac_ul_tbf *tbf);
-void ul_tbf_contention_resolution_success(struct gprs_rlcmac_ul_tbf *tbf);

 static inline struct gprs_rlcmac_tbf *ul_tbf_as_tbf(struct gprs_rlcmac_ul_tbf 
*ul_tbf)
 {

--
To view, visit https://gerrit.osmocom.org/c/osmo-pcu/+/29924
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Change-Id: I256aeede2a2678c9738539fb6ec4db9766fa85e4
Gerrit-Change-Number: 29924
Gerrit-PatchSet: 3
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <[email protected]>
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to