diff -Nurb linux-2.6.22-525/drivers/net/Makefile linux-2.6.22-526/drivers/net/Makefile
---- linux-2.6.22-525/drivers/net/Makefile 2008-07-09 15:41:30.000000000 -0400
-+++ linux-2.6.22-526/drivers/net/Makefile 2008-07-09 15:42:38.000000000 -0400
+--- linux-2.6.22-525/drivers/net/Makefile 2008-07-13 23:58:01.000000000 -0400
++++ linux-2.6.22-526/drivers/net/Makefile 2008-07-13 23:58:45.000000000 -0400
@@ -1,7 +1,7 @@
#
# Makefile for the Linux network (ethercard) device drivers.
obj-$(CONFIG_IBM_EMAC) += ibm_emac/
diff -Nurb linux-2.6.22-525/drivers/net/vnet_tun.c linux-2.6.22-526/drivers/net/vnet_tun.c
--- linux-2.6.22-525/drivers/net/vnet_tun.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-2.6.22-526/drivers/net/vnet_tun.c 2008-07-09 15:38:35.000000000 -0400
-@@ -0,0 +1,697 @@
++++ linux-2.6.22-526/drivers/net/vnet_tun.c 2008-07-14 16:22:57.000000000 -0400
+@@ -0,0 +1,725 @@
+/*
+ * TUN - Universal TUN/TAP device driver.
+ * Copyright (C) 1999-2002 Maxim Krasnyansky <maxk@qualcomm.com>
+#include <linux/if_arp.h>
+#include <linux/if_ether.h>
+#include <linux/if_tun.h>
++#include <net/sock.h>
+
+#include <asm/system.h>
+#include <asm/uaccess.h>
+struct net_device tun_netdev;
+static struct net_device_stats tun_stats;
+
-+#define get_sk_xid(sk) sk->sk_nid
++int print_once=1;
++
++static inline xid_t
++get_sk_xid(struct sock *sk)
++{
++ if (sk) {
++ return (int) sk->sk_nid >= 0 ? sk->sk_nid : 0;
++ }
++ else {
++ if (in_interrupt() && print_once) {
++ print_once=0;
++ printk(KERN_EMERG "vnet_tun: get-sk_xid called in interrupt context! Stephen: Don't Panic.\n");
++ }
++ return current->xid;
++ }
++}
++
+#define set_sk_xid(sk,xid) sk->sk_nid=xid
+#define set_skb_xid(skb,xid) skb->skb_tag=xid
++#define get_skb_xid(skb) skb->skb_tag
+
+/* Extended fields */
+struct tun_pi_ext {
+/* Net device start xmit */
+static int tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
+{
-+ xid_t xid = get_sk_xid(skb->sk);
-+ struct tun_struct *tun = tun_get_by_xid(xid);
++ xid_t xid, skb_xid;
++ struct tun_struct *tun;
++ skb_xid=get_skb_xid(skb);
++ if (skb_xid<1)
++ xid=get_sk_xid(skb->sk);
++ else
++ xid=skb_xid;
+
++ tun = tun_get_by_xid(xid);
+ /* Mark packet */
+ set_skb_xid(skb, xid);
+
+
+ unregister_netdev(&tun_netdev);
+}
++
++module_init(tun_init);
++module_cleanup(tun_cleanup);
++MODULE_LICENSE("GPL");