Setting tag linux-2.6-22-50
[linux-2.6.git] / linux-2.6-526-tun-tap.patch
index 2701324..1b13d03 100644 (file)
@@ -1,6 +1,6 @@
 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.
@@ -12,8 +12,8 @@ diff -Nurb linux-2.6.22-525/drivers/net/Makefile linux-2.6.22-526/drivers/net/Ma
  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>
@@ -70,6 +70,7 @@ diff -Nurb linux-2.6.22-525/drivers/net/vnet_tun.c linux-2.6.22-526/drivers/net/
 +#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>
@@ -91,9 +92,26 @@ diff -Nurb linux-2.6.22-525/drivers/net/vnet_tun.c linux-2.6.22-526/drivers/net/
 +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 {
@@ -178,9 +196,15 @@ diff -Nurb linux-2.6.22-525/drivers/net/vnet_tun.c linux-2.6.22-526/drivers/net/
 +/* 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);
 +
@@ -711,3 +735,7 @@ diff -Nurb linux-2.6.22-525/drivers/net/vnet_tun.c linux-2.6.22-526/drivers/net/
 +
 +      unregister_netdev(&tun_netdev);
 +}
++
++module_init(tun_init);
++module_cleanup(tun_cleanup);
++MODULE_LICENSE("GPL");