[MERGED] openbsc[master]: libmsc: handle delivery ack via SMPP SUBMIT SM / send GSM 03...

2017-08-09 Thread Pablo Neira Ayuso
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...

2017-08-09 Thread Pablo Neira Ayuso

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 Ayuso 
Gerrit-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...

2017-08-09 Thread Harald Welte

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 Ayuso 
Gerrit-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...

2017-08-09 Thread Pablo Neira Ayuso
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...

2017-08-09 Thread Harald Welte

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 Ayuso 
Gerrit-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...

2017-08-09 Thread Harald Welte

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 Ayuso 
Gerrit-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...

2017-08-08 Thread Pablo Neira Ayuso

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