Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.org
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@
| SGSAP | 3GPP TS 29.118 v17.0.0 | X | X | | Parameters might be binary decoded (i.e. passthrough) |
| GTPv1-C | 3GPP TS 29.060 v17.3.0 | X | X | | Parameters might be binary decoded (i.e. passthrough) |
| GTPv2-C | 3GPP TS 29.274 v17.7.0 | X | X | | Parameters might be binary decoded (i.e. passthrough) |
| SMPP | SMS Forum SMPP V5.0 | x | x | | Parameters might be binary decoded (i.e. passthrough) |

* Diameter interfaces

Expand Down
1,278 changes: 1,278 additions & 0 deletions doc/smpp.org

Large diffs are not rendered by default.

101 changes: 101 additions & 0 deletions include/smpp.hrl
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
-define(SMPP_CMD_ID_BIND_RECEIVER, 16#00000001).
-define(SMPP_CMD_ID_BIND_TRANSMITTER, 16#00000002).
-define(SMPP_CMD_ID_QUERY_SM, 16#00000003).
-define(SMPP_CMD_ID_SUBMIT_SM, 16#00000004).
-define(SMPP_CMD_ID_DELIVER_SM, 16#00000005).
-define(SMPP_CMD_ID_UNBIND, 16#00000006).
-define(SMPP_CMD_ID_REPLACE_SM, 16#00000007).
-define(SMPP_CMD_ID_CANCEL_SM, 16#00000008).
-define(SMPP_CMD_ID_BIND_TRANSCEIVER, 16#00000009).
-define(SMPP_CMD_ID_OUTBIND, 16#0000000B).
-define(SMPP_CMD_ID_ENQUIRE_LINK, 16#00000015).
-define(SMPP_CMD_ID_SUBMIT_MULTI, 16#00000021).
-define(SMPP_CMD_ID_ALERT_NOTIFICATION, 16#00000102).
-define(SMPP_CMD_ID_DATA_SM, 16#00000103).
-define(SMPP_CMD_ID_BROADCAST_SM, 16#00000111).
-define(SMPP_CMD_ID_QUERY_BROADCAST_SM, 16#00000112).
-define(SMPP_CMD_ID_CANCEL_BROADCAST_SM, 16#00000113).
-define(SMPP_CMD_ID_GENERIC_NACK, 16#80000000).
-define(SMPP_CMD_ID_BIND_RECEIVER_RESP, 16#80000001).
-define(SMPP_CMD_ID_BIND_TRANSMITTER_RESP, 16#80000002).
-define(SMPP_CMD_ID_QUERY_SM_RESP, 16#80000003).
-define(SMPP_CMD_ID_SUBMIT_SM_RESP, 16#80000004).
-define(SMPP_CMD_ID_DELIVER_SM_RESP, 16#80000005).
-define(SMPP_CMD_ID_UNBIND_RESP, 16#80000006).
-define(SMPP_CMD_ID_REPLACE_SM_RESP, 16#80000007).
-define(SMPP_CMD_ID_CANCEL_SM_RESP, 16#80000008).
-define(SMPP_CMD_ID_BIND_TRANSCEIVER_RESP, 16#80000009).
-define(SMPP_CMD_ID_ENQUIRE_LINK_RESP, 16#80000015).
-define(SMPP_CMD_ID_SUBMIT_MULTI_RESP, 16#80000021).
-define(SMPP_CMD_ID_DATA_SM_RESP, 16#80000103).
-define(SMPP_CMD_ID_BROADCAST_SM_RESP, 16#80000111).
-define(SMPP_CMD_ID_QUERY_BROADCAST_SM_RESP, 16#80000112).
-define(SMPP_CMD_ID_CANCEL_BROADCAST_SM_RESP, 16#80000113).

-define(SMPP_CMD_STATUS_ESME_ROK, 16#00000000).
-define(SMPP_CMD_STATUS_ESME_RINVMSGLEN, 16#00000001).
-define(SMPP_CMD_STATUS_ESME_RINVCMDLEN, 16#00000002).
-define(SMPP_CMD_STATUS_ESME_RINVCMDID, 16#00000003).
-define(SMPP_CMD_STATUS_ESME_RINVBNDSTS, 16#00000004).
-define(SMPP_CMD_STATUS_ESME_RALYBND, 16#00000005).
-define(SMPP_CMD_STATUS_ESME_RINVPRTFLG, 16#00000006).
-define(SMPP_CMD_STATUS_ESME_RINVREGDLVFLG, 16#00000007).
-define(SMPP_CMD_STATUS_ESME_RSYSERR, 16#00000008).
-define(SMPP_CMD_STATUS_ESME_RINVSRCADR, 16#0000000A).
-define(SMPP_CMD_STATUS_ESME_RINVDSTADR, 16#0000000B).
-define(SMPP_CMD_STATUS_ESME_RINVMSGID, 16#0000000C).
-define(SMPP_CMD_STATUS_ESME_RBINDFAIL, 16#0000000D).
-define(SMPP_CMD_STATUS_ESME_RINVPASWD, 16#0000000E).
-define(SMPP_CMD_STATUS_ESME_RINVSYSID, 16#0000000F).
-define(SMPP_CMD_STATUS_ESME_RCANCELFAIL, 16#00000011).
-define(SMPP_CMD_STATUS_ESME_RREPLACEFAIL, 16#00000013).
-define(SMPP_CMD_STATUS_ESME_RMSGQFUL, 16#00000014).
-define(SMPP_CMD_STATUS_ESME_RINVSERTYP, 16#00000015).
-define(SMPP_CMD_STATUS_ESME_RINVNUMDESTS, 16#00000033).
-define(SMPP_CMD_STATUS_ESME_RINVDLNAME, 16#00000034).
-define(SMPP_CMD_STATUS_ESME_RINVDESTFLAG, 16#00000040).
-define(SMPP_CMD_STATUS_ESME_RINVSUBREP, 16#00000042).
-define(SMPP_CMD_STATUS_ESME_RINVESMCLASS, 16#00000043).
-define(SMPP_CMD_STATUS_ESME_RCNTSUBDL, 16#00000044).
-define(SMPP_CMD_STATUS_ESME_RSUBMITFAIL, 16#00000045).
-define(SMPP_CMD_STATUS_ESME_RINVSRCTON, 16#00000048).
-define(SMPP_CMD_STATUS_ESME_RINVSRCNPI, 16#00000049).
-define(SMPP_CMD_STATUS_ESME_RINVDSTTON, 16#00000050).
-define(SMPP_CMD_STATUS_ESME_RINVDSTNPI, 16#00000051).
-define(SMPP_CMD_STATUS_ESME_RINVSYSTYP, 16#00000053).
-define(SMPP_CMD_STATUS_ESME_RINVREPFLAG, 16#00000054).
-define(SMPP_CMD_STATUS_ESME_RINVNUMMSGS, 16#00000055).
-define(SMPP_CMD_STATUS_ESME_RTHROTTLED, 16#00000058).
-define(SMPP_CMD_STATUS_ESME_RINVSCHED, 16#00000061).
-define(SMPP_CMD_STATUS_ESME_RINVEXPIRY, 16#00000062).
-define(SMPP_CMD_STATUS_ESME_RINVDFTMSGID, 16#00000063).
-define(SMPP_CMD_STATUS_ESME_RX_T_APPN, 16#00000064).
-define(SMPP_CMD_STATUS_ESME_RX_P_APPN, 16#00000065).
-define(SMPP_CMD_STATUS_ESME_RX_R_APPN, 16#00000066).
-define(SMPP_CMD_STATUS_ESME_RQUERYFAIL, 16#00000067).
-define(SMPP_CMD_STATUS_ESME_RINVTLVSTREAM, 16#000000C0).
-define(SMPP_CMD_STATUS_ESME_RTLVNOTALLWD, 16#000000C1).
-define(SMPP_CMD_STATUS_ESME_RINVTLVLEN, 16#000000C2).
-define(SMPP_CMD_STATUS_ESME_RMISSINGTLV, 16#000000C3).
-define(SMPP_CMD_STATUS_ESME_RINVTLVVAL, 16#000000C4).
-define(SMPP_CMD_STATUS_ESME_RDELIVERYFAILURE, 16#000000FE).
-define(SMPP_CMD_STATUS_ESME_RUNKNOWNERR, 16#000000FF).
-define(SMPP_CMD_STATUS_ESME_RSERTYPUNAUTH, 16#00000100).
-define(SMPP_CMD_STATUS_ESME_RPROHIBITED, 16#00000101).
-define(SMPP_CMD_STATUS_ESME_RSERTYPUNAVAIL, 16#00000102).
-define(SMPP_CMD_STATUS_ESME_RSERTYPDENIED, 16#00000103).
-define(SMPP_CMD_STATUS_ESME_RINVDCS, 16#00000104).
-define(SMPP_CMD_STATUS_ESME_RINVSRCADDRSUBUNIT, 16#00000105).
-define(SMPP_CMD_STATUS_ESME_RINVDSTADDRSUBUNIT, 16#00000106).
-define(SMPP_CMD_STATUS_ESME_RINVBCASTFREQINT, 16#00000107).
-define(SMPP_CMD_STATUS_ESME_RINVBCASTALIAS_NAME, 16#00000108).
-define(SMPP_CMD_STATUS_ESME_RINVBCASTAREAFMT, 16#00000109).
-define(SMPP_CMD_STATUS_ESME_RINVNUMBCAST_AREAS, 16#0000010A).
-define(SMPP_CMD_STATUS_ESME_RINVBCASTCNTTYPE, 16#0000010B).
-define(SMPP_CMD_STATUS_ESME_RINVBCASTMSGCLASS, 16#0000010C).
-define(SMPP_CMD_STATUS_ESME_RBCASTFAIL, 16#0000010D).
-define(SMPP_CMD_STATUS_ESME_RBCASTQUERYFAIL, 16#0000010E).
-define(SMPP_CMD_STATUS_ESME_RBCASTCANCELFAIL, 16#0000010F).
-define(SMPP_CMD_STATUS_ESME_RINVBCAST_REP, 16#00000110).
-define(SMPP_CMD_STATUS_ESME_RINVBCASTSRVGRP, 16#00000111).
-define(SMPP_CMD_STATUS_ESME_RINVBCASTCHANIND, 16#00000112).
124 changes: 124 additions & 0 deletions scripts/smpp_decode_msgs.awk
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
## Help functions ###################
function trim(s){
sub(/^[ \t\r\n]+/, "", s)
sub(/[ \t\r\n]+$/, "", s)
return s
}

function atom(s){
s=trim(tolower(s))
gsub("[()/']", "", s)
gsub("[ -]", "_", s)
if(s ~ /^5.*/) {
s = "'" s "'"
}
return s
}

function atom_to_var(s){
if(substr(s, 1, 3) == "'5g") {
s=substr(s, 4, length(s)-4)
}
split(s, arr, "_")
s=""
for(i = 1; i <= length(arr); i++) {
l=toupper(substr(arr[i], 1, 1)) substr(arr[i], 2)
s=s l
}
return s
}

function field_type(s){
if(s ~ /[iI]nteger/) {
return "integer"
} else if(s ~ /C-Octet String/) {
return "cstring"
} else if(s ~ /Octet String/){
return "string"
} else if(s ~ /TLV/) {
return "tlv"
} else if(s ~ /Composite/) {
return "composite"
} else {
return "unknown("s")"
}

sub(/-/, "", s)
return trim(tolower(s))
}

function hex(s){
sub(/-/, "", s)
return trim(toupper(s))
}

function len(s){
if(index(s, "-")){
split(s, arr, "-")
return sprintf("{%s, %s}", trim(arr[1]), trim(tolower(arr[2])))
} else if(trim(s) == "1/2") {
return "half"
} else {
return trim(s)
}
}

## Execution ###################

BEGIN {

}

/^\* 4 SMPP PDU/ {
section=1;
}
/^\* 4.8 PDU/ {
section=0;
}
!section {
next;
}

/\*\*\* 4[^ ]+/ {
msg=$3;
FS="|";
next;
}

/^\| sequence_number/ && !start {
start=1;
next;
}

/^$/ && start {
start=0;
params=substr(params, 26, length(params)-27)
if(params != "") {
params=sprintf("%s\n%-24s", params, " ");
}
fun=sprintf("decode_msg(#{command := %s}, Bin) ->\n AllowedParameters = [%s],\n decode_parameters(AllowedParameters, Bin);", msg, params);
msg="";
params="";
print fun;
FS=" ";
next;
}

start {
field=atom(trim($2));
size=trim($3);
type=field_type(trim($4));
if(field == "sm_length") {
# no need for the short_message field
next;
}
if(type == "tlv" && size == "-") {
size="undefined";
} else {
size=len(size);
}
params=params sprintf("%-25s{%s, %s, %s},\n", " ", field, size, type);
}

END {
}
10 changes: 7 additions & 3 deletions src/otc.erl
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@
nas_5gs_5gsm/1,
gtpv1c/1,
gtpv2c/1,
sgsap/1
sgsap/1,
smpp/1
]).

%% General functions
Expand All @@ -80,7 +81,7 @@

-type protocol() :: sctp_ppi | sctp | m3ua | m2pa | mtp3 | sccp | sccp_mgmt | tcap | map
| nas_eps | nas_eps_emm | nas_eps_esm
| gtpv1c | gtpv2c | sgsap.
| gtpv1c | gtpv2c | sgsap | smpp.

callback_module(sctp_ppi) -> otc_sctp_ppi;
callback_module(sctp) -> otc_sctp;
Expand All @@ -99,7 +100,8 @@ callback_module(nas_5gs_5gmm) -> otc_nas_5gs_5gmm;
callback_module(nas_5gs_5gsm) -> otc_nas_5gs_5gsm;
callback_module(gtpv1c) -> otc_gtpv1c;
callback_module(gtpv2c) -> otc_gtpv2c;
callback_module(sgsap) -> otc_sgsap.
callback_module(sgsap) -> otc_sgsap;
callback_module(smpp) -> otc_smpp.

sctp_ppi(PPI) -> sctp_ppi(PPI, #{}).
sctp(D) -> sctp(D, #{}).
Expand All @@ -119,6 +121,7 @@ nas_5gs_5gsm(D) -> nas_5gs_5gsm(D, #{}).
gtpv1c(D) -> gtpv1c(D, #{}).
gtpv2c(D) -> gtpv2c(D, #{}).
sgsap(D) -> sgsap(D, #{}).
smpp(D) -> smpp(D, #{}).

sctp_ppi(PPI, Opts) -> otc_sctp_ppi:codec(PPI, Opts).
sctp(D, Opts) -> otc_sctp:codec(D, Opts).
Expand All @@ -138,6 +141,7 @@ nas_5gs_5gsm(D, Opts) -> otc_nas_5gs_5gsm:codec(D, Opts).
gtpv1c(D, Opts) -> otc_gtpv1c:codec(D, Opts).
gtpv2c(D, Opts) -> otc_gtpv2c:codec(D, Opts).
sgsap(D, Opts) -> otc_sgsap:codec(D, Opts).
smpp(D, Opts) -> otc_smpp:codec(D, Opts).

%% General functions -----------------------------------------------------------

Expand Down
Loading