tbf: Add BTS::ms_alloc method

Currently the code that creates the MS objects with tbf.cpp is
duplicated.

This commit moves the corresponding code into a new method. Since
there is no TLLI available there, the GprsMsStorage::create_ms method
has been refactored into two variants, one with TLLI/direction and
one without.

Sponsored-by: On-Waves ehf
diff --git a/src/bts.cpp b/src/bts.cpp
index 0ff0ffa..bc5ac94 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -522,6 +522,17 @@
 }
 
 
+GprsMs *BTS::ms_alloc(uint8_t ms_class)
+{
+	GprsMs *ms;
+	ms = ms_store().create_ms();
+
+	ms->set_timeout(m_bts.ms_idle_sec);
+	ms->set_ms_class(ms_class);
+
+	return ms;
+}
+
 /*
  * PDCH code below. TODO: move to a separate file
  */
diff --git a/src/bts.h b/src/bts.h
index f2db318..7e34db5 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -229,6 +229,7 @@
 
 	GprsMsStorage &ms_store();
 	GprsMs *ms_by_tlli(uint32_t tlli, uint32_t old_tlli = 0);
+	GprsMs *ms_alloc(uint8_t ms_class);
 
 	/*
 	 * Statistics
diff --git a/src/gprs_ms_storage.cpp b/src/gprs_ms_storage.cpp
index 1f124a5..515ed75 100644
--- a/src/gprs_ms_storage.cpp
+++ b/src/gprs_ms_storage.cpp
@@ -80,6 +80,18 @@
 	return NULL;
 }
 
+GprsMs *GprsMsStorage::create_ms()
+{
+	GprsMs *ms;
+
+	ms = new GprsMs(m_bts, 0);
+
+	ms->set_callback(this);
+	llist_add(&ms->list(), &m_list);
+
+	return ms;
+}
+
 GprsMs *GprsMsStorage::create_ms(uint32_t tlli, enum gprs_rlcmac_tbf_direction dir)
 {
 	GprsMs *ms = get_ms(tlli);
@@ -87,15 +99,12 @@
 	if (ms)
 		return ms;
 
-	ms = new GprsMs(m_bts, 0);
+	ms = create_ms();
 
 	if (dir == GPRS_RLCMAC_UL_TBF)
 		ms->set_tlli(tlli);
 	else
 		ms->confirm_tlli(tlli);
 
-	ms->set_callback(this);
-	llist_add(&ms->list(), &m_list);
-
 	return ms;
 }
diff --git a/src/gprs_ms_storage.h b/src/gprs_ms_storage.h
index ad1e656..df788bf 100644
--- a/src/gprs_ms_storage.h
+++ b/src/gprs_ms_storage.h
@@ -38,6 +38,7 @@
 
 	GprsMs *get_ms(uint32_t tlli, uint32_t old_tlli = 0, const char *imsi = 0) const;
 	GprsMs *create_ms(uint32_t tlli, enum gprs_rlcmac_tbf_direction dir);
+	GprsMs *create_ms();
 
 	const LListHead<GprsMs>& ms_list() const {return m_list;}
 private:
diff --git a/src/tbf.cpp b/src/tbf.cpp
index faddb79..9bdc1f7 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -499,11 +499,8 @@
 
 	tbf->direction = GPRS_RLCMAC_UL_TBF;
 
-	if (!ms) {
-		ms = bts->bts->ms_store().create_ms(0, tbf->direction);
-		ms->set_timeout(bts->ms_idle_sec);
-		ms->set_ms_class(ms_class);
-	}
+	if (!ms)
+		ms = bts->bts->ms_alloc(ms_class);
 
 	rc = setup_tbf(tbf, bts, ms, tfi, trx, ms_class, single_slot);
 	/* if no resource */
@@ -539,11 +536,8 @@
 
 	tbf->direction = GPRS_RLCMAC_DL_TBF;
 
-	if (!ms) {
-		ms = bts->bts->ms_store().create_ms(0, tbf->direction);
-		ms->set_timeout(bts->ms_idle_sec);
-		ms->set_ms_class(ms_class);
-	}
+	if (!ms)
+		ms = bts->bts->ms_alloc(ms_class);
 
 	rc = setup_tbf(tbf, bts, ms, tfi, trx, ms_class, single_slot);
 	/* if no resource */