wbokslag has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-tetra/+/34000 )
Change subject: Fixups and clarifying comments for msgb tail modifications ......................................................................
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) */