bts: Provide the first set of counters
diff --git a/src/bts.cpp b/src/bts.cpp
index 29e5834..39c1fd5 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -664,6 +664,7 @@
 		case 23:
 			break;
 	default:
+		bts()->decode_error();
 		LOGP(DRLCMACUL, LOGL_ERROR, "Dropping data block with invalid"
 			"length: %d)\n", len);
 		return -EINVAL;
@@ -696,6 +697,7 @@
 		}
 		rc = Decoding::tlli_from_ul_data(data, len, &tbf->tlli);
 		if (rc) {
+			bts()->decode_error();
 			LOGP(DRLCMACUL, LOGL_NOTICE, "Failed to decode TLLI "
 				"of UL DATA TBF=%d.\n", rh->tfi);
 			return 0;
@@ -1101,6 +1103,7 @@
 		gprs_rlcmac_meas_rep(&ul_control_block->u.Packet_Measurement_Report);
 		break;
 	default:
+		bts()->decode_error();
 		LOGP(DRLCMAC, LOGL_NOTICE, "RX: [PCU <- BTS] unknown control block received\n");
 	}
 	talloc_free(ul_control_block);
diff --git a/src/bts.h b/src/bts.h
index af51e47..eec3493 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -237,6 +237,31 @@
 	return m_ratectrs;
 }
 
+inline void BTS::tbf_dl_created()
+{
+	rate_ctr_inc(&m_ratectrs->ctr[CTR_TBF_DL_ALLOCATED]);
+}
+
+inline void BTS::tbf_dl_freed()
+{
+	rate_ctr_inc(&m_ratectrs->ctr[CTR_TBF_DL_FREED]);
+}
+
+inline void BTS::tbf_ul_created()
+{
+	rate_ctr_inc(&m_ratectrs->ctr[CTR_TBF_UL_ALLOCATED]);
+}
+
+inline void BTS::tbf_ul_freed()
+{
+	rate_ctr_inc(&m_ratectrs->ctr[CTR_TBF_UL_FREED]);
+}
+
+inline void BTS::decode_error()
+{
+	rate_ctr_inc(&m_ratectrs->ctr[CTR_DECODE_ERRORS]);
+}
+
 inline gprs_rlcmac_bts *gprs_rlcmac_pdch::bts_data() const
 {
 	return trx->bts->bts_data();
diff --git a/src/tbf.cpp b/src/tbf.cpp
index eb76ab8..cdd8098 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -328,6 +328,12 @@
 		msgb_free(msg);
 	tbf_unlink_pdch(tbf);
 	llist_del(&tbf->list);
+
+	if (tbf->direction == GPRS_RLCMAC_UL_TBF)
+		tbf->bts->tbf_ul_freed();
+	else
+		tbf->bts->tbf_dl_freed();
+
 	LOGP(DRLCMAC, LOGL_DEBUG, "********** TBF ends here **********\n");
 	talloc_free(tbf);
 }
@@ -602,10 +608,13 @@
 	gettimeofday(&tbf->meas.dl_loss_tv, NULL);
 
 	INIT_LLIST_HEAD(&tbf->llc_queue);
-	if (dir == GPRS_RLCMAC_UL_TBF)
+	if (dir == GPRS_RLCMAC_UL_TBF) {
 		llist_add(&tbf->list, &bts->ul_tbfs);
-	else
+		tbf->bts->tbf_ul_created();
+	} else {
 		llist_add(&tbf->list, &bts->dl_tbfs);
+		tbf->bts->tbf_dl_created();
+	}
 
 	debug_diagram(bts->bts, tbf->diag, "+-----------------+");
 	debug_diagram(bts->bts, tbf->diag, "|NEW %s TBF TFI=%2d|",