# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/05/09 22:19:13+02:00 kaber@trash.net 
#   MARK and/or mode
# 
# net/ipv4/netfilter/ipt_MARK.c
#   2004/05/09 22:15:52+02:00 kaber@trash.net +12 -2
#   MARK and/or mode
# 
# include/linux/netfilter_ipv4/ipt_MARK.h
#   2004/05/09 22:15:52+02:00 kaber@trash.net +7 -0
#   MARK and/or mode
# 
diff -Nru a/include/linux/netfilter_ipv4/ipt_MARK.h b/include/linux/netfilter_ipv4/ipt_MARK.h
--- a/include/linux/netfilter_ipv4/ipt_MARK.h	Sun May  9 22:22:16 2004
+++ b/include/linux/netfilter_ipv4/ipt_MARK.h	Sun May  9 22:22:16 2004
@@ -1,8 +1,15 @@
 #ifndef _IPT_MARK_H_target
 #define _IPT_MARK_H_target
 
+enum {
+        IPT_MARK_SET,
+        IPT_MARK_AND,
+        IPT_MARK_OR
+};
+
 struct ipt_mark_target_info {
 	unsigned long mark;
+	u_int8_t mode;
 };
 
 #endif /*_IPT_MARK_H_target*/
diff -Nru a/net/ipv4/netfilter/ipt_MARK.c b/net/ipv4/netfilter/ipt_MARK.c
--- a/net/ipv4/netfilter/ipt_MARK.c	Sun May  9 22:22:16 2004
+++ b/net/ipv4/netfilter/ipt_MARK.c	Sun May  9 22:22:16 2004
@@ -29,10 +29,20 @@
 {
 	const struct ipt_mark_target_info *markinfo = targinfo;
 
-	if((*pskb)->nfmark != markinfo->mark) {
+	switch (markinfo->mode) {
+	case IPT_MARK_SET:
 		(*pskb)->nfmark = markinfo->mark;
-		(*pskb)->nfcache |= NFC_ALTERED;
+		break;
+		
+	case IPT_MARK_AND:
+		(*pskb)->nfmark &= markinfo->mark;
+		break;
+		
+	case IPT_MARK_OR:
+		(*pskb)->nfmark |= markinfo->mark;
+		break;
 	}
+        (*pskb)->nfcache |= NFC_ALTERED;
 	return IPT_CONTINUE;
 }
 
