aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Kluchnikov <kluchnikovi@gmail.com>2015-12-21 12:05:56 +0300
committerVadim Yanitskiy <axilirator@gmail.com>2018-11-29 02:54:54 +0700
commit9bd4fd601a25481bf6163d226bb653929d060282 (patch)
tree2cfef68f2f8c1b4aa3f4dfb07256e1b7b30b3592
parent87c7ea3c5af1d54eb86d70710188722c83754c36 (diff)
libmsc/transaction: introduce trans_find_by_sm_rp_mr()
According to GSM TS 04.11, section 8.2.3, the RP Message Reference is a mandatory field for all messages on the SM-RL (SM Relay Layer), that is used to link an RP-ACK or RP-ERROR message to the associated (preceding) RP-DATA or RP-SMMA message transfer attempt. This change extends the transaction state structure with SM-RP-MR, and introduces a new function for matching transactions within a given connection by this reference. Change-Id: Ice47c37ecef4416e65ecee8931d946c915316791
-rw-r--r--include/osmocom/msc/transaction.h5
-rw-r--r--src/libmsc/transaction.c22
2 files changed, 27 insertions, 0 deletions
diff --git a/include/osmocom/msc/transaction.h b/include/osmocom/msc/transaction.h
index b7d7971fe..762eeea28 100644
--- a/include/osmocom/msc/transaction.h
+++ b/include/osmocom/msc/transaction.h
@@ -76,6 +76,9 @@ struct gsm_trans {
struct gsm411_smc_inst smc_inst;
struct gsm411_smr_inst smr_inst;
+ /* SM-RP-MR, Message Reference (see GSM TS 04.11, section 8.2.3) */
+ uint8_t sm_rp_mr;
+
struct gsm_sms *sms;
} sms;
struct {
@@ -99,6 +102,8 @@ struct gsm_trans *trans_find_by_id(struct gsm_subscriber_connection *conn,
uint8_t proto, uint8_t trans_id);
struct gsm_trans *trans_find_by_callref(struct gsm_network *net,
uint32_t callref);
+struct gsm_trans *trans_find_by_sm_rp_mr(struct gsm_subscriber_connection *conn,
+ uint8_t sm_rp_mr);
struct gsm_trans *trans_alloc(struct gsm_network *net,
struct vlr_subscr *vsub,
diff --git a/src/libmsc/transaction.c b/src/libmsc/transaction.c
index 680d7f306..cffbe0dac 100644
--- a/src/libmsc/transaction.c
+++ b/src/libmsc/transaction.c
@@ -73,6 +73,28 @@ struct gsm_trans *trans_find_by_callref(struct gsm_network *net,
return NULL;
}
+/*! Find a transaction by SM-RP-MR (RP Message Reference)
+ * \param[in] conn Connection in which we want to find transaction
+ * \param[in] sm_rp_mr RP Message Reference (see GSM TS 04.11, section 8.2.3)
+ * \returns Matching transaction, NULL otherwise
+ */
+struct gsm_trans *trans_find_by_sm_rp_mr(struct gsm_subscriber_connection *conn,
+ uint8_t sm_rp_mr)
+{
+ struct gsm_network *net = conn->network;
+ struct vlr_subscr *vsub = conn->vsub;
+ struct gsm_trans *trans;
+
+ llist_for_each_entry(trans, &net->trans_list, entry) {
+ if (trans->vsub == vsub &&
+ trans->protocol == GSM48_PDISC_SMS &&
+ trans->sms.sm_rp_mr == sm_rp_mr)
+ return trans;
+ }
+
+ return NULL;
+}
+
/*! Allocate a new transaction and add it to network list
* \param[in] net Netwokr in which we allocate transaction
* \param[in] subscr Subscriber for which we allocate transaction