Expect ms object to exist before calling tbf_alloc_ul_tbf()

It's really non-sense from architectural point of view to pass an
optional pointer to the MS holding the TBF and creating it otherwise.
TBFs shouldn't be creating MS they belong too.

This simple change requiring so many code line changes really exhibits
how badly entangled the object relationship is.

Another commit will follow doing the same for dl tbf.

Change-Id: I010aa5877902816ae246e09ad5ad87946f96855c
diff --git a/src/pdch.cpp b/src/pdch.cpp
index 77be1b5..149ca1f 100644
--- a/src/pdch.cpp
+++ b/src/pdch.cpp
@@ -118,8 +118,7 @@
 	bts->channel_request_description();
 
 	/* This call will register the new TBF with the MS on success */
-	gprs_rlcmac_ul_tbf *ul_tbf = tbf_alloc_ul(bts_data, tbf->trx->trx_no, tbf->ms_class(),
-						  tbf->ms()->egprs_ms_class(), tbf->tlli(), tbf->ta(), tbf->ms());
+	gprs_rlcmac_ul_tbf *ul_tbf = tbf_alloc_ul(bts_data, tbf->ms(), tbf->trx->trx_no, tbf->tlli(), tbf->ta());
 
 	/* schedule uplink assignment or reject */
 	if (ul_tbf) {
@@ -552,19 +551,17 @@
 		struct gprs_rlcmac_ul_tbf *ul_tbf = NULL;
 		struct gprs_rlcmac_dl_tbf *dl_tbf = NULL;
 		uint32_t tlli = request->ID.u.TLLI;
-		uint8_t ms_class = 0;
-		uint8_t egprs_ms_class = 0;
 		uint8_t ta = GSM48_TA_INVALID;
 
 		GprsMs *ms = bts()->ms_by_tlli(tlli);
+		if (!ms)
+			ms = bts()->ms_alloc(0, 0); /* ms class updated later */
+
 		/* Keep the ms, even if it gets idle temporarily */
 		GprsMs::Guard guard(ms);
-
-		if (ms) {
-			ul_tbf = ms->ul_tbf();
-			dl_tbf = ms->dl_tbf();
-			ta = ms->ta();
-		}
+		ul_tbf = ms->ul_tbf();
+		dl_tbf = ms->dl_tbf();
+		ta = ms->ta();
 
 		/* We got a RACH so the MS was in packet idle mode and thus
 		 * didn't have any active TBFs */
@@ -597,20 +594,23 @@
 			bts()->sba()->free_sba(sba);
 		}
 		if (request->Exist_MS_Radio_Access_capability2) {
+			uint8_t ms_class, egprs_ms_class;
 			ms_class = Decoding::get_ms_class_by_capability(
 				&request->MS_Radio_Access_capability2);
+			ms->set_ms_class(ms_class);
 			egprs_ms_class =
 				Decoding::get_egprs_ms_class_by_capability(
 					&request->MS_Radio_Access_capability2);
+			ms->set_egprs_ms_class(egprs_ms_class);
 		}
-		if (!ms_class)
+		if (!ms->ms_class())
 			LOGP(DRLCMAC, LOGL_NOTICE, "MS does not give us a class.\n");
-		if (egprs_ms_class)
+		if (ms->egprs_ms_class())
 			LOGP(DRLCMAC, LOGL_NOTICE,
 				"MS supports EGPRS multislot class %d.\n",
-				egprs_ms_class);
-		ul_tbf = tbf_alloc_ul(bts_data(), trx_no(), ms_class,
-			egprs_ms_class, tlli, ta, ms);
+				ms->egprs_ms_class());
+
+		ul_tbf = tbf_alloc_ul(bts_data(), ms, trx_no(), tlli, ta);
 
 		if (!ul_tbf) {
 			handle_tbf_reject(bts_data(), ms, tlli,
@@ -626,10 +626,6 @@
 		/* schedule uplink assignment */
 		TBF_SET_ASS_STATE_UL(ul_tbf, GPRS_RLCMAC_UL_ASS_SEND_ASS);
 
-		/* get capabilities */
-		if (ul_tbf->ms())
-			ul_tbf->ms()->set_egprs_ms_class(egprs_ms_class);
-
 		/* get measurements */
 		if (ul_tbf->ms()) {
 			get_meas(meas, request);