bsc_api: Rework the signal handler to be extendable
diff --git a/openbsc/src/bsc_api.c b/openbsc/src/bsc_api.c
index f1f7a62..6639dae 100644
--- a/openbsc/src/bsc_api.c
+++ b/openbsc/src/bsc_api.c
@@ -39,6 +39,7 @@
 
 static void rll_ind_cb(struct gsm_lchan *, uint8_t, void *, enum bsc_rllr_ind);
 static void send_sapi_reject(struct gsm_subscriber_connection *conn, int link_id);
+static void handle_release(struct gsm_subscriber_connection *conn, struct bsc_api *bsc, struct  gsm_lchan *lchan);
 
 /* GSM 08.08 3.2.2.33 */
 static u_int8_t lchan_to_chosen_channel(struct gsm_lchan *lchan)
@@ -422,10 +423,8 @@
 {
 	struct bsc_api *bsc;
 	struct gsm_lchan *lchan;
-	struct gsm_subscriber_connection *conn;
-	int destruct = 1;
 
-	if (subsys != SS_LCHAN || signal != S_LCHAN_UNEXPECTED_RELEASE)
+	if (subsys != SS_LCHAN)
 		return 0;
 
 	lchan = (struct gsm_lchan *)signal_data;
@@ -436,7 +435,20 @@
 	if (!bsc)
 		return 0;
 
-	conn = lchan->conn;
+	switch (signal) {
+	case S_LCHAN_UNEXPECTED_RELEASE:
+		handle_release(lchan->conn, bsc, lchan);
+		break;
+	}
+
+	return 0;
+}
+
+static void handle_release(struct gsm_subscriber_connection *conn,
+			   struct bsc_api *bsc, struct gsm_lchan *lchan)
+{
+	int destruct = 1;
+
 	if (bsc->clear_request)
 		destruct = bsc->clear_request(conn, 0);
 
@@ -451,8 +463,6 @@
 
 	if (destruct)
 		subscr_con_free(conn);
-
-	return 0;
 }
 
 static __attribute__((constructor)) void on_dso_load_bsc(void)