]> git.ipfire.org Git - thirdparty/nftables.git/commit
src: fix sub-byte protocol header definitions
authorPablo Neira Ayuso <pablo@netfilter.org>
Sat, 5 Dec 2015 19:04:21 +0000 (20:04 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 14 Dec 2015 19:32:55 +0000 (20:32 +0100)
commit4a9a38727957731e56b5302960da5ef1e0275d61
treeb3d3c546cc6db893866c8d4707861dd06c2a8963
parent210f479bff5b6cf8483383aa27ad9ded3925326c
src: fix sub-byte protocol header definitions

Update bitfield definitions to match according to the way they are
expressed in RFC and IEEE specifications.

This required a bit of update for c3f0501 ("src: netlink_linearize:
handle sub-byte lengths").

>From the linearize step, to calculate the shift based on the bitfield
offset, we need to obtain the length of the word in bytes:

len = round_up(expr->len, BITS_PER_BYTE);

Then, we substract the offset bits and the bitfield length.

        shift = len - (offset + expr->len);

From the delinearize, payload_expr_trim() needs to obtain the real
offset through:

off = round_up(mask->len, BITS_PER_BYTE) - mask_len;

For vlan id (offset 12), this gets the position of the last bit set in
the mask (ie. 12), then we substract the length we fetch in bytes (16),
so we obtain the real bitfield offset (4).

Then, we add that to the original payload offset that was expressed in
bytes:

payload_offset += off;

Note that payload_expr_trim() now also adjusts the payload expression to
its real length and offset so we don't need to propagate the mask
expression.

Reported-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/payload.h
include/proto.h
include/utils.h
src/netlink_delinearize.c
src/netlink_linearize.c
src/payload.c
src/proto.c