falconia has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/libosmo-abis/+/41163?usp=email )


Change subject: rtp2trau CSD: accept both CLEARMODE and TW-TS-007 payloads
......................................................................

rtp2trau CSD: accept both CLEARMODE and TW-TS-007 payloads

Change-Id: Ide89de89ed43df5762a091f1577a8b8e84b55738
---
M src/trau/trau_rtp_conv.c
1 file changed, 90 insertions(+), 45 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-abis refs/changes/63/41163/1

diff --git a/src/trau/trau_rtp_conv.c b/src/trau/trau_rtp_conv.c
index a7184fb..156b57a 100644
--- a/src/trau/trau_rtp_conv.c
+++ b/src/trau/trau_rtp_conv.c
@@ -34,6 +34,7 @@
 #include <osmocom/trau/csd_ra2.h>
 #include <osmocom/trau/csd_raa_prime.h>
 #include <osmocom/trau/csd_v110.h>
+#include <osmocom/trau/twts007.h>

 /* this corresponds to the bit-lengths of the individual codec
  * parameters as indicated in Table 1.1 of TS 46.010 */
@@ -1370,23 +1371,34 @@
                              size_t data_len, unsigned second_offset)
 {
        ubit_t ra_bits[80 * 2];
+       int rc;

-       if (data_len != OSMO_CLEARMODE_20MS)
+       switch (data_len) {
+       case OSMO_CLEARMODE_20MS:
+               /* reverse RA2 first */
+               osmo_csd_ra2_8k_unpack(ra_bits, data, OSMO_CLEARMODE_20MS);
+               /* enforce two properly aligned V.110 frames */
+               if (!osmo_csd_check_v110_align(ra_bits))
+                       goto idle_fill;
+               if (!osmo_csd_check_v110_align(ra_bits + 80))
+                       goto idle_fill;
+               /* all checks passed - copy the payload */
+               osmo_csd_v110_to_63bits(tf->d_bits, ra_bits);
+               osmo_csd_v110_to_63bits(tf->d_bits + second_offset,
+                                       ra_bits + 80);
+               return;
+       case OSMO_CCSD_PL_LEN_4k8:
+               rc = osmo_ccsd_unpack_v110_frame(tf->d_bits, data);
+               if (rc < 0)
+                       goto idle_fill;
+               rc = osmo_ccsd_unpack_v110_frame(tf->d_bits + second_offset,
+                                                data + 8);
+               if (rc < 0)
+                       goto idle_fill;
+               return;
+       default:
                goto idle_fill;
-
-       /* reverse RA2 first */
-       osmo_csd_ra2_8k_unpack(ra_bits, data, OSMO_CLEARMODE_20MS);
-
-       /* enforce two properly aligned V.110 frames */
-       if (!osmo_csd_check_v110_align(ra_bits))
-               goto idle_fill;
-       if (!osmo_csd_check_v110_align(ra_bits + 80))
-               goto idle_fill;
-
-       /* all checks passed - copy the payload */
-       osmo_csd_v110_to_63bits(tf->d_bits, ra_bits);
-       osmo_csd_v110_to_63bits(tf->d_bits + second_offset, ra_bits + 80);
-       return;
+       }

 idle_fill:
        memset(tf->d_bits, 1, 63);
@@ -1398,29 +1410,46 @@
                               size_t data_len)
 {
        ubit_t ra_bits[80 * 4];
+       int rc;

-       if (data_len != OSMO_CLEARMODE_20MS)
+       switch (data_len) {
+       case OSMO_CLEARMODE_20MS:
+               /* reverse RA2 first */
+               osmo_csd_ra2_16k_unpack(ra_bits, data, OSMO_CLEARMODE_20MS);
+               /* enforce 4 properly aligned V.110 frames */
+               if (!osmo_csd_check_v110_align(ra_bits))
+                       goto idle_fill;
+               if (!osmo_csd_check_v110_align(ra_bits + 80))
+                       goto idle_fill;
+               if (!osmo_csd_check_v110_align(ra_bits + 80 * 2))
+                       goto idle_fill;
+               if (!osmo_csd_check_v110_align(ra_bits + 80 * 3))
+                       goto idle_fill;
+               /* all checks passed - copy the payload */
+               osmo_csd_v110_to_63bits(tf->d_bits, ra_bits);
+               osmo_csd_v110_to_63bits(tf->d_bits + 63, ra_bits + 80);
+               osmo_csd_v110_to_63bits(tf->d_bits + 63 * 2, ra_bits + 80 * 2);
+               osmo_csd_v110_to_63bits(tf->d_bits + 63 * 3, ra_bits + 80 * 3);
+               return;
+       case OSMO_CCSD_PL_LEN_9k6:
+               rc = osmo_ccsd_unpack_v110_frame(tf->d_bits, data);
+               if (rc < 0)
+                       goto idle_fill;
+               rc = osmo_ccsd_unpack_v110_frame(tf->d_bits + 63, data + 8);
+               if (rc < 0)
+                       goto idle_fill;
+               rc = osmo_ccsd_unpack_v110_frame(tf->d_bits + 63 * 2,
+                                                data + 8 * 2);
+               if (rc < 0)
+                       goto idle_fill;
+               rc = osmo_ccsd_unpack_v110_frame(tf->d_bits + 63 * 3,
+                                                data + 8 * 3);
+               if (rc < 0)
+                       goto idle_fill;
+               return;
+       default:
                goto idle_fill;
-
-       /* reverse RA2 first */
-       osmo_csd_ra2_16k_unpack(ra_bits, data, OSMO_CLEARMODE_20MS);
-
-       /* enforce 4 properly aligned V.110 frames */
-       if (!osmo_csd_check_v110_align(ra_bits))
-               goto idle_fill;
-       if (!osmo_csd_check_v110_align(ra_bits + 80))
-               goto idle_fill;
-       if (!osmo_csd_check_v110_align(ra_bits + 80 * 2))
-               goto idle_fill;
-       if (!osmo_csd_check_v110_align(ra_bits + 80 * 3))
-               goto idle_fill;
-
-       /* all checks passed - copy the payload */
-       osmo_csd_v110_to_63bits(tf->d_bits, ra_bits);
-       osmo_csd_v110_to_63bits(tf->d_bits + 63, ra_bits + 80);
-       osmo_csd_v110_to_63bits(tf->d_bits + 63 * 2, ra_bits + 80 * 2);
-       osmo_csd_v110_to_63bits(tf->d_bits + 63 * 3, ra_bits + 80 * 3);
-       return;
+       }

 idle_fill:
        memset(tf->d_bits, 1, 63 * 4);
@@ -1532,6 +1561,7 @@
                          size_t data_len)
 {
        ubit_t atrau_c4;
+       int rc;

        tf->type = OSMO_TRAU16_FT_EDATA;

@@ -1541,9 +1571,12 @@
        /* set C6=0: indicate good reception of TRAU-UL frames */
        tf->c_bits[5] = 0;

-       if (data_len == OSMO_CLEARMODE_20MS &&
-           osmo_csd144_from_atrau_ra2(tf->m_bits, tf->d_bits, &atrau_c4, NULL,
-                                       data) >= 0) {
+       switch (data_len) {
+       case OSMO_CLEARMODE_20MS:
+               rc = osmo_csd144_from_atrau_ra2(tf->m_bits, tf->d_bits,
+                                               &atrau_c4, NULL, data);
+               if (rc < 0)
+                       goto idle_fill;
                /* We got good A-TRAU input.  3GPP specs define the following
                 * mapping for DL direction only:
                 *
@@ -1551,14 +1584,26 @@
                 * Spec references: TS 48.020 section 11.1, TS 48.060
                 * section 6.5.1. */
                tf->c_bits[6] = !atrau_c4;
-       } else {
-               /* We did not get good A-TRAU input: generate idle fill. */
-               memset(tf->m_bits, 1, 2);
-               memset(tf->d_bits, 1, 288);
-               /* C7=1 means idle */
-               tf->c_bits[6] = 1;
+               return 0;
+       case OSMO_CCSD_PL_LEN_14k4:
+               rc = osmo_ccsd_unpack_atrau_frame(tf->m_bits, tf->d_bits,
+                                                 &atrau_c4, NULL, data);
+               if (rc < 0)
+                       goto idle_fill;
+               /* Semantics remains strictly unchanged between CLEARMODE
+                * and compressed CSD. */
+               tf->c_bits[6] = !atrau_c4;
+               return 0;
+       default:
+               goto idle_fill;
        }

+idle_fill:
+       /* We did not get good A-TRAU input: generate idle fill. */
+       memset(tf->m_bits, 1, 2);
+       memset(tf->d_bits, 1, 288);
+       /* C7=1 means idle */
+       tf->c_bits[6] = 1;
        return 0;
 }


--
To view, visit https://gerrit.osmocom.org/c/libosmo-abis/+/41163?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: libosmo-abis
Gerrit-Branch: master
Gerrit-Change-Id: Ide89de89ed43df5762a091f1577a8b8e84b55738
Gerrit-Change-Number: 41163
Gerrit-PatchSet: 1
Gerrit-Owner: falconia <[email protected]>

Reply via email to