wbokslag has uploaded this change for review.
Fixups and clarifying comments for msgb tail modifications
Added fixups for msgb len field whenever the tail is modified
Also, added some clarifying comments
Change-Id: Ia725edbeafe26bd2ea9b5a1810d0b26bc79d84db
---
M src/lower_mac/tetra_lower_mac.c
M src/tetra_llc.c
M src/tetra_upper_mac.c
3 files changed, 30 insertions(+), 9 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-tetra refs/changes/00/34000/1
diff --git a/src/lower_mac/tetra_lower_mac.c b/src/lower_mac/tetra_lower_mac.c
index 21998f7..f8e7810 100644
--- a/src/lower_mac/tetra_lower_mac.c
+++ b/src/lower_mac/tetra_lower_mac.c
@@ -325,23 +325,26 @@
int pdu_bits = 0;
uint32_t offset = 0;
- uint8_t *orig_head = msg->head;
- uint8_t *orig_tail = msg->tail;
+ uint8_t *orig_head = msg->head; /* The true start of the timeslot */
+ uint8_t *orig_tail = msg->tail; /* The true end of the timeslot */
while (offset < tbp->type1_bits - 16) {
/* send Rx time along with the TMV-UNITDATA.ind primitive */
memcpy(&tup->tdma_time, &tcd->time, sizeof(tup->tdma_time));
+
+ /* Parse MAC element in timeslot (just one, possibly more later in the loop) */
pdu_bits = upper_mac_prim_recv(&ttp->oph, tms);
- if (pdu_bits < 0) {
- /* -1 is returned when pdu fills slot or length could not be determined */
+ /* Check if we are done (-1 returned) */
+ if (pdu_bits < 0)
break;
- }
- /* Increment head and l1h ptrs and reset tail to end of msg (may be altered by removing FCS) */
+ /* Not done */
+ /* Increment head and l1h ptrs */
+ /* Reset tail to end of msg (may be altered by removing FCS) */
offset += pdu_bits;
- msg->head = orig_head + offset;
- msg->tail = orig_tail;
- msg->len = msg->tail - msg->head;
+ msg->head = orig_head + offset; /* New head is old head plus parsed len from prev msg */
+ msg->tail = orig_tail; /* Restore original tail */
+ msg->len = msg->tail - msg->head; /* Fixup len */
msg->l1h = msg->head;
msg->l2h = 0;
msg->l3h = 0;
diff --git a/src/tetra_llc.c b/src/tetra_llc.c
index b8a378d..cdbfea0 100644
--- a/src/tetra_llc.c
+++ b/src/tetra_llc.c
@@ -122,6 +122,7 @@
tetra_llc_pdu_parse(&lpp, msg->l2h, len);
msg->l3h = lpp.tl_sdu;
msg->tail = msg->l3h + lpp.tl_sdu_len; // Strips off FCS (if present)
+ msg->len = msg->tail - msg->head;
printf("TM-SDU(%s)", tetra_get_llc_pdut_dec_name(lpp.pdu_type));
if (lpp.have_fcs) {
diff --git a/src/tetra_upper_mac.c b/src/tetra_upper_mac.c
index 94a58ce..3b2092b 100644
--- a/src/tetra_upper_mac.c
+++ b/src/tetra_upper_mac.c
@@ -175,12 +175,14 @@
} else {
pdu_bits = rsd.macpdu_length * 8; /* Length given */
msg->tail = msg->head + pdu_bits;
+ msg->len = msg->tail - msg->head;
}
/* Strip fill bits */
if (rsd.fill_bits) {
int num_fill_bits = get_num_fill_bits(msg->l1h, msgb_l1len(msg));
msg->tail -= num_fill_bits;
+ msg->len = msg->tail - msg->head;
}
/* Decrypt buffer if encrypted and key available */
@@ -301,6 +303,7 @@
if (fillbits_present) {
int num_fill_bits = get_num_fill_bits(msg->l1h, msgb_l1len(msg));
msg->tail -= num_fill_bits;
+ msg->len = msg->tail - msg->head;
}
/* Decrypt (if required) */
@@ -349,9 +352,11 @@
/* Determine msg len, strip fill bits if any */
msg->tail = msg->head + length_indicator * 8;
+ msg->len = msg->tail - msg->head;
if (fillbits_present) {
num_fill_bits = get_num_fill_bits(msg->l1h, msgb_l1len(msg));
msg->tail -= num_fill_bits;
+ msg->len = msg->tail - msg->head;
}
/* Decrypt (if required) */
To view, visit change 34000. To unsubscribe, or for help writing mail filters, visit settings.