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: (26 commits) bonding: fix panic if initialization fails IXP4xx: complete Ethernet netdev setup before calling register_netdev(). IXP4xx: use "ENODEV" instead of "ENOSYS" in module initialization. ipvs: Fix IPv4 FWMARK virtual services ipv4: Make INET_LRO a bool instead of tristate. net: remove stale reference to fastroute from Kconfig help text net: update skb_recycle_check() for hardware timestamping changes bnx2: Fix panic in bnx2_poll_work(). net-sched: fix bfifo default limit igb: resolve panic on shutdown when SR-IOV is enabled wimax: oops: wimax_dev_add() is the only one that can initialize the state wimax: fix oops if netlink fails to add attribute Bluetooth: Move dev_set_name() to a context that can sleep netfilter: ctnetlink: fix wrong message type in user updates netfilter: xt_cluster: fix use of cluster match with 32 nodes netfilter: ip6t_ipv6header: fix match on packets ending with NEXTHDR_NONE netfilter: add missing linux/types.h include to xt_LED.h mac80211: pid, fix memory corruption mac80211: minstrel, fix memory corruption cfg80211: fix comment on regulatory hint processing ...
This commit is contained in:
Коммит
2ad20802b7
|
@ -714,7 +714,7 @@ static int __init npe_init_module(void)
|
|||
}
|
||||
|
||||
if (!found)
|
||||
return -ENOSYS;
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -338,12 +338,12 @@ static int ixp4xx_mdio_register(void)
|
|||
if (cpu_is_ixp43x()) {
|
||||
/* IXP43x lacks NPE-B and uses NPE-C for MII PHY access */
|
||||
if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEC_ETH))
|
||||
return -ENOSYS;
|
||||
return -ENODEV;
|
||||
mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthC_BASE_VIRT;
|
||||
} else {
|
||||
/* All MII PHY accesses use NPE-B Ethernet registers */
|
||||
if (!(ixp4xx_read_feature_bits() & IXP4XX_FEATURE_NPEB_ETH0))
|
||||
return -ENOSYS;
|
||||
return -ENODEV;
|
||||
mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT;
|
||||
}
|
||||
|
||||
|
@ -1174,7 +1174,7 @@ static int __devinit eth_init_one(struct platform_device *pdev)
|
|||
regs_phys = IXP4XX_EthC_BASE_PHYS;
|
||||
break;
|
||||
default:
|
||||
err = -ENOSYS;
|
||||
err = -ENODEV;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
|
@ -1189,15 +1189,10 @@ static int __devinit eth_init_one(struct platform_device *pdev)
|
|||
goto err_free;
|
||||
}
|
||||
|
||||
if (register_netdev(dev)) {
|
||||
err = -EIO;
|
||||
goto err_npe_rel;
|
||||
}
|
||||
|
||||
port->mem_res = request_mem_region(regs_phys, REGS_SIZE, dev->name);
|
||||
if (!port->mem_res) {
|
||||
err = -EBUSY;
|
||||
goto err_unreg;
|
||||
goto err_npe_rel;
|
||||
}
|
||||
|
||||
port->plat = plat;
|
||||
|
@ -1215,20 +1210,25 @@ static int __devinit eth_init_one(struct platform_device *pdev)
|
|||
snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, "0", plat->phy);
|
||||
port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0,
|
||||
PHY_INTERFACE_MODE_MII);
|
||||
if (IS_ERR(port->phydev)) {
|
||||
printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
|
||||
return PTR_ERR(port->phydev);
|
||||
}
|
||||
if ((err = IS_ERR(port->phydev)))
|
||||
goto err_free_mem;
|
||||
|
||||
port->phydev->irq = PHY_POLL;
|
||||
|
||||
if ((err = register_netdev(dev)))
|
||||
goto err_phy_dis;
|
||||
|
||||
printk(KERN_INFO "%s: MII PHY %i on %s\n", dev->name, plat->phy,
|
||||
npe_name(port->npe));
|
||||
|
||||
return 0;
|
||||
|
||||
err_unreg:
|
||||
unregister_netdev(dev);
|
||||
err_phy_dis:
|
||||
phy_disconnect(port->phydev);
|
||||
err_free_mem:
|
||||
npe_port_tab[NPE_ID(port->id)] = NULL;
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
release_resource(port->mem_res);
|
||||
err_npe_rel:
|
||||
npe_release(port->npe);
|
||||
err_free:
|
||||
|
@ -1242,6 +1242,7 @@ static int __devexit eth_remove_one(struct platform_device *pdev)
|
|||
struct port *port = netdev_priv(dev);
|
||||
|
||||
unregister_netdev(dev);
|
||||
phy_disconnect(port->phydev);
|
||||
npe_port_tab[NPE_ID(port->id)] = NULL;
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
npe_release(port->npe);
|
||||
|
|
|
@ -54,8 +54,8 @@
|
|||
|
||||
#define DRV_MODULE_NAME "bnx2"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "2.0.0"
|
||||
#define DRV_MODULE_RELDATE "April 2, 2009"
|
||||
#define DRV_MODULE_VERSION "2.0.1"
|
||||
#define DRV_MODULE_RELDATE "May 6, 2009"
|
||||
#define FW_MIPS_FILE_06 "bnx2/bnx2-mips-06-4.6.16.fw"
|
||||
#define FW_RV2P_FILE_06 "bnx2/bnx2-rv2p-06-4.6.16.fw"
|
||||
#define FW_MIPS_FILE_09 "bnx2/bnx2-mips-09-4.6.17.fw"
|
||||
|
@ -2600,6 +2600,7 @@ bnx2_get_hw_tx_cons(struct bnx2_napi *bnapi)
|
|||
/* Tell compiler that status block fields can change. */
|
||||
barrier();
|
||||
cons = *bnapi->hw_tx_cons_ptr;
|
||||
barrier();
|
||||
if (unlikely((cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT))
|
||||
cons++;
|
||||
return cons;
|
||||
|
@ -2879,6 +2880,7 @@ bnx2_get_hw_rx_cons(struct bnx2_napi *bnapi)
|
|||
/* Tell compiler that status block fields can change. */
|
||||
barrier();
|
||||
cons = *bnapi->hw_rx_cons_ptr;
|
||||
barrier();
|
||||
if (unlikely((cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT))
|
||||
cons++;
|
||||
return cons;
|
||||
|
|
|
@ -5181,7 +5181,6 @@ static int __init bonding_init(void)
|
|||
{
|
||||
int i;
|
||||
int res;
|
||||
struct bonding *bond;
|
||||
|
||||
printk(KERN_INFO "%s", version);
|
||||
|
||||
|
@ -5212,13 +5211,6 @@ static int __init bonding_init(void)
|
|||
|
||||
goto out;
|
||||
err:
|
||||
list_for_each_entry(bond, &bond_dev_list, bond_list) {
|
||||
bond_work_cancel_all(bond);
|
||||
destroy_workqueue(bond->wq);
|
||||
}
|
||||
|
||||
bond_destroy_sysfs();
|
||||
|
||||
rtnl_lock();
|
||||
bond_free_all();
|
||||
rtnl_unlock();
|
||||
|
|
|
@ -2006,7 +2006,7 @@ static void igb_setup_rctl(struct igb_adapter *adapter)
|
|||
struct e1000_hw *hw = &adapter->hw;
|
||||
u32 rctl;
|
||||
u32 srrctl = 0;
|
||||
int i, j;
|
||||
int i;
|
||||
|
||||
rctl = rd32(E1000_RCTL);
|
||||
|
||||
|
@ -2071,8 +2071,6 @@ static void igb_setup_rctl(struct igb_adapter *adapter)
|
|||
if (adapter->vfs_allocated_count) {
|
||||
u32 vmolr;
|
||||
|
||||
j = adapter->rx_ring[0].reg_idx;
|
||||
|
||||
/* set all queue drop enable bits */
|
||||
wr32(E1000_QDE, ALL_QUEUES);
|
||||
srrctl |= E1000_SRRCTL_DROP_EN;
|
||||
|
@ -2080,16 +2078,16 @@ static void igb_setup_rctl(struct igb_adapter *adapter)
|
|||
/* disable queue 0 to prevent tail write w/o re-config */
|
||||
wr32(E1000_RXDCTL(0), 0);
|
||||
|
||||
vmolr = rd32(E1000_VMOLR(j));
|
||||
vmolr = rd32(E1000_VMOLR(adapter->vfs_allocated_count));
|
||||
if (rctl & E1000_RCTL_LPE)
|
||||
vmolr |= E1000_VMOLR_LPE;
|
||||
if (adapter->num_rx_queues > 0)
|
||||
if (adapter->num_rx_queues > 1)
|
||||
vmolr |= E1000_VMOLR_RSSE;
|
||||
wr32(E1000_VMOLR(j), vmolr);
|
||||
wr32(E1000_VMOLR(adapter->vfs_allocated_count), vmolr);
|
||||
}
|
||||
|
||||
for (i = 0; i < adapter->num_rx_queues; i++) {
|
||||
j = adapter->rx_ring[i].reg_idx;
|
||||
int j = adapter->rx_ring[i].reg_idx;
|
||||
wr32(E1000_SRRCTL(j), srrctl);
|
||||
}
|
||||
|
||||
|
|
|
@ -1249,7 +1249,7 @@ static int __devinit hss_init_one(struct platform_device *pdev)
|
|||
return -ENOMEM;
|
||||
|
||||
if ((port->npe = npe_request(0)) == NULL) {
|
||||
err = -ENOSYS;
|
||||
err = -ENODEV;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
|
@ -1311,7 +1311,7 @@ static int __init hss_init_module(void)
|
|||
if ((ixp4xx_read_feature_bits() &
|
||||
(IXP4XX_FEATURE_HDLC | IXP4XX_FEATURE_HSS)) !=
|
||||
(IXP4XX_FEATURE_HDLC | IXP4XX_FEATURE_HSS))
|
||||
return -ENOSYS;
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_init(&npe_lock);
|
||||
|
||||
|
|
|
@ -719,6 +719,14 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
|
|||
{
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
__le16 key_flags = 0;
|
||||
|
||||
key_flags |= (STA_KEY_FLG_TKIP | STA_KEY_FLG_MAP_KEY_MSK);
|
||||
key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
|
||||
key_flags &= ~STA_KEY_FLG_INVALID;
|
||||
|
||||
if (sta_id == priv->hw_params.bcast_sta_id)
|
||||
key_flags |= STA_KEY_MULTICAST_MSK;
|
||||
|
||||
keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
|
||||
keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
|
||||
|
@ -738,6 +746,9 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
|
|||
WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
|
||||
"no space for a new key");
|
||||
|
||||
priv->stations[sta_id].sta.key.key_flags = key_flags;
|
||||
|
||||
|
||||
/* This copy is acutally not needed: we get the key with each TX */
|
||||
memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key, 16);
|
||||
|
||||
|
@ -754,9 +765,7 @@ void iwl_update_tkip_key(struct iwl_priv *priv,
|
|||
{
|
||||
u8 sta_id = IWL_INVALID_STATION;
|
||||
unsigned long flags;
|
||||
__le16 key_flags = 0;
|
||||
int i;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
sta_id = iwl_find_station(priv, addr);
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
|
@ -771,16 +780,8 @@ void iwl_update_tkip_key(struct iwl_priv *priv,
|
|||
return;
|
||||
}
|
||||
|
||||
key_flags |= (STA_KEY_FLG_TKIP | STA_KEY_FLG_MAP_KEY_MSK);
|
||||
key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
|
||||
key_flags &= ~STA_KEY_FLG_INVALID;
|
||||
|
||||
if (sta_id == priv->hw_params.bcast_sta_id)
|
||||
key_flags |= STA_KEY_MULTICAST_MSK;
|
||||
|
||||
spin_lock_irqsave(&priv->sta_lock, flags);
|
||||
|
||||
priv->stations[sta_id].sta.key.key_flags = key_flags;
|
||||
priv->stations[sta_id].sta.key.tkip_rx_tsc_byte2 = (u8) iv32;
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
|
|
|
@ -1744,7 +1744,6 @@ static void iwl3945_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rx
|
|||
rxq->bd = NULL;
|
||||
rxq->rb_stts = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl3945_rx_queue_free);
|
||||
|
||||
|
||||
/* Convert linear signal-to-noise ratio into dB */
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef _XT_LED_H
|
||||
#define _XT_LED_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct xt_led_info {
|
||||
char id[27]; /* Unique ID for this trigger in the LED class */
|
||||
__u8 always_blink; /* Blink even if the LED is already on */
|
||||
|
|
|
@ -12,4 +12,6 @@ struct xt_cluster_match_info {
|
|||
u_int32_t flags;
|
||||
};
|
||||
|
||||
#define XT_CLUSTER_NODES_MAX 32
|
||||
|
||||
#endif /* _XT_CLUSTER_MATCH_H */
|
||||
|
|
|
@ -119,12 +119,6 @@ menuconfig NETFILTER
|
|||
<file:Documentation/Changes> under "iptables" for the location of
|
||||
these packages.
|
||||
|
||||
Make sure to say N to "Fast switching" below if you intend to say Y
|
||||
here, as Fast switching currently bypasses netfilter.
|
||||
|
||||
Chances are that you should say Y here if you compile a kernel which
|
||||
will run as a router and N for regular hosts. If unsure, say N.
|
||||
|
||||
if NETFILTER
|
||||
|
||||
config NETFILTER_DEBUG
|
||||
|
|
|
@ -88,10 +88,13 @@ static struct device_type bt_link = {
|
|||
static void add_conn(struct work_struct *work)
|
||||
{
|
||||
struct hci_conn *conn = container_of(work, struct hci_conn, work_add);
|
||||
struct hci_dev *hdev = conn->hdev;
|
||||
|
||||
/* ensure previous del is complete */
|
||||
flush_work(&conn->work_del);
|
||||
|
||||
dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle);
|
||||
|
||||
if (device_add(&conn->dev) < 0) {
|
||||
BT_ERR("Failed to register connection device");
|
||||
return;
|
||||
|
@ -154,12 +157,8 @@ void hci_conn_init_sysfs(struct hci_conn *conn)
|
|||
|
||||
void hci_conn_add_sysfs(struct hci_conn *conn)
|
||||
{
|
||||
struct hci_dev *hdev = conn->hdev;
|
||||
|
||||
BT_DBG("conn %p", conn);
|
||||
|
||||
dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle);
|
||||
|
||||
queue_work(bt_workq, &conn->work_add);
|
||||
}
|
||||
|
||||
|
|
|
@ -502,7 +502,9 @@ int skb_recycle_check(struct sk_buff *skb, int skb_size)
|
|||
shinfo->gso_segs = 0;
|
||||
shinfo->gso_type = 0;
|
||||
shinfo->ip6_frag_id = 0;
|
||||
shinfo->tx_flags.flags = 0;
|
||||
shinfo->frag_list = NULL;
|
||||
memset(&shinfo->hwtstamps, 0, sizeof(shinfo->hwtstamps));
|
||||
|
||||
memset(skb, 0, offsetof(struct sk_buff, tail));
|
||||
skb->data = skb->head + NET_SKB_PAD;
|
||||
|
|
|
@ -407,7 +407,7 @@ config INET_XFRM_MODE_BEET
|
|||
If unsure, say Y.
|
||||
|
||||
config INET_LRO
|
||||
tristate "Large Receive Offload (ipv4/tcp)"
|
||||
bool "Large Receive Offload (ipv4/tcp)"
|
||||
|
||||
---help---
|
||||
Support for Large Receive Offload (ipv4/tcp).
|
||||
|
|
|
@ -50,14 +50,14 @@ ipv6header_mt6(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
struct ipv6_opt_hdr _hdr;
|
||||
int hdrlen;
|
||||
|
||||
/* Is there enough space for the next ext header? */
|
||||
if (len < (int)sizeof(struct ipv6_opt_hdr))
|
||||
return false;
|
||||
/* No more exthdr -> evaluate */
|
||||
if (nexthdr == NEXTHDR_NONE) {
|
||||
temp |= MASK_NONE;
|
||||
break;
|
||||
}
|
||||
/* Is there enough space for the next ext header? */
|
||||
if (len < (int)sizeof(struct ipv6_opt_hdr))
|
||||
return false;
|
||||
/* ESP -> evaluate */
|
||||
if (nexthdr == NEXTHDR_ESP) {
|
||||
temp |= MASK_ESP;
|
||||
|
|
|
@ -476,7 +476,7 @@ minstrel_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
|
|||
return NULL;
|
||||
|
||||
for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
|
||||
sband = hw->wiphy->bands[hw->conf.channel->band];
|
||||
sband = hw->wiphy->bands[i];
|
||||
if (sband->n_bitrates > max_rates)
|
||||
max_rates = sband->n_bitrates;
|
||||
}
|
||||
|
|
|
@ -317,57 +317,17 @@ rate_control_pid_rate_init(void *priv, struct ieee80211_supported_band *sband,
|
|||
struct ieee80211_sta *sta, void *priv_sta)
|
||||
{
|
||||
struct rc_pid_sta_info *spinfo = priv_sta;
|
||||
struct rc_pid_info *pinfo = priv;
|
||||
struct rc_pid_rateinfo *rinfo = pinfo->rinfo;
|
||||
struct sta_info *si;
|
||||
int i, j, tmp;
|
||||
bool s;
|
||||
|
||||
/* TODO: This routine should consider using RSSI from previous packets
|
||||
* as we need to have IEEE 802.1X auth succeed immediately after assoc..
|
||||
* Until that method is implemented, we will use the lowest supported
|
||||
* rate as a workaround. */
|
||||
|
||||
spinfo->txrate_idx = rate_lowest_index(sband, sta);
|
||||
/* HACK */
|
||||
si = container_of(sta, struct sta_info, sta);
|
||||
si->fail_avg = 0;
|
||||
}
|
||||
|
||||
static void *rate_control_pid_alloc(struct ieee80211_hw *hw,
|
||||
struct dentry *debugfsdir)
|
||||
{
|
||||
struct rc_pid_info *pinfo;
|
||||
struct rc_pid_rateinfo *rinfo;
|
||||
struct ieee80211_supported_band *sband;
|
||||
int i, j, tmp;
|
||||
bool s;
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
struct rc_pid_debugfs_entries *de;
|
||||
#endif
|
||||
|
||||
sband = hw->wiphy->bands[hw->conf.channel->band];
|
||||
|
||||
pinfo = kmalloc(sizeof(*pinfo), GFP_ATOMIC);
|
||||
if (!pinfo)
|
||||
return NULL;
|
||||
|
||||
/* We can safely assume that sband won't change unless we get
|
||||
* reinitialized. */
|
||||
rinfo = kmalloc(sizeof(*rinfo) * sband->n_bitrates, GFP_ATOMIC);
|
||||
if (!rinfo) {
|
||||
kfree(pinfo);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pinfo->target = RC_PID_TARGET_PF;
|
||||
pinfo->sampling_period = RC_PID_INTERVAL;
|
||||
pinfo->coeff_p = RC_PID_COEFF_P;
|
||||
pinfo->coeff_i = RC_PID_COEFF_I;
|
||||
pinfo->coeff_d = RC_PID_COEFF_D;
|
||||
pinfo->smoothing_shift = RC_PID_SMOOTHING_SHIFT;
|
||||
pinfo->sharpen_factor = RC_PID_SHARPENING_FACTOR;
|
||||
pinfo->sharpen_duration = RC_PID_SHARPENING_DURATION;
|
||||
pinfo->norm_offset = RC_PID_NORM_OFFSET;
|
||||
pinfo->rinfo = rinfo;
|
||||
pinfo->oldrate = 0;
|
||||
|
||||
/* Sort the rates. This is optimized for the most common case (i.e.
|
||||
* almost-sorted CCK+OFDM rates). Kind of bubble-sort with reversed
|
||||
* mapping too. */
|
||||
|
@ -395,6 +355,51 @@ static void *rate_control_pid_alloc(struct ieee80211_hw *hw,
|
|||
break;
|
||||
}
|
||||
|
||||
spinfo->txrate_idx = rate_lowest_index(sband, sta);
|
||||
/* HACK */
|
||||
si = container_of(sta, struct sta_info, sta);
|
||||
si->fail_avg = 0;
|
||||
}
|
||||
|
||||
static void *rate_control_pid_alloc(struct ieee80211_hw *hw,
|
||||
struct dentry *debugfsdir)
|
||||
{
|
||||
struct rc_pid_info *pinfo;
|
||||
struct rc_pid_rateinfo *rinfo;
|
||||
struct ieee80211_supported_band *sband;
|
||||
int i, max_rates = 0;
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
struct rc_pid_debugfs_entries *de;
|
||||
#endif
|
||||
|
||||
pinfo = kmalloc(sizeof(*pinfo), GFP_ATOMIC);
|
||||
if (!pinfo)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
|
||||
sband = hw->wiphy->bands[i];
|
||||
if (sband->n_bitrates > max_rates)
|
||||
max_rates = sband->n_bitrates;
|
||||
}
|
||||
|
||||
rinfo = kmalloc(sizeof(*rinfo) * max_rates, GFP_ATOMIC);
|
||||
if (!rinfo) {
|
||||
kfree(pinfo);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pinfo->target = RC_PID_TARGET_PF;
|
||||
pinfo->sampling_period = RC_PID_INTERVAL;
|
||||
pinfo->coeff_p = RC_PID_COEFF_P;
|
||||
pinfo->coeff_i = RC_PID_COEFF_I;
|
||||
pinfo->coeff_d = RC_PID_COEFF_D;
|
||||
pinfo->smoothing_shift = RC_PID_SMOOTHING_SHIFT;
|
||||
pinfo->sharpen_factor = RC_PID_SHARPENING_FACTOR;
|
||||
pinfo->sharpen_duration = RC_PID_SHARPENING_DURATION;
|
||||
pinfo->norm_offset = RC_PID_NORM_OFFSET;
|
||||
pinfo->rinfo = rinfo;
|
||||
pinfo->oldrate = 0;
|
||||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
de = &pinfo->dentries;
|
||||
de->target = debugfs_create_u32("target_pf", S_IRUSR | S_IWUSR,
|
||||
|
|
|
@ -772,7 +772,7 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx)
|
|||
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||
|
||||
/* internal error, why is TX_FRAGMENTED set? */
|
||||
if (WARN_ON(skb->len <= frag_threshold))
|
||||
if (WARN_ON(skb->len + FCS_LEN <= frag_threshold))
|
||||
return TX_DROP;
|
||||
|
||||
/*
|
||||
|
|
|
@ -260,7 +260,10 @@ struct ip_vs_conn *ip_vs_ct_in_get
|
|||
list_for_each_entry(cp, &ip_vs_conn_tab[hash], c_list) {
|
||||
if (cp->af == af &&
|
||||
ip_vs_addr_equal(af, s_addr, &cp->caddr) &&
|
||||
ip_vs_addr_equal(af, d_addr, &cp->vaddr) &&
|
||||
/* protocol should only be IPPROTO_IP if
|
||||
* d_addr is a fwmark */
|
||||
ip_vs_addr_equal(protocol == IPPROTO_IP ? AF_UNSPEC : af,
|
||||
d_addr, &cp->vaddr) &&
|
||||
s_port == cp->cport && d_port == cp->vport &&
|
||||
cp->flags & IP_VS_CONN_F_TEMPLATE &&
|
||||
protocol == cp->protocol) {
|
||||
|
@ -698,7 +701,9 @@ ip_vs_conn_new(int af, int proto, const union nf_inet_addr *caddr, __be16 cport,
|
|||
cp->cport = cport;
|
||||
ip_vs_addr_copy(af, &cp->vaddr, vaddr);
|
||||
cp->vport = vport;
|
||||
ip_vs_addr_copy(af, &cp->daddr, daddr);
|
||||
/* proto should only be IPPROTO_IP if d_addr is a fwmark */
|
||||
ip_vs_addr_copy(proto == IPPROTO_IP ? AF_UNSPEC : af,
|
||||
&cp->daddr, daddr);
|
||||
cp->dport = dport;
|
||||
cp->flags = flags;
|
||||
spin_lock_init(&cp->lock);
|
||||
|
|
|
@ -278,7 +278,7 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
|||
*/
|
||||
if (svc->fwmark) {
|
||||
union nf_inet_addr fwmark = {
|
||||
.all = { 0, 0, 0, htonl(svc->fwmark) }
|
||||
.ip = htonl(svc->fwmark)
|
||||
};
|
||||
|
||||
ct = ip_vs_ct_in_get(svc->af, IPPROTO_IP, &snet, 0,
|
||||
|
@ -306,7 +306,7 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
|||
*/
|
||||
if (svc->fwmark) {
|
||||
union nf_inet_addr fwmark = {
|
||||
.all = { 0, 0, 0, htonl(svc->fwmark) }
|
||||
.ip = htonl(svc->fwmark)
|
||||
};
|
||||
|
||||
ct = ip_vs_conn_new(svc->af, IPPROTO_IP,
|
||||
|
|
|
@ -1186,28 +1186,6 @@ ctnetlink_change_conntrack(struct nf_conn *ct, struct nlattr *cda[])
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
ctnetlink_event_report(struct nf_conn *ct, u32 pid, int report)
|
||||
{
|
||||
unsigned int events = 0;
|
||||
|
||||
if (test_bit(IPS_EXPECTED_BIT, &ct->status))
|
||||
events |= IPCT_RELATED;
|
||||
else
|
||||
events |= IPCT_NEW;
|
||||
|
||||
nf_conntrack_event_report(IPCT_STATUS |
|
||||
IPCT_HELPER |
|
||||
IPCT_REFRESH |
|
||||
IPCT_PROTOINFO |
|
||||
IPCT_NATSEQADJ |
|
||||
IPCT_MARK |
|
||||
events,
|
||||
ct,
|
||||
pid,
|
||||
report);
|
||||
}
|
||||
|
||||
static struct nf_conn *
|
||||
ctnetlink_create_conntrack(struct nlattr *cda[],
|
||||
struct nf_conntrack_tuple *otuple,
|
||||
|
@ -1373,6 +1351,7 @@ ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
|
|||
err = -ENOENT;
|
||||
if (nlh->nlmsg_flags & NLM_F_CREATE) {
|
||||
struct nf_conn *ct;
|
||||
enum ip_conntrack_events events;
|
||||
|
||||
ct = ctnetlink_create_conntrack(cda, &otuple,
|
||||
&rtuple, u3);
|
||||
|
@ -1383,9 +1362,18 @@ ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
|
|||
err = 0;
|
||||
nf_conntrack_get(&ct->ct_general);
|
||||
spin_unlock_bh(&nf_conntrack_lock);
|
||||
ctnetlink_event_report(ct,
|
||||
NETLINK_CB(skb).pid,
|
||||
nlmsg_report(nlh));
|
||||
if (test_bit(IPS_EXPECTED_BIT, &ct->status))
|
||||
events = IPCT_RELATED;
|
||||
else
|
||||
events = IPCT_NEW;
|
||||
|
||||
nf_conntrack_event_report(IPCT_STATUS |
|
||||
IPCT_HELPER |
|
||||
IPCT_PROTOINFO |
|
||||
IPCT_NATSEQADJ |
|
||||
IPCT_MARK | events,
|
||||
ct, NETLINK_CB(skb).pid,
|
||||
nlmsg_report(nlh));
|
||||
nf_ct_put(ct);
|
||||
} else
|
||||
spin_unlock_bh(&nf_conntrack_lock);
|
||||
|
@ -1404,9 +1392,13 @@ ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
|
|||
if (err == 0) {
|
||||
nf_conntrack_get(&ct->ct_general);
|
||||
spin_unlock_bh(&nf_conntrack_lock);
|
||||
ctnetlink_event_report(ct,
|
||||
NETLINK_CB(skb).pid,
|
||||
nlmsg_report(nlh));
|
||||
nf_conntrack_event_report(IPCT_STATUS |
|
||||
IPCT_HELPER |
|
||||
IPCT_PROTOINFO |
|
||||
IPCT_NATSEQADJ |
|
||||
IPCT_MARK,
|
||||
ct, NETLINK_CB(skb).pid,
|
||||
nlmsg_report(nlh));
|
||||
nf_ct_put(ct);
|
||||
} else
|
||||
spin_unlock_bh(&nf_conntrack_lock);
|
||||
|
|
|
@ -135,7 +135,13 @@ static bool xt_cluster_mt_checkentry(const struct xt_mtchk_param *par)
|
|||
{
|
||||
struct xt_cluster_match_info *info = par->matchinfo;
|
||||
|
||||
if (info->node_mask >= (1 << info->total_nodes)) {
|
||||
if (info->total_nodes > XT_CLUSTER_NODES_MAX) {
|
||||
printk(KERN_ERR "xt_cluster: you have exceeded the maximum "
|
||||
"number of cluster nodes (%u > %u)\n",
|
||||
info->total_nodes, XT_CLUSTER_NODES_MAX);
|
||||
return false;
|
||||
}
|
||||
if (info->node_mask >= (1ULL << info->total_nodes)) {
|
||||
printk(KERN_ERR "xt_cluster: this node mask cannot be "
|
||||
"higher than the total number of nodes\n");
|
||||
return false;
|
||||
|
|
|
@ -51,7 +51,7 @@ static int fifo_init(struct Qdisc *sch, struct nlattr *opt)
|
|||
u32 limit = qdisc_dev(sch)->tx_queue_len ? : 1;
|
||||
|
||||
if (sch->ops == &bfifo_qdisc_ops)
|
||||
limit *= qdisc_dev(sch)->mtu;
|
||||
limit *= psched_mtu(qdisc_dev(sch));
|
||||
|
||||
q->limit = limit;
|
||||
} else {
|
||||
|
|
|
@ -149,7 +149,8 @@ struct sk_buff *wimax_msg_alloc(struct wimax_dev *wimax_dev,
|
|||
}
|
||||
result = nla_put(skb, WIMAX_GNL_MSG_DATA, size, msg);
|
||||
if (result < 0) {
|
||||
dev_err(dev, "no memory to add payload in attribute\n");
|
||||
dev_err(dev, "no memory to add payload (msg %p size %zu) in "
|
||||
"attribute: %d\n", msg, size, result);
|
||||
goto error_nla_put;
|
||||
}
|
||||
genlmsg_end(skb, genl_msg);
|
||||
|
@ -299,10 +300,10 @@ int wimax_msg(struct wimax_dev *wimax_dev, const char *pipe_name,
|
|||
struct sk_buff *skb;
|
||||
|
||||
skb = wimax_msg_alloc(wimax_dev, pipe_name, buf, size, gfp_flags);
|
||||
if (skb == NULL)
|
||||
goto error_msg_new;
|
||||
result = wimax_msg_send(wimax_dev, skb);
|
||||
error_msg_new:
|
||||
if (IS_ERR(skb))
|
||||
result = PTR_ERR(skb);
|
||||
else
|
||||
result = wimax_msg_send(wimax_dev, skb);
|
||||
return result;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wimax_msg);
|
||||
|
|
|
@ -338,8 +338,21 @@ out:
|
|||
*/
|
||||
void wimax_state_change(struct wimax_dev *wimax_dev, enum wimax_st new_state)
|
||||
{
|
||||
/*
|
||||
* A driver cannot take the wimax_dev out of the
|
||||
* __WIMAX_ST_NULL state unless by calling wimax_dev_add(). If
|
||||
* the wimax_dev's state is still NULL, we ignore any request
|
||||
* to change its state because it means it hasn't been yet
|
||||
* registered.
|
||||
*
|
||||
* There is no need to complain about it, as routines that
|
||||
* call this might be shared from different code paths that
|
||||
* are called before or after wimax_dev_add() has done its
|
||||
* job.
|
||||
*/
|
||||
mutex_lock(&wimax_dev->mutex);
|
||||
__wimax_state_change(wimax_dev, new_state);
|
||||
if (wimax_dev->state > __WIMAX_ST_NULL)
|
||||
__wimax_state_change(wimax_dev, new_state);
|
||||
mutex_unlock(&wimax_dev->mutex);
|
||||
return;
|
||||
}
|
||||
|
@ -376,7 +389,7 @@ EXPORT_SYMBOL_GPL(wimax_state_get);
|
|||
void wimax_dev_init(struct wimax_dev *wimax_dev)
|
||||
{
|
||||
INIT_LIST_HEAD(&wimax_dev->id_table_node);
|
||||
__wimax_state_set(wimax_dev, WIMAX_ST_UNINITIALIZED);
|
||||
__wimax_state_set(wimax_dev, __WIMAX_ST_NULL);
|
||||
mutex_init(&wimax_dev->mutex);
|
||||
mutex_init(&wimax_dev->mutex_reset);
|
||||
}
|
||||
|
|
|
@ -907,6 +907,7 @@ EXPORT_SYMBOL(freq_reg_info);
|
|||
int freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 *bandwidth,
|
||||
const struct ieee80211_reg_rule **reg_rule)
|
||||
{
|
||||
assert_cfg80211_lock();
|
||||
return freq_reg_info_regd(wiphy, center_freq,
|
||||
bandwidth, reg_rule, NULL);
|
||||
}
|
||||
|
@ -1133,7 +1134,8 @@ static bool reg_is_world_roaming(struct wiphy *wiphy)
|
|||
if (is_world_regdom(cfg80211_regdomain->alpha2) ||
|
||||
(wiphy->regd && is_world_regdom(wiphy->regd->alpha2)))
|
||||
return true;
|
||||
if (last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
|
||||
if (last_request &&
|
||||
last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
|
||||
wiphy->custom_regulatory)
|
||||
return true;
|
||||
return false;
|
||||
|
@ -1142,6 +1144,12 @@ static bool reg_is_world_roaming(struct wiphy *wiphy)
|
|||
/* Reap the advantages of previously found beacons */
|
||||
static void reg_process_beacons(struct wiphy *wiphy)
|
||||
{
|
||||
/*
|
||||
* Means we are just firing up cfg80211, so no beacons would
|
||||
* have been processed yet.
|
||||
*/
|
||||
if (!last_request)
|
||||
return;
|
||||
if (!reg_is_world_roaming(wiphy))
|
||||
return;
|
||||
wiphy_update_beacon_reg(wiphy);
|
||||
|
@ -1176,6 +1184,8 @@ static void handle_channel_custom(struct wiphy *wiphy,
|
|||
struct ieee80211_supported_band *sband;
|
||||
struct ieee80211_channel *chan;
|
||||
|
||||
assert_cfg80211_lock();
|
||||
|
||||
sband = wiphy->bands[band];
|
||||
BUG_ON(chan_idx >= sband->n_channels);
|
||||
chan = &sband->channels[chan_idx];
|
||||
|
@ -1214,10 +1224,13 @@ void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
|
|||
const struct ieee80211_regdomain *regd)
|
||||
{
|
||||
enum ieee80211_band band;
|
||||
|
||||
mutex_lock(&cfg80211_mutex);
|
||||
for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
||||
if (wiphy->bands[band])
|
||||
handle_band_custom(wiphy, band, regd);
|
||||
}
|
||||
mutex_unlock(&cfg80211_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(wiphy_apply_custom_regulatory);
|
||||
|
||||
|
@ -1423,7 +1436,7 @@ new_request:
|
|||
return call_crda(last_request->alpha2);
|
||||
}
|
||||
|
||||
/* This currently only processes user and driver regulatory hints */
|
||||
/* This processes *all* regulatory hints */
|
||||
static void reg_process_hint(struct regulatory_request *reg_request)
|
||||
{
|
||||
int r = 0;
|
||||
|
|
|
@ -395,6 +395,7 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
|
|||
memcpy(ies, res->pub.information_elements, ielen);
|
||||
found->ies_allocated = true;
|
||||
found->pub.information_elements = ies;
|
||||
found->pub.len_information_elements = ielen;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче