This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / net / core / dev.c
index 65aedf8..e917b51 100644 (file)
@@ -74,7 +74,7 @@
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
-#include <linux/bitops.h>
+#include <asm/bitops.h>
 #include <linux/config.h>
 #include <linux/cpu.h>
 #include <linux/types.h>
 #include <linux/wireless.h>            /* Note : will define WIRELESS_EXT */
 #include <net/iw_handler.h>
 #endif /* CONFIG_NET_RADIO */
-#include <linux/vs_network.h>
 #include <asm/current.h>
+#include <linux/vs_base.h>
 #include <linux/vs_network.h>
 
 /* This define, if set, will randomly drop a packet when congestion
@@ -1003,29 +1003,6 @@ int call_netdevice_notifiers(unsigned long val, void *v)
        return notifier_call_chain(&netdev_chain, val, v);
 }
 
-/* When > 0 there are consumers of rx skb time stamps */
-static atomic_t netstamp_needed = ATOMIC_INIT(0);
-
-void net_enable_timestamp(void)
-{
-       atomic_inc(&netstamp_needed);
-}
-
-void net_disable_timestamp(void)
-{
-       atomic_dec(&netstamp_needed);
-}
-
-static inline void net_timestamp(struct timeval *stamp)
-{
-       if (atomic_read(&netstamp_needed))
-               do_gettimeofday(stamp);
-       else {
-               stamp->tv_sec = 0;
-               stamp->tv_usec = 0;
-       }
-}
-
 /*
  *     Support routine. Sends outgoing frames to any network
  *     taps currently in use.
@@ -1075,34 +1052,34 @@ void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
  * Invalidate hardware checksum when packet is to be mangled, and
  * complete checksum manually on outgoing path.
  */
-int skb_checksum_help(struct sk_buff *skb, int inward)
+int skb_checksum_help(struct sk_buff **pskb, int inward)
 {
        unsigned int csum;
-       int ret = 0, offset = skb->h.raw - skb->data;
+       int ret = 0, offset = (*pskb)->h.raw - (*pskb)->data;
 
        if (inward) {
-               skb->ip_summed = CHECKSUM_NONE;
+               (*pskb)->ip_summed = CHECKSUM_NONE;
                goto out;
        }
 
-       if (skb_cloned(skb)) {
-               ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
+       if (skb_cloned(*pskb)) {
+               ret = pskb_expand_head(*pskb, 0, 0, GFP_ATOMIC);
                if (ret)
                        goto out;
        }
 
-       if (offset > (int)skb->len)
+       if (offset > (int)(*pskb)->len)
                BUG();
-       csum = skb_checksum(skb, offset, skb->len-offset, 0);
+       csum = skb_checksum(*pskb, offset, (*pskb)->len-offset, 0);
 
-       offset = skb->tail - skb->h.raw;
+       offset = (*pskb)->tail - (*pskb)->h.raw;
        if (offset <= 0)
                BUG();
-       if (skb->csum + 2 > offset)
+       if ((*pskb)->csum + 2 > offset)
                BUG();
 
-       *(u16*)(skb->h.raw + skb->csum) = csum_fold(csum);
-       skb->ip_summed = CHECKSUM_NONE;
+       *(u16*)((*pskb)->h.raw + (*pskb)->csum) = csum_fold(csum);
+       (*pskb)->ip_summed = CHECKSUM_NONE;
 out:   
        return ret;
 }
@@ -1204,6 +1181,13 @@ int __skb_linearize(struct sk_buff *skb, int gfp_mask)
        }                                               \
 }
 
+static inline void qdisc_run(struct net_device *dev)
+{
+       while (!netif_queue_stopped(dev) &&
+              qdisc_restart(dev)<0)
+               /* NOTHING */;
+}
+
 /**
  *     dev_queue_xmit - transmit a buffer
  *     @skb: buffer to transmit
@@ -1244,9 +1228,10 @@ int dev_queue_xmit(struct sk_buff *skb)
            (!(dev->features & (NETIF_F_HW_CSUM | NETIF_F_NO_CSUM)) &&
             (!(dev->features & NETIF_F_IP_CSUM) ||
              skb->protocol != htons(ETH_P_IP))))
-               if (skb_checksum_help(skb, 0))
+               if (skb_checksum_help(&skb, 0))
                        goto out_kfree_skb;
 
+
        /* Disable soft irqs for various locks below. Also 
         * stops preemption for RCU. 
         */
@@ -1314,6 +1299,7 @@ int dev_queue_xmit(struct sk_buff *skb)
                        if (net_ratelimit())
                                printk(KERN_CRIT "Virtual device %s asks to "
                                       "queue packet!\n", dev->name);
+                       goto out_enetdown;
                } else {
                        /* Recursion is detected! It is possible,
                         * unfortunately */
@@ -1322,13 +1308,10 @@ int dev_queue_xmit(struct sk_buff *skb)
                                       "%s, fix it urgently!\n", dev->name);
                }
        }
-
+out_enetdown:
        rc = -ENETDOWN;
-       local_bh_enable();
-
 out_kfree_skb:
        kfree_skb(skb);
-       return rc;
 out:
        local_bh_enable();
        return rc;
@@ -1482,21 +1465,6 @@ drop:
        return NET_RX_DROP;
 }
 
-int netif_rx_ni(struct sk_buff *skb)
-{
-       int err;
-
-       preempt_disable();
-       err = netif_rx(skb);
-       if (softirq_pending(smp_processor_id()))
-               do_softirq();
-       preempt_enable();
-
-       return err;
-}
-
-EXPORT_SYMBOL(netif_rx_ni);
-
 static __inline__ void skb_bond(struct sk_buff *skb)
 {
        struct net_device *dev = skb->dev;
@@ -1895,9 +1863,6 @@ static int dev_ifconf(char __user *arg)
 
        total = 0;
        for (dev = dev_base; dev; dev = dev->next) {
-               if (vx_flags(VXF_HIDE_NETIF, 0) &&
-                       !dev_in_nx_info(dev, current->nx_info))
-                       continue;
                for (i = 0; i < NPROTO; i++) {
                        if (gifconf_list[i]) {
                                int done;
@@ -1958,10 +1923,6 @@ void dev_seq_stop(struct seq_file *seq, void *v)
 
 static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
 {
-       struct nx_info *nxi = current->nx_info;
-
-       if (vx_flags(VXF_HIDE_NETIF, 0) && !dev_in_nx_info(dev, nxi))
-               return;
        if (dev->get_stats) {
                struct net_device_stats *stats = dev->get_stats(dev);
 
@@ -2345,11 +2306,10 @@ static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd)
                        return dev_set_mtu(dev, ifr->ifr_mtu);
 
                case SIOCGIFHWADDR:
-                       if (!dev->addr_len)
-                               memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data);
-                       else
-                               memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr,
-                                      min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len));
+                       if ((size_t) dev->addr_len > sizeof ifr->ifr_hwaddr.sa_data)
+                               return -EOVERFLOW;
+                       memset(ifr->ifr_hwaddr.sa_data, 0, sizeof ifr->ifr_hwaddr.sa_data);
+                       memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr, dev->addr_len);
                        ifr->ifr_hwaddr.sa_family = dev->type;
                        return 0;
 
@@ -2650,7 +2610,7 @@ int dev_ioctl(unsigned int cmd, void __user *arg)
                                /* Follow me in net/core/wireless.c */
                                ret = wireless_process_ioctl(&ifr, cmd);
                                rtnl_unlock();
-                               if (IW_IS_GET(cmd) &&
+                               if (!ret && IW_IS_GET(cmd) &&
                                    copy_to_user(arg, &ifr,
                                                 sizeof(struct ifreq)))
                                        ret = -EFAULT;
@@ -2776,14 +2736,6 @@ int register_netdevice(struct net_device *dev)
                dev->features &= ~NETIF_F_SG;
        }
 
-       /* TSO requires that SG is present as well. */
-       if ((dev->features & NETIF_F_TSO) &&
-           !(dev->features & NETIF_F_SG)) {
-               printk("%s: Dropping NETIF_F_TSO since no SG feature.\n",
-                      dev->name);
-               dev->features &= ~NETIF_F_TSO;
-       }
-
        /*
         *      nil rebuild_header routine,
         *      that should be never called and used as just bug trap.
@@ -3213,6 +3165,7 @@ EXPORT_SYMBOL(__dev_get_by_index);
 EXPORT_SYMBOL(__dev_get_by_name);
 EXPORT_SYMBOL(__dev_remove_pack);
 EXPORT_SYMBOL(__skb_linearize);
+EXPORT_SYMBOL(call_netdevice_notifiers);
 EXPORT_SYMBOL(dev_add_pack);
 EXPORT_SYMBOL(dev_alloc_name);
 EXPORT_SYMBOL(dev_close);
@@ -3222,9 +3175,6 @@ EXPORT_SYMBOL(dev_get_by_name);
 EXPORT_SYMBOL(dev_ioctl);
 EXPORT_SYMBOL(dev_open);
 EXPORT_SYMBOL(dev_queue_xmit);
-#if defined(CONFIG_VNET) || defined(CONFIG_VNET_MODULE)
-EXPORT_SYMBOL(dev_queue_xmit_nit);
-#endif
 EXPORT_SYMBOL(dev_remove_pack);
 EXPORT_SYMBOL(dev_set_allmulti);
 EXPORT_SYMBOL(dev_set_promiscuity);
@@ -3244,8 +3194,6 @@ EXPORT_SYMBOL(skb_checksum_help);
 EXPORT_SYMBOL(synchronize_net);
 EXPORT_SYMBOL(unregister_netdevice);
 EXPORT_SYMBOL(unregister_netdevice_notifier);
-EXPORT_SYMBOL(net_enable_timestamp);
-EXPORT_SYMBOL(net_disable_timestamp);
 
 #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
 EXPORT_SYMBOL(br_handle_frame_hook);