pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-netif/+/30755 )
Change subject: amr: use struct bwe_hdr in osmo_amr_bwe_to_oa() ......................................................................
amr: use struct bwe_hdr in osmo_amr_bwe_to_oa()
The header conversion is now much clearer. Take the chance to delay the memset(buf) after the checks.
Change-Id: I5042dc628ac70eca62b4980f4acae991dd976528 --- M src/amr.c 1 file changed, 15 insertions(+), 8 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-netif refs/changes/55/30755/1
diff --git a/src/amr.c b/src/amr.c index b648d54..e4f0dd8 100644 --- a/src/amr.c +++ b/src/amr.c @@ -203,11 +203,14 @@ { uint8_t buf[256]; /* The header is only valid after shifting first two bytes to OA mode */ + struct amr_hdr_bwe *bwe_hdr = (struct amr_hdr_bwe *)payload; struct amr_hdr *oa_hdr; unsigned int i; unsigned int oa_payload_len; + uint8_t ft;
- memset(buf, 0, sizeof(buf)); + if (payload_len < sizeof(struct amr_hdr_bwe)) + return -1;
if (payload_len + 1 > payload_maxlen) return -1; @@ -215,15 +218,19 @@ if (payload_len + 1 > sizeof(buf)) return -1;
- buf[0] = payload[0] & 0xf0; - buf[1] = payload[0] << 4; - buf[1] |= (payload[1] >> 4) & 0x0c; + ft = (bwe_hdr->ft_hi << 1) | bwe_hdr->ft_lo; + if (!osmo_amr_ft_valid(ft)) + return -1; + + memset(buf, 0, sizeof(buf)); + oa_hdr = (struct amr_hdr *)buf; + oa_hdr->cmr = bwe_hdr->cmr; + oa_hdr->f = bwe_hdr->f; + oa_hdr->ft = ft; + oa_hdr->q = bwe_hdr->q;
/* Calculate new payload length */ - oa_hdr = (struct amr_hdr *)buf; - if (!osmo_amr_ft_valid(oa_hdr->ft)) - return -1; - oa_payload_len = 2 + osmo_amr_bytes(oa_hdr->ft); + oa_payload_len = 2 + osmo_amr_bytes(ft);
for (i = 2; i < oa_payload_len - 1; i++) { buf[i] = payload[i - 1] << 2;