Re: [PATCH] Get all available TLV's as Meta-Data
Alejandro Guerrieri <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
Alex, Done. Please check the attached patch. There's still the issue regarding the "message_id" param on submit_sm_resp / data_sm_resp. The new match by tag method voids the option of using the same filtering mechanism mentioned on my previous, mail since it would require a match by name (or inventing a tag address for message_id, which is not an option IMHO). Since it's not a TLV, does it make sense to add it to meta-data, or maybe exploring other ways to be able to retrieve it? Maybe a special % param or a conf directive like "smsc-message-id-into-meta-data" on the smpp group. Do you have any other ideas about how to achieve this? Regards, -- Alejandro Guerrieri [email protected] El 26/11/2008, a las 06:43 a.m., Alexander Malysh escribió: > Hi Alex, > > great!!! :) > > Could you please change this patch to use dictionary tlv_by_tag > because the name of configured TLV may be different of the one in > SMPP spec. but the tag will be equal. I think it's up to user which > name configured TLV should use. > > And minor issue: please always make patches from gateway root > directory with cvs diff -Nau. > > Thanks, > Alex > > Alejandro Guerrieri schrieb: >> Hi, >> This patch allows meta-data to carry all available TLV's not only >> the User-Defined. >> All TLV's defined on smpp_pdu.def were "hijacked" by the main pdu >> structure, so they never reached the tlv dictionary. What this >> patch does is to check for defined TLV's on the smpp-tlv group and >> copy them to the tlv dictionary. Those TLV's are then available on >> the meta-data parameter. >> It only copies the TLV's explicitly defined, otherwise the meta- >> data parameter would be unnecessary cluttered with all available >> TLV's. >> This solves the "receipted_message_id" issue with deliver_sm (to >> name one), but does _not_ solve the "message_id" param on submit/ >> deliver/data_sm_response, since message_id is not a TLV. >> For that parameter I could add a call for meta_data_set_value to >> inject it into the meta data (already tried and works), but then it >> would be always available. >> To avoid this, I could use the same filtering mechanism as with the >> TLV's, but that would mean defining a dummy tag address, since this >> is not a TLV so it doesn't have a documented address. I could >> filter using tag_by_name, so the address wouldn't matter anyways, >> but it's somewhat ugly imho. >> Ideas? Opinions? >> Regards, >> -- >> Alejandro Guerrieri >> [email protected] > >
meta_data_extra_tlvs_v2.diff
(application/octet-stream, 2.6 KB)
Index: gw/smsc/smpp_pdu.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc/smpp_pdu.c,v
retrieving revision 1.28.2.2
diff -a -u -r1.28.2.2 smpp_pdu.c
--- gw/smsc/smpp_pdu.c 24 Jan 2008 16:47:04 -0000 1.28.2.2
+++ gw/smsc/smpp_pdu.c 27 Nov 2008 02:44:39 -0000
@@ -467,6 +467,15 @@
continue; \
} \
INTEGER(name, opt_len); \
+ Octstr *tmptag = octstr_format("%d", opt_tag); \
+ struct smpp_tlv *tlv = dict_get(tlv_by_tag, tmptag); \
+ if (tlv != NULL) {\
+ Octstr *tmpname = octstr_create(#name); \
+ Octstr *val = octstr_format("%ld", p->name); \
+ dict_put(p->tlv, tmpname, val); \
+ octstr_destroy(tmpname); \
+ } \
+ octstr_destroy(tmptag); \
} else
#define TLV_NULTERMINATED(name, max_len) \
if (SMPP_##name == opt_tag) { \
@@ -477,6 +486,15 @@
continue; \
} \
copy_until_nul(#name, data_without_len, &pos, opt_len, &p->name); \
+ Octstr *tmptag = octstr_format("%d", opt_tag); \
+ struct smpp_tlv *tlv = dict_get(tlv_by_tag, tmptag); \
+ if (tlv != NULL) {\
+ Octstr *tmpname = octstr_create(#name); \
+ Octstr *val = octstr_duplicate(p->name); \
+ dict_put(p->tlv, tmpname, val); \
+ octstr_destroy(tmpname); \
+ } \
+ octstr_destroy(tmptag); \
} else
#define TLV_OCTETS(name, min_len, max_len) \
if (SMPP_##name == opt_tag) { \
@@ -488,6 +506,15 @@
continue; \
} \
p->name = octstr_copy(data_without_len, pos, opt_len); \
+ Octstr *tmptag = octstr_format("%d", opt_tag); \
+ struct smpp_tlv *tlv = dict_get(tlv_by_tag, tmptag); \
+ if (tlv != NULL) {\
+ Octstr *tmpname = octstr_create(#name); \
+ Octstr *val = octstr_duplicate(p->name); \
+ dict_put(p->tlv, tmpname, val); \
+ octstr_destroy(tmpname); \
+ } \
+ octstr_destroy(tmptag); \
pos += opt_len; \
} else
#define OPTIONAL_END \