Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) TCP SACK processing can calculate an incorrect reordering value in some cases, fix from Neal Cardwell. 2) tcp_mark_head_lost() can split SKBs in situations where it should not, violating send queue invariants expected by other pieces of code and thus resulting (eventually) in corrupted retransmit state counters. Also from Neal Cardwell. 3) qla3xxx erroneously calls spin_lock_irqrestore() with constant hw_flags of zero. Fix from Santosh Nayak. 4) Fix NULL deref in rt2x00, from Gabor Juhos. 5) pch_gbe passes address of wrong typed object to pch_gbe_validate_option thus corrupting part of the value. From Dan Carpenter. 6) We must check the return value of nlmsg_parse() before trying to use the results. From Eric Dumazet. 7) Bridging code fails to check return value of ipv6_dev_get_saddr() thus potentially leaving uninitialized garbage in the outgoing ipv6 header. From Ulrich Weber. 8) Due to rounding and a reversed operation on jiffies, bridge message ages can go backwards instead of forwards, thus breaking STP. Fixes from Joakim Tjernlund. 9) r8169 modifies Config* registers without properly holding the Config9346 lock, resulting in corrupted IP fragments on some chips. Fix from Francois Romieu. 10) NET_PACKET_ENGINE default wan't set properly during the network driver mega-move. Fix from Stephen Hemminger. 11) vmxnet3 uses TCP header size where it actually should use the UDP header size, fix from Shreyas Bhatewara. 12) Netfilter bridge module autoload is busted in the compat case, fix from Florian Westphal. 13) Wireless Key removal was not setting multicast bits correctly thus accidently killing the unicast key 0 and thus all traffic stops. Fix from Johannes Berg. 14) Fix endless retries of A-MPDU transmissions in brcm80211 driver. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (22 commits) qla3xxx: ethernet: Fix bogus interrupt state flag. bridge: check return value of ipv6_dev_get_saddr() rtnetlink: fix rtnl_calcit() and rtnl_dump_ifinfo() bridge: message age needs to increase, not decrease. bridge: Adjust min age inc for HZ > 256 tcp: don't fragment SACKed skbs in tcp_mark_head_lost() r8169: corrupted IP fragments fix for large mtu. packetengines: fix config default vmxnet3: Fix transport header size enic: fix an endian bug in enic_probe() pch_gbe: memory corruption calling pch_gbe_validate_option() tg3: Fix tg3_get_stats64 for 5700 / 5701 devs tcp: fix false reordering signal in tcp_shifted_skb tcp: fix comment for tp->highest_sack netfilter: bridge: fix module autoload in compat case brcm80211: smac: only print block-ack timeout message at trace level brcm80211: smac: fix endless retry of A-MPDU transmissions mac80211: Fix a warning on changing to monitor mode from STA mac80211: zero initialize count field in ieee80211_tx_rate iwlwifi: fix key removal ...
This commit is contained in:
commit
aa139092de
|
@ -7886,10 +7886,8 @@ static int tg3_chip_reset(struct tg3 *tp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *,
|
||||
struct rtnl_link_stats64 *);
|
||||
static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *,
|
||||
struct tg3_ethtool_stats *);
|
||||
static void tg3_get_nstats(struct tg3 *, struct rtnl_link_stats64 *);
|
||||
static void tg3_get_estats(struct tg3 *, struct tg3_ethtool_stats *);
|
||||
|
||||
/* tp->lock is held. */
|
||||
static int tg3_halt(struct tg3 *tp, int kind, int silent)
|
||||
|
@ -7910,7 +7908,7 @@ static int tg3_halt(struct tg3 *tp, int kind, int silent)
|
|||
|
||||
if (tp->hw_stats) {
|
||||
/* Save the stats across chip resets... */
|
||||
tg3_get_stats64(tp->dev, &tp->net_stats_prev),
|
||||
tg3_get_nstats(tp, &tp->net_stats_prev),
|
||||
tg3_get_estats(tp, &tp->estats_prev);
|
||||
|
||||
/* And make sure the next sample is new data */
|
||||
|
@ -9847,7 +9845,7 @@ static inline u64 get_stat64(tg3_stat64_t *val)
|
|||
return ((u64)val->high << 32) | ((u64)val->low);
|
||||
}
|
||||
|
||||
static u64 calc_crc_errors(struct tg3 *tp)
|
||||
static u64 tg3_calc_crc_errors(struct tg3 *tp)
|
||||
{
|
||||
struct tg3_hw_stats *hw_stats = tp->hw_stats;
|
||||
|
||||
|
@ -9856,14 +9854,12 @@ static u64 calc_crc_errors(struct tg3 *tp)
|
|||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
|
||||
u32 val;
|
||||
|
||||
spin_lock_bh(&tp->lock);
|
||||
if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) {
|
||||
tg3_writephy(tp, MII_TG3_TEST1,
|
||||
val | MII_TG3_TEST1_CRC_EN);
|
||||
tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val);
|
||||
} else
|
||||
val = 0;
|
||||
spin_unlock_bh(&tp->lock);
|
||||
|
||||
tp->phy_crc_errors += val;
|
||||
|
||||
|
@ -9877,14 +9873,13 @@ static u64 calc_crc_errors(struct tg3 *tp)
|
|||
estats->member = old_estats->member + \
|
||||
get_stat64(&hw_stats->member)
|
||||
|
||||
static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp,
|
||||
struct tg3_ethtool_stats *estats)
|
||||
static void tg3_get_estats(struct tg3 *tp, struct tg3_ethtool_stats *estats)
|
||||
{
|
||||
struct tg3_ethtool_stats *old_estats = &tp->estats_prev;
|
||||
struct tg3_hw_stats *hw_stats = tp->hw_stats;
|
||||
|
||||
if (!hw_stats)
|
||||
return old_estats;
|
||||
return;
|
||||
|
||||
ESTAT_ADD(rx_octets);
|
||||
ESTAT_ADD(rx_fragments);
|
||||
|
@ -9963,20 +9958,13 @@ static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp,
|
|||
ESTAT_ADD(nic_tx_threshold_hit);
|
||||
|
||||
ESTAT_ADD(mbuf_lwm_thresh_hit);
|
||||
|
||||
return estats;
|
||||
}
|
||||
|
||||
static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
|
||||
struct rtnl_link_stats64 *stats)
|
||||
static void tg3_get_nstats(struct tg3 *tp, struct rtnl_link_stats64 *stats)
|
||||
{
|
||||
struct tg3 *tp = netdev_priv(dev);
|
||||
struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev;
|
||||
struct tg3_hw_stats *hw_stats = tp->hw_stats;
|
||||
|
||||
if (!hw_stats)
|
||||
return old_stats;
|
||||
|
||||
stats->rx_packets = old_stats->rx_packets +
|
||||
get_stat64(&hw_stats->rx_ucast_packets) +
|
||||
get_stat64(&hw_stats->rx_mcast_packets) +
|
||||
|
@ -10019,15 +10007,13 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
|
|||
get_stat64(&hw_stats->tx_carrier_sense_errors);
|
||||
|
||||
stats->rx_crc_errors = old_stats->rx_crc_errors +
|
||||
calc_crc_errors(tp);
|
||||
tg3_calc_crc_errors(tp);
|
||||
|
||||
stats->rx_missed_errors = old_stats->rx_missed_errors +
|
||||
get_stat64(&hw_stats->rx_discards);
|
||||
|
||||
stats->rx_dropped = tp->rx_dropped;
|
||||
stats->tx_dropped = tp->tx_dropped;
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
static inline u32 calc_crc(unsigned char *buf, int len)
|
||||
|
@ -15409,6 +15395,21 @@ static void __devinit tg3_init_coal(struct tg3 *tp)
|
|||
}
|
||||
}
|
||||
|
||||
static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
|
||||
struct rtnl_link_stats64 *stats)
|
||||
{
|
||||
struct tg3 *tp = netdev_priv(dev);
|
||||
|
||||
if (!tp->hw_stats)
|
||||
return &tp->net_stats_prev;
|
||||
|
||||
spin_lock_bh(&tp->lock);
|
||||
tg3_get_nstats(tp, stats);
|
||||
spin_unlock_bh(&tp->lock);
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
static const struct net_device_ops tg3_netdev_ops = {
|
||||
.ndo_open = tg3_open,
|
||||
.ndo_stop = tg3_close,
|
||||
|
|
|
@ -94,7 +94,7 @@ struct enic {
|
|||
u32 rx_coalesce_usecs;
|
||||
u32 tx_coalesce_usecs;
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
u32 num_vfs;
|
||||
u16 num_vfs;
|
||||
#endif
|
||||
struct enic_port_profile *pp;
|
||||
|
||||
|
|
|
@ -2370,7 +2370,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
|
|||
pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV);
|
||||
if (pos) {
|
||||
pci_read_config_word(pdev, pos + PCI_SRIOV_TOTAL_VF,
|
||||
(u16 *)&enic->num_vfs);
|
||||
&enic->num_vfs);
|
||||
if (enic->num_vfs) {
|
||||
err = pci_enable_sriov(pdev, enic->num_vfs);
|
||||
if (err) {
|
||||
|
|
|
@ -321,10 +321,10 @@ static void pch_gbe_check_copper_options(struct pch_gbe_adapter *adapter)
|
|||
pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n");
|
||||
hw->phy.autoneg_advertised = opt.def;
|
||||
} else {
|
||||
hw->phy.autoneg_advertised = AutoNeg;
|
||||
pch_gbe_validate_option(
|
||||
(int *)(&hw->phy.autoneg_advertised),
|
||||
&opt, adapter);
|
||||
int tmp = AutoNeg;
|
||||
|
||||
pch_gbe_validate_option(&tmp, &opt, adapter);
|
||||
hw->phy.autoneg_advertised = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -495,9 +495,10 @@ void pch_gbe_check_options(struct pch_gbe_adapter *adapter)
|
|||
.arg = { .l = { .nr = (int)ARRAY_SIZE(fc_list),
|
||||
.p = fc_list } }
|
||||
};
|
||||
hw->mac.fc = FlowControl;
|
||||
pch_gbe_validate_option((int *)(&hw->mac.fc),
|
||||
&opt, adapter);
|
||||
int tmp = FlowControl;
|
||||
|
||||
pch_gbe_validate_option(&tmp, &opt, adapter);
|
||||
hw->mac.fc = tmp;
|
||||
}
|
||||
|
||||
pch_gbe_check_copper_options(adapter);
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
config NET_PACKET_ENGINE
|
||||
bool "Packet Engine devices"
|
||||
default y
|
||||
depends on PCI
|
||||
---help---
|
||||
If you have a network (Ethernet) card belonging to this class, say Y
|
||||
|
|
|
@ -3017,7 +3017,6 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev)
|
|||
(void __iomem *)port_regs;
|
||||
u32 delay = 10;
|
||||
int status = 0;
|
||||
unsigned long hw_flags = 0;
|
||||
|
||||
if (ql_mii_setup(qdev))
|
||||
return -1;
|
||||
|
@ -3228,9 +3227,9 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev)
|
|||
value = ql_read_page0_reg(qdev, &port_regs->portStatus);
|
||||
if (value & PORT_STATUS_IC)
|
||||
break;
|
||||
spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
|
||||
spin_unlock_irq(&qdev->hw_lock);
|
||||
msleep(500);
|
||||
spin_lock_irqsave(&qdev->hw_lock, hw_flags);
|
||||
spin_lock_irq(&qdev->hw_lock);
|
||||
} while (--delay);
|
||||
|
||||
if (delay == 0) {
|
||||
|
|
|
@ -3781,12 +3781,20 @@ static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
|
|||
|
||||
static void rtl_hw_jumbo_enable(struct rtl8169_private *tp)
|
||||
{
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
|
||||
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
||||
rtl_generic_op(tp, tp->jumbo_ops.enable);
|
||||
RTL_W8(Cfg9346, Cfg9346_Lock);
|
||||
}
|
||||
|
||||
static void rtl_hw_jumbo_disable(struct rtl8169_private *tp)
|
||||
{
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
|
||||
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
||||
rtl_generic_op(tp, tp->jumbo_ops.disable);
|
||||
RTL_W8(Cfg9346, Cfg9346_Lock);
|
||||
}
|
||||
|
||||
static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp)
|
||||
|
|
|
@ -830,13 +830,8 @@ vmxnet3_parse_and_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
|
|||
ctx->l4_hdr_size = ((struct tcphdr *)
|
||||
skb_transport_header(skb))->doff * 4;
|
||||
else if (iph->protocol == IPPROTO_UDP)
|
||||
/*
|
||||
* Use tcp header size so that bytes to
|
||||
* be copied are more than required by
|
||||
* the device.
|
||||
*/
|
||||
ctx->l4_hdr_size =
|
||||
sizeof(struct tcphdr);
|
||||
sizeof(struct udphdr);
|
||||
else
|
||||
ctx->l4_hdr_size = 0;
|
||||
} else {
|
||||
|
|
|
@ -70,10 +70,10 @@
|
|||
/*
|
||||
* Version numbers
|
||||
*/
|
||||
#define VMXNET3_DRIVER_VERSION_STRING "1.1.18.0-k"
|
||||
#define VMXNET3_DRIVER_VERSION_STRING "1.1.29.0-k"
|
||||
|
||||
/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
|
||||
#define VMXNET3_DRIVER_VERSION_NUM 0x01011200
|
||||
#define VMXNET3_DRIVER_VERSION_NUM 0x01011D00
|
||||
|
||||
#if defined(CONFIG_PCI_MSI)
|
||||
/* RSS only makes sense if MSI-X is supported. */
|
||||
|
|
|
@ -489,8 +489,6 @@ static int ar5008_hw_rf_alloc_ext_banks(struct ath_hw *ah)
|
|||
ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows);
|
||||
ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows);
|
||||
ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows);
|
||||
ATH_ALLOC_BANK(ah->addac5416_21,
|
||||
ah->iniAddac.ia_rows * ah->iniAddac.ia_columns);
|
||||
ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows);
|
||||
|
||||
return 0;
|
||||
|
@ -519,7 +517,6 @@ static void ar5008_hw_rf_free_ext_banks(struct ath_hw *ah)
|
|||
ATH_FREE_BANK(ah->analogBank6Data);
|
||||
ATH_FREE_BANK(ah->analogBank6TPCData);
|
||||
ATH_FREE_BANK(ah->analogBank7Data);
|
||||
ATH_FREE_BANK(ah->addac5416_21);
|
||||
ATH_FREE_BANK(ah->bank6Temp);
|
||||
|
||||
#undef ATH_FREE_BANK
|
||||
|
@ -805,27 +802,7 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
|
|||
if (ah->eep_ops->set_addac)
|
||||
ah->eep_ops->set_addac(ah, chan);
|
||||
|
||||
if (AR_SREV_5416_22_OR_LATER(ah)) {
|
||||
REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites);
|
||||
} else {
|
||||
struct ar5416IniArray temp;
|
||||
u32 addacSize =
|
||||
sizeof(u32) * ah->iniAddac.ia_rows *
|
||||
ah->iniAddac.ia_columns;
|
||||
|
||||
/* For AR5416 2.0/2.1 */
|
||||
memcpy(ah->addac5416_21,
|
||||
ah->iniAddac.ia_array, addacSize);
|
||||
|
||||
/* override CLKDRV value at [row, column] = [31, 1] */
|
||||
(ah->addac5416_21)[31 * ah->iniAddac.ia_columns + 1] = 0;
|
||||
|
||||
temp.ia_array = ah->addac5416_21;
|
||||
temp.ia_columns = ah->iniAddac.ia_columns;
|
||||
temp.ia_rows = ah->iniAddac.ia_rows;
|
||||
REG_WRITE_ARRAY(&temp, 1, regWrites);
|
||||
}
|
||||
|
||||
REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites);
|
||||
REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC);
|
||||
|
||||
ENABLE_REGWRITE_BUFFER(ah);
|
||||
|
|
|
@ -180,6 +180,25 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
|
|||
INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac,
|
||||
ARRAY_SIZE(ar5416Addac), 2);
|
||||
}
|
||||
|
||||
/* iniAddac needs to be modified for these chips */
|
||||
if (AR_SREV_9160(ah) || !AR_SREV_5416_22_OR_LATER(ah)) {
|
||||
struct ar5416IniArray *addac = &ah->iniAddac;
|
||||
u32 size = sizeof(u32) * addac->ia_rows * addac->ia_columns;
|
||||
u32 *data;
|
||||
|
||||
data = kmalloc(size, GFP_KERNEL);
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
memcpy(data, addac->ia_array, size);
|
||||
addac->ia_array = data;
|
||||
|
||||
if (!AR_SREV_5416_22_OR_LATER(ah)) {
|
||||
/* override CLKDRV value */
|
||||
INI_RA(addac, 31,1) = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Support for Japan ch.14 (2484) spread */
|
||||
|
|
|
@ -940,7 +940,6 @@ struct ath_hw {
|
|||
u32 *analogBank6Data;
|
||||
u32 *analogBank6TPCData;
|
||||
u32 *analogBank7Data;
|
||||
u32 *addac5416_21;
|
||||
u32 *bank6Temp;
|
||||
|
||||
u8 txpower_limit;
|
||||
|
|
|
@ -1051,17 +1051,13 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb,
|
|||
}
|
||||
/* either retransmit or send bar if ack not recd */
|
||||
if (!ack_recd) {
|
||||
struct ieee80211_tx_rate *txrate =
|
||||
tx_info->status.rates;
|
||||
if (retry && (txrate[0].count < (int)retry_limit)) {
|
||||
if (retry && (ini->txretry[index] < (int)retry_limit)) {
|
||||
ini->txretry[index]++;
|
||||
ini->tx_in_transit--;
|
||||
/*
|
||||
* Use high prededence for retransmit to
|
||||
* give some punch
|
||||
*/
|
||||
/* brcms_c_txq_enq(wlc, scb, p,
|
||||
* BRCMS_PRIO_TO_PREC(tid)); */
|
||||
brcms_c_txq_enq(wlc, scb, p,
|
||||
BRCMS_PRIO_TO_HI_PREC(tid));
|
||||
} else {
|
||||
|
@ -1074,9 +1070,9 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb,
|
|||
IEEE80211_TX_STAT_AMPDU_NO_BACK;
|
||||
skb_pull(p, D11_PHY_HDR_LEN);
|
||||
skb_pull(p, D11_TXH_LEN);
|
||||
wiphy_err(wiphy, "%s: BA Timeout, seq %d, in_"
|
||||
"transit %d\n", "AMPDU status", seq,
|
||||
ini->tx_in_transit);
|
||||
BCMMSG(wiphy,
|
||||
"BA Timeout, seq %d, in_transit %d\n",
|
||||
seq, ini->tx_in_transit);
|
||||
ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw,
|
||||
p);
|
||||
}
|
||||
|
|
|
@ -1187,6 +1187,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
|
|||
unsigned long flags;
|
||||
struct iwl_addsta_cmd sta_cmd;
|
||||
u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta);
|
||||
__le16 key_flags;
|
||||
|
||||
/* if station isn't there, neither is the key */
|
||||
if (sta_id == IWL_INVALID_STATION)
|
||||
|
@ -1212,7 +1213,14 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
|
|||
IWL_ERR(priv, "offset %d not used in uCode key table.\n",
|
||||
keyconf->hw_key_idx);
|
||||
|
||||
sta_cmd.key.key_flags = STA_KEY_FLG_NO_ENC | STA_KEY_FLG_INVALID;
|
||||
key_flags = cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
|
||||
key_flags |= STA_KEY_FLG_MAP_KEY_MSK | STA_KEY_FLG_NO_ENC |
|
||||
STA_KEY_FLG_INVALID;
|
||||
|
||||
if (!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE))
|
||||
key_flags |= STA_KEY_MULTICAST_MSK;
|
||||
|
||||
sta_cmd.key.key_flags = key_flags;
|
||||
sta_cmd.key.key_offset = WEP_INVALID_OFFSET;
|
||||
sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
|
||||
sta_cmd.mode = STA_CONTROL_MODIFY_MSK;
|
||||
|
|
|
@ -1220,7 +1220,8 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
|
|||
cancel_work_sync(&rt2x00dev->rxdone_work);
|
||||
cancel_work_sync(&rt2x00dev->txdone_work);
|
||||
}
|
||||
destroy_workqueue(rt2x00dev->workqueue);
|
||||
if (rt2x00dev->workqueue)
|
||||
destroy_workqueue(rt2x00dev->workqueue);
|
||||
|
||||
/*
|
||||
* Free the tx status fifo.
|
||||
|
|
|
@ -412,7 +412,8 @@ struct tcp_sock {
|
|||
|
||||
struct tcp_sack_block recv_sack_cache[4];
|
||||
|
||||
struct sk_buff *highest_sack; /* highest skb with SACK received
|
||||
struct sk_buff *highest_sack; /* skb just after the highest
|
||||
* skb with SACKed bit set
|
||||
* (validity guaranteed only if
|
||||
* sacked_out > 0)
|
||||
*/
|
||||
|
|
|
@ -1364,8 +1364,9 @@ static inline void tcp_push_pending_frames(struct sock *sk)
|
|||
}
|
||||
}
|
||||
|
||||
/* Start sequence of the highest skb with SACKed bit, valid only if
|
||||
* sacked > 0 or when the caller has ensured validity by itself.
|
||||
/* Start sequence of the skb just after the highest skb with SACKed
|
||||
* bit, valid only if sacked_out > 0 or when the caller has ensured
|
||||
* validity by itself.
|
||||
*/
|
||||
static inline u32 tcp_highest_sack_seq(struct tcp_sock *tp)
|
||||
{
|
||||
|
|
|
@ -446,8 +446,11 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br,
|
|||
ip6h->nexthdr = IPPROTO_HOPOPTS;
|
||||
ip6h->hop_limit = 1;
|
||||
ipv6_addr_set(&ip6h->daddr, htonl(0xff020000), 0, 0, htonl(1));
|
||||
ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0,
|
||||
&ip6h->saddr);
|
||||
if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0,
|
||||
&ip6h->saddr)) {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest);
|
||||
|
||||
hopopt = (u8 *)(ip6h + 1);
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
#include "br_private_stp.h"
|
||||
|
||||
/* since time values in bpdu are in jiffies and then scaled (1/256)
|
||||
* before sending, make sure that is at least one.
|
||||
* before sending, make sure that is at least one STP tick.
|
||||
*/
|
||||
#define MESSAGE_AGE_INCR ((HZ < 256) ? 1 : (HZ/256))
|
||||
#define MESSAGE_AGE_INCR ((HZ / 256) + 1)
|
||||
|
||||
static const char *const br_port_state_names[] = {
|
||||
[BR_STATE_DISABLED] = "disabled",
|
||||
|
@ -186,7 +186,7 @@ static void br_record_config_information(struct net_bridge_port *p,
|
|||
p->designated_cost = bpdu->root_path_cost;
|
||||
p->designated_bridge = bpdu->bridge_id;
|
||||
p->designated_port = bpdu->port_id;
|
||||
p->designated_age = jiffies + bpdu->message_age;
|
||||
p->designated_age = jiffies - bpdu->message_age;
|
||||
|
||||
mod_timer(&p->message_age_timer, jiffies
|
||||
+ (p->br->max_age - bpdu->message_age));
|
||||
|
|
|
@ -1893,10 +1893,7 @@ static int compat_mtw_from_user(struct compat_ebt_entry_mwt *mwt,
|
|||
|
||||
switch (compat_mwt) {
|
||||
case EBT_COMPAT_MATCH:
|
||||
match = try_then_request_module(xt_find_match(NFPROTO_BRIDGE,
|
||||
name, 0), "ebt_%s", name);
|
||||
if (match == NULL)
|
||||
return -ENOENT;
|
||||
match = xt_request_find_match(NFPROTO_BRIDGE, name, 0);
|
||||
if (IS_ERR(match))
|
||||
return PTR_ERR(match);
|
||||
|
||||
|
@ -1915,10 +1912,7 @@ static int compat_mtw_from_user(struct compat_ebt_entry_mwt *mwt,
|
|||
break;
|
||||
case EBT_COMPAT_WATCHER: /* fallthrough */
|
||||
case EBT_COMPAT_TARGET:
|
||||
wt = try_then_request_module(xt_find_target(NFPROTO_BRIDGE,
|
||||
name, 0), "ebt_%s", name);
|
||||
if (wt == NULL)
|
||||
return -ENOENT;
|
||||
wt = xt_request_find_target(NFPROTO_BRIDGE, name, 0);
|
||||
if (IS_ERR(wt))
|
||||
return PTR_ERR(wt);
|
||||
off = xt_compat_target_offset(wt);
|
||||
|
|
|
@ -1060,11 +1060,12 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
|
|||
rcu_read_lock();
|
||||
cb->seq = net->dev_base_seq;
|
||||
|
||||
nlmsg_parse(cb->nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX,
|
||||
ifla_policy);
|
||||
if (nlmsg_parse(cb->nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX,
|
||||
ifla_policy) >= 0) {
|
||||
|
||||
if (tb[IFLA_EXT_MASK])
|
||||
ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
|
||||
if (tb[IFLA_EXT_MASK])
|
||||
ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
|
||||
}
|
||||
|
||||
for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
|
||||
idx = 0;
|
||||
|
@ -1900,10 +1901,11 @@ static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|||
u32 ext_filter_mask = 0;
|
||||
u16 min_ifinfo_dump_size = 0;
|
||||
|
||||
nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX, ifla_policy);
|
||||
|
||||
if (tb[IFLA_EXT_MASK])
|
||||
ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
|
||||
if (nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX,
|
||||
ifla_policy) >= 0) {
|
||||
if (tb[IFLA_EXT_MASK])
|
||||
ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
|
||||
}
|
||||
|
||||
if (!ext_filter_mask)
|
||||
return NLMSG_GOODSIZE;
|
||||
|
|
|
@ -1403,8 +1403,16 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
|
|||
|
||||
BUG_ON(!pcount);
|
||||
|
||||
/* Adjust hint for FACK. Non-FACK is handled in tcp_sacktag_one(). */
|
||||
if (tcp_is_fack(tp) && (skb == tp->lost_skb_hint))
|
||||
/* Adjust counters and hints for the newly sacked sequence
|
||||
* range but discard the return value since prev is already
|
||||
* marked. We must tag the range first because the seq
|
||||
* advancement below implicitly advances
|
||||
* tcp_highest_sack_seq() when skb is highest_sack.
|
||||
*/
|
||||
tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked,
|
||||
start_seq, end_seq, dup_sack, pcount);
|
||||
|
||||
if (skb == tp->lost_skb_hint)
|
||||
tp->lost_cnt_hint += pcount;
|
||||
|
||||
TCP_SKB_CB(prev)->end_seq += shifted;
|
||||
|
@ -1430,12 +1438,6 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
|
|||
skb_shinfo(skb)->gso_type = 0;
|
||||
}
|
||||
|
||||
/* Adjust counters and hints for the newly sacked sequence range but
|
||||
* discard the return value since prev is already marked.
|
||||
*/
|
||||
tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked,
|
||||
start_seq, end_seq, dup_sack, pcount);
|
||||
|
||||
/* Difference in this won't matter, both ACKed by the same cumul. ACK */
|
||||
TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS);
|
||||
|
||||
|
@ -2567,6 +2569,7 @@ static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head)
|
|||
|
||||
if (cnt > packets) {
|
||||
if ((tcp_is_sack(tp) && !tcp_is_fack(tp)) ||
|
||||
(TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED) ||
|
||||
(oldcnt >= packets))
|
||||
break;
|
||||
|
||||
|
|
|
@ -1332,6 +1332,9 @@ u32 __ieee80211_recalc_idle(struct ieee80211_local *local)
|
|||
hw_roc = true;
|
||||
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
|
||||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
continue;
|
||||
if (sdata->old_idle == sdata->vif.bss_conf.idle)
|
||||
continue;
|
||||
if (!ieee80211_sdata_running(sdata))
|
||||
|
|
|
@ -344,7 +344,7 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
|
|||
for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
|
||||
info->control.rates[i].idx = -1;
|
||||
info->control.rates[i].flags = 0;
|
||||
info->control.rates[i].count = 1;
|
||||
info->control.rates[i].count = 0;
|
||||
}
|
||||
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
|
||||
|
|
Loading…
Reference in a new issue