[PATCH] libosmocore[master]: Expand bitvec_write_field() function

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 Oct 18 13:14:26 UTC 2017


Hello Jenkins Builder,

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

    https://gerrit.osmocom.org/4292

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

Expand bitvec_write_field() function

Previously only boolean values were allowed while in practice it's
sometimes necessary to use L/H. Allow user to specify this explicitly
and make old function into wrapper around extended version. Use extended
function in tests and update output accordingly.

Change-Id: Iee648d764de9f3e7ef850f40864ad701c83f61db
Related: OS#1526
---
M include/osmocom/core/bitvec.h
M src/bitvec.c
M tests/bits/bitfield_test.c
M tests/bits/bitfield_test.ok
4 files changed, 22 insertions(+), 16 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/92/4292/3

diff --git a/include/osmocom/core/bitvec.h b/include/osmocom/core/bitvec.h
index 3e68ddb..b7eba1f 100644
--- a/include/osmocom/core/bitvec.h
+++ b/include/osmocom/core/bitvec.h
@@ -72,6 +72,7 @@
 unsigned int bitvec_unpack(struct bitvec *bv, const uint8_t *buffer);
 uint64_t bitvec_read_field(struct bitvec *bv, unsigned int *read_index, unsigned int len);
 int bitvec_write_field(struct bitvec *bv, unsigned int *write_index, uint64_t val, unsigned int len);
+int bitvec_write_field_ext(struct bitvec *bv, uint32_t *write_index, uint64_t val, uint8_t len, bool use_lh);
 int bitvec_fill(struct bitvec *bv, unsigned int num_bits, enum bit_value fill);
 char bit_value_to_char(enum bit_value v);
 void bitvec_to_string_r(const struct bitvec *bv, char *str);
diff --git a/src/bitvec.c b/src/bitvec.c
index 0683694..646594b 100644
--- a/src/bitvec.c
+++ b/src/bitvec.c
@@ -500,16 +500,18 @@
 /*! write into the vector
  *  \param[in] bv The boolean vector to work on
  *  \param[in,out] write_index Where writing supposed to start in the vector
+ *  \param[in] val value to be written to the vector
  *  \param[in] len How many bits to write
+ *  \param[in] use_lh whether to interpret the bits as L/H values or as 0/1
  *  \returns next write index or negative value on error
  */
-int bitvec_write_field(struct bitvec *bv, unsigned int *write_index, uint64_t val, unsigned int len)
+int bitvec_write_field_ext(struct bitvec *bv, uint32_t *write_index, uint64_t val, uint8_t len, bool use_lh)
 {
 	int rc;
 
 	bv->cur_bit = *write_index;
 
-	rc = bitvec_set_u64(bv, val, len, false);
+	rc = bitvec_set_u64(bv, val, len, use_lh);
 	if (rc != 0)
 		return rc;
 
@@ -518,6 +520,18 @@
 	return 0;
 }
 
+/*! write into the vector
+ *  \param[in] bv The boolean vector to work on
+ *  \param[in,out] write_index Where writing supposed to start in the vector
+ *  \param[in] val value to be written to the vector
+ *  \param[in] len How many bits to write
+ *  \returns next write index or negative value on error
+ */
+int bitvec_write_field(struct bitvec *bv, unsigned int *write_index, uint64_t val, unsigned int len)
+{
+	return bitvec_write_field_ext(bv, (uint32_t *)write_index, val, len, false);
+}
+
 /*! convert enum to corresponding character
  *  \param v input value (bit)
  *  \return single character, either 0, 1, L or H */
diff --git a/tests/bits/bitfield_test.c b/tests/bits/bitfield_test.c
index 0a86e1f..e7023f7 100644
--- a/tests/bits/bitfield_test.c
+++ b/tests/bits/bitfield_test.c
@@ -19,10 +19,7 @@
 	INTRO(use_lh);
 
 	/* GSM 04.08 10.5.2.16 IA Rest Octets */
-	if (use_lh) /* FIXME: add function to encode LH properly */
-		bitvec_write_field(dest, &wp, 3, 2);		/* "HH" */
-	else
-		bitvec_write_field(dest, &wp, 3, 2);		/* "HH" */
+	bitvec_write_field_ext(dest, &wp, 3, 2, use_lh);	/* "HH" */
 	bitvec_write_field(dest, &wp, 1, 2);			/* "01" Packet Downlink Assignment */
 	bitvec_write_field(dest, &wp, ttli, 32);		/* TLLI */
 	bitvec_write_field(dest, &wp, 1, 1);			/* switch TFI: on */
@@ -35,10 +32,7 @@
 	bitvec_write_field(dest, &wp, 0, 1);			/* No TIMING_ADVANCE_INDEX: */
 	bitvec_write_field(dest, &wp, 0, 1);			/* TBF Starting TIME present */
 	bitvec_write_field(dest, &wp, 0, 1);			/* P0 not present */
-	if (use_lh) { /* FIXME: add function to encode LH properly */
-		bitvec_write_field(dest, &wp, 1, 1);		/* "H" - additional for R99 */
-	} else
-		bitvec_write_field(dest, &wp, 1, 1);		/* "H" - additional for R99 */
+	bitvec_write_field_ext(dest, &wp, 1, 1, use_lh);	/* "H" - additional for R99 */
 	bitvec_write_field(dest, &wp, ws_enc, 5);		/* EGPRS Window Size */
 	bitvec_write_field(dest, &wp, 0, 2);			/* LINK_QUALITY_MEASUREMENT_MODE */
 	bitvec_write_field(dest, &wp, 0, 1);			/* BEP_PERIOD2 not present */
@@ -56,10 +50,7 @@
 	INTRO(use_lh);
 
 	/* GMS 04.08 10.5.2.37b 10.5.2.16 */
-	if (use_lh) /* FIXME: add function to encode LH properly */
-		bitvec_write_field(dest, &wp, 3, 2);				/* "HH" */
-	else
-		bitvec_write_field(dest, &wp, 3, 2);				/* "HH" */
+	bitvec_write_field_ext(dest, &wp, 3, 2, use_lh);			/* "HH" */
 	bitvec_write_field(dest, &wp, 0, 2);					/* "0" Packet Uplink Assignment */
 	if (!tbf) {
 		bitvec_write_field(dest, &wp, 0, 1);				/* Block Allocation: SBA */
diff --git a/tests/bits/bitfield_test.ok b/tests/bits/bitfield_test.ok
index f920a11..cd863cf 100644
--- a/tests/bits/bitfield_test.ok
+++ b/tests/bits/bitfield_test.ok
@@ -4,12 +4,12 @@
 
 
 === start test_bitvec_ia_octet_encode_pkt_dl_ass(1) ===
-Encoded PKT DL ASS IA Rest Octets: dd ea db ee f8 00 22 31 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 
+Encoded PKT DL ASS IA Rest Octets: dd ea db ee f8 00 20 31 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 
 === end test_bitvec_ia_octet_encode_pkt_dl_ass(1) ===
 
 
 === start test_bitdiff(22) ===
-=== total 0 bits differ ===
+=== total 1 bits differ ===
 === end test_bitdiff(22) ===
 
 

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

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Iee648d764de9f3e7ef850f40864ad701c83f61db
Gerrit-PatchSet: 3
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Minh-Quang Nguyen <minh-quang.nguyen at nutaq.com>



More information about the gerrit-log mailing list