[olsr-dev] questions on olsrd IPC protocol

Yuri Karaban (spam-protected)
Sat May 21 22:42:42 CEST 2005


Hello

I'm learning olsrd IPC protocol and found some inconsistency (or most
probably I missed something).

(I'm talking about olsrd distribution version 0.4.9)

In linux-gtk/src/ipc.c in function `ipc_read', line 176:

Packet length checked with the following expression:

<code>
              while(ntohs(msg->v4.olsr_msgsize) < bytes)
                {
                  ipc_evaluate_message(msg);
</code>


And passed to `ipc_evaluate_message'.

In `ipc_evaluate_message', `union olsr_message *' can be casted to
`struct routemsg *' (line 321) or `struct netmsg *' (line 326).

If compare `union olsr_message' with `struct routemsg' or `struct
netmsg' possible to notice that `message size' member located on different offsets:

struct olsrmsg
{
  olsr_u8_t     olsr_msgtype;
  olsr_u8_t     olsr_vtime;
  olsr_u16_t    olsr_msgsize;
...
};

struct netmsg
{
  olsr_u8_t      msgtype;
  olsr_u16_t     size;
...
};

struct routemsg 
{
  olsr_u8_t      msgtype;
  olsr_u16_t     size;
...
};

In `struct olsrmsg` (which is the member of `union olsr_message`) size
memeber is located on base + 2, and in `struct netmsg' and `struct
routemsg' it located at base + 1. (This offsets are valid for packed
structure).

linux-gtk gui works, I can suppouse because not specified that
structure is packed gcc align uint16_t members on 2 byte boundary. But
it is fortunity and it is not good to rely on it.

Please explain me where I can mistake or if I right please make more
determinate specifications of this strucures (with __attribute__
((packed)) for gcc). And insert dummy one byte wide filler before
`size' member in `netmsg' and `routemsg' structures.

PS. Please CC me your questions. Because I'm not subscriber and can
only to watch archives of mailinglist.



More information about the Olsr-dev mailing list