1--- original/linux/net/ipv4/netfilter/ipt_MARK.c	Mon Oct  1 03:26:08 2001
2+++ linux/net/ipv4/netfilter/ipt_MARK.c	Wed Feb 20 22:45:12 2002
3@@ -17,10 +17,22 @@
4 {
5 	const struct ipt_mark_target_info *markinfo = targinfo;
6 
7-	if((*pskb)->nfmark != markinfo->mark) {
8+	switch (markinfo->mode) {
9+	case IPT_MARK_SET:
10 		(*pskb)->nfmark = markinfo->mark;
11-		(*pskb)->nfcache |= NFC_ALTERED;
12+		break;
13+		
14+	case IPT_MARK_AND:
15+		(*pskb)->nfmark = (*pskb)->nfmark & markinfo->mark;
16+		break;
17+		
18+	case IPT_MARK_OR:
19+		(*pskb)->nfmark = (*pskb)->nfmark | markinfo->mark;
20+		break;
21+	default:
22+		break;
23 	}
24+        (*pskb)->nfcache |= NFC_ALTERED;
25 	return IPT_CONTINUE;
26 }
27 
28--- original/linux/include/linux/netfilter_ipv4/ipt_MARK.h	Sat Mar 18 02:56:20 2000
29+++ linux/include/linux/netfilter_ipv4/ipt_MARK.h	Wed Feb 20 22:24:16 2002
30@@ -1,8 +1,15 @@
31 #ifndef _IPT_MARK_H_target
32 #define _IPT_MARK_H_target
33 
34+enum {
35+        IPT_MARK_SET,
36+        IPT_MARK_AND,
37+        IPT_MARK_OR
38+};
39+
40 struct ipt_mark_target_info {
41 	unsigned long mark;
42+	u_int8_t mode;
43 };
44 
45 #endif /*_IPT_MARK_H_target*/
46