bsc: count the usage of codec by setting the lchan active

we count the codec when the channel was successful setted up

Change-Id: Ifc8a406a11dce16b9e7f3310841e470545550a2c
diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c
index dc4ede2..ae88f8c 100644
--- a/openbsc/src/libbsc/abis_rsl.c
+++ b/openbsc/src/libbsc/abis_rsl.c
@@ -82,6 +82,39 @@
 	lchan_free(lchan);
 }
 
+static void count_codecs(struct gsm_bts *bts, struct gsm_lchan *lchan)
+{
+	if (lchan->type == GSM_LCHAN_TCH_H) {
+		switch (lchan->tch_mode) {
+		case GSM48_CMODE_SPEECH_AMR:
+			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_AMR_H]);
+			break;
+		case GSM48_CMODE_SPEECH_V1:
+			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_V1_HR]);
+			break;
+		default:
+			break;
+		}
+	} else if (lchan->type == GSM_LCHAN_TCH_F) {
+		switch (lchan->tch_mode) {
+		case GSM48_CMODE_SPEECH_AMR:
+			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_AMR_F]);
+			break;
+		case GSM48_CMODE_SPEECH_V1:
+			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_V1_FR]);
+			break;
+		case GSM48_CMODE_SPEECH_EFR:
+			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_EFR]);
+			break;
+		default:
+			break;
+		}
+	} else {
+		LOGP(DRSL, LOGL_ERROR, "count_codecs unknown lchan->type %x on channel %s\n",
+		     lchan->type, gsm_ts_and_pchan_name(lchan->ts));
+	}
+}
+
 static uint8_t mdisc_by_msgtype(uint8_t msg_type)
 {
 	/* mask off the transparent bit ? */
@@ -1170,6 +1203,7 @@
 		lchan->rqd_ta = 0;
 	}
 
+	count_codecs(msg->trx->bts, lchan);
 	send_lchan_signal(S_LCHAN_ACTIVATE_ACK, lchan, NULL);
 
 	return 0;
@@ -1479,6 +1513,7 @@
 		rc = rsl_rx_rf_chan_rel_ack(msg->lchan);
 		break;
 	case RSL_MT_MODE_MODIFY_ACK:
+		count_codecs(msg->trx->bts, msg->lchan);
 		DEBUGP(DRSL, "%s CHANNEL MODE MODIFY ACK\n", ts_name);
 		break;
 	case RSL_MT_MODE_MODIFY_NACK: