aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmsc/smpp_smsc.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2012-11-08 19:44:08 +0100
committerHarald Welte <laforge@gnumonks.org>2012-11-16 22:00:09 +0100
commitd4bdee79e96906323811ea5832e402855985df88 (patch)
treec5bd16e6181fa2ea9f57eb2baafc046a2f5b760b /openbsc/src/libmsc/smpp_smsc.c
parentf1033cc752cfeb5f86e6f2357ce62637646f773f (diff)
SMPP: Implement transaction mode for SUBMIT-SM
WARNING: if the ESME disconnects, osmo_esme gets freed, and sms->smpp.esme might point to invalid/unallocated memory!
Diffstat (limited to 'openbsc/src/libmsc/smpp_smsc.c')
-rw-r--r--openbsc/src/libmsc/smpp_smsc.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/openbsc/src/libmsc/smpp_smsc.c b/openbsc/src/libmsc/smpp_smsc.c
index ff6b1f9e5..dd6a2f9e3 100644
--- a/openbsc/src/libmsc/smpp_smsc.c
+++ b/openbsc/src/libmsc/smpp_smsc.c
@@ -46,6 +46,17 @@ enum emse_bind {
ESME_BIND_TX = 0x02,
};
+static struct osmo_esme *
+esme_by_system_id(const struct smsc *smsc, char *system_id)
+{
+ struct osmo_esme *e;
+
+ llist_for_each_entry(e, &smsc->esme_list, list) {
+ if (!strcmp(e->system_id, system_id))
+ return e;
+ }
+ return NULL;
+}
#define INIT_RESP(type, resp, req) { \
@@ -280,6 +291,21 @@ static int smpp_handle_enq_link(struct osmo_esme *esme, struct msgb *msg)
return PACK_AND_SEND(esme, &enq_r);
}
+int smpp_tx_submit_r(struct osmo_esme *esme, uint32_t sequence_nr,
+ uint32_t command_status, char *msg_id)
+{
+ struct submit_sm_resp_t submit_r;
+
+ memset(&submit_r, 0, sizeof(submit_r));
+ submit_r.command_length = 0;
+ submit_r.command_id = SUBMIT_SM_RESP;
+ submit_r.command_status = command_status;
+ submit_r.sequence_number= sequence_nr;
+ snprintf(submit_r.message_id, sizeof(submit_r.message_id), "%s", msg_id);
+
+ return PACK_AND_SEND(esme, &submit_r);
+}
+
static int smpp_handle_submit(struct osmo_esme *esme, struct msgb *msg)
{
struct submit_sm_t submit;