summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2013-12-19 12:13:32 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2014-01-16 12:17:24 +0100
commit0970bab2a39244dfdd6caa226383da4d4e569b65 (patch)
tree3208753b95af0d2eb613f00e630377168cc40eff
parentb8300080209f2f93d57cf10445ae7558c6281db4 (diff)
mgcp/rtp: Add flag to disable RTP output
This patch make it possible to have a valid endpoint that drops all outgoing RTP packets. The number of dropped packets is shown by the VTY 'show mgcp' command. By default, this feature is disabled. To enable packet dropping, the corresponding output_enabled field must be set to 0. Ticket: OW#1044 Sponsored-by: On-Waves ehf
-rw-r--r--openbsc/include/openbsc/mgcp_internal.h2
-rw-r--r--openbsc/src/libmgcp/mgcp_network.c4
-rw-r--r--openbsc/src/libmgcp/mgcp_protocol.c2
-rw-r--r--openbsc/src/libmgcp/mgcp_vty.c8
4 files changed, 14 insertions, 2 deletions
diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h
index a9ae33c73..b4899e408 100644
--- a/openbsc/include/openbsc/mgcp_internal.h
+++ b/openbsc/include/openbsc/mgcp_internal.h
@@ -71,6 +71,7 @@ struct mgcp_rtp_end {
/* statistics */
unsigned int packets;
unsigned int octets;
+ unsigned int dropped_packets;
struct in_addr addr;
/* in network byte order */
@@ -84,6 +85,7 @@ struct mgcp_rtp_end {
int frames_per_packet;
uint32_t packet_duration_ms;
char *fmtp_extra;
+ int output_enabled;
/* RTP patching */
int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
diff --git a/openbsc/src/libmgcp/mgcp_network.c b/openbsc/src/libmgcp/mgcp_network.c
index 1c7c3dafe..21d52b58e 100644
--- a/openbsc/src/libmgcp/mgcp_network.c
+++ b/openbsc/src/libmgcp/mgcp_network.c
@@ -559,7 +559,9 @@ static int mgcp_send(struct mgcp_endpoint *endp, int dest, int is_rtp,
tap_idx = MGCP_TAP_BTS_OUT;
}
- if (is_rtp) {
+ if (!rtp_end->output_enabled)
+ rtp_end->dropped_packets += 1;
+ else if (is_rtp) {
mgcp_patch_and_count(endp, rtp_state, rtp_end, addr, buf, rc);
forward_data(rtp_end->rtp.fd, &endp->taps[tap_idx], buf, rc);
return mgcp_udp_send(rtp_end->rtp.fd,
diff --git a/openbsc/src/libmgcp/mgcp_protocol.c b/openbsc/src/libmgcp/mgcp_protocol.c
index ddec44d92..95f3910c0 100644
--- a/openbsc/src/libmgcp/mgcp_protocol.c
+++ b/openbsc/src/libmgcp/mgcp_protocol.c
@@ -1178,6 +1178,7 @@ static void mgcp_rtp_end_reset(struct mgcp_rtp_end *end)
end->packets = 0;
end->octets = 0;
+ end->dropped_packets = 0;
memset(&end->addr, 0, sizeof(end->addr));
end->rtp_port = end->rtcp_port = 0;
end->payload_type = -1;
@@ -1191,6 +1192,7 @@ static void mgcp_rtp_end_reset(struct mgcp_rtp_end *end)
end->frames_per_packet = 0; /* unknown */
end->packet_duration_ms = DEFAULT_RTP_AUDIO_PACKET_DURATION_MS;
end->rate = DEFAULT_RTP_AUDIO_DEFAULT_RATE;
+ end->output_enabled = 1;
}
static void mgcp_rtp_end_init(struct mgcp_rtp_end *end)
diff --git a/openbsc/src/libmgcp/mgcp_vty.c b/openbsc/src/libmgcp/mgcp_vty.c
index 8411b4aa4..3f1ebeb2c 100644
--- a/openbsc/src/libmgcp/mgcp_vty.c
+++ b/openbsc/src/libmgcp/mgcp_vty.c
@@ -150,7 +150,7 @@ static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbo
endp->trans_net.packets, endp->trans_bts.packets,
VTY_NEWLINE);
- if (verbose)
+ if (verbose) {
vty_out(vty,
" Timestamp Errs: BTS %d->%d, Net %d->%d%s",
endp->bts_state.in_stream.err_ts_counter,
@@ -158,6 +158,12 @@ static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbo
endp->net_state.in_stream.err_ts_counter,
endp->net_state.out_stream.err_ts_counter,
VTY_NEWLINE);
+ vty_out(vty,
+ " Dropped Packets: Net->BTS %d, BTS->Net %d%s",
+ endp->bts_end.dropped_packets,
+ endp->net_end.dropped_packets,
+ VTY_NEWLINE);
+ }
}
}