|
#define | MIN_SMPP_PDU_LEN (4*4) |
|
#define | MAX_SMPP_PDU_LEN (7424) |
|
#define | DEFAULT_SMSC_ID "def;ault" |
|
#define | OPTIONAL_BEGIN |
|
#define | TLV_INTEGER(name, octets) OCTETS(name, octets) |
|
#define | TLV_NULTERMINATED(name, max_len) OCTETS(name, max_len) |
|
#define | TLV_OCTETS(name, min_len, max_len) OCTETS(name, min_len) |
|
#define | OPTIONAL_END |
|
#define | INTEGER(name, octets) OCTETS(name, octets) |
|
#define | NULTERMINATED(name, max_octets) OCTETS(name, max_octets) |
|
#define | OCTETS(name, field_giving_octetst) |
|
#define | PDU(name, id, fields) |
|
#define | OPTIONAL_BEGIN |
|
#define | TLV_INTEGER(name, octets) p->name = -1; |
|
#define | TLV_NULTERMINATED(name, max_len) p->name = NULL; |
|
#define | TLV_OCTETS(name, min_len, max_len) p->name = NULL; |
|
#define | OPTIONAL_END p->tlv = dict_create(1024, octstr_destroy_item); |
|
#define | INTEGER(name, octets) p->name = 0; |
|
#define | NULTERMINATED(name, max_octets) p->name = NULL; |
|
#define | OCTETS(name, field_giving_octetst) p->name = NULL; |
|
#define | PDU(name, id, fields) |
|
#define | OPTIONAL_BEGIN |
|
#define | TLV_INTEGER(name, octets) p->name = -1; |
|
#define | TLV_NULTERMINATED(name, max_octets) octstr_destroy(p->name); |
|
#define | TLV_OCTETS(name, min_len, max_len) octstr_destroy(p->name); |
|
#define | OPTIONAL_END dict_destroy(p->tlv); |
|
#define | INTEGER(name, octets) p->name = 0; /* Make sure "p" is used */ |
|
#define | NULTERMINATED(name, max_octets) octstr_destroy(p->name); |
|
#define | OCTETS(name, field_giving_octets) octstr_destroy(p->name); |
|
#define | PDU(name, id, fields) case id: { struct name *p = &pdu->u.name; fields } break; |
|
#define | OPTIONAL_BEGIN |
|
#define | TLV_INTEGER(name, octets) |
|
#define | TLV_NULTERMINATED(name, max_len) |
|
#define | TLV_OCTETS(name, min_len, max_len) |
|
#define | OPTIONAL_END |
|
#define | INTEGER(name, octets) p = *(&p); |
|
#define | NULTERMINATED(name, max_octets) p = *(&p); |
|
#define | OCTETS(name, field_giving_octets) p->field_giving_octets = octstr_len(p->name); |
|
#define | PDU(name, id, fields) case id: { struct name *p = &pdu->u.name; fields } break; |
|
#define | TL(name, octets) |
|
#define | OPTIONAL_BEGIN |
|
#define | TLV_INTEGER(name, octets) |
|
#define | TLV_NULTERMINATED(name, max_len) |
|
#define | TLV_OCTETS(name, min_len, max_len) |
|
#define | OPTIONAL_END |
|
#define | INTEGER(name, octets) append_encoded_integer(os, p->name, octets); |
|
#define | NULTERMINATED(name, max_octets) |
|
#define | OCTETS(name, field_giving_octets) if (p->name) octstr_append(os, p->name); |
|
#define | PDU(name, id, fields) case id: { struct name *p = &pdu->u.name; fields } break; |
|
#define | OPTIONAL_BEGIN |
|
#define | TLV_INTEGER(mname, octets) |
|
#define | TLV_NULTERMINATED(mname, max_len) |
|
#define | TLV_OCTETS(mname, min_len, max_len) |
|
#define | OPTIONAL_END |
|
#define | INTEGER(name, octets) |
|
#define | NULTERMINATED(name, max_octets) |
|
#define | OCTETS(name, field_giving_octets) |
|
#define | PDU(name, id, fields) case id: { struct name *p = &pdu->u.name; fields } break; |
|
#define | OPTIONAL_BEGIN |
|
#define | TLV_INTEGER(name, max_len) |
|
#define | TLV_NULTERMINATED(name, max_len) |
|
#define | TLV_OCTETS(name, min_len, max_len) |
|
#define | OPTIONAL_END |
|
#define | INTEGER(name, octets) debug("sms.smpp", 0, " %s: %lu = 0x%08lx", #name, p->name, p->name); |
|
#define | NULTERMINATED(name, max_octets) octstr_dump_short(p->name, 2, #name); |
|
#define | OCTETS(name, field_giving_octets) octstr_dump_short(p->name, 2, #name); |
|
#define | PDU(name, id, fields) case id: { struct name *p = &pdu->u.name; fields } break; |
|
#define | OPTIONAL_BEGIN |
|
#define | TLV_INTEGER(name, max_len) |
|
#define | TLV_NULTERMINATED(name, max_len) |
|
#define | TLV_OCTETS(name, min_len, max_len) |
|
#define | OPTIONAL_END |
|
#define | INTEGER(name, octets) octstr_format_append(str, " [%s:0:0x%08lx]", #name, p->name); |
|
#define | NULTERMINATED(name, max_octets) octstr_format_append(str, " [%s:%d:%E]", #name, octstr_len(p->name), (p->name != NULL ? p->name : octstr_imm("NULL"))); |
|
#define | OCTETS(name, field_giving_octets) octstr_format_append(str, " [%s:%d:%E]", #name, octstr_len(p->name), (p->name != NULL ? p->name : octstr_imm("NULL"))); |
|
#define | PDU(name, id, fields) case id: { struct name *p = &pdu->u.name; fields } break; |
|
Definition at line 911 of file smpp_pdu.c.
References error(), SMPP_ESME_RALYBND, SMPP_ESME_RBCASTCANCELFAIL, SMPP_ESME_RBCASTFAIL, SMPP_ESME_RBCASTQUERYFAIL, SMPP_ESME_RBINDFAIL, SMPP_ESME_RCANCELFAIL, SMPP_ESME_RCNTSUBDL, SMPP_ESME_RDELIVERYFAILURE, SMPP_ESME_RINVBCAST_REP, SMPP_ESME_RINVBCASTALIAS_NAME, SMPP_ESME_RINVBCASTAREAFMT, SMPP_ESME_RINVBCASTCHANIND, SMPP_ESME_RINVBCASTCNTTYPE, SMPP_ESME_RINVBCASTFREQINT, SMPP_ESME_RINVBCASTMSGCLASS, SMPP_ESME_RINVBCASTSRVGRP, SMPP_ESME_RINVBNDSTS, SMPP_ESME_RINVCMDID, SMPP_ESME_RINVCMDLEN, SMPP_ESME_RINVDCS, SMPP_ESME_RINVDESTFLAG, SMPP_ESME_RINVDFTMSGID, SMPP_ESME_RINVDLNAME, SMPP_ESME_RINVDSTADDRSUBUNIT, SMPP_ESME_RINVDSTADR, SMPP_ESME_RINVDSTNPI, SMPP_ESME_RINVDSTTON, SMPP_ESME_RINVESMCLASS, SMPP_ESME_RINVEXPIRY, SMPP_ESME_RINVMSGLEN, SMPP_ESME_RINVNUMBCAST_AREAS, SMPP_ESME_RINVNUMDESTS, SMPP_ESME_RINVNUMMSGS, SMPP_ESME_RINVPASWD, SMPP_ESME_RINVPRTFLG, SMPP_ESME_RINVREGDLVFLG, SMPP_ESME_RINVREPFLAG, SMPP_ESME_RINVSCHED, SMPP_ESME_RINVSERTYP, SMPP_ESME_RINVSRCADDRSUBUNIT, SMPP_ESME_RINVSRCADR, SMPP_ESME_RINVSRCNPI, SMPP_ESME_RINVSRCTON, SMPP_ESME_RINVSUBREP, SMPP_ESME_RINVSYSID, SMPP_ESME_RINVSYSTYP, SMPP_ESME_RINVTLVLEN, SMPP_ESME_RINVTLVSTREAM, SMPP_ESME_RINVTLVVAL, SMPP_ESME_RMISSINGTLV, SMPP_ESME_RMSGQFUL, SMPP_ESME_ROK, SMPP_ESME_RPROHIBITED, SMPP_ESME_RQUERYFAIL, SMPP_ESME_RREPLACEFAIL, SMPP_ESME_RSERTYPDENIED, SMPP_ESME_RSERTYPUNAUTH, SMPP_ESME_RSERTYPUNAVAIL, SMPP_ESME_RSUBMITFAIL, SMPP_ESME_RSYSERR, SMPP_ESME_RTHROTTLED, SMPP_ESME_RTLVNOTALLWD, SMPP_ESME_RUNKNOWNERR, SMPP_ESME_RX_P_APPN, SMPP_ESME_RX_R_APPN, and SMPP_ESME_RX_T_APPN.
Referenced by handle_pdu().
917 return "Message Length is invalid";
919 return "Command Length is invalid";
921 return "Invalid Command ID";
923 return "Incorrect BIND Status for given command";
925 return "ESME Already in Bound State";
927 return "Invalid Priority Flag";
929 return "Invalid Registered Delivery Flag";
931 return "System Error";
933 return "Invalid Source Address";
935 return "Invalid Destination Address";
937 return "Bind Failed";
939 return "Invalid Password";
941 return "Invalid System ID";
943 return "Cancel SM Failed";
945 return "Replace SM Failed";
947 return "Message Queue Full";
949 return "Invalid Service Type";
951 return "Invalid number of destinations";
953 return "Invalid Distribution List Name";
955 return "Destination flag is invalid";
957 return "Submit w/replace not supported/allowed";
959 return "Invalid esm_class field data";
961 return "Cannot Submit to Distribution List";
963 return "Submit failed";
965 return "Invalid Source address TON";
967 return "Invalid Source address NPI";
969 return "Invalid Destination address TON";
971 return "Invalid Destination address NPI";
973 return "Invalid system_type field";
975 return "Invalid replace_if_present flag";
977 return "Invalid number of messages";
979 return "Throttling error";
981 return "Invalid Scheduled Delivery Time";
983 return "Invalid message validity period";
985 return "Predefined Message ID is Invalid or specific predefined message was not found";
987 return "ESME Receiver Temporary App Error Code";
989 return "ESME Receiver Permanent App Error Code";
991 return "ESME Receiver Reject Message Error Code";
993 return "query_sm request failed";
995 return "Error in optional part of the PDU Body";
997 return "TLV not allowed";
999 return "Invalid Parameter Length";
1001 return "Expected TLV missing";
1003 return "Invalid TLV value";
1005 return "Transaction Delivery Failure";
1007 return "Unknown Error";
1009 return "ESME Not authorized to use specified service_type";
1011 return "ESME Prohibited from using specified operation";
1013 return "Specified service_type is unavailable";
1015 return "Specified service_type is denied";
1017 return "Invalid Data Coding Scheme";
1019 return "Source Address Sub unit is invalid";
1021 return "Destination Address Sub unit is invalid";
1023 return "Broadcast Frequency Interval is invalid";
1025 return "Broadcast Alias Name is invalid";
1027 return "Broadcast Area Format is invalid";
1029 return "Number of Broadcast Areas is invalid";
1031 return "Broadcast Content Type is invalid";
1033 return "Broadcast Message Class is invalid";
1035 return "broadcast_sm operation failed";
1037 return "broadcast_query_sm operation failed";
1039 return "broadcast_cancel_sm operation failed";
1041 return "Number of Repeated Broadcasts is invalid";
1043 return "Broadcast Service Group is invalid";
1045 return "Broadcast Channel Indicator is invalid";
1050 return "Vendor-specific error, please refer to your SMPP provider";
1052 return "Unknown/Reserved";
void error(int err, const char *fmt,...)
int smpp_pdu_init |
( |
Cfg * |
cfg | ) |
|
Definition at line 184 of file smpp_pdu.c.
References cfg, cfg_get, cfg_get_integer(), cfg_get_multi_group(), smpp_tlv::constant, debug(), DEFAULT_SMSC_ID, dict_create(), dict_destroy(), dict_get(), dict_put(), dict_put_once(), error(), gwlist_create, gwlist_destroy(), gwlist_extract_first(), gwlist_produce(), initialized, smpp_tlv::length, smpp_tlv::name, octstr_create, octstr_destroy(), octstr_destroy_item(), octstr_format(), octstr_get_cstr, octstr_imm(), octstr_split(), octstr_str_case_compare(), smpp_tlv_destroy(), smpp_tlv::SMPP_TLV_INTEGER, smpp_tlv::SMPP_TLV_NULTERMINATED, smpp_tlv::SMPP_TLV_OCTETS, smsc_id, smpp_tlv::tag, tlvs, tlvs_by_const, tlvs_by_name, tlvs_by_tag, and smpp_tlv::type.
Referenced by init_smppbox(), main(), and smsc2_start().
202 tlv = gw_malloc(
sizeof(*tlv));
204 error(0,
"SMPP: Unable to get name for smpp-tlv.");
210 error(0,
"SMPP: Unable to get tag for smpp-tlv.");
215 error(0,
"SMPP: Unable to get length for smpp-tlv.");
220 error(0,
"SMPP: Unable to get type for smpp-tlv.");
256 if (tmp_dict == NULL) {
269 if (tmp_dict == NULL) {
285 if (tmp_dict == NULL) {
Dict * dict_create(long size_hint, void(*destroy_value)(void *))
void error(int err, const char *fmt,...)
int octstr_str_case_compare(const Octstr *ostr, const char *str)
void dict_put(Dict *dict, Octstr *key, void *value)
void gwlist_produce(List *list, void *item)
#define cfg_get(grp, varname)
static Dict * tlvs_by_name
static void smpp_tlv_destroy(struct smpp_tlv *tlv)
#define octstr_get_cstr(ostr)
static Dict * tlvs_by_tag
Octstr * octstr_imm(const char *cstr)
void * gwlist_extract_first(List *list)
void * dict_get(Dict *dict, Octstr *key)
List * cfg_get_multi_group(Cfg *cfg, Octstr *name)
Octstr * octstr_format(const char *fmt,...)
void octstr_destroy(Octstr *ostr)
#define octstr_create(cstr)
void octstr_destroy_item(void *os)
void dict_destroy(Dict *dict)
static Dict * tlvs_by_const
void debug(const char *place, int err, const char *fmt,...)
int cfg_get_integer(long *n, CfgGroup *grp, Octstr *varname)
int dict_put_once(Dict *dict, Octstr *key, void *value)
List * octstr_split(const Octstr *os, const Octstr *sep)
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition at line 458 of file smpp_pdu.c.
References append_encoded_integer(), error(), gw_assert(), octstr_create, octstr_destroy(), octstr_insert(), octstr_len(), and SMPP_PDU::type.
Referenced by handle_pdu(), send_enquire_link(), send_gnack(), send_pdu(), send_smpp_thread(), send_unbind(), smpp_emu_handle_pdu(), smpp_emu_writer(), and smsc_emu_submit_ack().
471 #define OPTIONAL_BEGIN 472 #define TLV_INTEGER(name, octets) 473 #define TLV_NULTERMINATED(name, max_len) 474 #define TLV_OCTETS(name, min_len, max_len) 476 #define INTEGER(name, octets) p = *(&p); 477 #define NULTERMINATED(name, max_octets) p = *(&p); 478 #define OCTETS(name, field_giving_octets) \ 479 p->field_giving_octets = octstr_len(p->name); 480 #define PDU(name, id, fields) \ 481 case id: { struct name *p = &pdu->u.name; fields } break; 484 error(0,
"Unknown SMPP_PDU type, internal error while packing.");
488 #define TL(name, octets) \ 489 append_encoded_integer(os, SMPP_##name, 2); \ 490 append_encoded_integer(os, octets, 2); 491 #define OPTIONAL_BEGIN 492 #define TLV_INTEGER(name, octets) \ 493 if (p->name >= 0) { \ 495 INTEGER(name, octets) \ 497 #define TLV_NULTERMINATED(name, max_len) \ 498 if (p->name != NULL) { \ 499 TL(name, (octstr_len(p->name) > max_len ? max_len : octstr_len(p->name) + 1)); \ 500 NULTERMINATED(name, max_len) \ 502 #define TLV_OCTETS(name, min_len, max_len) \ 503 if (p->name != NULL) { \ 504 unsigned long len = octstr_len(p->name); \ 505 if (len > max_len || len < min_len) { \ 506 error(0, "SMPP: Optional field (%s) with invalid length (%ld) (should be %d - %d) dropped.", \ 507 #name, len, min_len, max_len);\ 510 octstr_append(os, p->name); \ 513 #define OPTIONAL_END \ 514 if (p->tlv != NULL) { \ 517 struct smpp_tlv *tlv; \ 518 keys = dict_keys(p->tlv); \ 519 while(keys != NULL && (key = gwlist_extract_first(keys)) != NULL) { \ 520 tlv = smpp_tlv_get_by_name(smsc_id, key); \ 522 if (!is_defined_field(pdu->type, octstr_get_cstr(key))) \ 523 error(0, "SMPP: Unknown TLV `%s', don't send.", octstr_get_cstr(key)); \ 524 octstr_destroy(key); \ 527 switch(tlv->type) { \ 528 case SMPP_TLV_INTEGER: { \ 529 long val = atol(octstr_get_cstr(dict_get(p->tlv, key))); \ 530 append_encoded_integer(os, tlv->tag, 2); \ 531 append_encoded_integer(os, tlv->length, 2); \ 532 append_encoded_integer(os, val, tlv->length); \ 535 case SMPP_TLV_OCTETS: \ 536 case SMPP_TLV_NULTERMINATED: { \ 537 Octstr *val = dict_get(p->tlv, key); \ 538 unsigned long len = octstr_len(val); \ 539 if (len > tlv->length) { \ 540 error(0, "SMPP: Optional field (%s) with invalid length (%ld) (should be %ld) dropped.", \ 541 octstr_get_cstr(key), len, tlv->length);\ 542 octstr_destroy(key); \ 545 append_encoded_integer(os, tlv->tag, 2); \ 546 if (tlv->type == SMPP_TLV_NULTERMINATED) \ 547 append_encoded_integer(os, len + 1, 2); \ 549 append_encoded_integer(os, len, 2); \ 550 octstr_append(os, val); \ 551 if (tlv->type == SMPP_TLV_NULTERMINATED) \ 552 octstr_append_char(os, '\0'); \ 556 panic(0, "SMPP: Internal error, unknown configured TLV type %d.", tlv->type); \ 559 octstr_destroy(key); \ 561 gwlist_destroy(keys, octstr_destroy_item); \ 563 #define INTEGER(name, octets) \ 564 append_encoded_integer(os, p->name, octets); 565 #define NULTERMINATED(name, max_octets) \ 566 if (p->name != NULL) { \ 567 if (octstr_len(p->name) >= max_octets) { \ 568 warning(0, "SMPP: PDU element <%s> too long " \ 569 "(length is %ld, should be %d)", \ 570 #name, octstr_len(p->name), max_octets-1); \ 571 temp = octstr_copy(p->name, 0, max_octets-1); \ 573 temp = octstr_duplicate(p->name); \ 574 octstr_append(os, temp); \ 575 octstr_destroy(temp); \ 577 octstr_append_char(os, '\0'); 578 #define OCTETS(name, field_giving_octets) \ 579 if (p->name) octstr_append(os, p->name); 580 #define PDU(name, id, fields) \ 581 case id: { struct name *p = &pdu->u.name; fields } break; 584 error(0,
"Unknown SMPP_PDU type 0x%08lx, internal error while packing.", pdu->
type);
void error(int err, const char *fmt,...)
gw_assert(wtls_machine->packet_to_send !=NULL)
void octstr_insert(Octstr *ostr1, const Octstr *ostr2, long pos)
void octstr_destroy(Octstr *ostr)
#define octstr_create(cstr)
long octstr_len(const Octstr *ostr)
static void append_encoded_integer(Octstr *os, unsigned long u, long octets)