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);                                                    \
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.