Fw: Re: catenate the ff fe prefix in UTF-16 encoded octstr and swapping bytes in words (if it tnecessary)
Yury Mikhienko <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Organization | Mobicom-Kavkaz |
| Message-ID | <[email protected]> |
Begin forwarded message: Date: Fri, 19 Sep 2003 16:37:50 +0400 From: Yury Mikhienko <[email protected]> To: Andreas Fink <[email protected]> Subject: Re: catenate the ff fe prefix in UTF-16 encoded octstr and swapping bytes in words (if it tnecessary) Hi Andreas! I anticipate the wery interesting disscursion :) > this type of patch should not be necessary, Kannel runs successfully on > big-endian and little-endian machines (example: PowerPC versus Intel). > So if it doesnt work for you on SPARC the detection of endianness is > somehow screwed. > > Is this concerning UTF-16 encoded SMS text only? in this case - yes, but now I modify my code to: if (msg->sms.coding == DC_UCS2) { /* * remove the first two bytes FE FF from octetstring (add from yuryx for SMSCv3.2) * */ Octstr *octstr_tmp = NULL; short UTF_16_PREFIX = 0xfffe; #if (defined (__sparc__) || defined (__sparc) || defined (__sun)) UTF_16_PREFIX = 0xfeff; /* in SPARC low byte follow from hight byte in word (in INTEL, bytes swap in memory) */ #endif octstr_swap_bytes(pdu->u.submit_sm.short_message); /* <-------- that necessary for properlly work with UTF-16 encoded content (I use cocoon for serializing output content on each request) */ octstr_tmp = octstr_create(""); octstr_append_data(octstr_tmp, (char*) &UTF_16_PREFIX, 2); if(octstr_ncompare(pdu->u.submit_sm.short_message, octstr_tmp, 2) == 0) { octstr_delete(pdu->u.submit_sm.short_message, 0, 2); } octstr_destroy(octstr_tmp); } > how do you post process the output? > with my code (properlly worked on Intel and SPARC platforms) 2003-09-19 15:57:43 [5] DEBUG: SMPP PDU 0x8177a50 dump: 2003-09-19 15:57:43 [5] DEBUG: type_name: submit_sm 2003-09-19 15:57:43 [5] DEBUG: command_id: 4 = 0x00000004 2003-09-19 15:57:43 [5] DEBUG: command_status: 0 = 0x00000000 2003-09-19 15:57:43 [5] DEBUG: sequence_number: 7 = 0x00000007 2003-09-19 15:57:43 [5] DEBUG: service_type: NULL 2003-09-19 15:57:43 [5] DEBUG: source_addr_ton: 1 = 0x00000001 2003-09-19 15:57:43 [5] DEBUG: source_addr_npi: 1 = 0x00000001 2003-09-19 15:57:43 [5] DEBUG: source_addr: "xxxxx000013" 2003-09-19 15:57:43 [5] DEBUG: dest_addr_ton: 1 = 0x00000001 2003-09-19 15:57:43 [5] DEBUG: dest_addr_npi: 1 = 0x00000001 2003-09-19 15:57:43 [5] DEBUG: destination_addr: "xxxxx010199" 2003-09-19 15:57:43 [5] DEBUG: esm_class: 3 = 0x00000003 2003-09-19 15:57:43 [5] DEBUG: protocol_id: 0 = 0x00000000 2003-09-19 15:57:43 [5] DEBUG: priority_flag: 0 = 0x00000000 2003-09-19 15:57:43 [5] DEBUG: schedule_delivery_time: NULL 2003-09-19 15:57:43 [5] DEBUG: validity_period: NULL 2003-09-19 15:57:43 [5] DEBUG: registered_delivery: 0 = 0x00000000 2003-09-19 15:57:43 [5] DEBUG: replace_if_present_flag: 0 = 0x00000000 2003-09-19 15:57:43 [5] DEBUG: data_coding: 24 = 0x00000018 2003-09-19 15:57:43 [5] DEBUG: sm_default_msg_id: 0 = 0x00000000 2003-09-19 15:57:43 [5] DEBUG: sm_length: 58 = 0x0000003a 2003-09-19 15:57:43 [5] DEBUG: short_message: 2003-09-19 15:57:43 [5] DEBUG: Octet string at 0x8177dd8: 2003-09-19 15:57:43 [5] DEBUG: len: 58 2003-09-19 15:57:43 [5] DEBUG: size: 61 2003-09-19 15:57:43 [5] DEBUG: immutable: 0 2003-09-19 15:57:43 [5] DEBUG: data: 00 79 00 75 00 72 00 79 00 78 00 40 00 6d 00 6f [email protected] 2003-09-19 15:57:43 [5] DEBUG: data: 00 62 00 69 00 63 00 6f 00 6d 00 6b 00 2e 00 72 .b.i.c.o.m.k...r 2003-09-19 15:57:43 [5] DEBUG: data: 00 75 00 20 04 3e 04 42 04 3f 04 40 04 30 04 32 .u. .>[email protected] 2003-09-19 15:57:43 [5] DEBUG: data: 04 3b 04 35 04 3d 04 3e 00 2e .;.5.=.>.. 2003-09-19 15:57:43 [5] DEBUG: Octet string dump ends. without the my code I get the following pdu: (and wrong message) 2003-09-19 16:24:44 [5] DEBUG: SMPP[SMPP_TR]: Sending PDU: 2003-09-19 16:24:44 [5] DEBUG: SMPP PDU 0x8176740 dump: 2003-09-19 16:24:44 [5] DEBUG: type_name: submit_sm 2003-09-19 16:24:44 [5] DEBUG: command_id: 4 = 0x00000004 2003-09-19 16:24:44 [5] DEBUG: command_status: 0 = 0x00000000 2003-09-19 16:24:44 [5] DEBUG: sequence_number: 4 = 0x00000004 2003-09-19 16:24:44 [5] DEBUG: service_type: NULL 2003-09-19 16:24:44 [5] DEBUG: source_addr_ton: 1 = 0x00000001 2003-09-19 16:24:44 [5] DEBUG: source_addr_npi: 1 = 0x00000001 2003-09-19 16:24:44 [5] DEBUG: source_addr: "xxxxxx00013" 2003-09-19 16:24:44 [5] DEBUG: dest_addr_ton: 1 = 0x00000001 2003-09-19 16:24:44 [5] DEBUG: dest_addr_npi: 1 = 0x00000001 2003-09-19 16:24:44 [5] DEBUG: destination_addr: "xxxxx010199" 2003-09-19 16:24:44 [5] DEBUG: esm_class: 3 = 0x00000003 2003-09-19 16:24:44 [5] DEBUG: protocol_id: 0 = 0x00000000 2003-09-19 16:24:44 [5] DEBUG: priority_flag: 0 = 0x00000000 2003-09-19 16:24:44 [5] DEBUG: schedule_delivery_time: NULL 2003-09-19 16:24:44 [5] DEBUG: validity_period: NULL 2003-09-19 16:24:44 [5] DEBUG: registered_delivery: 0 = 0x00000000 2003-09-19 16:24:44 [5] DEBUG: replace_if_present_flag: 0 = 0x00000000 2003-09-19 16:24:44 [5] DEBUG: data_coding: 24 = 0x00000018 2003-09-19 16:24:44 [5] DEBUG: sm_default_msg_id: 0 = 0x00000000 2003-09-19 16:24:44 [5] DEBUG: sm_length: 60 = 0x0000003c 2003-09-19 16:24:44 [5] DEBUG: short_message: 2003-09-19 16:24:44 [5] DEBUG: Octet string at 0x8176d80: 2003-09-19 16:24:44 [5] DEBUG: len: 60 2003-09-19 16:24:44 [5] DEBUG: size: 61 2003-09-19 16:24:44 [5] DEBUG: immutable: 0 2003-09-19 16:24:44 [5] DEBUG: data: ff fe 79 00 75 00 72 00 79 00 78 00 40 00 6d 00 [email protected]. 2003-09-19 16:24:44 [5] DEBUG: data: 6f 00 62 00 69 00 63 00 6f 00 6d 00 6b 00 2e 00 o.b.i.c.o.m.k... 2003-09-19 16:24:44 [5] DEBUG: data: 72 00 75 00 20 00 3e 04 42 04 3f 04 40 04 30 04 r.u. .>[email protected]. 2003-09-19 16:24:44 [5] DEBUG: data: 32 04 3b 04 35 04 3d 04 3e 04 2e 00 2.;.5.=.>... 2003-09-19 16:24:44 [5] DEBUG: Octet string dump ends. 2003-09-19 16:24:44 [5] DEBUG: SMPP PDU dump ends. I found and correct the wrong code in pdu_pack function (smpp_pdu.c) in optional parameters packing section also diff in attachment > On Freitag, September 19, 2003, at 11:07 Uhr, Yury Mikhienko wrote: > > > Hi developers! > > > > I use kannel as SMSGW on the SPARC (with SunOS) platform and I was > > oblige to implement the following futures in some functions :)) > > > > in gwlib/octstr.c > > > > void octstr_swap_bytes(Octstr *ostr) > > { > > unsigned char ch = 0; > > long pos; > > > > seems_valid(ostr); > > > > for(pos = 0;pos < ostr->len - 1;pos += 2) > > { > > ch = ostr->data[pos]; > > ostr->data[pos] = ostr->data[pos + 1]; > > ostr->data[pos + 1] = ch; > > } > > } > > > > in gwlib/octstr.h > > > > void octstr_swap_bytes(Octstr *ostr); > > -- Best regards, Yury Mikhienko. IT ERP group head, ZAO "Mobicom-Kavkaz" -- Best regards, Yury Mikhienko. IT ERP group head, ZAO "Mobicom-Kavkaz"
smpp_pdu.patch
(application/octet-stream, 1.8 KB)
--- smpp_pdu.c 2003-05-15 18:35:52 +0400
+++ /home/yuryx/tools/gateway/gw/smsc/smpp_pdu.c 2003-09-17 15:56:30 +0400
@@ -13,7 +13,7 @@
#define MAX_SMPP_PDU_LEN (7424)
-static long decode_integer(Octstr *os, long pos, int octets)
+long decode_integer(Octstr *os, long pos, int octets)
{
unsigned long u;
int i;
@@ -29,7 +29,7 @@
}
-static void append_encoded_integer(Octstr *os, unsigned long u, long octets)
+void append_encoded_integer(Octstr *os, unsigned long u, long octets)
{
long i;
@@ -151,11 +151,11 @@
if (opt_val != NULL) { \
long opt_len = octstr_len(opt_val); \
debug("smpp_pdu", 0, "Packing optional parameter " \
- "(tag = %d, val = %s, len = %ld)", \
+ "(tag = 0x%04lx, val = 0x%04lx, len = %ld)", \
tag_id, octstr_get_cstr(opt_val), opt_len); \
gw_assert(min_len == -1 || (min_len <= opt_len && opt_len <= max_len)); \
- octstr_append(os, opt_tag); \
- octstr_append_data(os, (char*) &opt_len, 2); \
+ append_encoded_integer(os,tag_id,2); \
+ append_encoded_integer(os,opt_len,2); \
octstr_append(os, opt_val); \
} \
octstr_destroy(opt_tag); \