tbf: Move the tx part into the tbf as it accesses internal data
diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp
index ea5ab4e..0037e6d 100644
--- a/src/gprs_rlcmac.cpp
+++ b/src/gprs_rlcmac.cpp
@@ -113,31 +113,6 @@
 }
 #endif
 
-/* Send Uplink unit-data to SGSN. */
-int gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf)
-{
-	uint8_t qos_profile[3];
-	struct msgb *llc_pdu;
-	unsigned msg_len = NS_HDR_LEN + BSSGP_HDR_LEN + tbf->llc_index;
-	struct bssgp_bvc_ctx *bctx = gprs_bssgp_pcu_current_bctx();
-
-	LOGP(DBSSGP, LOGL_INFO, "LLC [PCU -> SGSN] %s len=%d\n", tbf_name(tbf), tbf->llc_index);
-	if (!bctx) {
-		LOGP(DBSSGP, LOGL_ERROR, "No bctx\n");
-		return -EIO;
-	}
-	
-	llc_pdu = msgb_alloc_headroom(msg_len, msg_len,"llc_pdu");
-	uint8_t *buf = msgb_push(llc_pdu, TL16V_GROSS_LEN(sizeof(uint8_t)*tbf->llc_index));
-	tl16v_put(buf, BSSGP_IE_LLC_PDU, sizeof(uint8_t)*tbf->llc_index, tbf->llc_frame);
-	qos_profile[0] = QOS_PROFILE >> 16;
-	qos_profile[1] = QOS_PROFILE >> 8;
-	qos_profile[2] = QOS_PROFILE;
-	bssgp_tx_ul_ud(bctx, tbf->tlli(), qos_profile, llc_pdu);
-
-	return 0;
-}
-
 int gprs_rlcmac_paging_request(uint8_t *ptmsi, uint16_t ptmsi_len,
 	const char *imsi)
 {
diff --git a/src/tbf.cpp b/src/tbf.cpp
index e571f70..6012388 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -892,8 +892,7 @@
 			/* send frame to SGSN */
 			LOGP(DRLCMACUL, LOGL_INFO, "%s complete UL frame len=%d\n",
 				tbf_name(this) , this->llc_index);
-			gprs_rlcmac_tx_ul_ud(this);
-			this->llc_index = 0; /* reset frame space */
+			snd_ul_ud();
 		/* also check if CV==0, because the frame may fill up the
 		 * block precisely, then it is also complete. normally the
 		 * frame would be extended into the next block with a 0-length
@@ -903,8 +902,7 @@
 			LOGP(DRLCMACUL, LOGL_INFO, "%s complete UL frame "
 				"that fits precisely in last block: "
 				"len=%d\n", tbf_name(this), this->llc_index);
-			gprs_rlcmac_tx_ul_ud(this);
-			this->llc_index = 0; /* reset frame space */
+			snd_ul_ud();
 		}
 	}
 
@@ -1844,6 +1842,33 @@
 	return 0;
 }
 
+/* Send Uplink unit-data to SGSN. */
+int gprs_rlcmac_tbf::snd_ul_ud()
+{
+	uint8_t qos_profile[3];
+	struct msgb *llc_pdu;
+	unsigned msg_len = NS_HDR_LEN + BSSGP_HDR_LEN + llc_index;
+	struct bssgp_bvc_ctx *bctx = gprs_bssgp_pcu_current_bctx();
+
+	LOGP(DBSSGP, LOGL_INFO, "LLC [PCU -> SGSN] %s len=%d\n", tbf_name(this), llc_index);
+	if (!bctx) {
+		LOGP(DBSSGP, LOGL_ERROR, "No bctx\n");
+		llc_index = 0; /* reset frame space */
+		return -EIO;
+	}
+	
+	llc_pdu = msgb_alloc_headroom(msg_len, msg_len,"llc_pdu");
+	uint8_t *buf = msgb_push(llc_pdu, TL16V_GROSS_LEN(sizeof(uint8_t)*llc_index));
+	tl16v_put(buf, BSSGP_IE_LLC_PDU, sizeof(uint8_t)*llc_index, llc_frame);
+	qos_profile[0] = QOS_PROFILE >> 16;
+	qos_profile[1] = QOS_PROFILE >> 8;
+	qos_profile[2] = QOS_PROFILE;
+	bssgp_tx_ul_ud(bctx, tlli(), qos_profile, llc_pdu);
+
+	llc_index = 0; /* reset frame space */
+	return 0;
+}
+
 const char *tbf_name(gprs_rlcmac_tbf *tbf)
 {
 	static char buf[40];
diff --git a/src/tbf.h b/src/tbf.h
index fb4a64c..afbfdb3 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -105,6 +105,7 @@
 	struct msgb *create_ul_ass(uint32_t fn);
 	struct msgb *create_ul_ack(uint32_t fn);
 	int snd_dl_ack(uint8_t final, uint8_t ssn, uint8_t *rbb);
+	int snd_ul_ud();
 
 	/* blocks were acked */
 	int rcv_data_block_acknowledged(const uint8_t *data, size_t len, int8_t rssi);