My previous patch was wrong, attached one should fix it...
Alexander Malysh schrieb:
Hi Alex,
seems your patch has a one issue:
+ 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); \
you put Spec defined TLV name into dictionary instead of user configured .
And I found a way to have smaller patch todo it ;)
How about this one?
diff --git a/gw/smsc/smpp_pdu.c b/gw/smsc/smpp_pdu.c
index 2a46e88..cd38f22 100644
--- a/gw/smsc/smpp_pdu.c
+++ b/gw/smsc/smpp_pdu.c
@@ -491,7 +491,8 @@ SMPP_PDU *smpp_pdu_unpack(Octstr *data_without_len)
pos += opt_len; \
} else
#define OPTIONAL_END \
- { \
+ {;}\
+ do { \
Octstr *val = NULL; \
struct smpp_tlv *tlv; \
Octstr *tmp = octstr_format("%ld", opt_tag); \
@@ -543,7 +544,7 @@ SMPP_PDU *smpp_pdu_unpack(Octstr *data_without_len)
octstr_destroy(val); \
pos += opt_len; \
} \
- } \
+ } while(0); \
} \
}
#define INTEGER(name, octets) \
Thanks,
Alex
Alejandro Guerrieri schrieb:
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]
diff --git a/gw/smsc/smpp_pdu.c b/gw/smsc/smpp_pdu.c
index 2a46e88..513150d 100644
--- a/gw/smsc/smpp_pdu.c
+++ b/gw/smsc/smpp_pdu.c
@@ -491,6 +491,7 @@ SMPP_PDU *smpp_pdu_unpack(Octstr *data_without_len)
pos += opt_len; \
} else
#define OPTIONAL_END \
+ {;}\
{ \
Octstr *val = NULL; \
struct smpp_tlv *tlv; \
@@ -532,17 +533,18 @@ SMPP_PDU *smpp_pdu_unpack(Octstr *data_without_len)
panic(0, "SMPP: Internal error, unknown configured
TLV type %d.", tlv->type); \
break; \
} \
- } else { \
- val = octstr_copy(data_without_len, pos, opt_len); \
- if (val) \
- octstr_binary_to_hex(val, 0); \
- else \
- val = octstr_create(""); \
- warning(0, "SMPP: Unknown TLV(0x%04lx,0x%04lx,%s) for
PDU type (%s) received!", \
- opt_tag, opt_len, octstr_get_cstr(val),
pdu->type_name); \
- octstr_destroy(val); \
- pos += opt_len; \
+ /* go to the next TLV */ \
+ continue; \
} \
+ val = octstr_copy(data_without_len, pos, opt_len); \
+ if (val) \
+ octstr_binary_to_hex(val, 0); \
+ else \
+ val = octstr_create(""); \
+ warning(0, "SMPP: Unknown TLV(0x%04lx,0x%04lx,%s) for PDU
type (%s) received!", \
+ opt_tag, opt_len, octstr_get_cstr(val),
pdu->type_name); \
+ octstr_destroy(val); \
+ pos += opt_len; \
} \
} \
}