From 432b711eb5e5c1e97266389f7f69f01fd4c98f92 Mon Sep 17 00:00:00 2001
From: Imre Kaloz <kaloz@openwrt.org>
Date: Mon, 2 Jun 2008 15:48:49 +0000
Subject: [PATCH] revert an upstream change to retain compatibility with
 iptables 1.4.0

SVN-Revision: 11326
---
 .../950-revert_xt_sctp_simplify.patch         | 103 ++++++++++++++++++
 1 file changed, 103 insertions(+)
 create mode 100644 target/linux/generic-2.6/patches-2.6.26/950-revert_xt_sctp_simplify.patch

diff --git a/target/linux/generic-2.6/patches-2.6.26/950-revert_xt_sctp_simplify.patch b/target/linux/generic-2.6/patches-2.6.26/950-revert_xt_sctp_simplify.patch
new file mode 100644
index 0000000000..6c8cdf1576
--- /dev/null
+++ b/target/linux/generic-2.6/patches-2.6.26/950-revert_xt_sctp_simplify.patch
@@ -0,0 +1,103 @@
+--- linux-2.6.26-rc4/include/linux/netfilter/xt_sctp.h	2008-05-26 20:08:11.000000000 +0200
++++ linux-2.6.26-rc4-owrt/include/linux/netfilter/xt_sctp.h	2008-06-02 13:30:15.000000000 +0200
+@@ -37,54 +37,68 @@
+ 
+ #define SCTP_CHUNKMAP_SET(chunkmap, type) 		\
+ 	do { 						\
+-		(chunkmap)[type / bytes(u_int32_t)] |= 	\
++		chunkmap[type / bytes(u_int32_t)] |= 	\
+ 			1 << (type % bytes(u_int32_t));	\
+ 	} while (0)
+ 
+ #define SCTP_CHUNKMAP_CLEAR(chunkmap, type)		 	\
+ 	do {							\
+-		(chunkmap)[type / bytes(u_int32_t)] &= 		\
++		chunkmap[type / bytes(u_int32_t)] &= 		\
+ 			~(1 << (type % bytes(u_int32_t)));	\
+ 	} while (0)
+ 
+ #define SCTP_CHUNKMAP_IS_SET(chunkmap, type) 			\
+ ({								\
+-	((chunkmap)[type / bytes (u_int32_t)] & 		\
++	(chunkmap[type / bytes (u_int32_t)] & 			\
+ 		(1 << (type % bytes (u_int32_t)))) ? 1: 0;	\
+ })
+ 
+-#define SCTP_CHUNKMAP_RESET(chunkmap) \
+-	memset((chunkmap), 0, sizeof(chunkmap))
++#define SCTP_CHUNKMAP_RESET(chunkmap) 				\
++	do {							\
++		int i; 						\
++		for (i = 0; i < ARRAY_SIZE(chunkmap); i++)	\
++			chunkmap[i] = 0;			\
++	} while (0)
+ 
+-#define SCTP_CHUNKMAP_SET_ALL(chunkmap) \
+-	memset((chunkmap), ~0U, sizeof(chunkmap))
++#define SCTP_CHUNKMAP_SET_ALL(chunkmap) 			\
++	do {							\
++		int i; 						\
++		for (i = 0; i < ARRAY_SIZE(chunkmap); i++) 	\
++			chunkmap[i] = ~0;			\
++	} while (0)
+ 
+-#define SCTP_CHUNKMAP_COPY(destmap, srcmap) \
+-	memcpy((destmap), (srcmap), sizeof(srcmap))
++#define SCTP_CHUNKMAP_COPY(destmap, srcmap) 			\
++	do {							\
++		int i; 						\
++		for (i = 0; i < ARRAY_SIZE(srcmap); i++) 	\
++			destmap[i] = srcmap[i];			\
++	} while (0)
++
++#define SCTP_CHUNKMAP_IS_CLEAR(chunkmap) 		\
++({							\
++	int i; 						\
++	int flag = 1;					\
++	for (i = 0; i < ARRAY_SIZE(chunkmap); i++) {	\
++		if (chunkmap[i]) {			\
++			flag = 0;			\
++			break;				\
++		}					\
++	}						\
++        flag;						\
++})
+ 
+-#define SCTP_CHUNKMAP_IS_CLEAR(chunkmap) \
+-	__sctp_chunkmap_is_clear((chunkmap), ARRAY_SIZE(chunkmap))
+-static inline bool
+-__sctp_chunkmap_is_clear(const u_int32_t *chunkmap, unsigned int n)
+-{
+-	unsigned int i;
+-	for (i = 0; i < n; ++i)
+-		if (chunkmap[i])
+-			return false;
+-	return true;
+-}
+-
+-#define SCTP_CHUNKMAP_IS_ALL_SET(chunkmap) \
+-	__sctp_chunkmap_is_all_set((chunkmap), ARRAY_SIZE(chunkmap))
+-static inline bool
+-__sctp_chunkmap_is_all_set(const u_int32_t *chunkmap, unsigned int n)
+-{
+-	unsigned int i;
+-	for (i = 0; i < n; ++i)
+-		if (chunkmap[i] != ~0U)
+-			return false;
+-	return true;
+-}
++#define SCTP_CHUNKMAP_IS_ALL_SET(chunkmap) 		\
++({							\
++	int i; 						\
++	int flag = 1;					\
++	for (i = 0; i < ARRAY_SIZE(chunkmap); i++) {	\
++		if (chunkmap[i] != ~0) {		\
++			flag = 0;			\
++				break;			\
++		}					\
++	}						\
++        flag;						\
++})
+ 
+ #endif /* _XT_SCTP_H_ */
+ 
-- 
2.25.1