Modify osmo-nitb for load testing a BTS

* Send Modify requests during release
* Send multiple SACCH deactivates
* Optionally do not send IMM.ASSIGNMENT during channel granting
  to force the phone to send multiple RACH bursts..
* abort() when a channel goes broken
diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c
index 977ea3f..26b3450 100644
--- a/openbsc/src/libbsc/abis_rsl.c
+++ b/openbsc/src/libbsc/abis_rsl.c
@@ -209,6 +209,7 @@
 
 	LOGP(DRSL, LOGL_ERROR, "%s Timeout during deactivation!\n",
 		gsm_lchan_name(lchan));
+	abort();
 
 	do_lchan_free(lchan);
 }
@@ -697,8 +698,10 @@
 		/*
 		 * sacch de-activate and "local end release"
 		 */
-		if (deact_sacch == SACCH_DEACTIVATE && !lchan->sacch_deact)
+		if (deact_sacch == SACCH_DEACTIVATE) {
 			rsl_deact_sacch(lchan);
+			rsl_deact_sacch(lchan);
+		}
 		rsl_release_sapis_from(lchan, 0, RSL_REL_LOCAL_END);
 
 		/*
@@ -946,13 +949,17 @@
 		print_rsl_cause(LOGL_ERROR, cause,
 				TLVP_LEN(&tp, RSL_IE_CAUSE));
 		msg->lchan->error_cause = *cause;
-		if (*cause != RSL_ERR_RCH_ALR_ACTV_ALLOC)
+		if (*cause != RSL_ERR_RCH_ALR_ACTV_ALLOC) {
 			rsl_lchan_set_state(msg->lchan, LCHAN_S_BROKEN);
+			abort();
+		}
 		else
 			rsl_rf_chan_release(msg->lchan, 1, SACCH_DEACTIVATE);
 
-	} else
+	} else {
+		abort();
 		rsl_lchan_set_state(msg->lchan, LCHAN_S_BROKEN);
+	}
 
 	LOGPC(DRSL, LOGL_ERROR, "\n");
 
@@ -1449,6 +1456,13 @@
 	lchan->T3101.data = lchan;
 	osmo_timer_schedule(&lchan->T3101, bts->network->T3101, 0);
 
+#if 0
+	if (lchan->type == GSM_LCHAN_TCH_F && lchan->ts->nr >= 0 && lchan->ts->nr <= 6) {
+		printf("Just not sending the immediate assignment..\n");
+		return 0;
+	}
+#endif
+
 	/* send IMMEDIATE ASSIGN CMD on RSL to BTS (to send on CCCH to MS) */
 	return rsl_imm_assign_cmd(bts, sizeof(*ia)+ia->mob_alloc_len, (uint8_t *) ia);
 }
@@ -2131,6 +2145,7 @@
 		link_id = sapi;
 		if (lchan->type == GSM_LCHAN_TCH_F || lchan->type == GSM_LCHAN_TCH_H)
 			link_id |= 0x40;
+		rsl_deact_sacch(lchan);
 		rsl_release_request(lchan, link_id, release_mode);
 		no_sapi = 0;
 	}
diff --git a/openbsc/src/libbsc/chan_alloc.c b/openbsc/src/libbsc/chan_alloc.c
index 99c9360..5c0a36b 100644
--- a/openbsc/src/libbsc/chan_alloc.c
+++ b/openbsc/src/libbsc/chan_alloc.c
@@ -300,7 +300,6 @@
 	sig.type = lchan->type;
 	lchan->type = GSM_LCHAN_NONE;
 
-
 	if (lchan->conn) {
 		struct lchan_signal_data sig;
 
@@ -396,7 +395,10 @@
 				"%s sacch already deactivated?!\n",
 				gsm_lchan_name(lchan));
 		lchan->sacch_deact = 1;
+		rsl_chan_mode_modify_req(lchan);
 		rsl_deact_sacch(lchan);
+		rsl_deact_sacch(lchan);
+		rsl_chan_mode_modify_req(lchan);
 		rsl_start_t3109(lchan);
 	} else if (lchan->sapis[0] == LCHAN_SAPI_UNUSED) {
 		rsl_direct_rf_release(lchan);