[MERGED] openbsc[master]: libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03...
Pablo Neira Ayuso has submitted this change and it was merged. Change subject: libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03.40 status report .. libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03.40 status report This patch adds gsm340_sms_send_status_report_tpdu() to build a status-report. Moreover, set sms->report field if we see a SMPP SUBMIT_SM with Delivery Acknowledgment esm_class, so this identifies that this is a delivery report. MSGSM 03.40 SMSC SMPP 3.4 ESME | || | | SUBMIT-SM| | |esm_class = Delivery Ack| | |<---| | | SUBMIT-SM-RESP | | |--->| | || | SMS-STATUS-REPORT || |<|| | GSM 04.11 RP-ACK|| |>|| | || There is a FIXME message in this patch, that I just copied from gsm340_gen_sms_deliver_tpdu() since TP-MMS is not supported by OpenBSC. Change-Id: Ib70e534840308ed315f7add440351e649de3f907 --- M openbsc/src/libmsc/gsm_04_11.c M openbsc/src/libmsc/smpp_openbsc.c 2 files changed, 54 insertions(+), 2 deletions(-) Approvals: Harald Welte: Looks good to me, approved Pablo Neira Ayuso: Verified diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c index 0edbe0b..80c3d77 100644 --- a/openbsc/src/libmsc/gsm_04_11.c +++ b/openbsc/src/libmsc/gsm_04_11.c @@ -277,6 +277,49 @@ return msg->len - old_msg_len; } +/* As defined by GSM 03.40, Section 9.2.2.3. */ +static int gsm340_gen_sms_status_report_tpdu(struct msgb *msg, +struct gsm_sms *sms) +{ + unsigned int old_msg_len = msg->len; + uint8_t oa_len = 0; + uint8_t oa[12]; /* max len per 03.40 */ + uint8_t *smsp; + + /* generate first octet with masked bits */ + smsp = msgb_put(msg, 1); + /* TP-MTI (message type indicator) */ + *smsp = GSM340_SMS_STATUS_REP_SC2MS; + /* TP-MMS (more messages to send) */ + if (0 /* FIXME */) + *smsp |= 0x04; + /* TP-MR (message reference) */ + smsp = msgb_put(msg, 1); + *smsp = sms->msg_ref; + /* generate recipient address */ + oa_len = gsm340_gen_oa_sub(oa, sizeof(oa), >dst); + smsp = msgb_put(msg, oa_len); + memcpy(smsp, oa, oa_len); + + /* generate TP-SCTS (Service centre timestamp) */ + smsp = msgb_put(msg, 7); + gsm340_gen_scts(smsp, time(NULL)); + + /* generate TP-DT (Discharge time, in TP-SCTS format). */ + smsp = msgb_put(msg, 7); + gsm340_gen_scts(smsp, time(NULL)); + + /* TP-ST (status) */ + smsp = msgb_put(msg, 1); + /* From GSM 03.40, Section 9.2.3.15, 0x00 means OK. */ + *smsp = 0x00; + + LOGP(DLSMS, LOGL_INFO, "sending status report for SMS reference %x\n", +sms->msg_ref); + + return msg->len - old_msg_len; +} + static int sms_route_mt_sms(struct gsm_subscriber_connection *conn, struct gsm_sms *gsms) { @@ -989,8 +1032,13 @@ /* obtain a pointer for the rp_ud_len, so we can fill it later */ rp_ud_len = (uint8_t *)msgb_put(msg, 1); - /* generate the 03.40 SMS-DELIVER TPDU */ - rc = gsm340_gen_sms_deliver_tpdu(msg, sms); + if (sms->is_report) { + /* generate the 03.40 SMS-STATUS-REPORT TPDU */ + rc = gsm340_gen_sms_status_report_tpdu(msg, sms); + } else { + /* generate the 03.40 SMS-DELIVER TPDU */ + rc = gsm340_gen_sms_deliver_tpdu(msg, sms); + } if (rc < 0) { send_signal(S_SMS_UNKNOWN_ERROR, trans, sms, 0); sms_free(sms); diff --git a/openbsc/src/libmsc/smpp_openbsc.c b/openbsc/src/libmsc/smpp_openbsc.c index c0aa89b..85de040 100644 --- a/openbsc/src/libmsc/smpp_openbsc.c +++ b/openbsc/src/libmsc/smpp_openbsc.c @@ -143,6 +143,10 @@ osmo_strlcpy(sms->src.addr, (char *)submit->source_addr, sizeof(sms->src.addr)); + /* This is a Delivery Acknowledgment. */ + if (submit->esm_class == 0x08) + sms->is_report = true; + if (submit->esm_class & 0x40) sms->ud_hdr_ind = 1; -- To view, visit https://gerrit.osmocom.org/3437 To unsubscribe, visit
openbsc[master]: libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03...
Patch Set 4: Verified+1 -- To view, visit https://gerrit.osmocom.org/3437 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: comment Gerrit-Change-Id: Ib70e534840308ed315f7add440351e649de3f907 Gerrit-PatchSet: 4 Gerrit-Project: openbsc Gerrit-Branch: master Gerrit-Owner: Pablo Neira AyusoGerrit-Reviewer: Harald Welte Gerrit-Reviewer: Holger Freyther Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Keith Whyte Gerrit-Reviewer: Neels Hofmeyr Gerrit-Reviewer: Pablo Neira Ayuso Gerrit-HasComments: No
openbsc[master]: libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03...
Patch Set 3: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/3437 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: comment Gerrit-Change-Id: Ib70e534840308ed315f7add440351e649de3f907 Gerrit-PatchSet: 3 Gerrit-Project: openbsc Gerrit-Branch: master Gerrit-Owner: Pablo Neira AyusoGerrit-Reviewer: Harald Welte Gerrit-Reviewer: Holger Freyther Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Keith Whyte Gerrit-Reviewer: Neels Hofmeyr Gerrit-HasComments: No
[PATCH] openbsc[master]: libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03...
Hello Neels Hofmeyr, Harald Welte, Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/3437 to look at the new patch set (#3). libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03.40 status report This patch adds gsm340_sms_send_status_report_tpdu() to build a status-report. Moreover, set sms->report field if we see a SMPP SUBMIT_SM with Delivery Acknowledgment esm_class, so this identifies that this is a delivery report. MSGSM 03.40 SMSC SMPP 3.4 ESME | || | | SUBMIT-SM| | |esm_class = Delivery Ack| | |<---| | | SUBMIT-SM-RESP | | |--->| | || | SMS-STATUS-REPORT || |<|| | GSM 04.11 RP-ACK|| |>|| | || There is a FIXME message in this patch, that I just copied from gsm340_gen_sms_deliver_tpdu() since TP-MMS is not supported by OpenBSC. Change-Id: Ib70e534840308ed315f7add440351e649de3f907 --- M openbsc/src/libmsc/gsm_04_11.c M openbsc/src/libmsc/smpp_openbsc.c 2 files changed, 54 insertions(+), 2 deletions(-) git pull ssh://gerrit.osmocom.org:29418/openbsc refs/changes/37/3437/3 diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c index 0edbe0b..80c3d77 100644 --- a/openbsc/src/libmsc/gsm_04_11.c +++ b/openbsc/src/libmsc/gsm_04_11.c @@ -277,6 +277,49 @@ return msg->len - old_msg_len; } +/* As defined by GSM 03.40, Section 9.2.2.3. */ +static int gsm340_gen_sms_status_report_tpdu(struct msgb *msg, +struct gsm_sms *sms) +{ + unsigned int old_msg_len = msg->len; + uint8_t oa_len = 0; + uint8_t oa[12]; /* max len per 03.40 */ + uint8_t *smsp; + + /* generate first octet with masked bits */ + smsp = msgb_put(msg, 1); + /* TP-MTI (message type indicator) */ + *smsp = GSM340_SMS_STATUS_REP_SC2MS; + /* TP-MMS (more messages to send) */ + if (0 /* FIXME */) + *smsp |= 0x04; + /* TP-MR (message reference) */ + smsp = msgb_put(msg, 1); + *smsp = sms->msg_ref; + /* generate recipient address */ + oa_len = gsm340_gen_oa_sub(oa, sizeof(oa), >dst); + smsp = msgb_put(msg, oa_len); + memcpy(smsp, oa, oa_len); + + /* generate TP-SCTS (Service centre timestamp) */ + smsp = msgb_put(msg, 7); + gsm340_gen_scts(smsp, time(NULL)); + + /* generate TP-DT (Discharge time, in TP-SCTS format). */ + smsp = msgb_put(msg, 7); + gsm340_gen_scts(smsp, time(NULL)); + + /* TP-ST (status) */ + smsp = msgb_put(msg, 1); + /* From GSM 03.40, Section 9.2.3.15, 0x00 means OK. */ + *smsp = 0x00; + + LOGP(DLSMS, LOGL_INFO, "sending status report for SMS reference %x\n", +sms->msg_ref); + + return msg->len - old_msg_len; +} + static int sms_route_mt_sms(struct gsm_subscriber_connection *conn, struct gsm_sms *gsms) { @@ -989,8 +1032,13 @@ /* obtain a pointer for the rp_ud_len, so we can fill it later */ rp_ud_len = (uint8_t *)msgb_put(msg, 1); - /* generate the 03.40 SMS-DELIVER TPDU */ - rc = gsm340_gen_sms_deliver_tpdu(msg, sms); + if (sms->is_report) { + /* generate the 03.40 SMS-STATUS-REPORT TPDU */ + rc = gsm340_gen_sms_status_report_tpdu(msg, sms); + } else { + /* generate the 03.40 SMS-DELIVER TPDU */ + rc = gsm340_gen_sms_deliver_tpdu(msg, sms); + } if (rc < 0) { send_signal(S_SMS_UNKNOWN_ERROR, trans, sms, 0); sms_free(sms); diff --git a/openbsc/src/libmsc/smpp_openbsc.c b/openbsc/src/libmsc/smpp_openbsc.c index c0aa89b..85de040 100644 --- a/openbsc/src/libmsc/smpp_openbsc.c +++ b/openbsc/src/libmsc/smpp_openbsc.c @@ -143,6 +143,10 @@ osmo_strlcpy(sms->src.addr, (char *)submit->source_addr, sizeof(sms->src.addr)); + /* This is a Delivery Acknowledgment. */ + if (submit->esm_class == 0x08) + sms->is_report = true; + if (submit->esm_class & 0x40) sms->ud_hdr_ind = 1; -- To view, visit https://gerrit.osmocom.org/3437 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newpatchset Gerrit-Change-Id:
openbsc[master]: libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03...
Patch Set 2: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/3437 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: comment Gerrit-Change-Id: Ib70e534840308ed315f7add440351e649de3f907 Gerrit-PatchSet: 2 Gerrit-Project: openbsc Gerrit-Branch: master Gerrit-Owner: Pablo Neira AyusoGerrit-Reviewer: Harald Welte Gerrit-Reviewer: Holger Freyther Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Keith Whyte Gerrit-Reviewer: Neels Hofmeyr Gerrit-HasComments: No
openbsc[master]: libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03...
Patch Set 1: (1 comment) https://gerrit.osmocom.org/#/c/3437/1/openbsc/src/libmsc/gsm_04_11.c File openbsc/src/libmsc/gsm_04_11.c: Line 280: /* As defined by GSM 03.40, Section 9.2.2.3. */ > (in comments we usually say "3GPP TS 03.40") actually, we normally say "GSM TS xx.yy" or "3GPP TS xx.yyy", if you really want to make a comment here. But we really shouldn't spend time on such details. The reader will know what is meant. -- To view, visit https://gerrit.osmocom.org/3437 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: comment Gerrit-Change-Id: Ib70e534840308ed315f7add440351e649de3f907 Gerrit-PatchSet: 1 Gerrit-Project: openbsc Gerrit-Branch: master Gerrit-Owner: Pablo Neira AyusoGerrit-Reviewer: Harald Welte Gerrit-Reviewer: Holger Freyther Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Keith Whyte Gerrit-Reviewer: Neels Hofmeyr Gerrit-HasComments: Yes
[PATCH] openbsc[master]: libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03...
Review at https://gerrit.osmocom.org/3437 libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03.40 status report This patch adds gsm340_sms_send_status_report_tpdu() to build a status-report. Moreover, set sms->report field if we see a SMPP SUBMIT_SM with Delivery Acknowledgment esm_class, so this identifies that this is a delivery report. MSGSM 03.40 SMSC SMPP 3.4 ESME | || | | SUBMIT-SM| | |esm_class = Delivery Ack| | |<---| | | SUBMIT-SM-RESP | | |--->| | || | SMS-STATUS-REPORT || |<|| | GSM 04.11 RP-ACK|| |>|| | || There is a FIXME message in this patch, that I just copied from gsm340_gen_sms_deliver_tpdu() since TP-MMS is not supported by OpenBSC. Change-Id: Ib70e534840308ed315f7add440351e649de3f907 --- M openbsc/src/libmsc/gsm_04_11.c M openbsc/src/libmsc/smpp_openbsc.c 2 files changed, 54 insertions(+), 2 deletions(-) git pull ssh://gerrit.osmocom.org:29418/openbsc refs/changes/37/3437/1 diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c index ea80860..a2e002e 100644 --- a/openbsc/src/libmsc/gsm_04_11.c +++ b/openbsc/src/libmsc/gsm_04_11.c @@ -277,6 +277,49 @@ return msg->len - old_msg_len; } +/* As defined by GSM 03.40, Section 9.2.2.3. */ +static int gsm340_gen_sms_status_report_tpdu(struct msgb *msg, +struct gsm_sms *sms) +{ + unsigned int old_msg_len = msg->len; + uint8_t oa_len = 0; + uint8_t oa[12]; /* max len per 03.40 */ + uint8_t *smsp; + + /* generate first octet with masked bits */ + smsp = msgb_put(msg, 1); + /* TP-MTI (message type indicator) */ + *smsp = GSM340_SMS_STATUS_REP_SC2MS; + /* TP-MMS (more messages to send) */ + if (0 /* FIXME */) + *smsp |= 0x04; + /* TP-MR (message reference) */ + smsp = msgb_put(msg, 1); + *smsp = sms->msg_ref; + /* generate recipient address */ + oa_len = gsm340_gen_oa_sub(oa, sizeof(oa), >dst); + smsp = msgb_put(msg, oa_len); + memcpy(smsp, oa, oa_len); + + /* generate TP-SCTS (Service centre timestamp) */ + smsp = msgb_put(msg, 7); + gsm340_gen_scts(smsp, time(NULL)); + + /* generate TP-DT (Discharge time, in TP-SCTS format). */ + smsp = msgb_put(msg, 7); + gsm340_gen_scts(smsp, time(NULL)); + + /* TP-ST (status) */ + smsp = msgb_put(msg, 1); + /* From GSM 03.40, Section 9.2.3.15, 0x00 means OK. */ + *smsp = 0x00; + + LOGP(DLSMS, LOGL_INFO, "sending status report for SMS reference %x\n", +sms->msg_ref); + + return msg->len - old_msg_len; +} + static int sms_route_mt_sms(struct gsm_subscriber_connection *conn, struct gsm_sms *gsms) { @@ -992,8 +1035,13 @@ /* obtain a pointer for the rp_ud_len, so we can fill it later */ rp_ud_len = (uint8_t *)msgb_put(msg, 1); - /* generate the 03.40 SMS-DELIVER TPDU */ - rc = gsm340_gen_sms_deliver_tpdu(msg, sms); + if (sms->report) { + /* generate the 03.40 SMS-STATUS-REPORT TPDU */ + rc = gsm340_gen_sms_status_report_tpdu(msg, sms); + } else { + /* generate the 03.40 SMS-DELIVER TPDU */ + rc = gsm340_gen_sms_deliver_tpdu(msg, sms); + } if (rc < 0) { send_signal(S_SMS_UNKNOWN_ERROR, trans, sms, 0); sms_free(sms); diff --git a/openbsc/src/libmsc/smpp_openbsc.c b/openbsc/src/libmsc/smpp_openbsc.c index 42357e2..32ad30e 100644 --- a/openbsc/src/libmsc/smpp_openbsc.c +++ b/openbsc/src/libmsc/smpp_openbsc.c @@ -143,6 +143,10 @@ osmo_strlcpy(sms->src.addr, (char *)submit->source_addr, sizeof(sms->src.addr)); + /* This is a Delivery Acknowledgment. */ + if (submit->esm_class == 0x08) + sms->report = true; + if (submit->esm_class & 0x40) sms->ud_hdr_ind = 1; -- To view, visit https://gerrit.osmocom.org/3437 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib70e534840308ed315f7add440351e649de3f907 Gerrit-PatchSet: 1 Gerrit-Project: openbsc Gerrit-Branch: master Gerrit-Owner: Pablo Neira Ayuso