> I am working on adding IS-IS protocol unpacking. Given that OSI loves to
> use lots of packed bytes, I ran into a packing problem pretty much right
> off the bat. The question is, what is the "official" way for doing
> structure overlays onto the PDU without having the compiler play with
> the alignment.
I'm not sure there's an official way.
Some alternatives:
1) don't overlay a structure; instead, have a pile of #defines,
say, for the offsets into the packet, and do, say
xxx = pntohs(&pd[OFFSET_OF_2_OCTET_FIELD_IN_QUESTION]);
to extract the value;
2) do something such as
typedef struct {
guint8 isis_hello_circuit_reserved; /* circuit type & reserved */
guint8 isis_hello_source_id[6]; /* source id */
guint8 isis_hello_holding_timer[2]; /* holding timer */
guint8 isis_hello_pdu_length[2]; /* full length, includ. hdr */
guint8 isis_hello_priority_reserved; /* priority & reserved */
guint8 isis_hello_lan_id[7]; /* LAN id */
} isis_hello_t;
and do something such as
xxx = pntohs(ihd->isis_hello_holding_timer);
to extract the value.
Note that, in *any* case, unless IS-IS specifies that the byte order of
multi-byte integral quantities is always the byte order of the machines
sniffing the network (which is a bit unlikely - unless there are
machines of different byte orders sniffing the network, in which case
it's a bit impossible...), you need to use "pntoh[sl]()" or
"pletoh[sl]()" *anyway* to extract multi-byte integral quantities, so
that
1) you treat them as being in the appropriate byte order;
2) you don't blow up if the field doesn't happen to be aligned
on the right boundary (even if the packet format aligns
stuff, there's no guarantee that the headers, etc. *before*
it are so aligned).