osmo_rtp2trau() for FR & EFR UL: set C13 & C14 correctly

Control bits C13 & C14 in TRAU-UL frames indicate SID classification
per section 6.1.1 of GSM 06.31 for FR or GSM 06.81 for EFR.
Previous commit 08d0c0990275 implements correct setting of C16 in
TRAU-DL, but the case of generating TRAU-UL was left as a FIXME.
Now that we have osmo_{fr,efr}_sid_classify() functions in
libosmocodec, we can set C13 & C14 in TRAU-UL too.  Do it.

Change-Id: Ifcfc28ad7d77e561d456be546689995abfd8a6f5
diff --git a/TODO-RELEASE b/TODO-RELEASE
index c021505..5f2f654 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -8,3 +8,4 @@
 # If any interfaces have been removed or changed since the last public release: c:r:0.
 #library	what		description / commit summary line
 libosmo-abis	struct e1inp_driver Field added at the end (ABI break)
+libosmocodec	>1.8.0		osmo_{fr,efr}_sid_classify() new functions
diff --git a/src/trau/trau_rtp_conv.c b/src/trau/trau_rtp_conv.c
index e08b0b9..5c87c46 100644
--- a/src/trau/trau_rtp_conv.c
+++ b/src/trau/trau_rtp_conv.c
@@ -257,6 +257,7 @@
 static int rtp2trau_fr(struct osmo_trau_frame *tf, const uint8_t *data, size_t data_len)
 {
 	int i, j, k, l, o;
+	enum osmo_gsm631_sid_class sidc;
 
 	/* data_len == 0 for BFI frame */
 	if (data_len < GSM_FR_BYTES && data_len != 0)
@@ -296,13 +297,17 @@
 	}
 	memset(&tf->c_bits[5], 0, 6);	/* C6 .. C11: Time Alignment */
 	if (tf->dir == OSMO_TRAU_DIR_UL) {
-		if (data_len == 0)
+		if (data_len == 0) {
 			tf->c_bits[11] = 1;	/* C12: BFI */
-		else
+			tf->c_bits[12] = 0;	/* C13: SID=0 */
+			tf->c_bits[13] = 0;	/* C14: SID=0 */
+		} else {
 			tf->c_bits[11] = 0;	/* C12: BFI */
-		/* FIXME: set C13 & C14 per GSM 06.31 section 6.1.1 */
-		tf->c_bits[12] = 0; /* C13: SID=0 */
-		tf->c_bits[13] = 0; /* C14: SID=0 */
+			/* SID classification per GSM 06.31 section 6.1.1 */
+			sidc = osmo_fr_sid_classify(data);
+			tf->c_bits[12] = (sidc >> 1) & 1; /* C13: msb */
+			tf->c_bits[13] = (sidc >> 0) & 1; /* C14: lsb */
+		}
 		tf->c_bits[14] = 0; /* C15: TAF (SACCH or not) */
 		tf->c_bits[15] = 1; /* C16: spare */
 		tf->c_bits[16] = 0; /* C17: DTXd not applied */
@@ -430,6 +435,7 @@
 {
 	int i, j;
 	ubit_t check_bits[26];
+	enum osmo_gsm631_sid_class sidc;
 
 	/* data_len == 0 for BFI frame */
 	if (data_len < GSM_EFR_BYTES && data_len != 0)
@@ -461,13 +467,17 @@
 
 	memset(&tf->c_bits[5], 0, 6); /* C6 .. C11: Time Alignment */
 	if (tf->dir == OSMO_TRAU_DIR_UL) {
-		if (data_len == 0)
-			tf->c_bits[11] = 1; /* C12: BFI=1 */
-		else
-			tf->c_bits[11] = 0; /* C12: BFI=1 */
-		/* FIXME: set C13 & C14 per GSM 06.81 section 6.1.1 */
-		tf->c_bits[12] = 0; /* C13: SID=0 */
-		tf->c_bits[13] = 0; /* C14: SID=0 */
+		if (data_len == 0) {
+			tf->c_bits[11] = 1;	/* C12: BFI */
+			tf->c_bits[12] = 0;	/* C13: SID=0 */
+			tf->c_bits[13] = 0;	/* C14: SID=0 */
+		} else {
+			tf->c_bits[11] = 0;	/* C12: BFI */
+			/* SID classification per GSM 06.81 section 6.1.1 */
+			sidc = osmo_efr_sid_classify(data);
+			tf->c_bits[12] = (sidc >> 1) & 1; /* C13: msb */
+			tf->c_bits[13] = (sidc >> 0) & 1; /* C14: lsb */
+		}
 		tf->c_bits[14] = 0; /* C15: TAF (SACCH) */
 		tf->c_bits[15] = 1; /* C16: spare */
 		tf->c_bits[16] = 0; /* C17: DTXd applied */