[PATCH] osmocom-bb[master]: host/trxcon/l1ctl.c: fix incomplete msg in l1ctl_tx_fbsb_conf()

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Thu Feb 22 15:33:03 UTC 2018


Review at  https://gerrit.osmocom.org/6728

host/trxcon/l1ctl.c: fix incomplete msg in l1ctl_tx_fbsb_conf()

Previously, all L1CTL_FBSB_CONF messages were sent without
required l1ctl_info_dl header, what caused unpredictable
behavior on higher layers (L2 & L3). Let's fix it.

Change-Id: I8dae597bb4c09df36f80944434ce3624569f2cf8
---
M src/host/trxcon/l1ctl.c
M src/host/trxcon/l1ctl.h
M src/host/trxcon/sched_lchan_handlers.c
3 files changed, 38 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/28/6728/1

diff --git a/src/host/trxcon/l1ctl.c b/src/host/trxcon/l1ctl.c
index d5c3b57..9b0d35a 100644
--- a/src/host/trxcon/l1ctl.c
+++ b/src/host/trxcon/l1ctl.c
@@ -126,10 +126,13 @@
 	return l1ctl_link_send(l1l, msg);
 }
 
-int l1ctl_tx_fbsb_conf(struct l1ctl_link *l1l, uint8_t result, uint8_t bsic)
+int l1ctl_tx_fbsb_conf(struct l1ctl_link *l1l, uint8_t result,
+	struct l1ctl_info_dl *dl_info, uint8_t bsic)
 {
 	struct l1ctl_fbsb_conf *conf;
+	struct l1ctl_info_dl *dl;
 	struct msgb *msg;
+	size_t len;
 
 	msg = l1ctl_alloc_msg(L1CTL_FBSB_CONF);
 	if (msg == NULL)
@@ -138,6 +141,13 @@
 	LOGP(DL1C, LOGL_DEBUG, "Send FBSB Conf (result=%u, bsic=%u)\n",
 		result, bsic);
 
+	/* Copy DL info provided by handler */
+	len = sizeof(struct l1ctl_info_dl);
+	dl = (struct l1ctl_info_dl *) msgb_put(msg, len);
+	memcpy(dl, dl_info, len);
+	talloc_free(dl_info);
+
+	/* Fill in FBSB payload: BSIC and sync result */
 	conf = (struct l1ctl_fbsb_conf *) msgb_put(msg, sizeof(*conf));
 	conf->result = result;
 	conf->bsic = bsic;
diff --git a/src/host/trxcon/l1ctl.h b/src/host/trxcon/l1ctl.h
index 165865a..af53b77 100644
--- a/src/host/trxcon/l1ctl.h
+++ b/src/host/trxcon/l1ctl.h
@@ -6,7 +6,8 @@
 #include "l1ctl_link.h"
 #include "l1ctl_proto.h"
 
-int l1ctl_tx_fbsb_conf(struct l1ctl_link *l1l, uint8_t result, uint8_t bsic);
+int l1ctl_tx_fbsb_conf(struct l1ctl_link *l1l, uint8_t result,
+	struct l1ctl_info_dl *dl_info, uint8_t bsic);
 int l1ctl_tx_ccch_mode_conf(struct l1ctl_link *l1l, uint8_t mode);
 int l1ctl_tx_pm_conf(struct l1ctl_link *l1l, uint16_t band_arfcn,
 	int dbm, int last);
diff --git a/src/host/trxcon/sched_lchan_handlers.c b/src/host/trxcon/sched_lchan_handlers.c
index 49a28ef..64893d7 100644
--- a/src/host/trxcon/sched_lchan_handlers.c
+++ b/src/host/trxcon/sched_lchan_handlers.c
@@ -224,11 +224,32 @@
 		return -EINVAL;
 	}
 
+	/* We don't need to send L1CTL_FBSB_CONF */
+	if (trx->l1l->fbsb_conf_sent)
+		return 0;
+
 	/* Send L1CTL_FBSB_CONF to higher layers */
-	if (!trx->l1l->fbsb_conf_sent) {
-		l1ctl_tx_fbsb_conf(trx->l1l, 0, bsic);
-		trx->bsic = bsic;
-	}
+	struct l1ctl_info_dl *data;
+	data = talloc_zero_size(ts, sizeof(struct l1ctl_info_dl));
+	if (data == NULL)
+		return -ENOMEM;
+
+	/* Fill in some downlink info */
+	data->chan_nr = trx_lchan_desc[chan].chan_nr | ts->index;
+	data->link_id = trx_lchan_desc[chan].link_id;
+	data->band_arfcn = htons(trx->band_arfcn);
+	data->frame_nr = htonl(fn);
+	data->rx_level = -rssi;
+
+	/* FIXME: set proper values */
+	data->num_biterr = 0;
+	data->fire_crc = 0;
+	data->snr = 0;
+
+	l1ctl_tx_fbsb_conf(trx->l1l, 0, data, bsic);
+
+	/* Update BSIC value of trx_instance */
+	trx->bsic = bsic;
 
 	return 0;
 }

-- 
To view, visit https://gerrit.osmocom.org/6728
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8dae597bb4c09df36f80944434ce3624569f2cf8
Gerrit-PatchSet: 1
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>



More information about the gerrit-log mailing list