summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-10-21 01:35:57 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-03-09 18:34:18 +0100
commit3c74d92bc491fdf174ea772aeae1604458fdad8d (patch)
tree87a615a223dba92de3e2b2690d32b1f4247c7414
parent7ffa831f05474311ccdc0a2cfb12c5622723a7af (diff)
mgcp: hack RAB success from nano3G: patch first RTP payloadneels/nano3G
The ip.access nano3G needs the first RTP payload's first two bytes to read hex 'e400', or it will reject the RAB assignment. Add flag patched_first_rtp_payload to mgcp_rtp_state to detect the first RTP payload on a stream, and overwrite its first bytes with e400. This should probably be configurable, but seems to not harm other femto cells (as long as we patch only the first RTP payload in each stream). Only do this when sending to the BTS side. Change-Id: If0887b0b7714fc204f2addab2d43d44bb283ba21
-rw-r--r--openbsc/include/openbsc/mgcp_internal.h1
-rw-r--r--openbsc/src/libmgcp/mgcp_network.c9
2 files changed, 10 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h
index b58eb9b58..4e215b8f1 100644
--- a/openbsc/include/openbsc/mgcp_internal.h
+++ b/openbsc/include/openbsc/mgcp_internal.h
@@ -64,6 +64,7 @@ struct mgcp_rtp_state {
uint32_t stats_jitter;
int32_t stats_transit;
int stats_cycles;
+ bool patched_first_rtp_payload;
};
struct mgcp_rtp_codec {
diff --git a/openbsc/src/libmgcp/mgcp_network.c b/openbsc/src/libmgcp/mgcp_network.c
index 5686e5944..b64e25dd7 100644
--- a/openbsc/src/libmgcp/mgcp_network.c
+++ b/openbsc/src/libmgcp/mgcp_network.c
@@ -666,6 +666,14 @@ int mgcp_send(struct mgcp_endpoint *endp, int dest, int is_rtp,
);
forward_data(rtp_end->rtp.fd, &endp->taps[tap_idx],
buf, len);
+
+ if (tap_idx == MGCP_TAP_BTS_OUT
+ && !rtp_state->patched_first_rtp_payload) {
+ uint8_t *data = &buf[12];
+ osmo_hexparse("e400", data, 2);
+ rtp_state->patched_first_rtp_payload = true;
+ }
+
rc = mgcp_udp_send(rtp_end->rtp.fd,
&rtp_end->addr,
rtp_end->rtp_port, buf, len);
@@ -685,6 +693,7 @@ int mgcp_send(struct mgcp_endpoint *endp, int dest, int is_rtp,
ntohs(rtp_end->rtp_port),
ntohs(rtp_end->rtcp_port)
);
+
return mgcp_udp_send(rtp_end->rtcp.fd,
&rtp_end->addr,
rtp_end->rtcp_port, buf, rc);