#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
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.
* 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;
}
} \
}
+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
(!(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.
*/
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 */
"%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;
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;
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;
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);
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;
/* 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;
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.
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);
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);
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);