tbf_dl: factor out EGPRS DL window size calculation

A subsequent patch needs to call this from gprs_rlcmac_tbf::update(),
so to avoid code dup, put the calculation in a separate function.

Related: OS#1808

Change-Id: I7c7777d43f843bbd3421503fc2a8600f148ca035
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 7a15547..cbc0710 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -781,20 +781,8 @@
 		return NULL;
 	}
 
-	if (tbf->is_egprs_enabled()) {
-		unsigned int num_pdch = pcu_bitcount(tbf->dl_slots());
-		unsigned int ws = bts->ws_base + num_pdch * bts->ws_pdch;
-		ws = (ws / 32) * 32;
-		ws = OSMO_MAX(64, ws);
-		if (num_pdch == 1)
-			ws = OSMO_MIN(192, ws);
-		else
-			ws = OSMO_MIN(128 * num_pdch, ws);
-
-		LOGP(DRLCMAC, LOGL_INFO, "%s: Setting EGPRS window size to %d\n",
-			tbf->name(), ws);
-		tbf->m_window.set_ws(ws);
-	}
+	if (tbf->is_egprs_enabled())
+		tbf->egprs_calc_window_size();
 
 	llist_add(&tbf->list(), &bts->bts->dl_tbfs());
 	tbf->bts->tbf_dl_created();
diff --git a/src/tbf.h b/src/tbf.h
index 2a1bfe8..3a6f42d 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -372,6 +372,8 @@
 	int release();
 	int abort();
 
+	void egprs_calc_window_size();
+
 	/* TODO: add the gettimeofday as parameter */
 	struct msgb *llc_dequeue(bssgp_bvc_ctx *bctx);
 
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index 489020b..457f2c9 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -1322,3 +1322,23 @@
 	/* Non SPB cases 0 is reurned */
 	return EGPRS_RLCMAC_DL_NO_RETX;
 }
+
+void gprs_rlcmac_dl_tbf::egprs_calc_window_size()
+{
+	struct gprs_rlcmac_bts *bts_data = bts->bts_data();
+	unsigned int num_pdch = pcu_bitcount(dl_slots());
+	unsigned int ws = bts_data->ws_base + num_pdch * bts_data->ws_pdch;
+
+	ws = (ws / 32) * 32;
+	ws = OSMO_MAX(64, ws);
+
+	if (num_pdch == 1)
+		ws = OSMO_MIN(192, ws);
+	else
+		ws = OSMO_MIN(128 * num_pdch, ws);
+
+	LOGP(DRLCMAC, LOGL_INFO, "%s: Setting EGPRS window size to %d\n",
+		name(), ws);
+
+	m_window.set_ws(ws);
+}