aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/netfilter/xt_sctp.h13
-rw-r--r--net/netfilter/xt_sctp.c18
2 files changed, 13 insertions, 18 deletions
diff --git a/include/linux/netfilter/xt_sctp.h b/include/linux/netfilter/xt_sctp.h
index b157897e7792..dd5a4fd4cfd3 100644
--- a/include/linux/netfilter/xt_sctp.h
+++ b/include/linux/netfilter/xt_sctp.h
@@ -7,9 +7,6 @@
7 7
8#define XT_SCTP_VALID_FLAGS 0x07 8#define XT_SCTP_VALID_FLAGS 0x07
9 9
10#define ELEMCOUNT(x) (sizeof(x)/sizeof(x[0]))
11
12
13struct xt_sctp_flag_info { 10struct xt_sctp_flag_info {
14 u_int8_t chunktype; 11 u_int8_t chunktype;
15 u_int8_t flag; 12 u_int8_t flag;
@@ -59,21 +56,21 @@ struct xt_sctp_info {
59#define SCTP_CHUNKMAP_RESET(chunkmap) \ 56#define SCTP_CHUNKMAP_RESET(chunkmap) \
60 do { \ 57 do { \
61 int i; \ 58 int i; \
62 for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ 59 for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \
63 chunkmap[i] = 0; \ 60 chunkmap[i] = 0; \
64 } while (0) 61 } while (0)
65 62
66#define SCTP_CHUNKMAP_SET_ALL(chunkmap) \ 63#define SCTP_CHUNKMAP_SET_ALL(chunkmap) \
67 do { \ 64 do { \
68 int i; \ 65 int i; \
69 for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ 66 for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \
70 chunkmap[i] = ~0; \ 67 chunkmap[i] = ~0; \
71 } while (0) 68 } while (0)
72 69
73#define SCTP_CHUNKMAP_COPY(destmap, srcmap) \ 70#define SCTP_CHUNKMAP_COPY(destmap, srcmap) \
74 do { \ 71 do { \
75 int i; \ 72 int i; \
76 for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ 73 for (i = 0; i < ARRAY_SIZE(srcmap); i++) \
77 destmap[i] = srcmap[i]; \ 74 destmap[i] = srcmap[i]; \
78 } while (0) 75 } while (0)
79 76
@@ -81,7 +78,7 @@ struct xt_sctp_info {
81({ \ 78({ \
82 int i; \ 79 int i; \
83 int flag = 1; \ 80 int flag = 1; \
84 for (i = 0; i < ELEMCOUNT(chunkmap); i++) { \ 81 for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \
85 if (chunkmap[i]) { \ 82 if (chunkmap[i]) { \
86 flag = 0; \ 83 flag = 0; \
87 break; \ 84 break; \
@@ -94,7 +91,7 @@ struct xt_sctp_info {
94({ \ 91({ \
95 int i; \ 92 int i; \
96 int flag = 1; \ 93 int flag = 1; \
97 for (i = 0; i < ELEMCOUNT(chunkmap); i++) { \ 94 for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \
98 if (chunkmap[i] != ~0) { \ 95 if (chunkmap[i] != ~0) { \
99 flag = 0; \ 96 flag = 0; \
100 break; \ 97 break; \
diff --git a/net/netfilter/xt_sctp.c b/net/netfilter/xt_sctp.c
index f907770fd4e9..3358273a47b7 100644
--- a/net/netfilter/xt_sctp.c
+++ b/net/netfilter/xt_sctp.c
@@ -42,21 +42,21 @@ match_flags(const struct xt_sctp_flag_info *flag_info,
42static inline bool 42static inline bool
43match_packet(const struct sk_buff *skb, 43match_packet(const struct sk_buff *skb,
44 unsigned int offset, 44 unsigned int offset,
45 const u_int32_t *chunkmap, 45 const struct xt_sctp_info *info,
46 int chunk_match_type,
47 const struct xt_sctp_flag_info *flag_info,
48 const int flag_count,
49 bool *hotdrop) 46 bool *hotdrop)
50{ 47{
51 u_int32_t chunkmapcopy[256 / sizeof (u_int32_t)]; 48 u_int32_t chunkmapcopy[256 / sizeof (u_int32_t)];
52 sctp_chunkhdr_t _sch, *sch; 49 sctp_chunkhdr_t _sch, *sch;
50 int chunk_match_type = info->chunk_match_type;
51 const struct xt_sctp_flag_info *flag_info = info->flag_info;
52 int flag_count = info->flag_count;
53 53
54#ifdef DEBUG_SCTP 54#ifdef DEBUG_SCTP
55 int i = 0; 55 int i = 0;
56#endif 56#endif
57 57
58 if (chunk_match_type == SCTP_CHUNK_MATCH_ALL) 58 if (chunk_match_type == SCTP_CHUNK_MATCH_ALL)
59 SCTP_CHUNKMAP_COPY(chunkmapcopy, chunkmap); 59 SCTP_CHUNKMAP_COPY(chunkmapcopy, info->chunkmap);
60 60
61 do { 61 do {
62 sch = skb_header_pointer(skb, offset, sizeof(_sch), &_sch); 62 sch = skb_header_pointer(skb, offset, sizeof(_sch), &_sch);
@@ -73,7 +73,7 @@ match_packet(const struct sk_buff *skb,
73 73
74 duprintf("skb->len: %d\toffset: %d\n", skb->len, offset); 74 duprintf("skb->len: %d\toffset: %d\n", skb->len, offset);
75 75
76 if (SCTP_CHUNKMAP_IS_SET(chunkmap, sch->type)) { 76 if (SCTP_CHUNKMAP_IS_SET(info->chunkmap, sch->type)) {
77 switch (chunk_match_type) { 77 switch (chunk_match_type) {
78 case SCTP_CHUNK_MATCH_ANY: 78 case SCTP_CHUNK_MATCH_ANY:
79 if (match_flags(flag_info, flag_count, 79 if (match_flags(flag_info, flag_count,
@@ -104,7 +104,7 @@ match_packet(const struct sk_buff *skb,
104 104
105 switch (chunk_match_type) { 105 switch (chunk_match_type) {
106 case SCTP_CHUNK_MATCH_ALL: 106 case SCTP_CHUNK_MATCH_ALL:
107 return SCTP_CHUNKMAP_IS_CLEAR(chunkmap); 107 return SCTP_CHUNKMAP_IS_CLEAR(info->chunkmap);
108 case SCTP_CHUNK_MATCH_ANY: 108 case SCTP_CHUNK_MATCH_ANY:
109 return false; 109 return false;
110 case SCTP_CHUNK_MATCH_ONLY: 110 case SCTP_CHUNK_MATCH_ONLY:
@@ -148,9 +148,7 @@ match(const struct sk_buff *skb,
148 && ntohs(sh->dest) <= info->dpts[1], 148 && ntohs(sh->dest) <= info->dpts[1],
149 XT_SCTP_DEST_PORTS, info->flags, info->invflags) 149 XT_SCTP_DEST_PORTS, info->flags, info->invflags)
150 && SCCHECK(match_packet(skb, protoff + sizeof (sctp_sctphdr_t), 150 && SCCHECK(match_packet(skb, protoff + sizeof (sctp_sctphdr_t),
151 info->chunkmap, info->chunk_match_type, 151 info, hotdrop),
152 info->flag_info, info->flag_count,
153 hotdrop),
154 XT_SCTP_CHUNK_TYPES, info->flags, info->invflags); 152 XT_SCTP_CHUNK_TYPES, info->flags, info->invflags);
155} 153}
156 154