Change in libosmocore[master]: i460: Fix bit- and subslots ordering of I.460 mux + demux

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

laforge gerrit-no-reply at lists.osmocom.org
Mon Aug 3 00:24:27 UTC 2020


laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/19514 )


Change subject: i460: Fix bit- and subslots ordering of I.460 mux + demux
......................................................................

i460: Fix bit- and subslots ordering of I.460 mux + demux

When I wrote the new I.460 mux + demux code, I failed to realize that
* bit numbers in relevant ITU specs start with 1 as MSB ... 8 as LSB
* sub-slot 0 is bits 1+2, i.e. the two MSBs of a byte
* bit-ordering within each sub-slot is also MSB first

As a result, the code and test data was broken.

Change-Id: I6df7dbf411efbdeaf516e72ac552432bf5a569d0
---
M src/gsm/i460_mux.c
M tests/i460_mux/i460_mux_test.c
M tests/i460_mux/i460_mux_test.ok
3 files changed, 103 insertions(+), 98 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/14/19514/1

diff --git a/src/gsm/i460_mux.c b/src/gsm/i460_mux.c
index 320e781..91ab2a1 100644
--- a/src/gsm/i460_mux.c
+++ b/src/gsm/i460_mux.c
@@ -89,32 +89,34 @@
 
 	for (i = 0; i < data_len; i++) {
 		uint8_t inbyte = data[i];
-		uint8_t inbits = inbyte >> schan->bit_offset;
+		/* I.460 defines sub-channel 0 is using bit positions 1+2 (the two
+		 * most significant bits, hence we extract msb-first */
+		uint8_t inbits = inbyte << schan->bit_offset;
 
 		/* extract the bits relevant to the given schan */
 		switch (schan->rate) {
 		case OSMO_I460_RATE_8k:
-			demux_subchan_append_bit(schan, inbits & 0x01);
+			demux_subchan_append_bit(schan, inbits & 0x80);
 			break;
 		case OSMO_I460_RATE_16k:
-			demux_subchan_append_bit(schan, inbits & 0x01);
-			demux_subchan_append_bit(schan, inbits & 0x02);
+			demux_subchan_append_bit(schan, inbits & 0x80);
+			demux_subchan_append_bit(schan, inbits & 0x40);
 			break;
 		case OSMO_I460_RATE_32k:
-			demux_subchan_append_bit(schan, inbits & 0x01);
-			demux_subchan_append_bit(schan, inbits & 0x02);
-			demux_subchan_append_bit(schan, inbits & 0x04);
-			demux_subchan_append_bit(schan, inbits & 0x08);
+			demux_subchan_append_bit(schan, inbits & 0x80);
+			demux_subchan_append_bit(schan, inbits & 0x40);
+			demux_subchan_append_bit(schan, inbits & 0x20);
+			demux_subchan_append_bit(schan, inbits & 0x10);
 			break;
 		case OSMO_I460_RATE_64k:
-			demux_subchan_append_bit(schan, inbits & 0x01);
-			demux_subchan_append_bit(schan, inbits & 0x02);
-			demux_subchan_append_bit(schan, inbits & 0x04);
-			demux_subchan_append_bit(schan, inbits & 0x08);
-			demux_subchan_append_bit(schan, inbits & 0x10);
-			demux_subchan_append_bit(schan, inbits & 0x20);
-			demux_subchan_append_bit(schan, inbits & 0x40);
 			demux_subchan_append_bit(schan, inbits & 0x80);
+			demux_subchan_append_bit(schan, inbits & 0x40);
+			demux_subchan_append_bit(schan, inbits & 0x20);
+			demux_subchan_append_bit(schan, inbits & 0x10);
+			demux_subchan_append_bit(schan, inbits & 0x08);
+			demux_subchan_append_bit(schan, inbits & 0x04);
+			demux_subchan_append_bit(schan, inbits & 0x02);
+			demux_subchan_append_bit(schan, inbits & 0x01);
 			break;
 		default:
 			OSMO_ASSERT(0);
@@ -205,22 +207,25 @@
 	uint8_t outbits = 0;
 	uint8_t outmask;
 
+	/* I.460 defines sub-channel 0 is using bit positions 1+2 (the two
+	 * most significant bits, hence we provide msb-first */
+
 	switch (schan->rate) {
 	case OSMO_I460_RATE_8k:
-		outbits = mux_schan_provide_bit(schan);
-		outmask = 0x01;
+		outbits = mux_schan_provide_bit(schan) << 7;
+		outmask = 0x80;
 		break;
 	case OSMO_I460_RATE_16k:
-		outbits |= mux_schan_provide_bit(schan) << 1;
-		outbits |= mux_schan_provide_bit(schan) << 0;
-		outmask = 0x03;
+		outbits |= mux_schan_provide_bit(schan) << 7;
+		outbits |= mux_schan_provide_bit(schan) << 6;
+		outmask = 0xC0;
 		break;
 	case OSMO_I460_RATE_32k:
-		outbits |= mux_schan_provide_bit(schan) << 3;
-		outbits |= mux_schan_provide_bit(schan) << 2;
-		outbits |= mux_schan_provide_bit(schan) << 1;
-		outbits |= mux_schan_provide_bit(schan) << 0;
-		outmask = 0x0F;
+		outbits |= mux_schan_provide_bit(schan) << 7;
+		outbits |= mux_schan_provide_bit(schan) << 6;
+		outbits |= mux_schan_provide_bit(schan) << 5;
+		outbits |= mux_schan_provide_bit(schan) << 4;
+		outmask = 0xF0;
 		break;
 	case OSMO_I460_RATE_64k:
 		outbits |= mux_schan_provide_bit(schan) << 7;
@@ -236,8 +241,8 @@
 	default:
 		OSMO_ASSERT(0);
 	}
-	*mask = outmask << schan->bit_offset;
-	return outbits << schan->bit_offset;
+	*mask = outmask >> schan->bit_offset;
+	return outbits >> schan->bit_offset;
 }
 
 /* provide one byte of multiplexed I.460 bits */
diff --git a/tests/i460_mux/i460_mux_test.c b/tests/i460_mux/i460_mux_test.c
index d63b2ae..9d5fcf7 100644
--- a/tests/i460_mux/i460_mux_test.c
+++ b/tests/i460_mux/i460_mux_test.c
@@ -234,8 +234,8 @@
 	int i;
 	for (i = 0; i < sizeof(sequence); i++)
 		sequence[i] = 0;
-	sequence[0] = 0x0f;
 	sequence[1] = 0xf0;
+	sequence[0] = 0x0f;
 	sequence[2] = 0xff;
 	osmo_i460_demux_in(ts, sequence, sizeof(sequence));
 
@@ -278,10 +278,10 @@
 	int i;
 	for (i = 0; i < sizeof(sequence); i++)
 		sequence[i] = 0;
-	sequence[0] = 0x03;
-	sequence[1] = 0x0c;
-	sequence[2] = 0x30;
-	sequence[3] = 0xc0;
+	sequence[0] = 0xC0;
+	sequence[1] = 0x30;
+	sequence[2] = 0x0c;
+	sequence[3] = 0x03;
 	sequence[4] = 0xff;
 	osmo_i460_demux_in(ts, sequence, sizeof(sequence));
 
@@ -328,16 +328,16 @@
 	for (i = 0; i < sizeof(sequence); i++)
 		sequence[i] = 0;
 	i = 0;
-	sequence[i++] = 0x01;
-	sequence[i++] = 0x02;
-	sequence[i++] = 0x04;
-	sequence[i++] = 0x08;
-	sequence[i++] = 0x0f;
-	sequence[i++] = 0x10;
-	sequence[i++] = 0x20;
-	sequence[i++] = 0x40;
 	sequence[i++] = 0x80;
+	sequence[i++] = 0x40;
+	sequence[i++] = 0x20;
+	sequence[i++] = 0x10;
 	sequence[i++] = 0xf0;
+	sequence[i++] = 0x08;
+	sequence[i++] = 0x04;
+	sequence[i++] = 0x02;
+	sequence[i++] = 0x01;
+	sequence[i++] = 0x0f;
 	sequence[i++] = 0xff;
 	osmo_i460_demux_in(ts, sequence, sizeof(sequence));
 
diff --git a/tests/i460_mux/i460_mux_test.ok b/tests/i460_mux/i460_mux_test.ok
index b94fb7b..79c55ed 100644
--- a/tests/i460_mux/i460_mux_test.ok
+++ b/tests/i460_mux/i460_mux_test.ok
@@ -7,15 +7,15 @@
 mux_out: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 
 
 ==> test_32k_subchan
-demux_bits_cb '32k_0': 1111000011110000000000000000000000000000
-demux_bits_cb '32k_4': 0000111111110000000000000000000000000000
+demux_bits_cb '32k_0': 0000111111110000000000000000000000000000
+demux_bits_cb '32k_4': 1111000011110000000000000000000000000000
 test_32k_subchan-single-0
-mux_out: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 
-mux_out: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 
+mux_out: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 
+mux_out: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_32k_subchan-single-1
-mux_out: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 
-mux_out: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 
+mux_out: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 
+mux_out: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 
 ==> test_16k_subchan
@@ -24,28 +24,28 @@
 demux_bits_cb '16k_4': 0000110011000000000000000000000000000000
 demux_bits_cb '16k_6': 0000001111000000000000000000000000000000
 test_16k_subchan-single-0
-mux_out: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 
-mux_out: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 
-mux_out: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 
-mux_out: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 
+mux_out: 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 
+mux_out: 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 
+mux_out: 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 
+mux_out: 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_16k_subchan-single-1
-mux_out: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 
-mux_out: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 
-mux_out: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 
-mux_out: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 
+mux_out: df df df df df df df df df df df df df df df df 
+mux_out: df df df df df df df df df df df df df df df df 
+mux_out: df df df df df df df df df df df df df df df df 
+mux_out: df df df df df df df df df df df df df df df df 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_16k_subchan-single-2
-mux_out: df df df df df df df df df df df df df df df df 
-mux_out: df df df df df df df df df df df df df df df df 
-mux_out: df df df df df df df df df df df df df df df df 
-mux_out: df df df df df df df df df df df df df df df df 
+mux_out: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 
+mux_out: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 
+mux_out: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 
+mux_out: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_16k_subchan-single-3
-mux_out: 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 
-mux_out: 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 
-mux_out: 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 
-mux_out: 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 
+mux_out: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 
+mux_out: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 
+mux_out: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 
+mux_out: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 
 ==> test_8k_subchan
@@ -58,58 +58,58 @@
 demux_bits_cb '8k_6': 0000000101100000000000000000000000000000
 demux_bits_cb '8k_7': 0000000011100000000000000000000000000000
 test_8k_subchan-single-0
-mux_out: fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff 
-mux_out: fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff 
-mux_out: fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff 
-mux_out: fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff 
+mux_out: 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 
+mux_out: 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 
+mux_out: 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 
+mux_out: 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_8k_subchan-single-1
-mux_out: fd ff fd ff fd ff fd ff fd ff fd ff fd ff fd ff 
-mux_out: fd ff fd ff fd ff fd ff fd ff fd ff fd ff fd ff 
-mux_out: fd ff fd ff fd ff fd ff fd ff fd ff fd ff fd ff 
-mux_out: fd ff fd ff fd ff fd ff fd ff fd ff fd ff fd ff 
+mux_out: bf ff bf ff bf ff bf ff bf ff bf ff bf ff bf ff 
+mux_out: bf ff bf ff bf ff bf ff bf ff bf ff bf ff bf ff 
+mux_out: bf ff bf ff bf ff bf ff bf ff bf ff bf ff bf ff 
+mux_out: bf ff bf ff bf ff bf ff bf ff bf ff bf ff bf ff 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_8k_subchan-single-2
-mux_out: fb ff fb ff fb ff fb ff fb ff fb ff fb ff fb ff 
-mux_out: fb ff fb ff fb ff fb ff fb ff fb ff fb ff fb ff 
-mux_out: fb ff fb ff fb ff fb ff fb ff fb ff fb ff fb ff 
-mux_out: fb ff fb ff fb ff fb ff fb ff fb ff fb ff fb ff 
+mux_out: df ff df ff df ff df ff df ff df ff df ff df ff 
+mux_out: df ff df ff df ff df ff df ff df ff df ff df ff 
+mux_out: df ff df ff df ff df ff df ff df ff df ff df ff 
+mux_out: df ff df ff df ff df ff df ff df ff df ff df ff 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_8k_subchan-single-3
-mux_out: f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff 
-mux_out: f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff 
-mux_out: f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff 
-mux_out: f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff 
+mux_out: ef ff ef ff ef ff ef ff ef ff ef ff ef ff ef ff 
+mux_out: ef ff ef ff ef ff ef ff ef ff ef ff ef ff ef ff 
+mux_out: ef ff ef ff ef ff ef ff ef ff ef ff ef ff ef ff 
+mux_out: ef ff ef ff ef ff ef ff ef ff ef ff ef ff ef ff 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_8k_subchan-single-4
-mux_out: ef ff ef ff ef ff ef ff ef ff ef ff ef ff ef ff 
-mux_out: ef ff ef ff ef ff ef ff ef ff ef ff ef ff ef ff 
-mux_out: ef ff ef ff ef ff ef ff ef ff ef ff ef ff ef ff 
-mux_out: ef ff ef ff ef ff ef ff ef ff ef ff ef ff ef ff 
+mux_out: f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff 
+mux_out: f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff 
+mux_out: f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff 
+mux_out: f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff f7 ff 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_8k_subchan-single-5
-mux_out: df ff df ff df ff df ff df ff df ff df ff df ff 
-mux_out: df ff df ff df ff df ff df ff df ff df ff df ff 
-mux_out: df ff df ff df ff df ff df ff df ff df ff df ff 
-mux_out: df ff df ff df ff df ff df ff df ff df ff df ff 
+mux_out: fb ff fb ff fb ff fb ff fb ff fb ff fb ff fb ff 
+mux_out: fb ff fb ff fb ff fb ff fb ff fb ff fb ff fb ff 
+mux_out: fb ff fb ff fb ff fb ff fb ff fb ff fb ff fb ff 
+mux_out: fb ff fb ff fb ff fb ff fb ff fb ff fb ff fb ff 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_8k_subchan-single-6
-mux_out: bf ff bf ff bf ff bf ff bf ff bf ff bf ff bf ff 
-mux_out: bf ff bf ff bf ff bf ff bf ff bf ff bf ff bf ff 
-mux_out: bf ff bf ff bf ff bf ff bf ff bf ff bf ff bf ff 
-mux_out: bf ff bf ff bf ff bf ff bf ff bf ff bf ff bf ff 
+mux_out: fd ff fd ff fd ff fd ff fd ff fd ff fd ff fd ff 
+mux_out: fd ff fd ff fd ff fd ff fd ff fd ff fd ff fd ff 
+mux_out: fd ff fd ff fd ff fd ff fd ff fd ff fd ff fd ff 
+mux_out: fd ff fd ff fd ff fd ff fd ff fd ff fd ff fd ff 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 test_8k_subchan-single-7
-mux_out: 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 
-mux_out: 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 
-mux_out: 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 
-mux_out: 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 7f ff 
+mux_out: fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff 
+mux_out: fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff 
+mux_out: fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff 
+mux_out: fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
 
 ==> test_unused_subchan
 test_unused_subchan-single
-mux_out: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc 
-mux_out: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc 
-mux_out: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc 
-mux_out: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc 
+mux_out: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 
+mux_out: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 
+mux_out: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 
+mux_out: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 
 mux_out: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/19514
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I6df7dbf411efbdeaf516e72ac552432bf5a569d0
Gerrit-Change-Number: 19514
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200803/d11a02b0/attachment.htm>


More information about the gerrit-log mailing list