diff -r ce4087e26684 include/linux/netfilter/xt_sctp.h --- a/include/linux/netfilter/xt_sctp.h Wed Jan 28 20:01:08 2009 +0000 +++ b/include/linux/netfilter/xt_sctp.h Fri Jan 30 16:25:55 2009 +0100 @@ -15,11 +15,13 @@ #define XT_NUM_SCTP_FLAGS 4 +#define sizeof_bits(type) (sizeof(type) * 8) + struct xt_sctp_info { u_int16_t dpts[2]; /* Min, Max */ u_int16_t spts[2]; /* Min, Max */ - u_int32_t chunkmap[256 / sizeof (u_int32_t)]; /* Bit mask of chunks to be matched according to RFC 2960 */ + u_int32_t chunkmap[256 / sizeof_bits(u_int32_t)]; /* Bit mask of chunks to be matched according to RFC 2960 */ #define SCTP_CHUNK_MATCH_ANY 0x01 /* Match if any of the chunk types are present */ #define SCTP_CHUNK_MATCH_ALL 0x02 /* Match if all of the chunk types are present */ @@ -33,24 +35,24 @@ u_int32_t invflags; }; -#define bytes(type) (sizeof(type) * 8) +#define SCTP_MODULO(chunktype, type) (chunktype & (sizeof_bits(type)-1)) -#define SCTP_CHUNKMAP_SET(chunkmap, type) \ - do { \ - (chunkmap)[type / bytes(u_int32_t)] |= \ - 1 << (type % bytes(u_int32_t)); \ +#define SCTP_CHUNKMAP_SET(chunkmap, chunktype) \ + do { \ + chunkmap[chunktype / sizeof_bits(u_int32_t)] |= \ + 1 << SCTP_MODULO(chunktype, u_int32_t); \ } while (0) -#define SCTP_CHUNKMAP_CLEAR(chunkmap, type) \ - do { \ - (chunkmap)[type / bytes(u_int32_t)] &= \ - ~(1 << (type % bytes(u_int32_t))); \ +#define SCTP_CHUNKMAP_CLEAR(chunkmap, chunktype) \ + do { \ + chunkmap[chunktype / sizeof_bits(u_int32_t)] &= \ + ~(1 << SCTP_MODULO(chunktype, u_int32_t)); \ } while (0) -#define SCTP_CHUNKMAP_IS_SET(chunkmap, type) \ -({ \ - ((chunkmap)[type / bytes (u_int32_t)] & \ - (1 << (type % bytes (u_int32_t)))) ? 1: 0; \ +#define SCTP_CHUNKMAP_IS_SET(chunkmap, chunktype) \ +({ \ + (chunkmap[chunktype / sizeof_bits(u_int32_t)] & \ + (1 << SCTP_MODULO(chunktype, u_int32_t))) ? 1 : 0; \ }) #define SCTP_CHUNKMAP_RESET(chunkmap) \ diff -r ce4087e26684 include/linux/netfilter_ipv4/ipt_sctp.h --- a/include/linux/netfilter_ipv4/ipt_sctp.h Wed Jan 28 20:01:08 2009 +0000 +++ b/include/linux/netfilter_ipv4/ipt_sctp.h Fri Jan 30 16:25:55 2009 +0100 @@ -16,11 +16,13 @@ #define IPT_NUM_SCTP_FLAGS 4 +#define sizeof_bits(type) (sizeof(type) * 8) + struct ipt_sctp_info { u_int16_t dpts[2]; /* Min, Max */ u_int16_t spts[2]; /* Min, Max */ - u_int32_t chunkmap[256 / sizeof (u_int32_t)]; /* Bit mask of chunks to be matched according to RFC 2960 */ + u_int32_t chunkmap[256 / sizeof_bits(u_int32_t)]; /* Bit mask of chunks to be matched according to RFC 2960 */ #define SCTP_CHUNK_MATCH_ANY 0x01 /* Match if any of the chunk types are present */ #define SCTP_CHUNK_MATCH_ALL 0x02 /* Match if all of the chunk types are present */ @@ -34,24 +36,24 @@ u_int32_t invflags; }; -#define bytes(type) (sizeof(type) * 8) +#define SCTP_MODULO(chunktype, type) (chunktype & (sizeof_bits(type)-1)) -#define SCTP_CHUNKMAP_SET(chunkmap, type) \ - do { \ - chunkmap[type / bytes(u_int32_t)] |= \ - 1 << (type % bytes(u_int32_t)); \ +#define SCTP_CHUNKMAP_SET(chunkmap, chunktype) \ + do { \ + chunkmap[chunktype / sizeof_bits(u_int32_t)] |= \ + 1 << SCTP_MODULO(chunktype, u_int32_t); \ } while (0) -#define SCTP_CHUNKMAP_CLEAR(chunkmap, type) \ - do { \ - chunkmap[type / bytes(u_int32_t)] &= \ - ~(1 << (type % bytes(u_int32_t))); \ +#define SCTP_CHUNKMAP_CLEAR(chunkmap, chunktype) \ + do { \ + chunkmap[chunktype / sizeof_bits(u_int32_t)] &= \ + ~(1 << SCTP_MODULO(chunktype, u_int32_t)); \ } while (0) -#define SCTP_CHUNKMAP_IS_SET(chunkmap, type) \ -({ \ - (chunkmap[type / bytes (u_int32_t)] & \ - (1 << (type % bytes (u_int32_t)))) ? 1: 0; \ +#define SCTP_CHUNKMAP_IS_SET(chunkmap, chunktype) \ +({ \ + (chunkmap[chunktype / sizeof_bits(u_int32_t)] & \ + (1 << SCTP_MODULO(chunktype, u_int32_t))) ? 1 : 0; \ }) #define SCTP_CHUNKMAP_RESET(chunkmap) \