aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2019-01-16 12:05:30 +0100
committerMax <msuraev@sysmocom.de>2019-01-17 12:17:52 +0000
commit0e8dfadc7a28143a0c5984c34e9a015c6c04a3e6 (patch)
tree32b234acdcdb4683e0d3eb2347e586ea1abc39b2
parent6b3cef08d29f45be3f828cf442cfe07bcd1e5a82 (diff)
SMS: remove code duplication in transaction init
Move code which allocates transaction for SMS and initializes corresponding FSM into separate function (shared by MT and MO code paths) to avoid code duplication and simplify further modifications. Change-Id: I3563e11bebb58e656592df2ff7db96f41deaf735
-rw-r--r--src/libmsc/gsm_04_11.c51
1 files changed, 27 insertions, 24 deletions
diff --git a/src/libmsc/gsm_04_11.c b/src/libmsc/gsm_04_11.c
index 8ef26a709..4dc07bd65 100644
--- a/src/libmsc/gsm_04_11.c
+++ b/src/libmsc/gsm_04_11.c
@@ -1007,6 +1007,27 @@ static int gsm411_mn_recv(struct gsm411_smc_inst *inst, int msg_type,
return rc;
}
+static struct gsm_trans *gsm411_trans_init(struct gsm_network *net, struct vlr_subscr *vsub, struct ran_conn *conn,
+ uint8_t tid)
+{
+ /* Allocate a new transaction */
+ struct gsm_trans *trans = trans_alloc(net, vsub, GSM48_PDISC_SMS, tid, new_callref++);
+ if (!trans) {
+ LOGP(DLSMS, LOGL_ERROR, "No memory for transaction\n");
+ return NULL;
+ }
+
+ /* Init both SMC and SMR state machines */
+ gsm411_smc_init(&trans->sms.smc_inst, 0, 1, gsm411_mn_recv, gsm411_mm_send);
+ gsm411_smr_init(&trans->sms.smr_inst, 0, 1, gsm411_rl_recv, gsm411_mn_send);
+
+ /* Associate transaction with connection */
+ if (conn)
+ trans->conn = ran_conn_get(conn, RAN_CONN_USE_TRANS_SMS);
+
+ return trans;
+}
+
static struct gsm_trans *gsm411_alloc_mt_trans(struct gsm_network *net,
struct vlr_subscr *vsub)
{
@@ -1023,24 +1044,15 @@ static struct gsm_trans *gsm411_alloc_mt_trans(struct gsm_network *net,
return NULL;
}
+ /* Attempt to find an existing connection */
+ conn = connection_for_subscr(vsub);
+
/* Allocate a new transaction */
- trans = trans_alloc(net, vsub, GSM48_PDISC_SMS, tid, new_callref++);
- if (!trans) {
- LOGP(DLSMS, LOGL_ERROR, "No memory for trans\n");
+ trans = gsm411_trans_init(net, vsub, conn, tid);
+ if (!trans)
return NULL;
- }
- /* Init both SMC and SMR state machines */
- gsm411_smc_init(&trans->sms.smc_inst, 0, 1,
- gsm411_mn_recv, gsm411_mm_send);
- gsm411_smr_init(&trans->sms.smr_inst, 0, 1,
- gsm411_rl_recv, gsm411_mn_send);
-
- /* Attempt to find an existing connection */
- conn = connection_for_subscr(vsub);
if (conn) {
- /* Associate transaction with connection */
- trans->conn = ran_conn_get(conn, RAN_CONN_USE_TRANS_SMS);
/* Generate unique RP Message Reference */
trans->sms.sm_rp_mr = conn->next_rp_ref++;
}
@@ -1192,21 +1204,12 @@ int gsm0411_rcv_sms(struct ran_conn *conn,
}
if (!trans) {
- DEBUGP(DLSMS, " -> (new transaction)\n");
- trans = trans_alloc(conn->network, conn->vsub,
- GSM48_PDISC_SMS,
- transaction_id, new_callref++);
+ trans = gsm411_trans_init(conn->network, conn->vsub, conn, transaction_id);
if (!trans) {
- DEBUGP(DLSMS, " -> No memory for trans\n");
/* FIXME: send some error message */
return -ENOMEM;
}
- gsm411_smc_init(&trans->sms.smc_inst, 0, 1,
- gsm411_mn_recv, gsm411_mm_send);
- gsm411_smr_init(&trans->sms.smr_inst, 0, 1,
- gsm411_rl_recv, gsm411_mn_send);
- trans->conn = ran_conn_get(conn, RAN_CONN_USE_TRANS_SMS);
trans->dlci = OMSC_LINKID_CB(msg); /* DLCI as received from BSC */
new_trans = 1;