Dear list,
Hi,
Here are the diffs for my patch against the latest CVS.
This adds support for 4 outgoing TLV's:
mas_app_id 0x1401
mas_svc_id 0x1402
mas_cont_id 0x1403
mas_cont_desc 0x1404
All are Octstr w/length 255.
This TLV's were needed for a south american operator. They are used
for billing purposes on a dedicated SMPP link: Each time we want to
bill a customer, we must send a message using that special SMPP link
and set this TLV's. mas_app_id is a special code assigned to each VAS,
mas_svc_id identifies the type of content (ringtones, wallpapers,
etc), mas_cont_id identifies our content-id and mas_content_desc
describes the content (song name for example).
To add the TLV's to an MT message, you should add the parameters
mas-app-id, mas-svc-id, mas-cont-id and mas-cont-desc into the sendsms
interface. I've (theoretically) added support for the HTTP HEADERS and
XML interfaces, but didn't really tested it (though it should work).
This is already in production on our servers and doing fine. It's my
first code contribution to the list, so please let me know if I've
made any mistakes in building the diffs.
I hope this helps anyone wishing to add some TLV's on outgoing messages.
Hope it helps.
Alejandro.
--- gateway/gw/msg-decl.h 2005-11-08 17:31:02.000000000 -0300
+++ gateway-ajg/gw/msg-decl.h 2006-02-20 16:09:39.000000000 -0300
@@ -106,8 +106,12 @@
INTEGER(msg_left);
VOID(split_parts);
INTEGER(priority);
- INTEGER(resend_try);
- INTEGER(resend_time);
+ INTEGER(resend_try);
+ INTEGER(resend_time);
+ OCTSTR(mas_app_id);
+ OCTSTR(mas_svc_id);
+ OCTSTR(mas_cont_id);
+ OCTSTR(mas_cont_desc);
})
MSG(ack,
--- gateway/gw/smsbox.c 2005-12-08 23:14:31.000000000 -0300
+++ gateway-ajg/gw/smsbox.c 2006-02-20 19:46:50.000000000 -0300
@@ -502,7 +502,9 @@
int *validity, int *deferred,
int *dlr_mask, Octstr **dlr_url,
Octstr **account, int *pid, int *alt_dcs,
- int *rpi, Octstr **binfo, int *priority)
+ int *rpi, Octstr **binfo, int *priority,
+ Octstr
**mas_app_id, Octstr **mas_svc_id,
+ Octstr
**mas_cont_id, Octstr **mas_cont_desc)
{
Octstr *name, *val;
long l;
@@ -559,6 +561,22 @@
*binfo = octstr_duplicate(val);
octstr_strip_blanks(*binfo);
}
+ else if (octstr_case_compare(name,
octstr_imm("X-Kannel-MASAppId")) == 0) {
+ *mas_app_id = octstr_duplicate(val);
+ octstr_strip_blanks(*mas_app_id);
+ }
+ else if (octstr_case_compare(name,
octstr_imm("X-Kannel-MASSvcId")) == 0) {
+ *mas_svc_id = octstr_duplicate(val);
+ octstr_strip_blanks(*mas_svc_id);
+ }
+ else if (octstr_case_compare(name,
octstr_imm("X-Kannel-MASContId")) == 0) {
+ *mas_cont_id = octstr_duplicate(val);
+ octstr_strip_blanks(*mas_cont_id);
+ }
+ else if (octstr_case_compare(name,
octstr_imm("X-Kannel-MASContDesc")) == 0) {
+ *mas_cont_desc = octstr_duplicate(val);
+ octstr_strip_blanks(*mas_cont_desc);
+ }
else if (octstr_case_compare(name, octstr_imm("X-Kannel-Coding")) == 0) {
sscanf(octstr_get_cstr(val),"%d", coding);
}
@@ -648,9 +666,10 @@
int *dlr_mask, Octstr **dlr_url,
Octstr **account, int *pid, int *alt_dcs,
int *rpi, List **tolist, Octstr **charset,
- Octstr **binfo, int *priority)
-{
-
+ Octstr **binfo, int *priority,
+
Octstr **mas_app_id, Octstr **mas_svc_id,
+
Octstr **mas_cont_id, Octstr **mas_cont_desc)
+{
Octstr *text, *tmp, *tmp2;
long tmplong, where;
@@ -677,6 +696,12 @@
/* binfo */
get_tag(tmp, octstr_imm("binfo"), binfo, 0, 0);
+ /* Additional TLV's */
+ get_tag(tmp, octstr_imm("mas_app_id"), mas_app_id, 0, 0);
+ get_tag(tmp, octstr_imm("mas_svc_id"), mas_svc_id, 0, 0);
+ get_tag(tmp, octstr_imm("mas_cont_id"), mas_cont_id, 0, 0);
+ get_tag(tmp, octstr_imm("mas_cont_desc"), mas_cont_desc, 0, 0);
+
O_DESTROY(tmp);
}
@@ -862,7 +887,9 @@
int validity, int deferred,
Octstr *dlr_url, int dlr_mask, int pid, int alt_dcs,
int rpi, Octstr *smsc, Octstr *account,
- Octstr *charset, Octstr *binfo, int priority)
+ Octstr *charset, Octstr *binfo, int priority,
+ Octstr *mas_app_id, Octstr *mas_svc_id,
+ Octstr *mas_cont_id, Octstr *mas_cont_desc)
{
msg->sms.msgdata = replytext;
msg->sms.time = time(NULL);
@@ -1014,6 +1041,46 @@
}
}
+ if (mas_app_id) {
+ if (urltrans_accept_x_kannel_headers(trans)) {
+ msg->sms.mas_app_id = mas_app_id;
+ } else {
+ warning(0, "Tried to change mas_app_id to '%s', denied.",
+ octstr_get_cstr(mas_app_id));
+ octstr_destroy(mas_app_id);
+ }
+ }
+
+ if (mas_svc_id) {
+ if (urltrans_accept_x_kannel_headers(trans)) {
+ msg->sms.mas_svc_id = mas_svc_id;
+ } else {
+ warning(0, "Tried to change mas_svc_id to '%s', denied.",
+ octstr_get_cstr(mas_svc_id));
+ octstr_destroy(mas_svc_id);
+ }
+ }
+
+ if (mas_cont_id) {
+ if (urltrans_accept_x_kannel_headers(trans)) {
+ msg->sms.mas_app_id = mas_cont_id;
+ } else {
+ warning(0, "Tried to change mas_cont_id to '%s', denied.",
+ octstr_get_cstr(mas_cont_id));
+ octstr_destroy(mas_cont_id);
+ }
+ }
+
+ if (mas_cont_desc) {
+ if (urltrans_accept_x_kannel_headers(trans)) {
+ msg->sms.mas_app_id = mas_cont_desc;
+ } else {
+ warning(0, "Tried to change mas_cont_desc to '%s', denied.",
+ octstr_get_cstr(mas_cont_desc));
+ octstr_destroy(mas_cont_desc);
+ }
+ }
+
if (priority != SMS_PARAM_UNDEFINED) {
if (urltrans_accept_x_kannel_headers(trans))
msg->sms.priority = priority;
@@ -1095,7 +1162,7 @@
unsigned int queued; /* indicate if processes reply is requeued */
Octstr *reply_body, *charset;
- Octstr *udh, *from, *to, *dlr_url, *account, *smsc, *binfo;
+ Octstr *udh, *from, *to, *dlr_url, *account, *smsc, *binfo,
*mas_app_id, *mas_svc_id, *mas_cont_id, *mas_cont_desc;
int dlr_mask, mclass, mwi, coding, compress, pid, alt_dcs, rpi;
int validity, deferred, priority;
@@ -1114,6 +1181,7 @@
octets = 0;
from = to = udh = smsc = dlr_url = account = binfo = charset = NULL;
+ mas_app_id = mas_svc_id = mas_cont_id
= mas_cont_desc = NULL;
mclass = mwi = coding = compress = pid = alt_dcs = rpi = dlr_mask
= validity = deferred = priority = SMS_PARAM_UNDEFINED;
@@ -1133,7 +1201,8 @@
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
&account, &pid, &alt_dcs, &rpi,
- &binfo, &priority);
+ &binfo, &priority, &mas_app_id,
+ &mas_svc_id,
&mas_cont_id, &mas_cont_desc);
} else if (octstr_case_compare(type, text_plain) == 0) {
replytext = octstr_duplicate(reply_body);
octstr_destroy(reply_body);
@@ -1143,7 +1212,8 @@
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
&account, &pid, &alt_dcs, &rpi,
- &binfo, &priority);
+ &binfo, &priority, &mas_app_id,
+ &mas_svc_id,
&mas_cont_id, &mas_cont_desc);
} else if (octstr_case_compare(type, text_xml) == 0) {
replytext = octstr_duplicate(reply_body);
octstr_destroy(reply_body);
@@ -1152,7 +1222,8 @@
&from, &to, &udh, NULL, NULL, &smsc, &mclass, &mwi,
&coding, &compress, &validity, &deferred, &dlr_mask,
&dlr_url, &account, &pid, &alt_dcs, &rpi,
NULL, &charset,
- &binfo, &priority);
+ &binfo, &priority, &mas_app_id, &mas_svc_id,
+
&mas_cont_id, &mas_cont_desc);
} else if (octstr_case_compare(type, octet_stream) == 0) {
replytext = octstr_duplicate(reply_body);
octstr_destroy(reply_body);
@@ -1163,7 +1234,8 @@
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
&account, &pid, &alt_dcs, &rpi,
- &binfo, &priority);
+ &binfo, &priority, &mas_app_id,
+ &mas_svc_id,
&mas_cont_id, &mas_cont_desc);
} else {
replytext = octstr_duplicate(reply_couldnotrepresent);
}
@@ -1183,7 +1255,7 @@
fill_message(msg, trans, replytext, octets, from, to, udh, mclass,
mwi, coding, compress, validity, deferred, dlr_url,
dlr_mask, pid, alt_dcs, rpi, smsc, account, charset,
- binfo, priority);
+ binfo, priority, mas_app_id, mas_svc_id, mas_cont_id,
mas_cont_desc);
if (final_url == NULL)
final_url = octstr_imm("");
@@ -1965,8 +2037,10 @@
int validity, int deferred,
int *status, int dlr_mask, Octstr *dlr_url,
Octstr *account, int pid, int alt_dcs, int rpi,
- List *receiver, Octstr *binfo, int priority)
-{
+ List *receiver, Octstr *binfo, int priority,
+ Octstr *mas_app_id, Octstr *mas_svc_id,
+ Octstr *mas_cont_id, Octstr *mas_cont_desc)
+{
Msg *msg = NULL;
Octstr *newfrom, *returnerror, *receiv;
List *failed_id, *allowed, *denied;
@@ -2152,6 +2226,14 @@
if (octstr_len(binfo))
msg->sms.binfo = octstr_duplicate(binfo);
+ if (octstr_len(mas_app_id))
+ msg->sms.mas_app_id = octstr_duplicate(mas_app_id);
+ if (octstr_len(mas_svc_id))
+ msg->sms.mas_svc_id = octstr_duplicate(mas_svc_id);
+ if (octstr_len(mas_cont_id))
+ msg->sms.mas_cont_id = octstr_duplicate(mas_cont_id);
+ if (octstr_len(mas_cont_desc))
+ msg->sms.mas_cont_desc = octstr_duplicate(mas_cont_desc);
if(octstr_len(dlr_url)) {
if(octstr_len(dlr_url) < 8) { /* http(s):// */
@@ -2476,10 +2558,13 @@
Octstr *tmp_string;
Octstr *from, *to, *charset, *text, *udh, *smsc, *dlr_url, *account;
Octstr *binfo;
+ Octstr *mas_app_id, *mas_svc_id, *mas_cont_id, *mas_cont_desc;
int dlr_mask, mclass, mwi, coding, compress, validity, deferred, pid;
int alt_dcs, rpi, priority;
from = to = udh = text = smsc = account = dlr_url = charset = binfo = NULL;
+ mas_app_id = mas_svc_id = mas_cont_id = mas_cont_desc = NULL;
+
mclass = mwi = coding = compress = validity = deferred = dlr_mask =
pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
@@ -2498,6 +2583,11 @@
to = http_cgi_variable(args, "to");
account = http_cgi_variable(args, "account");
binfo = http_cgi_variable(args, "binfo");
+ mas_app_id = http_cgi_variable(args, "mas-app-id");
+ mas_svc_id = http_cgi_variable(args, "mas-svc-id");
+ mas_cont_id = http_cgi_variable(args, "mas-cont-id");
+ mas_cont_desc = http_cgi_variable(args, "mas-cont-desc");
+
dlr_url = http_cgi_variable(args, "dlr-url");
if(dlr_url == NULL) { /* deprecated dlrurl without "-" */
dlr_url = http_cgi_variable(args, "dlrurl");
@@ -2552,7 +2642,7 @@
tmp_string = http_cgi_variable(args, "priority");
if(tmp_string != NULL)
sscanf(octstr_get_cstr(tmp_string),"%d", &priority);
-
+
/*
* we required "to" to be defined
*/
@@ -2571,7 +2661,8 @@
return smsbox_req_handle(t, client_ip, stored_uuid, from, to,
text, charset, udh,
smsc, mclass, mwi, coding, compress, validity,
deferred, status, dlr_mask, dlr_url, account,
- pid, alt_dcs, rpi, NULL, binfo, priority);
+ pid, alt_dcs, rpi, NULL, binfo, priority,
+ mas_app_id, mas_svc_id,
mas_cont_id, mas_cont_desc);
}
@@ -2590,6 +2681,7 @@
Octstr *text_html, *text_plain, *text_wml, *text_xml, *octet_stream;
Octstr *text;
Octstr *from, *to, *udh, *smsc, *charset, *dlr_url, *account, *binfo;
+ Octstr *mas_app_id, *mas_svc_id, *mas_cont_id, *mas_cont_desc;
int dlr_mask, mclass, mwi, coding, compress, validity, deferred;
int pid, alt_dcs, rpi, priority;
@@ -2617,7 +2709,8 @@
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
&account, &pid, &alt_dcs, &rpi,
- &binfo, &priority);
+ &binfo, &priority, &mas_app_id,
+ &mas_svc_id, &mas_cont_id,
&mas_cont_desc);
} else if (octstr_case_compare(type, text_plain) == 0 ||
octstr_case_compare(type, octet_stream) == 0) {
get_x_kannel_from_headers(headers, &from, &to, &udh,
@@ -2625,13 +2718,16 @@
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
&account, &pid, &alt_dcs, &rpi,
- &binfo, &priority);
+ &binfo, &priority, &mas_app_id,
+ &mas_svc_id, &mas_cont_id,
&mas_cont_desc);
} else if (octstr_case_compare(type, text_xml) == 0) {
get_x_kannel_from_xml(mt_push, &type, &body, headers,
- &from, &to, &udh, &user, &pass, &smsc, &mclass,
+ &from, &to, &udh, &user, &pass, &smsc, &mclass,
&mwi, &coding, &compress, &validity, &deferred,
&dlr_mask, &dlr_url, &account, &pid, &alt_dcs,
- &rpi, &tolist, &charset, &binfo, &priority);
+ &rpi, &tolist, &charset, &binfo, &priority,
+ &mas_app_id,
&mas_svc_id, &mas_cont_id,
+ &mas_cont_desc);
} else {
*status = HTTP_BAD_REQUEST;
ret = octstr_create("Invalid content-type");
@@ -2682,7 +2778,7 @@
udh, smsc, mclass, mwi, coding, compress,
validity, deferred, status, dlr_mask,
dlr_url, account, pid, alt_dcs, rpi, tolist,
- binfo, priority);
+ binfo, priority, mas_app_id,
mas_svc_id, mas_cont_id, mas_cont_desc);
}
error2:
@@ -2695,6 +2791,10 @@
octstr_destroy(dlr_url);
octstr_destroy(account);
octstr_destroy(binfo);
+ octstr_destroy(mas_app_id);
+ octstr_destroy(mas_svc_id);
+ octstr_destroy(mas_cont_id);
+ octstr_destroy(mas_cont_desc);
error:
octstr_destroy(type);
octstr_destroy(charset);
--- gateway/gw/smsc/smsc_smpp.c 2006-02-07 11:54:44.000000000 -0300
+++ gateway-ajg/gw/smsc/smsc_smpp.c 2006-02-27 22:05:11.491649160 -0300
@@ -753,6 +753,15 @@
pdu->u.submit_sm.source_addr_npi = GSM_ADDR_NPI_E164; /* ISDN
number plan */
}
+ if (octstr_len(msg->sms.mas_app_id))
+ pdu->u.submit_sm.mas_app_id =
octstr_duplicate(msg->sms.mas_app_id);
+ if (octstr_len(msg->sms.mas_svc_id))
+ pdu->u.submit_sm.mas_svc_id =
octstr_duplicate(msg->sms.mas_svc_id);
+ if (octstr_len(msg->sms.mas_cont_id))
+ pdu->u.submit_sm.mas_cont_id =
octstr_duplicate(msg->sms.mas_cont_id);
+ if (octstr_len(msg->sms.mas_cont_desc))
+ pdu->u.submit_sm.mas_cont_desc =
octstr_duplicate(msg->sms.mas_cont_desc);
+
if (smpp->autodetect_addr) {
/* lets see if its international or alphanumeric sender */
if (octstr_get_char(pdu->u.submit_sm.source_addr, 0) == '+') {
--- gateway/gw/smsc/smpp_pdu.def 2005-02-11 12:35:48.000000000 -0300
+++ gateway-ajg/gw/smsc/smpp_pdu.def 2006-02-20 17:33:41.000000000 -0300
@@ -253,6 +253,10 @@
TLV_INTEGER(its_reply_type, 1)
TLV_OCTETS(its_session_info, 2, 2)
TLV_OCTETS(ussd_service_op, 1, 1)
+ TLV_NULTERMINATED(mas_app_id, 255)
+ TLV_NULTERMINATED(mas_svc_id, 255)
+ TLV_NULTERMINATED(mas_cont_id, 255)
+ TLV_NULTERMINATED(mas_cont_desc, 255)
OPTIONAL_END
)
@@ -305,6 +309,10 @@
TLV_INTEGER(ms_msg_wait_facilities, 1)
TLV_INTEGER(alert_on_message_delivery, 0)
TLV_INTEGER(language_indicator, 1)
+ TLV_NULTERMINATED(mas_app_id, 255)
+ TLV_NULTERMINATED(mas_svc_id, 255)
+ TLV_NULTERMINATED(mas_cont_id, 255)
+ TLV_NULTERMINATED(mas_cont_desc, 255)
OPTIONAL_END
)
@@ -355,6 +363,10 @@
TLV_OCTETS(network_error_code, 3, 3)
TLV_INTEGER(message_state, 1)
TLV_NULTERMINATED(receipted_message_id, 65)
+ TLV_NULTERMINATED(mas_app_id, 255)
+ TLV_NULTERMINATED(mas_svc_id, 255)
+ TLV_NULTERMINATED(mas_cont_id, 255)
+ TLV_NULTERMINATED(mas_cont_desc, 255)
OPTIONAL_END
)
@@ -416,6 +428,10 @@
TLV_INTEGER(language_indicator, 1)
TLV_INTEGER(its_reply_type, 1)
TLV_OCTETS(its_session_info, 2, 2)
+ TLV_NULTERMINATED(mas_app_id, 255)
+ TLV_NULTERMINATED(mas_svc_id, 255)
+ TLV_NULTERMINATED(mas_cont_id, 255)
+ TLV_NULTERMINATED(mas_cont_desc, 255)
OPTIONAL_END
)
--- gateway/gw/smsc/smpp_pdu_opt.def 2005-02-11 12:35:48.000000000 -0300
+++ gateway-ajg/gw/smsc/smpp_pdu_opt.def 2006-02-20
14:42:20.000000000 -0300
@@ -105,6 +105,10 @@
#define SMPP_alert_on_message_delivery 0x130C
#define SMPP_its_reply_type 0x1380
#define SMPP_its_session_info 0x1383
+#define SMPP_mas_app_id 0x1401
+#define SMPP_mas_svc_id 0x1402
+#define SMPP_mas_cont_id 0x1403
+#define SMPP_mas_cont_desc 0x1404
#endif
--
Alejandro Guerrieri
Magicom
http://www.magicom-bcn.net/