[PATCH] osmo-bts[master]: lc15, sysmo: fix last SID store/repeat

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/.

Max gerrit-no-reply at lists.osmocom.org
Wed Sep 14 15:53:43 UTC 2016


Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/845

to look at the new patch set (#2).

lc15, sysmo: fix last SID store/repeat

The common save_last_sid() function was merged but the corresponding
code to use it was somehow lost during transition. Fix it to work with
milliseconds instead of GSM Fn and use fixed function instead of
duplicated code.

Note: this requires corresponding change in OpenBSC.

Change-Id: Ie545212cce5ed2b3ea3228597f18a473f5e1deb4
Fixes: OS#1800, #1799
---
M include/osmo-bts/msg_utils.h
M src/common/msg_utils.c
M src/osmo-bts-litecell15/tch.c
M src/osmo-bts-sysmo/tch.c
4 files changed, 44 insertions(+), 46 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/45/845/2

diff --git a/include/osmo-bts/msg_utils.h b/include/osmo-bts/msg_utils.h
index 591d194..6784818 100644
--- a/include/osmo-bts/msg_utils.h
+++ b/include/osmo-bts/msg_utils.h
@@ -22,7 +22,8 @@
 
 void lchan_set_marker(bool t, struct gsm_lchan *lchan);
 void save_last_sid(struct gsm_lchan *lchan, uint8_t *l1_payload, size_t length,
-		   uint32_t fn, bool update);
+		   bool update);
+bool check_last_seed(const struct gsm_lchan *lchan);
 bool dtx_sched_optional(struct gsm_lchan *lchan, uint32_t fn);
 int msg_verify_ipa_structure(struct msgb *msg);
 int msg_verify_oml_structure(struct msgb *msg);
diff --git a/src/common/msg_utils.c b/src/common/msg_utils.c
index f12c653..903b5a8 100644
--- a/src/common/msg_utils.c
+++ b/src/common/msg_utils.c
@@ -27,7 +27,7 @@
 #include <osmocom/core/msgb.h>
 
 #include <arpa/inet.h>
-
+#include <time.h>
 
 static int check_fom(struct abis_om_hdr *omh, size_t len)
 {
@@ -97,20 +97,49 @@
 	}
 }
 
+static inline time_t get_msec()
+{
+	struct timespec tspec;
+	clock_gettime(CLOCK_MONOTONIC, &tspec);
+
+	return 1000 * tspec.tv_sec + tspec.tv_nsec / 1000000;
+}
+
 /* store the last SID frame in lchan context */
 void save_last_sid(struct gsm_lchan *lchan, uint8_t *l1_payload, size_t length,
-		   uint32_t fn, bool update)
+		   bool update)
 {
 	size_t copy_len = OSMO_MIN(length + 1,
 				   ARRAY_SIZE(lchan->tch.last_sid.buf));
+	struct timespec tspec;
+	clock_gettime(CLOCK_MONOTONIC, &tspec);
 
 	lchan->tch.last_sid.len = copy_len;
-	lchan->tch.last_sid.fn = fn;
+	lchan->tch.last_sid.msec = get_msec();
 	lchan->tch.last_sid.is_update = update;
 
 	memcpy(lchan->tch.last_sid.buf, l1_payload, copy_len);
 }
 
+/* check if enough time has passed since last SID to warrant repetition */
+bool check_last_seed(const struct gsm_lchan *lchan)
+{
+	/* Each voice frame is 20 ms */
+	time_t msec = get_msec();
+
+	/* according to 3GPP TS 26.093 A.5.1.1: */
+	if (lchan->tch.last_sid.is_update) {
+		/* SID UPDATE should be repeated every 8th RTP frame */
+		if (msec - lchan->tch.last_sid.msec < 140)
+			return false;
+		return true;
+	}
+	/* 3rd frame after SID FIRST should be SID UPDATE */
+	if (msec - lchan->tch.last_sid.msec < 60)
+		return false;
+	return true;
+}
+
 static inline bool fn_chk(const uint8_t *t, uint32_t fn)
 {
 	uint8_t i;
diff --git a/src/osmo-bts-litecell15/tch.c b/src/osmo-bts-litecell15/tch.c
index 187f688..cb55f6c 100644
--- a/src/osmo-bts-litecell15/tch.c
+++ b/src/osmo-bts-litecell15/tch.c
@@ -270,14 +270,8 @@
 	}
 #endif
 
-	if (ft == AMR_SID) {
-		/* store the last SID frame in lchan context */
-		unsigned int copy_len;
-		copy_len = OSMO_MIN(payload_len+1,
-				    ARRAY_SIZE(lchan->tch.last_sid.buf));
-		lchan->tch.last_sid.len = copy_len;
-		memcpy(lchan->tch.last_sid.buf, l1_payload, copy_len);
-	}
+	if (ft == AMR_SID)
+		save_last_sid(lchan, l1_payload, payload_len, sti);
 
 	return payload_len+1;
 }
@@ -512,19 +506,9 @@
 	switch (lchan->tch_mode) {
 	case GSM48_CMODE_SPEECH_AMR:
 		*payload_type = GsmL1_TchPlType_Amr;
-		/* according to 3GPP TS 26.093 A.5.1.1: */
-		if (lchan->tch.last_sid.is_update) {
-			/* SID UPDATE should be repeated every 8th frame */
-			if (fn - lchan->tch.last_sid.fn < 7) {
-				msgb_free(msg);
-				return NULL;
-			}
-		} else {
-			/* 3rd frame after SID FIRST should be SID UPDATE */
-			if (fn - lchan->tch.last_sid.fn < 3) {
-				msgb_free(msg);
-				return NULL;
-			}
+		if (!check_last_seed(lchan)) {
+			msgb_free(msg);
+			return NULL;
 		}
 		if (repeat_last_sid(lchan, msg))
 			return msg;
diff --git a/src/osmo-bts-sysmo/tch.c b/src/osmo-bts-sysmo/tch.c
index 39feae1..e2c1545 100644
--- a/src/osmo-bts-sysmo/tch.c
+++ b/src/osmo-bts-sysmo/tch.c
@@ -367,14 +367,8 @@
 	}
 #endif
 
-	if (ft == AMR_SID) {
-		/* store the last SID frame in lchan context */
-		unsigned int copy_len;
-		copy_len = OSMO_MIN(payload_len+1,
-				    ARRAY_SIZE(lchan->tch.last_sid.buf));
-		lchan->tch.last_sid.len = copy_len;
-		memcpy(lchan->tch.last_sid.buf, l1_payload, copy_len);
-	}
+	if (ft == AMR_SID)
+		save_last_sid(lchan, l1_payload, payload_len, sti);
 
 	return payload_len+1;
 }
@@ -615,19 +609,9 @@
 	switch (lchan->tch_mode) {
 	case GSM48_CMODE_SPEECH_AMR:
 		*payload_type = GsmL1_TchPlType_Amr;
-		/* according to 3GPP TS 26.093 A.5.1.1: */
-		if (lchan->tch.last_sid.is_update) {
-			/* SID UPDATE should be repeated every 8th frame */
-			if (fn - lchan->tch.last_sid.fn < 7) {
-				msgb_free(msg);
-				return NULL;
-			}
-		} else {
-			/* 3rd frame after SID FIRST should be SID UPDATE */
-			if (fn - lchan->tch.last_sid.fn < 3) {
-				msgb_free(msg);
-				return NULL;
-			}
+		if (!check_last_seed(lchan)) {
+			msgb_free(msg);
+			return NULL;
 		}
 		if (repeat_last_sid(lchan, msg))
 			return msg;

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

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Ie545212cce5ed2b3ea3228597f18a473f5e1deb4
Gerrit-PatchSet: 2
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list