From 7b20bbc32146c1a8b5e0191d838b45735f1ae151 Mon Sep 17 00:00:00 2001
From: Andreas Eversberg <jolly@eversberg.eu>
Date: Fri, 18 Apr 2014 11:03:50 +0200
Subject: [PATCH] Move rtp_proxy.c from libtrau to libmsc
In order to free RTP socket when lchan_free() or lchan_reset() is called,
a signal is used between libbsc and rtp_proxy.
---
openbsc/include/openbsc/signal.h | 1 +
openbsc/src/libbsc/chan_alloc.c | 19 +++++++---------
openbsc/src/libmsc/Makefile.am | 3 ++-
openbsc/src/{libtrau => libmsc}/rtp_proxy.c | 35 +++++++++++++++++++++++++++++
openbsc/src/libtrau/Makefile.am | 2 +-
5 files changed, 47 insertions(+), 13 deletions(-)
rename openbsc/src/{libtrau => libmsc}/rtp_proxy.c (96%)
@@ -105,6 +105,7 @@ enum signal_lchan {
enum signal_challoc {
S_CHALLOC_ALLOC_FAIL, /* allocation of lchan has failed */
S_CHALLOC_FREED, /* lchan has been successfully freed */
+ S_CHALLOC_RESET, /* lchan has been reset */
};
/* SS_SUBSCR signals */
@@ -310,13 +310,6 @@ void lchan_free(struct gsm_lchan *lchan)
osmo_signal_dispatch(SS_LCHAN, S_LCHAN_UNEXPECTED_RELEASE, &sig);
}
- if (lchan->abis_ip.rtp_socket) {
- LOGP(DRLL, LOGL_ERROR, "%s RTP Proxy Socket remained open.\n",
- gsm_lchan_name(lchan));
- rtp_socket_free(lchan->abis_ip.rtp_socket);
- lchan->abis_ip.rtp_socket = NULL;
- }
-
/* stop the timer */
osmo_timer_del(&lchan->T3101);
@@ -360,18 +353,22 @@ void lchan_free(struct gsm_lchan *lchan)
*/
void lchan_reset(struct gsm_lchan *lchan)
{
+ struct challoc_signal_data sig;
+
osmo_timer_del(&lchan->T3101);
osmo_timer_del(&lchan->T3109);
osmo_timer_del(&lchan->T3111);
osmo_timer_del(&lchan->error_timer);
+ memset(&sig, 0, sizeof(sig));
+ sig.type = lchan->type;
+
lchan->type = GSM_LCHAN_NONE;
lchan->state = LCHAN_S_NONE;
- if (lchan->abis_ip.rtp_socket) {
- rtp_socket_free(lchan->abis_ip.rtp_socket);
- lchan->abis_ip.rtp_socket = NULL;
- }
+ sig.lchan = lchan;
+ sig.bts = lchan->ts->trx->bts;
+ osmo_signal_dispatch(SS_CHALLOC, S_CHALLOC_RESET, &sig);
}
/* Drive the release process of the lchan */
@@ -17,7 +17,8 @@ libmsc_a_SOURCES = auth.c \
ussd.c \
vty_interface_layer3.c \
transaction.c \
- osmo_msc.c ctrl_commands.c
+ osmo_msc.c ctrl_commands.c \
+ rtp_proxy.c
if BUILD_SMPP
noinst_HEADERS = smpp_smsc.h
similarity index 96%
rename from openbsc/src/libtrau/rtp_proxy.c
rename to openbsc/src/libmsc/rtp_proxy.c
@@ -36,6 +36,7 @@
#include <openbsc/rtp_proxy.h>
#include <openbsc/mncc.h>
#include <openbsc/trau_upqueue.h>
+#include <openbsc/signal.h>
/* attempt to determine byte order */
#include <sys/param.h>
@@ -830,3 +831,37 @@ int rtp_socket_free(struct rtp_socket *rs)
return 0;
}
+
+static int rtp_handle_challoc_signal(unsigned int subsys, unsigned int signal,
+ void *handler_data, void *signal_data)
+{
+ struct gsm_lchan *lchan;
+ struct challoc_signal_data *sig;
+
+ if (subsys != SS_CHALLOC)
+ return 0;
+
+
+ sig = signal_data;
+ if (!sig->lchan || !sig->lchan->conn)
+ return 0;
+
+ lchan = sig->lchan;
+
+ switch (signal) {
+ case S_CHALLOC_FREED:
+ case S_CHALLOC_RESET:
+ if (lchan->abis_ip.rtp_socket) {
+ rtp_socket_free(lchan->abis_ip.rtp_socket);
+ lchan->abis_ip.rtp_socket = NULL;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+static __attribute__((constructor)) void on_dso_load_rtp_proxy(void)
+{
+ osmo_signal_register_handler(SS_CHALLOC, rtp_handle_challoc_signal, NULL);
+}
@@ -4,4 +4,4 @@ AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOABIS_LIBS) $(COVERA
noinst_LIBRARIES = libtrau.a
-libtrau_a_SOURCES = rtp_proxy.c trau_mux.c trau_upqueue.c
+libtrau_a_SOURCES = trau_mux.c trau_upqueue.c
--
1.8.1.5