aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authoraravind sirsikar <arvind.sirsikar@radisys.com>2017-01-24 12:36:08 +0530
committerHarald Welte <laforge@gnumonks.org>2017-01-24 13:11:51 +0000
commite9a138e11111f509f988807bbdc5ca8cce2b3d3d (patch)
tree5c957d735e22ffad0cdc65e842b39a9e6c61ad6f /src
parent1d8744ce967f038e4bede584845b8326d9f66c2a (diff)
Handle packet access reject during packet resource request
When Packet resource request is received, PCU will generate the packet access reject if no resources are present. The encoding is done based on section 7.1.3.2.1 and 8.1.2.5 of 44.060 version 7.27.0 Release 7. This patch also includes the test case to validate the generated packet access reject message. This patch is integration tested on Osmo-trx setup with Ettus B210 board and LG F70 MS with some simulation code changes in Osmo-pcu. Change-Id: I05ff25124b58905586caa0c0c37023d69724f121
Diffstat (limited to 'src')
-rw-r--r--src/bts.cpp6
-rw-r--r--src/gprs_rlcmac_sched.cpp11
-rw-r--r--src/tbf.cpp40
-rw-r--r--src/tbf.h4
4 files changed, 57 insertions, 4 deletions
diff --git a/src/bts.cpp b/src/bts.cpp
index b4e18e3d..25cbc60f 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -1356,8 +1356,12 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request,
egprs_ms_class);
ul_tbf = tbf_alloc_ul(bts_data(), trx_no(), ms_class,
egprs_ms_class, tlli, ta, ms);
- if (!ul_tbf)
+
+ if (!ul_tbf) {
+ handle_tbf_reject(bts_data(), ms, tlli,
+ trx_no(), ts_no);
return;
+ }
/* set control ts to current MS's TS, until assignment complete */
LOGP(DRLCMAC, LOGL_DEBUG, "Change control TS to %d until assinment is complete.\n", ts_no);
diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp
index 8b27cacd..3b940f47 100644
--- a/src/gprs_rlcmac_sched.cpp
+++ b/src/gprs_rlcmac_sched.cpp
@@ -56,7 +56,9 @@ static uint32_t sched_poll(BTS *bts,
*ul_ack_tbf = ul_tbf;
if (ul_tbf->dl_ass_state == GPRS_RLCMAC_DL_ASS_SEND_ASS)
*dl_ass_tbf = ul_tbf;
- if (ul_tbf->ul_ass_state == GPRS_RLCMAC_UL_ASS_SEND_ASS)
+ if (ul_tbf->ul_ass_state == GPRS_RLCMAC_UL_ASS_SEND_ASS
+ || ul_tbf->ul_ass_state ==
+ GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ)
*ul_ass_tbf = ul_tbf;
#warning "Is this supposed to be fair? The last TBF for each wins? Maybe use llist_add_tail and skip once we have all states?"
}
@@ -136,8 +138,11 @@ static struct msgb *sched_select_ctrl_msg(
* because they may kill the TBF when the CONTROL ACK is
* received, thus preventing the others from being processed.
*/
-
- if (tbf == ul_ass_tbf && tbf->direction == GPRS_RLCMAC_DL_TBF)
+ if (tbf == ul_ass_tbf && tbf->ul_ass_state ==
+ GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ)
+ msg = ul_ass_tbf->create_packet_access_reject();
+ else if (tbf == ul_ass_tbf && tbf->direction ==
+ GPRS_RLCMAC_DL_TBF)
if (tbf->ul_ass_state ==
GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ)
msg = ul_ass_tbf->create_packet_access_reject();
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 33d94a85..0d28c5c1 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -1174,6 +1174,10 @@ struct msgb *gprs_rlcmac_tbf::create_packet_access_reject()
bitvec_free(packet_access_rej);
ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE;
+ /* Start Tmr only if it is UL TBF */
+ if (direction == GPRS_RLCMAC_UL_TBF)
+ tbf_timer_start(this, 0, Treject_pacch);
+
return msg;
}
@@ -1403,3 +1407,39 @@ bool gprs_rlcmac_tbf::is_control_ts(uint8_t ts) const
{
return ts == control_ts;
}
+
+struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts,
+ GprsMs *ms, uint32_t tlli, uint8_t trx_no, uint8_t ts)
+{
+ struct gprs_rlcmac_ul_tbf *ul_tbf = NULL;
+ struct gprs_rlcmac_trx *trx = &bts->trx[trx_no];
+
+ ul_tbf = talloc(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
+ if (!ul_tbf)
+ return ul_tbf;
+
+ talloc_set_destructor(ul_tbf, ul_tbf_dtor);
+ new (ul_tbf) gprs_rlcmac_ul_tbf(bts->bts);
+ if (!ms)
+ ms = bts->bts->ms_alloc(0, 0);
+
+ ms->set_tlli(tlli);
+
+ llist_add(&ul_tbf->list(), &bts->bts->ul_tbfs());
+ ul_tbf->bts->tbf_ul_created();
+ ul_tbf->set_state(GPRS_RLCMAC_ASSIGN);
+ ul_tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH);
+
+ ul_tbf->set_ms(ms);
+ ul_tbf->update_ms(tlli, GPRS_RLCMAC_UL_TBF);
+ ul_tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ;
+ ul_tbf->control_ts = ts;
+ ul_tbf->trx = trx;
+ ul_tbf->m_ctrs = rate_ctr_group_alloc(ul_tbf, &tbf_ctrg_desc, 0);
+ ul_tbf->m_ul_egprs_ctrs = rate_ctr_group_alloc(ul_tbf,
+ &tbf_ul_egprs_ctrg_desc, 0);
+ ul_tbf->m_ul_gprs_ctrs = rate_ctr_group_alloc(ul_tbf,
+ &tbf_ul_gprs_ctrg_desc, 0);
+
+ return ul_tbf;
+}
diff --git a/src/tbf.h b/src/tbf.h
index 03895953..09e31220 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -43,6 +43,7 @@ class GprsMs;
#define Tassign_agch 0,200000 /* waiting after IMM.ASS confirm */
#define Tassign_pacch 2,0 /* timeout for pacch assigment */
+#define Treject_pacch 0,2000 /* timeout for tbf reject for PRR*/
enum gprs_rlcmac_tbf_state {
GPRS_RLCMAC_NULL = 0, /* new created TBF */
@@ -316,6 +317,9 @@ struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts,
void tbf_free(struct gprs_rlcmac_tbf *tbf);
+struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts,
+ GprsMs *ms, uint32_t tlli, uint8_t trx_no, uint8_t ts_no);
+
int tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf);
void tbf_timer_start(struct gprs_rlcmac_tbf *tbf, unsigned int T,