move allocating new transaction_ids to transaction.c
diff --git a/openbsc/include/openbsc/transaction.h b/openbsc/include/openbsc/transaction.h
index 8f3e7de..1450dbc 100644
--- a/openbsc/include/openbsc/transaction.h
+++ b/openbsc/include/openbsc/transaction.h
@@ -13,4 +13,6 @@
 			      u_int32_t callref);
 void trans_free(struct gsm_trans *trans);
 
+int trans_assign_trans_id(struct gsm_subscriber *subscr,
+			  u_int8_t protocol, u_int8_t ti_flag);
 #endif
diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c
index e82bd0c..a16b0de 100644
--- a/openbsc/src/gsm_04_08.c
+++ b/openbsc/src/gsm_04_08.c
@@ -2257,9 +2257,7 @@
 	struct msgb *msg = gsm48_msgb_alloc();
 	struct gsm48_hdr *gh;
 	struct gsm_mncc *setup = arg;
-	struct gsm_trans *transt;
-	u_int16_t trans_id_mask = 0;
-	int rc, i;
+	int rc, trans_id;
 
 	gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh));
 
@@ -2277,14 +2275,8 @@
 	}
 	
 	/* Get free transaction_id */
-	llist_for_each_entry(transt, &trans->subscr->net->trans_list, entry) {
-		/* Transaction of our lchan? */
-		if (transt->lchan == trans->lchan &&
-		    transt->transaction_id != 0xff)
-			trans_id_mask |= (1 << transt->transaction_id);
-	}
-	/* Assign free transaction ID */
-	if ((trans_id_mask & 0x007f) == 0x7f) {
+	trans_id = trans_assign_trans_id(trans->subscr, GSM48_PDISC_CC, 0);
+	if (trans_id < 0) {
 		/* no free transaction ID */
 		rc = mncc_release_ind(trans->subscr->net, trans, trans->callref,
 				      GSM48_CAUSE_LOC_PRN_S_LU,
@@ -2293,12 +2285,7 @@
 		trans_free(trans);
 		return rc;
 	}
-	for (i = 0; i < 7; i++) {
-		if ((trans_id_mask & (1 << i)) == 0) {
-			trans->transaction_id = i; /* flag = 0 */
-			break;
-		}
-	}
+	trans->transaction_id = trans_id;
 
 	gh->msg_type = GSM48_MT_CC_SETUP;
 
diff --git a/openbsc/src/transaction.c b/openbsc/src/transaction.c
index e917cdd..f4cef28 100644
--- a/openbsc/src/transaction.c
+++ b/openbsc/src/transaction.c
@@ -113,13 +113,18 @@
 	talloc_free(trans);
 }
 
-#if 0
+/* allocate an unused transaction ID for the given subscriber
+ * in the given protocol using the ti_flag specified */
 int trans_assign_trans_id(struct gsm_subscriber *subscr,
 			  u_int8_t protocol, u_int8_t ti_flag)
 {
 	struct gsm_network *net = subscr->net;
 	struct gsm_trans *trans;
 	unsigned int used_tid_bitmask = 0;
+	int i;
+
+	if (ti_flag)
+		ti_flag = 0x8;
 
 	/* generate bitmask of already-used TIDs for this (subscr,proto) */
 	llist_for_each_entry(trans, &net->trans_list, entry) {
@@ -130,5 +135,10 @@
 		used_tid_bitmask |= (1 << trans->transaction_id);
 	}
 
+	for (i = 0; i <= 7; i++) {
+		if ((used_tid_bitmask & (1 << (i | ti_flag))) == 0)
+			return i | ti_flag;
+	}
+
+	return -1;
 }
-#endif