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.
This commit is contained in:
Holger Hans Peter Freyther 2014-07-04 20:55:20 +02:00
parent 1fc1ed23b2
commit 91eeeae312
3 changed files with 61 additions and 9 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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