mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 15:54:15 +08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (27 commits) pktgen: make sure that pktgen_thread_worker has been executed [VLAN]: Propagate selected feature bits to VLAN devices drivers/atm/: remove CVS keywords vlan: Correctly handle device notifications for layered VLAN devices net: Fix call to ->change_rx_flags(dev, IFF_MULTICAST) in dev_change_flags() net_sched: cls_api: fix return value for non-existant classifiers ipsec: Use the correct ip_local_out function ipv6 addrconf: Allow infinite prefix lifetime. ipv6 route: Fix lifetime in netlink. ipv6 addrconf: Fix route lifetime setting in corner case. ndisc: Add missing strategies for per-device retrans timer/reachable time settings. ipv6: Move <linux/in6.h> from header-y to unifdef-y. l2tp: avoid skb truesize bug if headroom is increased wireless: Create 'device' symlink in sysfs wireless, airo: waitbusy() won't delay libertas: fix command timeout after firmware failure mac80211: Add RTNL version of ieee80211_iterate_active_interfaces mac80211 : Association with 11n hidden ssid ap. hostap: fix "registers" registration in procfs isdn/capi: Return proper errnos on module init. ...
This commit is contained in:
commit
e616c63033
@ -1,4 +1,3 @@
|
||||
/* $Id: fore200e.h,v 1.4 2000/04/14 10:10:34 davem Exp $ */
|
||||
#ifndef _FORE200E_H
|
||||
#define _FORE200E_H
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
/*
|
||||
$Id: fore200e_mkfirm.c,v 1.1 2000/02/21 16:04:32 davem Exp $
|
||||
|
||||
mkfirm.c: generates a C readable file from a binary firmware image
|
||||
|
||||
Christophe Lizzi (lizzi@{csti.fr, cnam.fr}), June 1999.
|
||||
|
@ -1,5 +1,3 @@
|
||||
/* $Id: he.h,v 1.4 2003/05/06 22:48:00 chas Exp $ */
|
||||
|
||||
/*
|
||||
|
||||
he.h
|
||||
|
@ -1,8 +1,4 @@
|
||||
/*******************************************************************
|
||||
* ident "$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $"
|
||||
*
|
||||
* $Author: ecd $
|
||||
* $Date: 2001/11/11 08:13:54 $
|
||||
*
|
||||
* Copyright (c) 2000 ATecoM GmbH
|
||||
*
|
||||
@ -29,9 +25,6 @@
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*******************************************************************/
|
||||
static char const rcsid[] =
|
||||
"$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $";
|
||||
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
|
@ -1,8 +1,4 @@
|
||||
/*******************************************************************
|
||||
* ident "$Id: idt77252.h,v 1.2 2001/11/11 08:13:54 ecd Exp $"
|
||||
*
|
||||
* $Author: ecd $
|
||||
* $Date: 2001/11/11 08:13:54 $
|
||||
*
|
||||
* Copyright (c) 2000 ATecoM GmbH
|
||||
*
|
||||
|
@ -1025,7 +1025,8 @@ typedef struct iadev_t {
|
||||
spinlock_t rx_lock, misc_lock;
|
||||
struct atm_vcc **rx_open; /* list of all open VCs */
|
||||
u16 num_rx_desc, rx_buf_sz, rxing;
|
||||
u32 rx_pkt_ram, rx_tmp_cnt, rx_tmp_jif;
|
||||
u32 rx_pkt_ram, rx_tmp_cnt;
|
||||
unsigned long rx_tmp_jif;
|
||||
void __iomem *RX_DESC_BASE_ADDR;
|
||||
u32 drop_rxpkt, drop_rxcell, rx_cell_cnt, rx_pkt_cnt;
|
||||
struct atm_dev *next_board; /* other iphase devices */
|
||||
|
@ -13,7 +13,7 @@
|
||||
*
|
||||
* Modified to work with the IDT7721 nicstar -- AAL5 (tested) only.
|
||||
*
|
||||
* R. D. Rechenmacher <ron@fnal.gov>, Aug. 6, 1997 $Revision: 1.1 $ $Date: 1999/08/20 11:00:11 $
|
||||
* R. D. Rechenmacher <ron@fnal.gov>, Aug. 6, 1997
|
||||
*
|
||||
* Linux driver for the IDT77201 NICStAR PCI ATM controller.
|
||||
* PHY component is expected to be 155 Mbps S/UNI-Lite or IDT 77155;
|
||||
|
@ -1291,13 +1291,11 @@ int device_rename(struct device *dev, char *new_name)
|
||||
}
|
||||
#else
|
||||
if (dev->class) {
|
||||
sysfs_remove_link(&dev->class->subsys.kobj, old_device_name);
|
||||
error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj,
|
||||
dev->bus_id);
|
||||
if (error) {
|
||||
dev_err(dev, "%s: sysfs_create_symlink failed (%d)\n",
|
||||
__func__, error);
|
||||
}
|
||||
if (error)
|
||||
goto out;
|
||||
sysfs_remove_link(&dev->class->subsys.kobj, old_device_name);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -948,17 +948,17 @@ int __init cdebug_init(void)
|
||||
{
|
||||
g_cmsg= kmalloc(sizeof(_cmsg), GFP_KERNEL);
|
||||
if (!g_cmsg)
|
||||
return ENOMEM;
|
||||
return -ENOMEM;
|
||||
g_debbuf = kmalloc(sizeof(_cdebbuf), GFP_KERNEL);
|
||||
if (!g_debbuf) {
|
||||
kfree(g_cmsg);
|
||||
return ENOMEM;
|
||||
return -ENOMEM;
|
||||
}
|
||||
g_debbuf->buf = kmalloc(CDEBUG_GSIZE, GFP_KERNEL);
|
||||
if (!g_debbuf->buf) {
|
||||
kfree(g_cmsg);
|
||||
kfree(g_debbuf);
|
||||
return ENOMEM;;
|
||||
return -ENOMEM;;
|
||||
}
|
||||
g_debbuf->size = CDEBUG_GSIZE;
|
||||
g_debbuf->buf[0] = 0;
|
||||
|
@ -3,7 +3,7 @@
|
||||
#
|
||||
config HYSDN
|
||||
tristate "Hypercope HYSDN cards (Champ, Ergo, Metro) support (module only)"
|
||||
depends on m && PROC_FS && PCI && BROKEN_ON_SMP
|
||||
depends on m && PROC_FS && PCI
|
||||
help
|
||||
Say Y here if you have one of Hypercope's active PCI ISDN cards
|
||||
Champ, Ergo and Metro. You will then get a module called hysdn.
|
||||
|
@ -64,10 +64,11 @@ ergo_interrupt(int intno, void *dev_id)
|
||||
} /* ergo_interrupt */
|
||||
|
||||
/******************************************************************************/
|
||||
/* ergo_irq_bh is the function called by the immediate kernel task list after */
|
||||
/* being activated with queue_task and no interrupts active. This task is the */
|
||||
/* only one handling data transfer from or to the card after booting. The task */
|
||||
/* may be queued from everywhere (interrupts included). */
|
||||
/* ergo_irq_bh will be called as part of the kernel clearing its shared work */
|
||||
/* queue sometime after a call to schedule_work has been made passing our */
|
||||
/* work_struct. This task is the only one handling data transfer from or to */
|
||||
/* the card after booting. The task may be queued from everywhere */
|
||||
/* (interrupts included). */
|
||||
/******************************************************************************/
|
||||
static void
|
||||
ergo_irq_bh(struct work_struct *ugli_api)
|
||||
@ -90,7 +91,6 @@ ergo_irq_bh(struct work_struct *ugli_api)
|
||||
card->hw_lock = 1; /* we now lock the hardware */
|
||||
|
||||
do {
|
||||
sti(); /* reenable other ints */
|
||||
again = 0; /* assume loop not to be repeated */
|
||||
|
||||
if (!dpr->ToHyFlag) {
|
||||
@ -110,7 +110,6 @@ ergo_irq_bh(struct work_struct *ugli_api)
|
||||
again = 1; /* restart loop */
|
||||
}
|
||||
} /* a message has arrived for us */
|
||||
cli(); /* no further ints */
|
||||
if (again) {
|
||||
dpr->ToHyInt = 1;
|
||||
dpr->ToPcInt = 1; /* interrupt to E1 for all cards */
|
||||
@ -242,7 +241,6 @@ ergo_writebootimg(struct HYSDN_CARD *card, unsigned char *buf,
|
||||
byteout(card->iobase + PCI9050_USER_IO, PCI9050_E1_RUN); /* start E1 processor */
|
||||
/* the interrupts are still masked */
|
||||
|
||||
sti();
|
||||
msleep_interruptible(20); /* Timeout 20ms */
|
||||
|
||||
if (((tDpramBootSpooler *) card->dpram)->Len != DPRAM_SPOOLER_DATA_SIZE) {
|
||||
@ -276,7 +274,6 @@ ergo_writebootseq(struct HYSDN_CARD *card, unsigned char *buf, int len)
|
||||
dst = sp->Data; /* point to data in spool structure */
|
||||
buflen = sp->Len; /* maximum len of spooled data */
|
||||
wr_mirror = sp->WrPtr; /* only once read */
|
||||
sti();
|
||||
|
||||
/* try until all bytes written or error */
|
||||
i = 0x1000; /* timeout value */
|
||||
@ -380,7 +377,6 @@ ergo_waitpofready(struct HYSDN_CARD *card)
|
||||
#endif /* CONFIG_HYSDN_CAPI */
|
||||
return (0); /* success */
|
||||
} /* data has arrived */
|
||||
sti();
|
||||
msleep_interruptible(50); /* Timeout 50ms */
|
||||
} /* wait until timeout */
|
||||
|
||||
|
@ -1437,8 +1437,16 @@ int bond_create_sysfs(void)
|
||||
* configure multiple bonding devices.
|
||||
*/
|
||||
if (ret == -EEXIST) {
|
||||
netdev_class = NULL;
|
||||
return 0;
|
||||
/* Is someone being kinky and naming a device bonding_master? */
|
||||
if (__dev_get_by_name(&init_net,
|
||||
class_attr_bonding_masters.attr.name))
|
||||
printk(KERN_ERR
|
||||
"network device named %s already exists in sysfs",
|
||||
class_attr_bonding_masters.attr.name);
|
||||
else {
|
||||
netdev_class = NULL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -980,6 +980,8 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
|
||||
__wsum csum = 0;
|
||||
struct udphdr *uh;
|
||||
unsigned int len;
|
||||
int old_headroom;
|
||||
int new_headroom;
|
||||
|
||||
if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED))
|
||||
goto abort;
|
||||
@ -1001,16 +1003,18 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
|
||||
|
||||
/* Check that there's enough headroom in the skb to insert IP,
|
||||
* UDP and L2TP and PPP headers. If not enough, expand it to
|
||||
* make room. Note that a new skb (or a clone) is
|
||||
* allocated. If we return an error from this point on, make
|
||||
* sure we free the new skb but do not free the original skb
|
||||
* since that is done by the caller for the error case.
|
||||
* make room. Adjust truesize.
|
||||
*/
|
||||
headroom = NET_SKB_PAD + sizeof(struct iphdr) +
|
||||
sizeof(struct udphdr) + hdr_len + sizeof(ppph);
|
||||
old_headroom = skb_headroom(skb);
|
||||
if (skb_cow_head(skb, headroom))
|
||||
goto abort;
|
||||
|
||||
new_headroom = skb_headroom(skb);
|
||||
skb_orphan(skb);
|
||||
skb->truesize += new_headroom - old_headroom;
|
||||
|
||||
/* Setup PPP header */
|
||||
__skb_push(skb, sizeof(ppph));
|
||||
skb->data[0] = ppph[0];
|
||||
@ -1065,7 +1069,6 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
|
||||
/* Get routing info from the tunnel socket */
|
||||
dst_release(skb->dst);
|
||||
skb->dst = dst_clone(__sk_dst_get(sk_tun));
|
||||
skb_orphan(skb);
|
||||
skb->sk = sk_tun;
|
||||
|
||||
/* Queue the packet to IP for output */
|
||||
|
@ -2668,6 +2668,7 @@ static struct net_device *init_wifidev(struct airo_info *ai,
|
||||
dev->irq = ethdev->irq;
|
||||
dev->base_addr = ethdev->base_addr;
|
||||
dev->wireless_data = ethdev->wireless_data;
|
||||
SET_NETDEV_DEV(dev, ethdev->dev.parent);
|
||||
memcpy(dev->dev_addr, ethdev->dev_addr, dev->addr_len);
|
||||
err = register_netdev(dev);
|
||||
if (err<0) {
|
||||
@ -2904,7 +2905,7 @@ EXPORT_SYMBOL(init_airo_card);
|
||||
|
||||
static int waitbusy (struct airo_info *ai) {
|
||||
int delay = 0;
|
||||
while ((IN4500 (ai, COMMAND) & COMMAND_BUSY) & (delay < 10000)) {
|
||||
while ((IN4500 (ai, COMMAND) & COMMAND_BUSY) && (delay < 10000)) {
|
||||
udelay (10);
|
||||
if ((++delay % 20) == 0)
|
||||
OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
|
||||
|
@ -3276,11 +3276,6 @@ while (0)
|
||||
}
|
||||
printk(KERN_INFO "%s: Registered netdevice %s\n", dev_info, dev->name);
|
||||
|
||||
#ifndef PRISM2_NO_PROCFS_DEBUG
|
||||
create_proc_read_entry("registers", 0, local->proc,
|
||||
prism2_registers_proc_read, local);
|
||||
#endif /* PRISM2_NO_PROCFS_DEBUG */
|
||||
|
||||
hostap_init_data(local);
|
||||
return dev;
|
||||
|
||||
@ -3307,6 +3302,10 @@ static int hostap_hw_ready(struct net_device *dev)
|
||||
netif_carrier_off(local->ddev);
|
||||
}
|
||||
hostap_init_proc(local);
|
||||
#ifndef PRISM2_NO_PROCFS_DEBUG
|
||||
create_proc_read_entry("registers", 0, local->proc,
|
||||
prism2_registers_proc_read, local);
|
||||
#endif /* PRISM2_NO_PROCFS_DEBUG */
|
||||
hostap_init_ap_proc(local);
|
||||
return 0;
|
||||
}
|
||||
|
@ -11584,6 +11584,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv)
|
||||
priv->prom_net_dev->hard_start_xmit = ipw_prom_hard_start_xmit;
|
||||
|
||||
priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR;
|
||||
SET_NETDEV_DEV(priv->prom_net_dev, &priv->pci_dev->dev);
|
||||
|
||||
rc = register_netdev(priv->prom_net_dev);
|
||||
if (rc) {
|
||||
|
@ -756,6 +756,7 @@ static int lbs_thread(void *data)
|
||||
priv->nr_retries = 0;
|
||||
} else {
|
||||
priv->cur_cmd = NULL;
|
||||
priv->dnld_sent = DNLD_RES_RECEIVED;
|
||||
lbs_pr_info("requeueing command %x due to timeout (#%d)\n",
|
||||
le16_to_cpu(cmdnode->cmdbuf->command), priv->nr_retries);
|
||||
|
||||
@ -1564,6 +1565,7 @@ static int lbs_add_rtap(struct lbs_private *priv)
|
||||
rtap_dev->hard_start_xmit = lbs_rtap_hard_start_xmit;
|
||||
rtap_dev->set_multicast_list = lbs_set_multicast_list;
|
||||
rtap_dev->priv = priv;
|
||||
SET_NETDEV_DEV(rtap_dev, priv->dev->dev.parent);
|
||||
|
||||
ret = register_netdev(rtap_dev);
|
||||
if (ret) {
|
||||
|
@ -419,12 +419,8 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
|
||||
*/
|
||||
int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
|
||||
{
|
||||
if (sysfs_find_dirent(acxt->parent_sd, sd->s_name)) {
|
||||
printk(KERN_WARNING "sysfs: duplicate filename '%s' "
|
||||
"can not be created\n", sd->s_name);
|
||||
WARN_ON(1);
|
||||
if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
sd->s_parent = sysfs_get(acxt->parent_sd);
|
||||
|
||||
|
@ -92,7 +92,6 @@ header-y += if_slip.h
|
||||
header-y += if_strip.h
|
||||
header-y += if_tun.h
|
||||
header-y += if_tunnel.h
|
||||
header-y += in6.h
|
||||
header-y += in_route.h
|
||||
header-y += ioctl.h
|
||||
header-y += ip6_tunnel.h
|
||||
@ -236,6 +235,7 @@ unifdef-y += if_vlan.h
|
||||
unifdef-y += igmp.h
|
||||
unifdef-y += inet_diag.h
|
||||
unifdef-y += in.h
|
||||
unifdef-y += in6.h
|
||||
unifdef-y += inotify.h
|
||||
unifdef-y += input.h
|
||||
unifdef-y += ip.h
|
||||
|
@ -16,14 +16,11 @@
|
||||
* documentation. Do not change them.
|
||||
*/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/socket.h>
|
||||
#include <linux/types.h>
|
||||
#endif
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/atmapi.h>
|
||||
#include <linux/atmsap.h>
|
||||
#include <linux/atmioc.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
|
||||
/* general ATM constants */
|
||||
@ -212,7 +209,7 @@ struct sockaddr_atmsvc {
|
||||
char pub[ATM_E164_LEN+1]; /* public address (E.164) */
|
||||
/* unused addresses must be bzero'ed */
|
||||
char lij_type; /* role in LIJ call; one of ATM_LIJ* */
|
||||
uint32_t lij_id; /* LIJ call identifier */
|
||||
__u32 lij_id; /* LIJ call identifier */
|
||||
} sas_addr __ATM_API_ALIGN; /* SVC address */
|
||||
};
|
||||
|
||||
|
@ -8,11 +8,9 @@
|
||||
#define LINUX_ATM_TCP_H
|
||||
|
||||
#include <linux/atmapi.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/types.h>
|
||||
#endif
|
||||
#include <linux/atm.h>
|
||||
#include <linux/atmioc.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
|
||||
/*
|
||||
@ -20,9 +18,9 @@
|
||||
*/
|
||||
|
||||
struct atmtcp_hdr {
|
||||
uint16_t vpi;
|
||||
uint16_t vci;
|
||||
uint32_t length; /* ... of data part */
|
||||
__u16 vpi;
|
||||
__u16 vci;
|
||||
__u32 length; /* ... of data part */
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -514,10 +514,12 @@ struct net_device
|
||||
#define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */
|
||||
#define NETIF_F_MULTI_QUEUE 16384 /* Has multiple TX/RX queues */
|
||||
#define NETIF_F_LRO 32768 /* large receive offload */
|
||||
#define NETIF_F_VLAN_TSO 65536 /* Supports TSO for VLANs */
|
||||
#define NETIF_F_VLAN_CSUM 131072 /* Supports TX checksumming for VLANs */
|
||||
|
||||
/* Segmentation offload features */
|
||||
#define NETIF_F_GSO_SHIFT 16
|
||||
#define NETIF_F_GSO_MASK 0xffff0000
|
||||
#define NETIF_F_GSO_SHIFT 20
|
||||
#define NETIF_F_GSO_MASK 0xfff00000
|
||||
#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
|
||||
#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
|
||||
#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
|
||||
|
@ -1594,13 +1594,16 @@ void ieee80211_wake_queues(struct ieee80211_hw *hw);
|
||||
void ieee80211_scan_completed(struct ieee80211_hw *hw);
|
||||
|
||||
/**
|
||||
* ieee80211_iterate_active_interfaces - iterate active interfaces
|
||||
* ieee80211_iterate_active_interfaces- iterate active interfaces
|
||||
*
|
||||
* This function iterates over the interfaces associated with a given
|
||||
* hardware that are currently active and calls the callback for them.
|
||||
* This function allows the iterator function to sleep, when the iterator
|
||||
* function is atomic @ieee80211_iterate_active_interfaces_atomic can
|
||||
* be used.
|
||||
*
|
||||
* @hw: the hardware struct of which the interfaces should be iterated over
|
||||
* @iterator: the iterator function to call, cannot sleep
|
||||
* @iterator: the iterator function to call
|
||||
* @data: first argument of the iterator function
|
||||
*/
|
||||
void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
|
||||
@ -1608,6 +1611,24 @@ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif),
|
||||
void *data);
|
||||
|
||||
/**
|
||||
* ieee80211_iterate_active_interfaces_atomic - iterate active interfaces
|
||||
*
|
||||
* This function iterates over the interfaces associated with a given
|
||||
* hardware that are currently active and calls the callback for them.
|
||||
* This function requires the iterator callback function to be atomic,
|
||||
* if that is not desired, use @ieee80211_iterate_active_interfaces instead.
|
||||
*
|
||||
* @hw: the hardware struct of which the interfaces should be iterated over
|
||||
* @iterator: the iterator function to call, cannot sleep
|
||||
* @data: first argument of the iterator function
|
||||
*/
|
||||
void ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw,
|
||||
void (*iterator)(void *data,
|
||||
u8 *mac,
|
||||
struct ieee80211_vif *vif),
|
||||
void *data);
|
||||
|
||||
/**
|
||||
* ieee80211_start_tx_ba_session - Start a tx Block Ack session.
|
||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||
|
@ -129,6 +129,10 @@ extern int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl,
|
||||
void __user *buffer,
|
||||
size_t *lenp,
|
||||
loff_t *ppos);
|
||||
int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name,
|
||||
int nlen, void __user *oldval,
|
||||
size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen);
|
||||
#endif
|
||||
|
||||
extern void inet6_ifinfo_notify(int event,
|
||||
|
@ -382,6 +382,24 @@ static void vlan_sync_address(struct net_device *dev,
|
||||
memcpy(vlan->real_dev_addr, dev->dev_addr, ETH_ALEN);
|
||||
}
|
||||
|
||||
static void vlan_transfer_features(struct net_device *dev,
|
||||
struct net_device *vlandev)
|
||||
{
|
||||
unsigned long old_features = vlandev->features;
|
||||
|
||||
if (dev->features & NETIF_F_VLAN_TSO) {
|
||||
vlandev->features &= ~VLAN_TSO_FEATURES;
|
||||
vlandev->features |= dev->features & VLAN_TSO_FEATURES;
|
||||
}
|
||||
if (dev->features & NETIF_F_VLAN_CSUM) {
|
||||
vlandev->features &= ~NETIF_F_ALL_CSUM;
|
||||
vlandev->features |= dev->features & NETIF_F_ALL_CSUM;
|
||||
}
|
||||
|
||||
if (old_features != vlandev->features)
|
||||
netdev_features_change(vlandev);
|
||||
}
|
||||
|
||||
static void __vlan_device_event(struct net_device *dev, unsigned long event)
|
||||
{
|
||||
switch (event) {
|
||||
@ -410,10 +428,8 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
|
||||
int i, flgs;
|
||||
struct net_device *vlandev;
|
||||
|
||||
if (is_vlan_dev(dev)) {
|
||||
if (is_vlan_dev(dev))
|
||||
__vlan_device_event(dev, event);
|
||||
goto out;
|
||||
}
|
||||
|
||||
grp = __vlan_find_group(dev);
|
||||
if (!grp)
|
||||
@ -450,6 +466,18 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
|
||||
}
|
||||
break;
|
||||
|
||||
case NETDEV_FEAT_CHANGE:
|
||||
/* Propagate device features to underlying device */
|
||||
for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
|
||||
vlandev = vlan_group_get_device(grp, i);
|
||||
if (!vlandev)
|
||||
continue;
|
||||
|
||||
vlan_transfer_features(dev, vlandev);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case NETDEV_DOWN:
|
||||
/* Put all VLANs for this dev in the down state too. */
|
||||
for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
|
||||
|
@ -7,6 +7,8 @@
|
||||
#define VLAN_GRP_HASH_SIZE (1 << VLAN_GRP_HASH_SHIFT)
|
||||
#define VLAN_GRP_HASH_MASK (VLAN_GRP_HASH_SIZE - 1)
|
||||
|
||||
#define VLAN_TSO_FEATURES (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_SG)
|
||||
|
||||
/* Find a VLAN device by the MAC address of its Ethernet device, and
|
||||
* it's VLAN ID. The default configuration is to have VLAN's scope
|
||||
* to be box-wide, so the MAC will be ignored. The mac will only be
|
||||
|
@ -663,6 +663,11 @@ static int vlan_dev_init(struct net_device *dev)
|
||||
(1<<__LINK_STATE_DORMANT))) |
|
||||
(1<<__LINK_STATE_PRESENT);
|
||||
|
||||
if (real_dev->features & NETIF_F_VLAN_TSO)
|
||||
dev->features |= real_dev->features & VLAN_TSO_FEATURES;
|
||||
if (real_dev->features & NETIF_F_VLAN_CSUM)
|
||||
dev->features |= real_dev->features & NETIF_F_ALL_CSUM;
|
||||
|
||||
/* ipv6 shared card related stuff */
|
||||
dev->dev_id = real_dev->dev_id;
|
||||
|
||||
|
@ -903,7 +903,11 @@ int dev_change_name(struct net_device *dev, char *newname)
|
||||
strlcpy(dev->name, newname, IFNAMSIZ);
|
||||
|
||||
rollback:
|
||||
device_rename(&dev->dev, dev->name);
|
||||
err = device_rename(&dev->dev, dev->name);
|
||||
if (err) {
|
||||
memcpy(dev->name, oldname, IFNAMSIZ);
|
||||
return err;
|
||||
}
|
||||
|
||||
write_lock_bh(&dev_base_lock);
|
||||
hlist_del(&dev->name_hlist);
|
||||
@ -3137,7 +3141,7 @@ int dev_change_flags(struct net_device *dev, unsigned flags)
|
||||
* Load in the correct multicast list now the flags have changed.
|
||||
*/
|
||||
|
||||
if (dev->change_rx_flags && (dev->flags ^ flags) & IFF_MULTICAST)
|
||||
if (dev->change_rx_flags && (old_flags ^ flags) & IFF_MULTICAST)
|
||||
dev->change_rx_flags(dev, IFF_MULTICAST);
|
||||
|
||||
dev_set_rx_mode(dev);
|
||||
|
@ -390,6 +390,7 @@ struct pktgen_thread {
|
||||
int cpu;
|
||||
|
||||
wait_queue_head_t queue;
|
||||
struct completion start_done;
|
||||
};
|
||||
|
||||
#define REMOVE 1
|
||||
@ -3414,6 +3415,7 @@ static int pktgen_thread_worker(void *arg)
|
||||
BUG_ON(smp_processor_id() != cpu);
|
||||
|
||||
init_waitqueue_head(&t->queue);
|
||||
complete(&t->start_done);
|
||||
|
||||
pr_debug("pktgen: starting pktgen/%d: pid=%d\n", cpu, task_pid_nr(current));
|
||||
|
||||
@ -3615,6 +3617,7 @@ static int __init pktgen_create_thread(int cpu)
|
||||
INIT_LIST_HEAD(&t->if_list);
|
||||
|
||||
list_add_tail(&t->th_list, &pktgen_threads);
|
||||
init_completion(&t->start_done);
|
||||
|
||||
p = kthread_create(pktgen_thread_worker, t, "kpktgend_%d", cpu);
|
||||
if (IS_ERR(p)) {
|
||||
@ -3639,6 +3642,7 @@ static int __init pktgen_create_thread(int cpu)
|
||||
}
|
||||
|
||||
wake_up_process(p);
|
||||
wait_for_completion(&t->start_done);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -160,7 +160,7 @@ static struct dst_ops ipv4_dst_ops = {
|
||||
.negative_advice = ipv4_negative_advice,
|
||||
.link_failure = ipv4_link_failure,
|
||||
.update_pmtu = ip_rt_update_pmtu,
|
||||
.local_out = ip_local_out,
|
||||
.local_out = __ip_local_out,
|
||||
.entry_size = sizeof(struct rtable),
|
||||
.entries = ATOMIC_INIT(0),
|
||||
};
|
||||
|
@ -1764,14 +1764,16 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
|
||||
* 2) Configure prefixes with the auto flag set
|
||||
*/
|
||||
|
||||
/* Avoid arithmetic overflow. Really, we could
|
||||
save rt_expires in seconds, likely valid_lft,
|
||||
but it would require division in fib gc, that it
|
||||
not good.
|
||||
*/
|
||||
if (valid_lft >= 0x7FFFFFFF/HZ)
|
||||
if (valid_lft == INFINITY_LIFE_TIME)
|
||||
rt_expires = ~0UL;
|
||||
else if (valid_lft >= 0x7FFFFFFF/HZ) {
|
||||
/* Avoid arithmetic overflow. Really, we could
|
||||
* save rt_expires in seconds, likely valid_lft,
|
||||
* but it would require division in fib gc, that it
|
||||
* not good.
|
||||
*/
|
||||
rt_expires = 0x7FFFFFFF - (0x7FFFFFFF % HZ);
|
||||
else
|
||||
} else
|
||||
rt_expires = valid_lft * HZ;
|
||||
|
||||
/*
|
||||
@ -1779,7 +1781,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
|
||||
* Avoid arithmetic overflow there as well.
|
||||
* Overflow can happen only if HZ < USER_HZ.
|
||||
*/
|
||||
if (HZ < USER_HZ && rt_expires > 0x7FFFFFFF / USER_HZ)
|
||||
if (HZ < USER_HZ && ~rt_expires && rt_expires > 0x7FFFFFFF / USER_HZ)
|
||||
rt_expires = 0x7FFFFFFF / USER_HZ;
|
||||
|
||||
if (pinfo->onlink) {
|
||||
@ -1788,17 +1790,28 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
|
||||
dev->ifindex, 1);
|
||||
|
||||
if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
|
||||
if (rt->rt6i_flags&RTF_EXPIRES) {
|
||||
if (valid_lft == 0) {
|
||||
ip6_del_rt(rt);
|
||||
rt = NULL;
|
||||
} else {
|
||||
rt->rt6i_expires = jiffies + rt_expires;
|
||||
}
|
||||
/* Autoconf prefix route */
|
||||
if (valid_lft == 0) {
|
||||
ip6_del_rt(rt);
|
||||
rt = NULL;
|
||||
} else if (~rt_expires) {
|
||||
/* not infinity */
|
||||
rt->rt6i_expires = jiffies + rt_expires;
|
||||
rt->rt6i_flags |= RTF_EXPIRES;
|
||||
} else {
|
||||
rt->rt6i_flags &= ~RTF_EXPIRES;
|
||||
rt->rt6i_expires = 0;
|
||||
}
|
||||
} else if (valid_lft) {
|
||||
int flags = RTF_ADDRCONF | RTF_PREFIX_RT;
|
||||
clock_t expires = 0;
|
||||
if (~rt_expires) {
|
||||
/* not infinity */
|
||||
flags |= RTF_EXPIRES;
|
||||
expires = jiffies_to_clock_t(rt_expires);
|
||||
}
|
||||
addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len,
|
||||
dev, jiffies_to_clock_t(rt_expires), RTF_ADDRCONF|RTF_EXPIRES|RTF_PREFIX_RT);
|
||||
dev, expires, flags);
|
||||
}
|
||||
if (rt)
|
||||
dst_release(&rt->u.dst);
|
||||
@ -2021,7 +2034,8 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx,
|
||||
struct inet6_dev *idev;
|
||||
struct net_device *dev;
|
||||
int scope;
|
||||
u32 flags = RTF_EXPIRES;
|
||||
u32 flags;
|
||||
clock_t expires;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
@ -2041,8 +2055,13 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx,
|
||||
if (valid_lft == INFINITY_LIFE_TIME) {
|
||||
ifa_flags |= IFA_F_PERMANENT;
|
||||
flags = 0;
|
||||
} else if (valid_lft >= 0x7FFFFFFF/HZ)
|
||||
valid_lft = 0x7FFFFFFF/HZ;
|
||||
expires = 0;
|
||||
} else {
|
||||
if (valid_lft >= 0x7FFFFFFF/HZ)
|
||||
valid_lft = 0x7FFFFFFF/HZ;
|
||||
flags = RTF_EXPIRES;
|
||||
expires = jiffies_to_clock_t(valid_lft * HZ);
|
||||
}
|
||||
|
||||
if (prefered_lft == 0)
|
||||
ifa_flags |= IFA_F_DEPRECATED;
|
||||
@ -2060,7 +2079,7 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx,
|
||||
spin_unlock_bh(&ifp->lock);
|
||||
|
||||
addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev,
|
||||
jiffies_to_clock_t(valid_lft * HZ), flags);
|
||||
expires, flags);
|
||||
/*
|
||||
* Note that section 3.1 of RFC 4429 indicates
|
||||
* that the Optimistic flag should not be set for
|
||||
@ -3148,7 +3167,8 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
|
||||
static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags,
|
||||
u32 prefered_lft, u32 valid_lft)
|
||||
{
|
||||
u32 flags = RTF_EXPIRES;
|
||||
u32 flags;
|
||||
clock_t expires;
|
||||
|
||||
if (!valid_lft || (prefered_lft > valid_lft))
|
||||
return -EINVAL;
|
||||
@ -3156,8 +3176,13 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags,
|
||||
if (valid_lft == INFINITY_LIFE_TIME) {
|
||||
ifa_flags |= IFA_F_PERMANENT;
|
||||
flags = 0;
|
||||
} else if (valid_lft >= 0x7FFFFFFF/HZ)
|
||||
valid_lft = 0x7FFFFFFF/HZ;
|
||||
expires = 0;
|
||||
} else {
|
||||
if (valid_lft >= 0x7FFFFFFF/HZ)
|
||||
valid_lft = 0x7FFFFFFF/HZ;
|
||||
flags = RTF_EXPIRES;
|
||||
expires = jiffies_to_clock_t(valid_lft * HZ);
|
||||
}
|
||||
|
||||
if (prefered_lft == 0)
|
||||
ifa_flags |= IFA_F_DEPRECATED;
|
||||
@ -3176,7 +3201,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags,
|
||||
ipv6_ifa_notify(0, ifp);
|
||||
|
||||
addrconf_prefix_route(&ifp->addr, ifp->prefix_len, ifp->idev->dev,
|
||||
jiffies_to_clock_t(valid_lft * HZ), flags);
|
||||
expires, flags);
|
||||
addrconf_verify(0);
|
||||
|
||||
return 0;
|
||||
@ -4242,7 +4267,7 @@ static void addrconf_sysctl_register(struct inet6_dev *idev)
|
||||
neigh_sysctl_register(idev->dev, idev->nd_parms, NET_IPV6,
|
||||
NET_IPV6_NEIGH, "ipv6",
|
||||
&ndisc_ifinfo_sysctl_change,
|
||||
NULL);
|
||||
ndisc_ifinfo_sysctl_strategy);
|
||||
__addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name,
|
||||
idev->dev->ifindex, idev, &idev->cnf);
|
||||
}
|
||||
|
@ -1727,10 +1727,10 @@ int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, struct file * f
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name,
|
||||
int nlen, void __user *oldval,
|
||||
size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen)
|
||||
int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name,
|
||||
int nlen, void __user *oldval,
|
||||
size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen)
|
||||
{
|
||||
struct net_device *dev = ctl->extra1;
|
||||
struct inet6_dev *idev;
|
||||
|
@ -109,7 +109,7 @@ static struct dst_ops ip6_dst_ops_template = {
|
||||
.negative_advice = ip6_negative_advice,
|
||||
.link_failure = ip6_link_failure,
|
||||
.update_pmtu = ip6_rt_update_pmtu,
|
||||
.local_out = ip6_local_out,
|
||||
.local_out = __ip6_local_out,
|
||||
.entry_size = sizeof(struct rt6_info),
|
||||
.entries = ATOMIC_INIT(0),
|
||||
};
|
||||
@ -475,7 +475,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
|
||||
lifetime = ntohl(rinfo->lifetime);
|
||||
if (lifetime == 0xffffffff) {
|
||||
/* infinity */
|
||||
} else if (lifetime > 0x7fffffff/HZ) {
|
||||
} else if (lifetime > 0x7fffffff/HZ - 1) {
|
||||
/* Avoid arithmetic overflow */
|
||||
lifetime = 0x7fffffff/HZ - 1;
|
||||
}
|
||||
@ -1106,7 +1106,9 @@ int ip6_route_add(struct fib6_config *cfg)
|
||||
}
|
||||
|
||||
rt->u.dst.obsolete = -1;
|
||||
rt->rt6i_expires = jiffies + clock_t_to_jiffies(cfg->fc_expires);
|
||||
rt->rt6i_expires = (cfg->fc_flags & RTF_EXPIRES) ?
|
||||
jiffies + clock_t_to_jiffies(cfg->fc_expires) :
|
||||
0;
|
||||
|
||||
if (cfg->fc_protocol == RTPROT_UNSPEC)
|
||||
cfg->fc_protocol = RTPROT_BOOT;
|
||||
@ -2200,7 +2202,9 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt,
|
||||
|
||||
NLA_PUT_U32(skb, RTA_PRIORITY, rt->rt6i_metric);
|
||||
|
||||
expires = rt->rt6i_expires ? rt->rt6i_expires - jiffies : 0;
|
||||
expires = (rt->rt6i_flags & RTF_EXPIRES) ?
|
||||
rt->rt6i_expires - jiffies : 0;
|
||||
|
||||
if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0,
|
||||
expires, rt->u.dst.error) < 0)
|
||||
goto nla_put_failure;
|
||||
|
@ -3446,21 +3446,17 @@ static int ieee80211_sta_config_auth(struct net_device *dev,
|
||||
struct ieee80211_sta_bss *bss, *selected = NULL;
|
||||
int top_rssi = 0, freq;
|
||||
|
||||
if (!(ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL |
|
||||
IEEE80211_STA_AUTO_BSSID_SEL | IEEE80211_STA_AUTO_CHANNEL_SEL))) {
|
||||
ifsta->state = IEEE80211_AUTHENTICATE;
|
||||
ieee80211_sta_reset_auth(dev, ifsta);
|
||||
return 0;
|
||||
}
|
||||
|
||||
spin_lock_bh(&local->sta_bss_lock);
|
||||
freq = local->oper_channel->center_freq;
|
||||
list_for_each_entry(bss, &local->sta_bss_list, list) {
|
||||
if (!(bss->capability & WLAN_CAPABILITY_ESS))
|
||||
continue;
|
||||
|
||||
if (!!(bss->capability & WLAN_CAPABILITY_PRIVACY) ^
|
||||
!!sdata->default_key)
|
||||
if ((ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL |
|
||||
IEEE80211_STA_AUTO_BSSID_SEL |
|
||||
IEEE80211_STA_AUTO_CHANNEL_SEL)) &&
|
||||
(!!(bss->capability & WLAN_CAPABILITY_PRIVACY) ^
|
||||
!!sdata->default_key))
|
||||
continue;
|
||||
|
||||
if (!(ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL) &&
|
||||
|
@ -389,6 +389,41 @@ void ieee80211_iterate_active_interfaces(
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
switch (sdata->vif.type) {
|
||||
case IEEE80211_IF_TYPE_INVALID:
|
||||
case IEEE80211_IF_TYPE_MNTR:
|
||||
case IEEE80211_IF_TYPE_VLAN:
|
||||
continue;
|
||||
case IEEE80211_IF_TYPE_AP:
|
||||
case IEEE80211_IF_TYPE_STA:
|
||||
case IEEE80211_IF_TYPE_IBSS:
|
||||
case IEEE80211_IF_TYPE_WDS:
|
||||
case IEEE80211_IF_TYPE_MESH_POINT:
|
||||
break;
|
||||
}
|
||||
if (sdata->dev == local->mdev)
|
||||
continue;
|
||||
if (netif_running(sdata->dev))
|
||||
iterator(data, sdata->dev->dev_addr,
|
||||
&sdata->vif);
|
||||
}
|
||||
|
||||
rtnl_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces);
|
||||
|
||||
void ieee80211_iterate_active_interfaces_atomic(
|
||||
struct ieee80211_hw *hw,
|
||||
void (*iterator)(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif),
|
||||
void *data)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
||||
@ -413,4 +448,4 @@ void ieee80211_iterate_active_interfaces(
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces);
|
||||
EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
|
||||
|
@ -220,7 +220,7 @@ replay:
|
||||
tp = kzalloc(sizeof(*tp), GFP_KERNEL);
|
||||
if (tp == NULL)
|
||||
goto errout;
|
||||
err = -EINVAL;
|
||||
err = -ENOENT;
|
||||
tp_ops = tcf_proto_lookup_ops(tca[TCA_KIND]);
|
||||
if (tp_ops == NULL) {
|
||||
#ifdef CONFIG_KMOD
|
||||
|
Loading…
Reference in New Issue
Block a user