Introduce GSMTAP categories

When looking at GSMTAP output so far, one is easily overwhelmed by way
too much information being presented.  A lot of is consists of DUMMY
frames, which are probably of lowest interest, ever.

A concept similar to the "gsmtap-sapi" of OsmoBTS is introduced, by
which the user can configure which particular categories (uplink or
downlink control or data, gprs or egprs, ...) he actually wants to
see in his logs.

Change-Id: I297183690e98a7234dfc1608c18847d8981306e4
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index c2c6cc6..420bca0 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -165,7 +165,6 @@
 {
 	struct gprs_rlcmac_bts *bts = bts_main_data();
 
-	gsmtap_send(bts->gsmtap, arfcn, ts, GSMTAP_CHANNEL_PACCH, 0, fn, 0, 0, msg->data, msg->len);
 #ifdef ENABLE_DIRECT_PHY
 	if (bts->trx[trx].fl1h) {
 		l1if_pdch_req(bts->trx[trx].fl1h, ts, 0, fn, arfcn, block_nr,
@@ -245,8 +244,9 @@
 	return pdch->rcv_block(data, len, fn, meas);
 }
 
-static int pcu_rx_data_ind(struct gsm_pcu_if_data *data_ind, struct gsmtap_inst *gsmtap)
+static int pcu_rx_data_ind(struct gsm_pcu_if_data *data_ind)
 {
+	struct gprs_rlcmac_bts *bts = bts_main_data();
 	int rc;
 	pcu_l1_meas meas;
 	meas.set_rssi(data_ind->rssi);
@@ -264,13 +264,6 @@
 		data_ind->arfcn, data_ind->block_nr,
 		osmo_hexdump(data_ind->data, data_ind->len));
 
-	rc = gsmtap_send(gsmtap, data_ind->arfcn | GSMTAP_ARFCN_F_UPLINK, data_ind->ts_nr,
-			 GSMTAP_CHANNEL_PACCH, 0, data_ind->fn, 0, 0, data_ind->data, data_ind->len);
-	if (rc < 0)
-	    LOGP(DL1IF, LOGL_ERROR, "Sending RX data via GSMTAP failed: %d\n", rc);
-
-	rc = 0;
-
 	switch (data_ind->sapi) {
 	case PCU_IF_SAPI_PDTCH:
 		rc = pcu_rx_data_ind_pdtch(data_ind->trx_nr, data_ind->ts_nr,
@@ -283,6 +276,11 @@
 		rc = -EINVAL;
 	}
 
+	if (rc < 0 && (bts->gsmtap_categ_mask & PCU_GSMTAP_C_UL_UNKNOWN)) {
+		gsmtap_send(bts->gsmtap, data_ind->arfcn | GSMTAP_ARFCN_F_UPLINK, data_ind->ts_nr,
+			    GSMTAP_CHANNEL_PACCH, 0, data_ind->fn, 0, 0, data_ind->data, data_ind->len);
+	}
+
 	return rc;
 }
 
@@ -568,11 +566,10 @@
 int pcu_rx(uint8_t msg_type, struct gsm_pcu_if *pcu_prim)
 {
 	int rc = 0;
-	struct gprs_rlcmac_bts *bts = bts_main_data();
 
 	switch (msg_type) {
 	case PCU_IF_MSG_DATA_IND:
-		rc = pcu_rx_data_ind(&pcu_prim->u.data_ind, bts->gsmtap);
+		rc = pcu_rx_data_ind(&pcu_prim->u.data_ind);
 		break;
 	case PCU_IF_MSG_DATA_CNF:
 		rc = pcu_rx_data_cnf(&pcu_prim->u.data_cnf);
@@ -597,6 +594,6 @@
 			msg_type);
 		rc = -EINVAL;
 	}
-
+;
 	return rc;
 }