| 
| #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)