[Oisf-devel] Decoding Problem [ One byte Missing ]

Anoop Saldanha anoopsaldanha at gmail.com
Wed Jul 25 16:37:29 UTC 2012


On Wed, Jul 25, 2012 at 4:48 PM, Prabhakaran Kasinathan
<prabhakaran1989 at gmail.com> wrote:
> Dear Developer's,
>
> I have been working in decoding the IEEE802154 packets and 6LoWPAN packets.
> It took some time to understand the decoding functionality. Pls Help!
>
> Now my problem is,
>
> One byte is missing when i try to separate the structure like ( uint16_t ,
> uint8_t,here next 8 bit is missing, uint16_t ...) it jumps to the next 16
> bit and next 16 bit and soo on!  What is the problem here?
>
> whereas it works correctly either if i use ( uint16_t , uint8_t
> ,uint8_t,uint16_t ,uint16_t , and so.... ) or ( uint16_t ,uint16_t ,uint16_t
> ,uint16_t , ... ) . I couldn't understand this.
>
> Details :
>
> The current Header of IEEE802154 packet.
>
> octects 2      1            2            2            2
> |  FCF     |  Seq no | Dst Pan | Dst Add | Src Add | remaining data
>
>
> Hex :  61 88 d9 22 00 01 00 64 00 e0 ... Data...        [ the byte 22 is
> missing when i print the hole order ]
>
> My Structure Declarations
>
> typedef struct Ieee802154Hdr_ {
>     uint16_t ieee802154_fcf;
>     uint8_t ieee802154_seq;
>     uint16_t  ieee802154_dstpan;
>     uint16_t  ieee802154_dstadd;
>     uint16_t  ieee802154_srcadd;
> } Ieee802154Hdr;
>
>     SCLogInfo("\n Length  %d ieee FCF: %x | ieee seq %x | DstPan  %04x |
> Dstadd %04X | SrcAdd
> %04x",len,ntohs(p->ieeeh->ieee802154_fcf),ntohs(p->ieeeh->ieee802154_seq),ntohs(p->ieeeh->ieee802154_dstpan),ntohs(p->ieeeh->ieee802154_dstadd),ntohs(p->ieeeh->ieee802154_srcadd));
>
>
> Output is:
>
> Length  26 ieee FCF: 6188 | ieee seq d9 | DstPan  0001 | Dstadd 0064 |
> SrcAdd 00e0
>
>                                                                  it should
> be 0022               0001              0064
>
> Note: If I use the (uint16_t) continuously, I get the bytes correctly. How
> to overcome this problem.
>

This is a gcc alignment issue.  Can't think of any portable solutions as such.

One way would be use a uint8_t array to point to the packet byte
array, and use macros to dereference the various fields from this
array.

#DEFINE GET_IEEE802145_DSTPAN(array) (*((uint16_t *)((uint8_t *)array + 3))

--

Another solution would be to define the struct as

{
    uint16_t a;
    uint8_t b;
    uint8_t c1;
    uint8_t c2;
     ...
}

So c1 + c2 in your case would be ieee802154_dstpan.  You can hide the
retrieval of the value from c1 + c2 using some macros.

Let me know if you have a better solution.

> Question 2:
>
> How to use the SCLogDebug and Printf lines to get printed in console? Since
> I couldn't find that. I started using SCLogInfo to print and debug the
> error's.
>
> --
> Best Regards,
> Prabhakaran Kasinathan
> +39 3279720502
>
>
> _______________________________________________
> Oisf-devel mailing list
> Oisf-devel at openinfosecfoundation.org
> http://lists.openinfosecfoundation.org/mailman/listinfo/oisf-devel

doesn't printf print to the console?  SCLogDebug needs --enable-debug
while configuring and requires you to set the log-level  in the conf
to debug.

-- 
Anoop Saldanha



More information about the Oisf-devel mailing list