diff -urN linux/net/ipv6/netfilter/ip6t_limit.c linux.ip6t/net/ipv6/netfilter/ip6t_limit.c
--- linux/net/ipv6/netfilter/ip6t_limit.c	Mon May 22 18:50:55 2000
+++ linux.ip6t/net/ipv6/netfilter/ip6t_limit.c	Fri Feb 16 15:37:38 2001
@@ -13,7 +13,7 @@
 #include <linux/interrupt.h>
 
 #include <linux/netfilter_ipv6/ip6_tables.h>
-#include <linux/netfilter_ipv4/ipt_limit.h>
+#include <linux/netfilter_ipv6/ip6t_limit.h>
 
 /* The algorithm used is the Simple Token Bucket Filter (TBF)
  * see net/sched/sch_tbf.c in the linux source tree
@@ -42,7 +42,7 @@
 #define CREDITS_PER_JIFFY 128
 
 static int
-ipt_limit_match(const struct sk_buff *skb,
+ip6t_limit_match(const struct sk_buff *skb,
 		const struct net_device *in,
 		const struct net_device *out,
 		const void *matchinfo,
@@ -51,7 +51,7 @@
 		u_int16_t datalen,
 		int *hotdrop)
 {
-	struct ipt_rateinfo *r = ((struct ipt_rateinfo *)matchinfo)->master;
+	struct ip6t_rateinfo *r = ((struct ip6t_rateinfo *)matchinfo)->master;
 	unsigned long now = jiffies;
 
 	spin_lock_bh(&limit_lock);
@@ -77,32 +77,32 @@
 	/* If multiplying would overflow... */
 	if (user > 0xFFFFFFFF / (HZ*CREDITS_PER_JIFFY))
 		/* Divide first. */
-		return (user / IPT_LIMIT_SCALE) * HZ * CREDITS_PER_JIFFY;
+		return (user / IP6T_LIMIT_SCALE) * HZ * CREDITS_PER_JIFFY;
 
-	return (user * HZ * CREDITS_PER_JIFFY) / IPT_LIMIT_SCALE;
+	return (user * HZ * CREDITS_PER_JIFFY) / IP6T_LIMIT_SCALE;
 }
 
 static int
-ipt_limit_checkentry(const char *tablename,
+ip6t_limit_checkentry(const char *tablename,
 		     const struct ip6t_ip6 *ip,
 		     void *matchinfo,
 		     unsigned int matchsize,
 		     unsigned int hook_mask)
 {
-	struct ipt_rateinfo *r = matchinfo;
+	struct ip6t_rateinfo *r = matchinfo;
 
-	if (matchsize != IP6T_ALIGN(sizeof(struct ipt_rateinfo)))
+	if (matchsize != IP6T_ALIGN(sizeof(struct ip6t_rateinfo)))
 		return 0;
 
 	/* Check for overflow. */
 	if (r->burst == 0
 	    || user2credits(r->avg * r->burst) < user2credits(r->avg)) {
-		printk("Call rusty: overflow in ipt_limit: %u/%u\n",
+		printk("Call rusty: overflow in ip6t_limit: %u/%u\n",
 		       r->avg, r->burst);
 		return 0;
 	}
 
-	/* User avg in seconds * IPT_LIMIT_SCALE: convert to jiffies *
+	/* User avg in seconds * IP6T_LIMIT_SCALE: convert to jiffies *
 	   128. */
 	r->prev = jiffies;
 	r->credit = user2credits(r->avg * r->burst);	 /* Credits full. */
@@ -115,20 +115,20 @@
 	return 1;
 }
 
-static struct ip6t_match ipt_limit_reg
-= { { NULL, NULL }, "limit", ipt_limit_match, ipt_limit_checkentry, NULL,
+static struct ip6t_match ip6t_limit_reg
+= { { NULL, NULL }, "limit", ip6t_limit_match, ip6t_limit_checkentry, NULL,
     THIS_MODULE };
 
 static int __init init(void)
 {
-	if (ip6t_register_match(&ipt_limit_reg))
+	if (ip6t_register_match(&ip6t_limit_reg))
 		return -EINVAL;
 	return 0;
 }
 
 static void __exit fini(void)
 {
-	ip6t_unregister_match(&ipt_limit_reg);
+	ip6t_unregister_match(&ip6t_limit_reg);
 }
 
 module_init(init);
diff -urN linux/net/ipv6/netfilter/ip6t_mac.c linux.ip6t/net/ipv6/netfilter/ip6t_mac.c
--- linux/net/ipv6/netfilter/ip6t_mac.c	Tue Jun 20 23:32:27 2000
+++ linux.ip6t/net/ipv6/netfilter/ip6t_mac.c	Fri Feb 16 15:38:08 2001
@@ -27,7 +27,7 @@
 }
 
 static int
-ipt_mac_checkentry(const char *tablename,
+ip6t_mac_checkentry(const char *tablename,
 		   const struct ip6t_ip6 *ip,
 		   void *matchinfo,
 		   unsigned int matchsize,
@@ -35,7 +35,7 @@
 {
 	if (hook_mask
 	    & ~((1 << NF_IP6_PRE_ROUTING) | (1 << NF_IP6_LOCAL_IN))) {
-		printk("ipt_mac: only valid for PRE_ROUTING or LOCAL_IN.\n");
+		printk("ip6t_mac: only valid for PRE_ROUTING or LOCAL_IN.\n");
 		return 0;
 	}
 
@@ -46,7 +46,7 @@
 }
 
 static struct ip6t_match mac_match
-= { { NULL, NULL }, "mac", &match, &ipt_mac_checkentry, NULL, THIS_MODULE };
+= { { NULL, NULL }, "mac", &match, &ip6t_mac_checkentry, NULL, THIS_MODULE };
 
 static int __init init(void)
 {
diff -urN linux/net/ipv6/netfilter/ip6t_multiport.c linux.ip6t/net/ipv6/netfilter/ip6t_multiport.c
--- linux/net/ipv6/netfilter/ip6t_multiport.c	Tue Jun 20 23:32:27 2000
+++ linux.ip6t/net/ipv6/netfilter/ip6t_multiport.c	Fri Feb 16 15:38:24 2001
@@ -51,7 +51,7 @@
 	if (offset == 0 && datalen < sizeof(struct udphdr)) {
 		/* We've been asked to examine this packet, and we
 		   can't.  Hence, no choice but to drop. */
-			duprintf("ipt_multiport:"
+			duprintf("ip6t_multiport:"
 				 " Dropping evil offset=0 tinygram.\n");
 			*hotdrop = 1;
 			return 0;
diff -urN linux/net/ipv6/netfilter/ip6t_owner.c linux.ip6t/net/ipv6/netfilter/ip6t_owner.c
--- linux/net/ipv6/netfilter/ip6t_owner.c	Thu Jan  1 01:00:00 1970
+++ linux.ip6t/net/ipv6/netfilter/ip6t_owner.c	Fri Feb 16 14:46:37 2001
@@ -0,0 +1,154 @@
+/* Kernel module to match various things tied to sockets associated with
+   locally generated outgoing packets.
+
+   Copyright (C) 2000 Marc Boucher
+ */
+#include <linux/module.h>
+#include <linux/skbuff.h>
+#include <linux/file.h>
+#include <net/sock.h>
+
+#include <linux/netfilter_ipv6/ip6t_owner.h>
+#include <linux/netfilter_ipv6/ip6_tables.h>
+
+static int
+match_pid(const struct sk_buff *skb, pid_t pid)
+{
+	struct task_struct *p;
+	struct files_struct *files;
+	int i;
+
+	read_lock(&tasklist_lock);
+	p = find_task_by_pid(pid);
+	if (!p)
+		goto out;
+	task_lock(p);
+	files = p->files;
+	if(files) {
+		read_lock(&files->file_lock);
+		for (i=0; i < files->max_fds; i++) {
+			if (fcheck_files(files, i) == skb->sk->socket->file) {
+				read_unlock(&files->file_lock);
+				task_unlock(p);
+				read_unlock(&tasklist_lock);
+				return 1;
+			}
+		}
+		read_unlock(&files->file_lock);
+	}
+	task_unlock(p);
+out:
+	read_unlock(&tasklist_lock);
+	return 0;
+}
+
+static int
+match_sid(const struct sk_buff *skb, pid_t sid)
+{
+	struct task_struct *p;
+	struct file *file = skb->sk->socket->file;
+	int i, found=0;
+
+	read_lock(&tasklist_lock);
+	for_each_task(p) {
+		struct files_struct *files;
+		if (p->session != sid)
+			continue;
+
+		task_lock(p);
+		files = p->files;
+		if (files) {
+			read_lock(&files->file_lock);
+			for (i=0; i < files->max_fds; i++) {
+				if (fcheck_files(files, i) == file) {
+					found = 1;
+					break;
+				}
+			}
+			read_unlock(&files->file_lock);
+		}
+		task_unlock(p);
+		if(found)
+			break;
+	}
+	read_unlock(&tasklist_lock);
+
+	return found;
+}
+
+static int
+match(const struct sk_buff *skb,
+      const struct net_device *in,
+      const struct net_device *out,
+      const void *matchinfo,
+      int offset,
+      const void *hdr,
+      u_int16_t datalen,
+      int *hotdrop)
+{
+	const struct ip6t_owner_info *info = matchinfo;
+
+	if (!skb->sk || !skb->sk->socket || !skb->sk->socket->file)
+		return 0;
+
+	if(info->match & IP6T_OWNER_UID) {
+		if((skb->sk->socket->file->f_uid != info->uid) ^
+		    !!(info->invert & IP6T_OWNER_UID))
+			return 0;
+	}
+
+	if(info->match & IP6T_OWNER_GID) {
+		if((skb->sk->socket->file->f_gid != info->gid) ^
+		    !!(info->invert & IP6T_OWNER_GID))
+			return 0;
+	}
+
+	if(info->match & IP6T_OWNER_PID) {
+		if (!match_pid(skb, info->pid) ^
+		    !!(info->invert & IP6T_OWNER_PID))
+			return 0;
+	}
+
+	if(info->match & IP6T_OWNER_SID) {
+		if (!match_sid(skb, info->sid) ^
+		    !!(info->invert & IP6T_OWNER_SID))
+			return 0;
+	}
+
+	return 1;
+}
+
+static int
+checkentry(const char *tablename,
+           const struct ip6t_ip6 *ip,
+           void *matchinfo,
+           unsigned int matchsize,
+           unsigned int hook_mask)
+{
+        if (hook_mask
+            & ~((1 << NF_IP6_LOCAL_OUT) | (1 << NF_IP6_POST_ROUTING))) {
+                printk("ip6t_owner: only valid for LOCAL_OUT or POST_ROUTING.\n");
+                return 0;
+        }
+
+	if (matchsize != IP6T_ALIGN(sizeof(struct ip6t_owner_info)))
+		return 0;
+
+	return 1;
+}
+
+static struct ip6t_match owner_match
+= { { NULL, NULL }, "owner", &match, &checkentry, NULL, THIS_MODULE };
+
+static int __init init(void)
+{
+	return ip6t_register_match(&owner_match);
+}
+
+static void __exit fini(void)
+{
+	ip6t_unregister_match(&owner_match);
+}
+
+module_init(init);
+module_exit(fini);
