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
This commit is contained in:
parent
87c7ea3c5a
commit
9bd4fd601a
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue