aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-07-04 20:55:20 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-07-22 14:31:35 +0200
commit91eeeae312b3dfc54fc577b437c481811ff60d4a (patch)
treed4167b35cdc4c968d1f2234842f7b70ea1a980ff
parent1fc1ed23b25273688ef1f695e2f0135aaff97c73 (diff)
mgcp: Fix/test reading/writing the sequence number
The sequence number was read from the wrong place and then the wrong byte order conversion routine was used so we ended up wirting 0x00, 0x00 into the patched sequence number. Add a testcase for that.
-rw-r--r--openbsc/src/libmgcp/mgcp_transcode.c4
-rw-r--r--openbsc/tests/mgcp/mgcp_transcoding_test.c52
-rw-r--r--openbsc/tests/mgcp/mgcp_transcoding_test.ok14
3 files changed, 61 insertions, 9 deletions
diff --git a/openbsc/src/libmgcp/mgcp_transcode.c b/openbsc/src/libmgcp/mgcp_transcode.c
index 8ab9a04fd..296020c49 100644
--- a/openbsc/src/libmgcp/mgcp_transcode.c
+++ b/openbsc/src/libmgcp/mgcp_transcode.c
@@ -429,7 +429,7 @@ int mgcp_transcoding_process_rtp(struct mgcp_endpoint *endp,
if (payload_len > 0) {
ts_no = ntohl(*(uint32_t*)(data+4));
if (!state->is_running)
- state->next_seq = ntohs(*(uint32_t*)(data+4));
+ state->next_seq = ntohs(*(uint16_t*)(data+2));
state->is_running = 1;
@@ -494,7 +494,7 @@ int mgcp_transcoding_process_rtp(struct mgcp_endpoint *endp,
nsamples -= state->sample_cnt;
*len = rtp_hdr_size + rc;
- *(uint16_t*)(data+2) = htonl(state->next_seq);
+ *(uint16_t*)(data+2) = htons(state->next_seq);
*(uint32_t*)(data+4) = htonl(ts_no);
state->next_seq += 1;
diff --git a/openbsc/tests/mgcp/mgcp_transcoding_test.c b/openbsc/tests/mgcp/mgcp_transcoding_test.c
index 6b3364516..404268a68 100644
--- a/openbsc/tests/mgcp/mgcp_transcoding_test.c
+++ b/openbsc/tests/mgcp/mgcp_transcoding_test.c
@@ -11,6 +11,7 @@
#include <openbsc/gsm_data.h>
#include <openbsc/mgcp.h>
#include <openbsc/mgcp_internal.h>
+#include <openbsc/rtp.h>
#include "bscconfig.h"
#ifndef BUILD_MGCP_TRANSCODING
@@ -245,6 +246,56 @@ static int transcode_test(const char *srcfmt, const char *dstfmt,
return 0;
}
+static void test_rtp_seq_state(void)
+{
+ char buf[4096];
+ int len;
+ int cont;
+ void *ctx;
+ struct mgcp_endpoint *endp;
+ struct mgcp_process_rtp_state *state;
+ struct rtp_hdr *hdr;
+ uint32_t ts_no;
+ uint16_t seq_no;
+
+ given_configured_endpoint(160, 0, "pcma", "l16", &ctx, &endp);
+ state = endp->bts_end.rtp_process_data;
+ OSMO_ASSERT(!state->is_running);
+ OSMO_ASSERT(state->next_seq == 0);
+ OSMO_ASSERT(state->next_time == 0);
+
+ /* initialize packet */
+ len = audio_packets_pcma[0].len;
+ memcpy(buf, audio_packets_pcma[0].data, len);
+ cont = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, len);
+ OSMO_ASSERT(cont >= 0);
+ OSMO_ASSERT(state->is_running);
+ OSMO_ASSERT(state->next_seq == 2);
+ OSMO_ASSERT(state->next_time = 240);
+
+ /* verify that the right timestamp was written */
+ OSMO_ASSERT(len == audio_packets_pcma[0].len);
+ hdr = (struct rtp_hdr *) &buf[0];
+
+ memcpy(&ts_no, &hdr->timestamp, sizeof(ts_no));
+ OSMO_ASSERT(htonl(ts_no) == 160);
+ memcpy(&seq_no, &hdr->sequence, sizeof(seq_no));
+ OSMO_ASSERT(htons(seq_no) == 1);
+ /* Check the right sequence number is written */
+ state->next_seq = 1234;
+ len = audio_packets_pcma[0].len;
+ memcpy(buf, audio_packets_pcma[0].data, len);
+ cont = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, len);
+ OSMO_ASSERT(cont >= 0);
+ OSMO_ASSERT(len == audio_packets_pcma[0].len);
+ hdr = (struct rtp_hdr *) &buf[0];
+
+ memcpy(&seq_no, &hdr->sequence, sizeof(seq_no));
+ OSMO_ASSERT(htons(seq_no) == 1234);
+
+ talloc_free(ctx);
+}
+
static int test_repacking(int in_samples, int out_samples, int no_transcode)
{
char buf[4096] = {0x80, 0};
@@ -388,6 +439,7 @@ int main(int argc, char **argv)
test_repacking(160, 240, 1);
test_repacking(160, 100, 0);
test_repacking(160, 100, 1);
+ test_rtp_seq_state();
return 0;
}
diff --git a/openbsc/tests/mgcp/mgcp_transcoding_test.ok b/openbsc/tests/mgcp/mgcp_transcoding_test.ok
index 07929a868..e06b0e1bc 100644
--- a/openbsc/tests/mgcp/mgcp_transcoding_test.ok
+++ b/openbsc/tests/mgcp/mgcp_transcoding_test.ok
@@ -27,14 +27,14 @@ counted: 0
== Transcoding test ==
converting l16 -> gsm
encoded:
- 80 0b 00 00 00 00 00 a0 11 22 33 44 d4 7c e3 e9
+ 80 0b 00 01 00 00 00 a0 11 22 33 44 d4 7c e3 e9
62 50 39 f0 f8 b4 68 ea 6c 0e 81 1b 56 2a d5 bc
69 9c d1 f0 66 7a ec 49 7a 33 3d 0a de
counted: 12
== Transcoding test ==
converting l16 -> pcma
encoded:
- 80 0b 00 00 00 00 00 a0 11 22 33 44 d5 a5 a3 a5
+ 80 0b 00 01 00 00 00 a0 11 22 33 44 d5 a5 a3 a5
d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5
d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5
d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5
@@ -49,7 +49,7 @@ counted: 12
== Transcoding test ==
converting gsm -> l16
encoded:
- 80 03 00 00 00 00 00 a0 11 22 33 44 00 00 54 00
+ 80 03 00 01 00 00 00 a0 11 22 33 44 00 00 54 00
59 f0 34 20 c4 c8 b9 f8 e2 18 f1 e8 f2 28 f0 e0
46 08 4f 80 2c a0 a9 c8 80 00 c0 58 3f 80 63 c0
24 b8 fa b8 f6 88 0b a0 c8 70 a8 b0 c8 c0 3b a8
@@ -81,7 +81,7 @@ counted: 0
== Transcoding test ==
converting gsm -> pcma
encoded:
- 80 03 00 00 00 00 00 a0 11 22 33 44 d5 a0 a3 bf
+ 80 03 00 01 00 00 00 a0 11 22 33 44 d5 a0 a3 bf
38 24 08 19 1e 1b a4 a6 b3 20 2a 3a ba ad b7 60
17 92 3e 20 3e b8 ac b2 32 2c 20 02 b6 be be 82
04 27 26 35 8d a4 a6 b5 35 21 20 31 8d a7 a6 b6
@@ -96,7 +96,7 @@ counted: 12
== Transcoding test ==
converting pcma -> l16
encoded:
- 80 08 00 00 00 00 00 a0 11 22 33 44 00 08 42 00
+ 80 08 00 01 00 00 00 a0 11 22 33 44 00 08 42 00
5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00
5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00
5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00
@@ -121,7 +121,7 @@ counted: 12
== Transcoding test ==
converting pcma -> gsm
encoded:
- 80 08 00 00 00 00 00 a0 11 22 33 44 d4 b9 f4 5d
+ 80 08 00 01 00 00 00 a0 11 22 33 44 d4 b9 f4 5d
d9 50 5a e1 a0 cd 76 ea 52 0e 87 53 ad d4 ea a2
0a 63 ca e9 60 79 e2 2a 25 d2 c0 f3 39
counted: 12
@@ -161,7 +161,7 @@ Invalid payload type:
== Transcoding test ==
converting gsm -> pcma
encoded:
- 80 08 00 00 00 00 00 a0 11 22 33 44 d5 a0 a3 bf
+ 80 08 00 01 00 00 00 a0 11 22 33 44 d5 a0 a3 bf
38 24 08 19 1e 1b a4 a6 b3 20 2a 3a ba ad b7 60
17 92 3e 20 3e b8 ac b2 32 2c 20 02 b6 be be 82
04 27 26 35 8d a4 a6 b5 35 21 20 31 8d a7 a6 b6