diff options
40 files changed, 196 insertions, 160 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index eb22272b2116..03df1d15ebf3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -4654,8 +4654,8 @@ L: netfilter@vger.kernel.org | |||
| 4654 | L: coreteam@netfilter.org | 4654 | L: coreteam@netfilter.org |
| 4655 | W: http://www.netfilter.org/ | 4655 | W: http://www.netfilter.org/ |
| 4656 | W: http://www.iptables.org/ | 4656 | W: http://www.iptables.org/ |
| 4657 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-2.6.git | 4657 | T: git git://1984.lsi.us.es/nf |
| 4658 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-next-2.6.git | 4658 | T: git git://1984.lsi.us.es/nf-next |
| 4659 | S: Supported | 4659 | S: Supported |
| 4660 | F: include/linux/netfilter* | 4660 | F: include/linux/netfilter* |
| 4661 | F: include/linux/netfilter/ | 4661 | F: include/linux/netfilter/ |
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index 0741aded9eb0..f2db8fca46a1 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c | |||
| @@ -1804,18 +1804,16 @@ void gfar_configure_coalescing(struct gfar_private *priv, | |||
| 1804 | if (priv->mode == MQ_MG_MODE) { | 1804 | if (priv->mode == MQ_MG_MODE) { |
| 1805 | baddr = ®s->txic0; | 1805 | baddr = ®s->txic0; |
| 1806 | for_each_set_bit(i, &tx_mask, priv->num_tx_queues) { | 1806 | for_each_set_bit(i, &tx_mask, priv->num_tx_queues) { |
| 1807 | if (likely(priv->tx_queue[i]->txcoalescing)) { | 1807 | gfar_write(baddr + i, 0); |
| 1808 | gfar_write(baddr + i, 0); | 1808 | if (likely(priv->tx_queue[i]->txcoalescing)) |
| 1809 | gfar_write(baddr + i, priv->tx_queue[i]->txic); | 1809 | gfar_write(baddr + i, priv->tx_queue[i]->txic); |
| 1810 | } | ||
| 1811 | } | 1810 | } |
| 1812 | 1811 | ||
| 1813 | baddr = ®s->rxic0; | 1812 | baddr = ®s->rxic0; |
| 1814 | for_each_set_bit(i, &rx_mask, priv->num_rx_queues) { | 1813 | for_each_set_bit(i, &rx_mask, priv->num_rx_queues) { |
| 1815 | if (likely(priv->rx_queue[i]->rxcoalescing)) { | 1814 | gfar_write(baddr + i, 0); |
| 1816 | gfar_write(baddr + i, 0); | 1815 | if (likely(priv->rx_queue[i]->rxcoalescing)) |
| 1817 | gfar_write(baddr + i, priv->rx_queue[i]->rxic); | 1816 | gfar_write(baddr + i, priv->rx_queue[i]->rxic); |
| 1818 | } | ||
| 1819 | } | 1817 | } |
| 1820 | } | 1818 | } |
| 1821 | } | 1819 | } |
diff --git a/drivers/net/ethernet/intel/e1000e/defines.h b/drivers/net/ethernet/intel/e1000e/defines.h index 351a4097b2ba..76edbc1be33b 100644 --- a/drivers/net/ethernet/intel/e1000e/defines.h +++ b/drivers/net/ethernet/intel/e1000e/defines.h | |||
| @@ -103,6 +103,7 @@ | |||
| 103 | #define E1000_RXD_ERR_SEQ 0x04 /* Sequence Error */ | 103 | #define E1000_RXD_ERR_SEQ 0x04 /* Sequence Error */ |
| 104 | #define E1000_RXD_ERR_CXE 0x10 /* Carrier Extension Error */ | 104 | #define E1000_RXD_ERR_CXE 0x10 /* Carrier Extension Error */ |
| 105 | #define E1000_RXD_ERR_TCPE 0x20 /* TCP/UDP Checksum Error */ | 105 | #define E1000_RXD_ERR_TCPE 0x20 /* TCP/UDP Checksum Error */ |
| 106 | #define E1000_RXD_ERR_IPE 0x40 /* IP Checksum Error */ | ||
| 106 | #define E1000_RXD_ERR_RXE 0x80 /* Rx Data Error */ | 107 | #define E1000_RXD_ERR_RXE 0x80 /* Rx Data Error */ |
| 107 | #define E1000_RXD_SPC_VLAN_MASK 0x0FFF /* VLAN ID is in lower 12 bits */ | 108 | #define E1000_RXD_SPC_VLAN_MASK 0x0FFF /* VLAN ID is in lower 12 bits */ |
| 108 | 109 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 31d37a2b5ba8..623e30b9964d 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
| @@ -496,7 +496,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter, | |||
| 496 | * @sk_buff: socket buffer with received data | 496 | * @sk_buff: socket buffer with received data |
| 497 | **/ | 497 | **/ |
| 498 | static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, | 498 | static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, |
| 499 | __le16 csum, struct sk_buff *skb) | 499 | struct sk_buff *skb) |
| 500 | { | 500 | { |
| 501 | u16 status = (u16)status_err; | 501 | u16 status = (u16)status_err; |
| 502 | u8 errors = (u8)(status_err >> 24); | 502 | u8 errors = (u8)(status_err >> 24); |
| @@ -511,8 +511,8 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, | |||
| 511 | if (status & E1000_RXD_STAT_IXSM) | 511 | if (status & E1000_RXD_STAT_IXSM) |
| 512 | return; | 512 | return; |
| 513 | 513 | ||
| 514 | /* TCP/UDP checksum error bit is set */ | 514 | /* TCP/UDP checksum error bit or IP checksum error bit is set */ |
| 515 | if (errors & E1000_RXD_ERR_TCPE) { | 515 | if (errors & (E1000_RXD_ERR_TCPE | E1000_RXD_ERR_IPE)) { |
| 516 | /* let the stack verify checksum errors */ | 516 | /* let the stack verify checksum errors */ |
| 517 | adapter->hw_csum_err++; | 517 | adapter->hw_csum_err++; |
| 518 | return; | 518 | return; |
| @@ -523,19 +523,7 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, | |||
| 523 | return; | 523 | return; |
| 524 | 524 | ||
| 525 | /* It must be a TCP or UDP packet with a valid checksum */ | 525 | /* It must be a TCP or UDP packet with a valid checksum */ |
| 526 | if (status & E1000_RXD_STAT_TCPCS) { | 526 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 527 | /* TCP checksum is good */ | ||
| 528 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 529 | } else { | ||
| 530 | /* | ||
| 531 | * IP fragment with UDP payload | ||
| 532 | * Hardware complements the payload checksum, so we undo it | ||
| 533 | * and then put the value in host order for further stack use. | ||
| 534 | */ | ||
| 535 | __sum16 sum = (__force __sum16)swab16((__force u16)csum); | ||
| 536 | skb->csum = csum_unfold(~sum); | ||
| 537 | skb->ip_summed = CHECKSUM_COMPLETE; | ||
| 538 | } | ||
| 539 | adapter->hw_csum_good++; | 527 | adapter->hw_csum_good++; |
| 540 | } | 528 | } |
| 541 | 529 | ||
| @@ -954,8 +942,7 @@ static bool e1000_clean_rx_irq(struct e1000_ring *rx_ring, int *work_done, | |||
| 954 | skb_put(skb, length); | 942 | skb_put(skb, length); |
| 955 | 943 | ||
| 956 | /* Receive Checksum Offload */ | 944 | /* Receive Checksum Offload */ |
| 957 | e1000_rx_checksum(adapter, staterr, | 945 | e1000_rx_checksum(adapter, staterr, skb); |
| 958 | rx_desc->wb.lower.hi_dword.csum_ip.csum, skb); | ||
| 959 | 946 | ||
| 960 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); | 947 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); |
| 961 | 948 | ||
| @@ -1341,8 +1328,7 @@ copydone: | |||
| 1341 | total_rx_bytes += skb->len; | 1328 | total_rx_bytes += skb->len; |
| 1342 | total_rx_packets++; | 1329 | total_rx_packets++; |
| 1343 | 1330 | ||
| 1344 | e1000_rx_checksum(adapter, staterr, | 1331 | e1000_rx_checksum(adapter, staterr, skb); |
| 1345 | rx_desc->wb.lower.hi_dword.csum_ip.csum, skb); | ||
| 1346 | 1332 | ||
| 1347 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); | 1333 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); |
| 1348 | 1334 | ||
| @@ -1512,9 +1498,8 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_ring *rx_ring, int *work_done, | |||
| 1512 | } | 1498 | } |
| 1513 | } | 1499 | } |
| 1514 | 1500 | ||
| 1515 | /* Receive Checksum Offload XXX recompute due to CRC strip? */ | 1501 | /* Receive Checksum Offload */ |
| 1516 | e1000_rx_checksum(adapter, staterr, | 1502 | e1000_rx_checksum(adapter, staterr, skb); |
| 1517 | rx_desc->wb.lower.hi_dword.csum_ip.csum, skb); | ||
| 1518 | 1503 | ||
| 1519 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); | 1504 | e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb); |
| 1520 | 1505 | ||
| @@ -3098,19 +3083,10 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) | |||
| 3098 | 3083 | ||
| 3099 | /* Enable Receive Checksum Offload for TCP and UDP */ | 3084 | /* Enable Receive Checksum Offload for TCP and UDP */ |
| 3100 | rxcsum = er32(RXCSUM); | 3085 | rxcsum = er32(RXCSUM); |
| 3101 | if (adapter->netdev->features & NETIF_F_RXCSUM) { | 3086 | if (adapter->netdev->features & NETIF_F_RXCSUM) |
| 3102 | rxcsum |= E1000_RXCSUM_TUOFL; | 3087 | rxcsum |= E1000_RXCSUM_TUOFL; |
| 3103 | 3088 | else | |
| 3104 | /* | ||
| 3105 | * IPv4 payload checksum for UDP fragments must be | ||
| 3106 | * used in conjunction with packet-split. | ||
| 3107 | */ | ||
| 3108 | if (adapter->rx_ps_pages) | ||
| 3109 | rxcsum |= E1000_RXCSUM_IPPCSE; | ||
| 3110 | } else { | ||
| 3111 | rxcsum &= ~E1000_RXCSUM_TUOFL; | 3089 | rxcsum &= ~E1000_RXCSUM_TUOFL; |
| 3112 | /* no need to clear IPPCSE as it defaults to 0 */ | ||
| 3113 | } | ||
| 3114 | ew32(RXCSUM, rxcsum); | 3090 | ew32(RXCSUM, rxcsum); |
| 3115 | 3091 | ||
| 3116 | if (adapter->hw.mac.type == e1000_pch2lan) { | 3092 | if (adapter->hw.mac.type == e1000_pch2lan) { |
| @@ -5241,22 +5217,10 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
| 5241 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; | 5217 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; |
| 5242 | 5218 | ||
| 5243 | /* Jumbo frame support */ | 5219 | /* Jumbo frame support */ |
| 5244 | if (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) { | 5220 | if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) && |
| 5245 | if (!(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) { | 5221 | !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) { |
| 5246 | e_err("Jumbo Frames not supported.\n"); | 5222 | e_err("Jumbo Frames not supported.\n"); |
| 5247 | return -EINVAL; | 5223 | return -EINVAL; |
| 5248 | } | ||
| 5249 | |||
| 5250 | /* | ||
| 5251 | * IP payload checksum (enabled with jumbos/packet-split when | ||
| 5252 | * Rx checksum is enabled) and generation of RSS hash is | ||
| 5253 | * mutually exclusive in the hardware. | ||
| 5254 | */ | ||
| 5255 | if ((netdev->features & NETIF_F_RXCSUM) && | ||
| 5256 | (netdev->features & NETIF_F_RXHASH)) { | ||
| 5257 | e_err("Jumbo frames cannot be enabled when both receive checksum offload and receive hashing are enabled. Disable one of the receive offload features before enabling jumbos.\n"); | ||
| 5258 | return -EINVAL; | ||
| 5259 | } | ||
| 5260 | } | 5224 | } |
| 5261 | 5225 | ||
| 5262 | /* Supported frame sizes */ | 5226 | /* Supported frame sizes */ |
| @@ -6030,17 +5994,6 @@ static int e1000_set_features(struct net_device *netdev, | |||
| 6030 | NETIF_F_RXALL))) | 5994 | NETIF_F_RXALL))) |
| 6031 | return 0; | 5995 | return 0; |
| 6032 | 5996 | ||
| 6033 | /* | ||
| 6034 | * IP payload checksum (enabled with jumbos/packet-split when Rx | ||
| 6035 | * checksum is enabled) and generation of RSS hash is mutually | ||
| 6036 | * exclusive in the hardware. | ||
| 6037 | */ | ||
| 6038 | if (adapter->rx_ps_pages && | ||
| 6039 | (features & NETIF_F_RXCSUM) && (features & NETIF_F_RXHASH)) { | ||
| 6040 | e_err("Enabling both receive checksum offload and receive hashing is not possible with jumbo frames. Disable jumbos or enable only one of the receive offload features.\n"); | ||
| 6041 | return -EINVAL; | ||
| 6042 | } | ||
| 6043 | |||
| 6044 | if (changed & NETIF_F_RXFCS) { | 5997 | if (changed & NETIF_F_RXFCS) { |
| 6045 | if (features & NETIF_F_RXFCS) { | 5998 | if (features & NETIF_F_RXFCS) { |
| 6046 | adapter->flags2 &= ~FLAG2_CRC_STRIPPING; | 5999 | adapter->flags2 &= ~FLAG2_CRC_STRIPPING; |
diff --git a/drivers/net/ethernet/intel/igbvf/ethtool.c b/drivers/net/ethernet/intel/igbvf/ethtool.c index 8ce67064b9c5..90eef07943f4 100644 --- a/drivers/net/ethernet/intel/igbvf/ethtool.c +++ b/drivers/net/ethernet/intel/igbvf/ethtool.c | |||
| @@ -357,21 +357,28 @@ static int igbvf_set_coalesce(struct net_device *netdev, | |||
| 357 | struct igbvf_adapter *adapter = netdev_priv(netdev); | 357 | struct igbvf_adapter *adapter = netdev_priv(netdev); |
| 358 | struct e1000_hw *hw = &adapter->hw; | 358 | struct e1000_hw *hw = &adapter->hw; |
| 359 | 359 | ||
| 360 | if ((ec->rx_coalesce_usecs > IGBVF_MAX_ITR_USECS) || | 360 | if ((ec->rx_coalesce_usecs >= IGBVF_MIN_ITR_USECS) && |
| 361 | ((ec->rx_coalesce_usecs > 3) && | 361 | (ec->rx_coalesce_usecs <= IGBVF_MAX_ITR_USECS)) { |
| 362 | (ec->rx_coalesce_usecs < IGBVF_MIN_ITR_USECS)) || | 362 | adapter->current_itr = ec->rx_coalesce_usecs << 2; |
| 363 | (ec->rx_coalesce_usecs == 2)) | 363 | adapter->requested_itr = 1000000000 / |
| 364 | return -EINVAL; | 364 | (adapter->current_itr * 256); |
| 365 | 365 | } else if ((ec->rx_coalesce_usecs == 3) || | |
| 366 | /* convert to rate of irq's per second */ | 366 | (ec->rx_coalesce_usecs == 2)) { |
| 367 | if (ec->rx_coalesce_usecs && ec->rx_coalesce_usecs <= 3) { | ||
| 368 | adapter->current_itr = IGBVF_START_ITR; | 367 | adapter->current_itr = IGBVF_START_ITR; |
| 369 | adapter->requested_itr = ec->rx_coalesce_usecs; | 368 | adapter->requested_itr = ec->rx_coalesce_usecs; |
| 370 | } else { | 369 | } else if (ec->rx_coalesce_usecs == 0) { |
| 371 | adapter->current_itr = ec->rx_coalesce_usecs << 2; | 370 | /* |
| 371 | * The user's desire is to turn off interrupt throttling | ||
| 372 | * altogether, but due to HW limitations, we can't do that. | ||
| 373 | * Instead we set a very small value in EITR, which would | ||
| 374 | * allow ~967k interrupts per second, but allow the adapter's | ||
| 375 | * internal clocking to still function properly. | ||
| 376 | */ | ||
| 377 | adapter->current_itr = 4; | ||
| 372 | adapter->requested_itr = 1000000000 / | 378 | adapter->requested_itr = 1000000000 / |
| 373 | (adapter->current_itr * 256); | 379 | (adapter->current_itr * 256); |
| 374 | } | 380 | } else |
| 381 | return -EINVAL; | ||
| 375 | 382 | ||
| 376 | writel(adapter->current_itr, | 383 | writel(adapter->current_itr, |
| 377 | hw->hw_addr + adapter->rx_ring->itr_register); | 384 | hw->hw_addr + adapter->rx_ring->itr_register); |
diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c index d614c374ed9d..3b5c4571b55e 100644 --- a/drivers/net/ethernet/ti/davinci_cpdma.c +++ b/drivers/net/ethernet/ti/davinci_cpdma.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
| 17 | #include <linux/device.h> | 17 | #include <linux/device.h> |
| 18 | #include <linux/module.h> | ||
| 18 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
| 19 | #include <linux/err.h> | 20 | #include <linux/err.h> |
| 20 | #include <linux/dma-mapping.h> | 21 | #include <linux/dma-mapping.h> |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 3767a1225860..b01960fcfbc9 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -197,6 +197,10 @@ err: | |||
| 197 | static int qmi_wwan_cdc_wdm_manage_power(struct usb_interface *intf, int on) | 197 | static int qmi_wwan_cdc_wdm_manage_power(struct usb_interface *intf, int on) |
| 198 | { | 198 | { |
| 199 | struct usbnet *dev = usb_get_intfdata(intf); | 199 | struct usbnet *dev = usb_get_intfdata(intf); |
| 200 | |||
| 201 | /* can be called while disconnecting */ | ||
| 202 | if (!dev) | ||
| 203 | return 0; | ||
| 200 | return qmi_wwan_manage_power(dev, on); | 204 | return qmi_wwan_manage_power(dev, on); |
| 201 | } | 205 | } |
| 202 | 206 | ||
diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h index c54b7d37bff1..420d69b2674c 100644 --- a/drivers/net/wireless/ath/ath.h +++ b/drivers/net/wireless/ath/ath.h | |||
| @@ -143,6 +143,7 @@ struct ath_common { | |||
| 143 | u32 keymax; | 143 | u32 keymax; |
| 144 | DECLARE_BITMAP(keymap, ATH_KEYMAX); | 144 | DECLARE_BITMAP(keymap, ATH_KEYMAX); |
| 145 | DECLARE_BITMAP(tkip_keymap, ATH_KEYMAX); | 145 | DECLARE_BITMAP(tkip_keymap, ATH_KEYMAX); |
| 146 | DECLARE_BITMAP(ccmp_keymap, ATH_KEYMAX); | ||
| 146 | enum ath_crypt_caps crypt_caps; | 147 | enum ath_crypt_caps crypt_caps; |
| 147 | 148 | ||
| 148 | unsigned int clockrate; | 149 | unsigned int clockrate; |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 1c68e564f503..995ca8e1302e 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -622,7 +622,7 @@ static int __ath9k_hw_init(struct ath_hw *ah) | |||
| 622 | 622 | ||
| 623 | if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) { | 623 | if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) { |
| 624 | if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI || | 624 | if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI || |
| 625 | ((AR_SREV_9160(ah) || AR_SREV_9280(ah)) && | 625 | ((AR_SREV_9160(ah) || AR_SREV_9280(ah) || AR_SREV_9287(ah)) && |
| 626 | !ah->is_pciexpress)) { | 626 | !ah->is_pciexpress)) { |
| 627 | ah->config.serialize_regmode = | 627 | ah->config.serialize_regmode = |
| 628 | SER_REG_MODE_ON; | 628 | SER_REG_MODE_ON; |
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index e1fcc68124dc..0735aeb3b26c 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
| @@ -695,9 +695,9 @@ static bool ath_edma_get_buffers(struct ath_softc *sc, | |||
| 695 | __skb_unlink(skb, &rx_edma->rx_fifo); | 695 | __skb_unlink(skb, &rx_edma->rx_fifo); |
| 696 | list_add_tail(&bf->list, &sc->rx.rxbuf); | 696 | list_add_tail(&bf->list, &sc->rx.rxbuf); |
| 697 | ath_rx_edma_buf_link(sc, qtype); | 697 | ath_rx_edma_buf_link(sc, qtype); |
| 698 | } else { | ||
| 699 | bf = NULL; | ||
| 700 | } | 698 | } |
| 699 | |||
| 700 | bf = NULL; | ||
| 701 | } | 701 | } |
| 702 | 702 | ||
| 703 | *dest = bf; | 703 | *dest = bf; |
| @@ -822,7 +822,8 @@ static bool ath9k_rx_accept(struct ath_common *common, | |||
| 822 | * descriptor does contain a valid key index. This has been observed | 822 | * descriptor does contain a valid key index. This has been observed |
| 823 | * mostly with CCMP encryption. | 823 | * mostly with CCMP encryption. |
| 824 | */ | 824 | */ |
| 825 | if (rx_stats->rs_keyix == ATH9K_RXKEYIX_INVALID) | 825 | if (rx_stats->rs_keyix == ATH9K_RXKEYIX_INVALID || |
| 826 | !test_bit(rx_stats->rs_keyix, common->ccmp_keymap)) | ||
| 826 | rx_stats->rs_status &= ~ATH9K_RXERR_KEYMISS; | 827 | rx_stats->rs_status &= ~ATH9K_RXERR_KEYMISS; |
| 827 | 828 | ||
| 828 | if (!rx_stats->rs_datalen) { | 829 | if (!rx_stats->rs_datalen) { |
diff --git a/drivers/net/wireless/ath/key.c b/drivers/net/wireless/ath/key.c index 0e81904956cf..5c54aa43ca2d 100644 --- a/drivers/net/wireless/ath/key.c +++ b/drivers/net/wireless/ath/key.c | |||
| @@ -556,6 +556,9 @@ int ath_key_config(struct ath_common *common, | |||
| 556 | return -EIO; | 556 | return -EIO; |
| 557 | 557 | ||
| 558 | set_bit(idx, common->keymap); | 558 | set_bit(idx, common->keymap); |
| 559 | if (key->cipher == WLAN_CIPHER_SUITE_CCMP) | ||
| 560 | set_bit(idx, common->ccmp_keymap); | ||
| 561 | |||
| 559 | if (key->cipher == WLAN_CIPHER_SUITE_TKIP) { | 562 | if (key->cipher == WLAN_CIPHER_SUITE_TKIP) { |
| 560 | set_bit(idx + 64, common->keymap); | 563 | set_bit(idx + 64, common->keymap); |
| 561 | set_bit(idx, common->tkip_keymap); | 564 | set_bit(idx, common->tkip_keymap); |
| @@ -582,6 +585,7 @@ void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key) | |||
| 582 | return; | 585 | return; |
| 583 | 586 | ||
| 584 | clear_bit(key->hw_key_idx, common->keymap); | 587 | clear_bit(key->hw_key_idx, common->keymap); |
| 588 | clear_bit(key->hw_key_idx, common->ccmp_keymap); | ||
| 585 | if (key->cipher != WLAN_CIPHER_SUITE_TKIP) | 589 | if (key->cipher != WLAN_CIPHER_SUITE_TKIP) |
| 586 | return; | 590 | return; |
| 587 | 591 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-mac80211.c b/drivers/net/wireless/iwlwifi/iwl-mac80211.c index 3ee23134c02b..013680332f07 100644 --- a/drivers/net/wireless/iwlwifi/iwl-mac80211.c +++ b/drivers/net/wireless/iwlwifi/iwl-mac80211.c | |||
| @@ -796,6 +796,18 @@ int iwlagn_mac_sta_state(struct ieee80211_hw *hw, | |||
| 796 | switch (op) { | 796 | switch (op) { |
| 797 | case ADD: | 797 | case ADD: |
| 798 | ret = iwlagn_mac_sta_add(hw, vif, sta); | 798 | ret = iwlagn_mac_sta_add(hw, vif, sta); |
| 799 | if (ret) | ||
| 800 | break; | ||
| 801 | /* | ||
| 802 | * Clear the in-progress flag, the AP station entry was added | ||
| 803 | * but we'll initialize LQ only when we've associated (which | ||
| 804 | * would also clear the in-progress flag). This is necessary | ||
| 805 | * in case we never initialize LQ because association fails. | ||
| 806 | */ | ||
| 807 | spin_lock_bh(&priv->sta_lock); | ||
| 808 | priv->stations[iwl_sta_id(sta)].used &= | ||
| 809 | ~IWL_STA_UCODE_INPROGRESS; | ||
| 810 | spin_unlock_bh(&priv->sta_lock); | ||
| 799 | break; | 811 | break; |
| 800 | case REMOVE: | 812 | case REMOVE: |
| 801 | ret = iwlagn_mac_sta_remove(hw, vif, sta); | 813 | ret = iwlagn_mac_sta_remove(hw, vif, sta); |
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.c b/drivers/net/wireless/mwifiex/11n_rxreorder.c index 9c44088054dd..900ee129e825 100644 --- a/drivers/net/wireless/mwifiex/11n_rxreorder.c +++ b/drivers/net/wireless/mwifiex/11n_rxreorder.c | |||
| @@ -256,7 +256,8 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta, | |||
| 256 | else | 256 | else |
| 257 | last_seq = priv->rx_seq[tid]; | 257 | last_seq = priv->rx_seq[tid]; |
| 258 | 258 | ||
| 259 | if (last_seq >= new_node->start_win) | 259 | if (last_seq != MWIFIEX_DEF_11N_RX_SEQ_NUM && |
| 260 | last_seq >= new_node->start_win) | ||
| 260 | new_node->start_win = last_seq + 1; | 261 | new_node->start_win = last_seq + 1; |
| 261 | 262 | ||
| 262 | new_node->win_size = win_size; | 263 | new_node->win_size = win_size; |
| @@ -596,5 +597,5 @@ void mwifiex_11n_cleanup_reorder_tbl(struct mwifiex_private *priv) | |||
| 596 | spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags); | 597 | spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags); |
| 597 | 598 | ||
| 598 | INIT_LIST_HEAD(&priv->rx_reorder_tbl_ptr); | 599 | INIT_LIST_HEAD(&priv->rx_reorder_tbl_ptr); |
| 599 | memset(priv->rx_seq, 0, sizeof(priv->rx_seq)); | 600 | mwifiex_reset_11n_rx_seq_num(priv); |
| 600 | } | 601 | } |
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.h b/drivers/net/wireless/mwifiex/11n_rxreorder.h index f1bffebabc60..6c9815a0f5d8 100644 --- a/drivers/net/wireless/mwifiex/11n_rxreorder.h +++ b/drivers/net/wireless/mwifiex/11n_rxreorder.h | |||
| @@ -37,6 +37,13 @@ | |||
| 37 | 37 | ||
| 38 | #define ADDBA_RSP_STATUS_ACCEPT 0 | 38 | #define ADDBA_RSP_STATUS_ACCEPT 0 |
| 39 | 39 | ||
| 40 | #define MWIFIEX_DEF_11N_RX_SEQ_NUM 0xffff | ||
| 41 | |||
| 42 | static inline void mwifiex_reset_11n_rx_seq_num(struct mwifiex_private *priv) | ||
| 43 | { | ||
| 44 | memset(priv->rx_seq, 0xff, sizeof(priv->rx_seq)); | ||
| 45 | } | ||
| 46 | |||
| 40 | int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *, | 47 | int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *, |
| 41 | u16 seqNum, | 48 | u16 seqNum, |
| 42 | u16 tid, u8 *ta, | 49 | u16 tid, u8 *ta, |
diff --git a/drivers/net/wireless/mwifiex/ie.c b/drivers/net/wireless/mwifiex/ie.c index ceb82cd749cc..383820a52beb 100644 --- a/drivers/net/wireless/mwifiex/ie.c +++ b/drivers/net/wireless/mwifiex/ie.c | |||
| @@ -213,6 +213,7 @@ mwifiex_update_uap_custom_ie(struct mwifiex_private *priv, | |||
| 213 | /* save assoc resp ie index after auto-indexing */ | 213 | /* save assoc resp ie index after auto-indexing */ |
| 214 | *assoc_idx = *((u16 *)pos); | 214 | *assoc_idx = *((u16 *)pos); |
| 215 | 215 | ||
| 216 | kfree(ap_custom_ie); | ||
| 216 | return ret; | 217 | return ret; |
| 217 | } | 218 | } |
| 218 | 219 | ||
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c index e0377473282f..fc8a9bfa1248 100644 --- a/drivers/net/wireless/mwifiex/sdio.c +++ b/drivers/net/wireless/mwifiex/sdio.c | |||
| @@ -978,10 +978,10 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter, | |||
| 978 | dev_dbg(adapter->dev, "info: --- Rx: Event ---\n"); | 978 | dev_dbg(adapter->dev, "info: --- Rx: Event ---\n"); |
| 979 | adapter->event_cause = *(u32 *) skb->data; | 979 | adapter->event_cause = *(u32 *) skb->data; |
| 980 | 980 | ||
| 981 | skb_pull(skb, MWIFIEX_EVENT_HEADER_LEN); | ||
| 982 | |||
| 983 | if ((skb->len > 0) && (skb->len < MAX_EVENT_SIZE)) | 981 | if ((skb->len > 0) && (skb->len < MAX_EVENT_SIZE)) |
| 984 | memcpy(adapter->event_body, skb->data, skb->len); | 982 | memcpy(adapter->event_body, |
| 983 | skb->data + MWIFIEX_EVENT_HEADER_LEN, | ||
| 984 | skb->len); | ||
| 985 | 985 | ||
| 986 | /* event cause has been saved to adapter->event_cause */ | 986 | /* event cause has been saved to adapter->event_cause */ |
| 987 | adapter->event_received = true; | 987 | adapter->event_received = true; |
diff --git a/drivers/net/wireless/mwifiex/sta_event.c b/drivers/net/wireless/mwifiex/sta_event.c index 4ace5a3dcd23..11e731f3581c 100644 --- a/drivers/net/wireless/mwifiex/sta_event.c +++ b/drivers/net/wireless/mwifiex/sta_event.c | |||
| @@ -406,9 +406,9 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) | |||
| 406 | break; | 406 | break; |
| 407 | 407 | ||
| 408 | case EVENT_UAP_STA_ASSOC: | 408 | case EVENT_UAP_STA_ASSOC: |
| 409 | skb_pull(adapter->event_skb, MWIFIEX_UAP_EVENT_EXTRA_HEADER); | ||
| 410 | memset(&sinfo, 0, sizeof(sinfo)); | 409 | memset(&sinfo, 0, sizeof(sinfo)); |
| 411 | event = (struct mwifiex_assoc_event *)adapter->event_skb->data; | 410 | event = (struct mwifiex_assoc_event *) |
| 411 | (adapter->event_body + MWIFIEX_UAP_EVENT_EXTRA_HEADER); | ||
| 412 | if (le16_to_cpu(event->type) == TLV_TYPE_UAP_MGMT_FRAME) { | 412 | if (le16_to_cpu(event->type) == TLV_TYPE_UAP_MGMT_FRAME) { |
| 413 | len = -1; | 413 | len = -1; |
| 414 | 414 | ||
| @@ -433,9 +433,8 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) | |||
| 433 | GFP_KERNEL); | 433 | GFP_KERNEL); |
| 434 | break; | 434 | break; |
| 435 | case EVENT_UAP_STA_DEAUTH: | 435 | case EVENT_UAP_STA_DEAUTH: |
| 436 | skb_pull(adapter->event_skb, MWIFIEX_UAP_EVENT_EXTRA_HEADER); | 436 | cfg80211_del_sta(priv->netdev, adapter->event_body + |
| 437 | cfg80211_del_sta(priv->netdev, adapter->event_skb->data, | 437 | MWIFIEX_UAP_EVENT_EXTRA_HEADER, GFP_KERNEL); |
| 438 | GFP_KERNEL); | ||
| 439 | break; | 438 | break; |
| 440 | case EVENT_UAP_BSS_IDLE: | 439 | case EVENT_UAP_BSS_IDLE: |
| 441 | priv->media_connected = false; | 440 | priv->media_connected = false; |
diff --git a/drivers/net/wireless/mwifiex/usb.c b/drivers/net/wireless/mwifiex/usb.c index 49ebf20c56eb..22a5916564b8 100644 --- a/drivers/net/wireless/mwifiex/usb.c +++ b/drivers/net/wireless/mwifiex/usb.c | |||
| @@ -49,6 +49,7 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter, | |||
| 49 | struct device *dev = adapter->dev; | 49 | struct device *dev = adapter->dev; |
| 50 | u32 recv_type; | 50 | u32 recv_type; |
| 51 | __le32 tmp; | 51 | __le32 tmp; |
| 52 | int ret; | ||
| 52 | 53 | ||
| 53 | if (adapter->hs_activated) | 54 | if (adapter->hs_activated) |
| 54 | mwifiex_process_hs_config(adapter); | 55 | mwifiex_process_hs_config(adapter); |
| @@ -69,16 +70,19 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter, | |||
| 69 | case MWIFIEX_USB_TYPE_CMD: | 70 | case MWIFIEX_USB_TYPE_CMD: |
| 70 | if (skb->len > MWIFIEX_SIZE_OF_CMD_BUFFER) { | 71 | if (skb->len > MWIFIEX_SIZE_OF_CMD_BUFFER) { |
| 71 | dev_err(dev, "CMD: skb->len too large\n"); | 72 | dev_err(dev, "CMD: skb->len too large\n"); |
| 72 | return -1; | 73 | ret = -1; |
| 74 | goto exit_restore_skb; | ||
| 73 | } else if (!adapter->curr_cmd) { | 75 | } else if (!adapter->curr_cmd) { |
| 74 | dev_dbg(dev, "CMD: no curr_cmd\n"); | 76 | dev_dbg(dev, "CMD: no curr_cmd\n"); |
| 75 | if (adapter->ps_state == PS_STATE_SLEEP_CFM) { | 77 | if (adapter->ps_state == PS_STATE_SLEEP_CFM) { |
| 76 | mwifiex_process_sleep_confirm_resp( | 78 | mwifiex_process_sleep_confirm_resp( |
| 77 | adapter, skb->data, | 79 | adapter, skb->data, |
| 78 | skb->len); | 80 | skb->len); |
| 79 | return 0; | 81 | ret = 0; |
| 82 | goto exit_restore_skb; | ||
| 80 | } | 83 | } |
| 81 | return -1; | 84 | ret = -1; |
| 85 | goto exit_restore_skb; | ||
| 82 | } | 86 | } |
| 83 | 87 | ||
| 84 | adapter->curr_cmd->resp_skb = skb; | 88 | adapter->curr_cmd->resp_skb = skb; |
| @@ -87,20 +91,22 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter, | |||
| 87 | case MWIFIEX_USB_TYPE_EVENT: | 91 | case MWIFIEX_USB_TYPE_EVENT: |
| 88 | if (skb->len < sizeof(u32)) { | 92 | if (skb->len < sizeof(u32)) { |
| 89 | dev_err(dev, "EVENT: skb->len too small\n"); | 93 | dev_err(dev, "EVENT: skb->len too small\n"); |
| 90 | return -1; | 94 | ret = -1; |
| 95 | goto exit_restore_skb; | ||
| 91 | } | 96 | } |
| 92 | skb_copy_from_linear_data(skb, &tmp, sizeof(u32)); | 97 | skb_copy_from_linear_data(skb, &tmp, sizeof(u32)); |
| 93 | adapter->event_cause = le32_to_cpu(tmp); | 98 | adapter->event_cause = le32_to_cpu(tmp); |
| 94 | skb_pull(skb, sizeof(u32)); | ||
| 95 | dev_dbg(dev, "event_cause %#x\n", adapter->event_cause); | 99 | dev_dbg(dev, "event_cause %#x\n", adapter->event_cause); |
| 96 | 100 | ||
| 97 | if (skb->len > MAX_EVENT_SIZE) { | 101 | if (skb->len > MAX_EVENT_SIZE) { |
| 98 | dev_err(dev, "EVENT: event body too large\n"); | 102 | dev_err(dev, "EVENT: event body too large\n"); |
| 99 | return -1; | 103 | ret = -1; |
| 104 | goto exit_restore_skb; | ||
| 100 | } | 105 | } |
| 101 | 106 | ||
| 102 | skb_copy_from_linear_data(skb, adapter->event_body, | 107 | memcpy(adapter->event_body, skb->data + |
| 103 | skb->len); | 108 | MWIFIEX_EVENT_HEADER_LEN, skb->len); |
| 109 | |||
| 104 | adapter->event_received = true; | 110 | adapter->event_received = true; |
| 105 | adapter->event_skb = skb; | 111 | adapter->event_skb = skb; |
| 106 | break; | 112 | break; |
| @@ -124,6 +130,12 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter, | |||
| 124 | } | 130 | } |
| 125 | 131 | ||
| 126 | return -EINPROGRESS; | 132 | return -EINPROGRESS; |
| 133 | |||
| 134 | exit_restore_skb: | ||
| 135 | /* The buffer will be reused for further cmds/events */ | ||
| 136 | skb_push(skb, INTF_HEADER_LEN); | ||
| 137 | |||
| 138 | return ret; | ||
| 127 | } | 139 | } |
| 128 | 140 | ||
| 129 | static void mwifiex_usb_rx_complete(struct urb *urb) | 141 | static void mwifiex_usb_rx_complete(struct urb *urb) |
diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c index f3fc65515857..3fa4d4176993 100644 --- a/drivers/net/wireless/mwifiex/wmm.c +++ b/drivers/net/wireless/mwifiex/wmm.c | |||
| @@ -404,6 +404,8 @@ mwifiex_wmm_init(struct mwifiex_adapter *adapter) | |||
| 404 | priv->add_ba_param.tx_win_size = MWIFIEX_AMPDU_DEF_TXWINSIZE; | 404 | priv->add_ba_param.tx_win_size = MWIFIEX_AMPDU_DEF_TXWINSIZE; |
| 405 | priv->add_ba_param.rx_win_size = MWIFIEX_AMPDU_DEF_RXWINSIZE; | 405 | priv->add_ba_param.rx_win_size = MWIFIEX_AMPDU_DEF_RXWINSIZE; |
| 406 | 406 | ||
| 407 | mwifiex_reset_11n_rx_seq_num(priv); | ||
| 408 | |||
| 407 | atomic_set(&priv->wmm.tx_pkts_queued, 0); | 409 | atomic_set(&priv->wmm.tx_pkts_queued, 0); |
| 408 | atomic_set(&priv->wmm.highest_queued_prio, HIGH_PRIO_TID); | 410 | atomic_set(&priv->wmm.highest_queued_prio, HIGH_PRIO_TID); |
| 409 | } | 411 | } |
| @@ -1221,6 +1223,7 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter) | |||
| 1221 | 1223 | ||
| 1222 | if (!ptr->is_11n_enabled || | 1224 | if (!ptr->is_11n_enabled || |
| 1223 | mwifiex_is_ba_stream_setup(priv, ptr, tid) || | 1225 | mwifiex_is_ba_stream_setup(priv, ptr, tid) || |
| 1226 | priv->wps.session_enable || | ||
| 1224 | ((priv->sec_info.wpa_enabled || | 1227 | ((priv->sec_info.wpa_enabled || |
| 1225 | priv->sec_info.wpa2_enabled) && | 1228 | priv->sec_info.wpa2_enabled) && |
| 1226 | !priv->wpa_is_gtk_set)) { | 1229 | !priv->wpa_is_gtk_set)) { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c index d228358e6a40..9970c2b1b199 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | |||
| @@ -301,9 +301,11 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | |||
| 301 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ | 301 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ |
| 302 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ | 302 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ |
| 303 | {RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/ | 303 | {RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/ |
| 304 | {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ | ||
| 304 | {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ | 305 | {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ |
| 305 | {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ | 306 | {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ |
| 306 | {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/ | 307 | {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/ |
| 308 | {RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/ | ||
| 307 | /* HP - Lite-On ,8188CUS Slim Combo */ | 309 | /* HP - Lite-On ,8188CUS Slim Combo */ |
| 308 | {RTL_USB_DEVICE(0x103c, 0x1629, rtl92cu_hal_cfg)}, | 310 | {RTL_USB_DEVICE(0x103c, 0x1629, rtl92cu_hal_cfg)}, |
| 309 | {RTL_USB_DEVICE(0x13d3, 0x3357, rtl92cu_hal_cfg)}, /* AzureWave */ | 311 | {RTL_USB_DEVICE(0x13d3, 0x3357, rtl92cu_hal_cfg)}, /* AzureWave */ |
| @@ -346,6 +348,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | |||
| 346 | {RTL_USB_DEVICE(0x07b8, 0x8178, rtl92cu_hal_cfg)}, /*Funai -Abocom*/ | 348 | {RTL_USB_DEVICE(0x07b8, 0x8178, rtl92cu_hal_cfg)}, /*Funai -Abocom*/ |
| 347 | {RTL_USB_DEVICE(0x0846, 0x9021, rtl92cu_hal_cfg)}, /*Netgear-Sercomm*/ | 349 | {RTL_USB_DEVICE(0x0846, 0x9021, rtl92cu_hal_cfg)}, /*Netgear-Sercomm*/ |
| 348 | {RTL_USB_DEVICE(0x0b05, 0x17ab, rtl92cu_hal_cfg)}, /*ASUS-Edimax*/ | 350 | {RTL_USB_DEVICE(0x0b05, 0x17ab, rtl92cu_hal_cfg)}, /*ASUS-Edimax*/ |
| 351 | {RTL_USB_DEVICE(0x0bda, 0x8186, rtl92cu_hal_cfg)}, /*Realtek 92CE-VAU*/ | ||
| 349 | {RTL_USB_DEVICE(0x0df6, 0x0061, rtl92cu_hal_cfg)}, /*Sitecom-Edimax*/ | 352 | {RTL_USB_DEVICE(0x0df6, 0x0061, rtl92cu_hal_cfg)}, /*Sitecom-Edimax*/ |
| 350 | {RTL_USB_DEVICE(0x0e66, 0x0019, rtl92cu_hal_cfg)}, /*Hawking-Edimax*/ | 353 | {RTL_USB_DEVICE(0x0e66, 0x0019, rtl92cu_hal_cfg)}, /*Hawking-Edimax*/ |
| 351 | {RTL_USB_DEVICE(0x2001, 0x3307, rtl92cu_hal_cfg)}, /*D-Link-Cameo*/ | 354 | {RTL_USB_DEVICE(0x2001, 0x3307, rtl92cu_hal_cfg)}, /*D-Link-Cameo*/ |
diff --git a/drivers/net/wireless/ti/wlcore/Kconfig b/drivers/net/wireless/ti/wlcore/Kconfig index 54156b0b5c2d..d7b907e67170 100644 --- a/drivers/net/wireless/ti/wlcore/Kconfig +++ b/drivers/net/wireless/ti/wlcore/Kconfig | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | config WLCORE | 1 | config WLCORE |
| 2 | tristate "TI wlcore support" | 2 | tristate "TI wlcore support" |
| 3 | depends on WL_TI && GENERIC_HARDIRQS && MAC80211 | 3 | depends on WL_TI && GENERIC_HARDIRQS && MAC80211 |
| 4 | depends on INET | ||
| 5 | select FW_LOADER | 4 | select FW_LOADER |
| 6 | ---help--- | 5 | ---help--- |
| 7 | This module contains the main code for TI WLAN chips. It abstracts | 6 | This module contains the main code for TI WLAN chips. It abstracts |
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index e4652fe58958..fecdf31816f2 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
| @@ -912,6 +912,9 @@ struct sctp_transport { | |||
| 912 | /* Is this structure kfree()able? */ | 912 | /* Is this structure kfree()able? */ |
| 913 | malloced:1; | 913 | malloced:1; |
| 914 | 914 | ||
| 915 | /* Has this transport moved the ctsn since we last sacked */ | ||
| 916 | __u32 sack_generation; | ||
| 917 | |||
| 915 | struct flowi fl; | 918 | struct flowi fl; |
| 916 | 919 | ||
| 917 | /* This is the peer's IP address and port. */ | 920 | /* This is the peer's IP address and port. */ |
| @@ -1584,6 +1587,7 @@ struct sctp_association { | |||
| 1584 | */ | 1587 | */ |
| 1585 | __u8 sack_needed; /* Do we need to sack the peer? */ | 1588 | __u8 sack_needed; /* Do we need to sack the peer? */ |
| 1586 | __u32 sack_cnt; | 1589 | __u32 sack_cnt; |
| 1590 | __u32 sack_generation; | ||
| 1587 | 1591 | ||
| 1588 | /* These are capabilities which our peer advertised. */ | 1592 | /* These are capabilities which our peer advertised. */ |
| 1589 | __u8 ecn_capable:1, /* Can peer do ECN? */ | 1593 | __u8 ecn_capable:1, /* Can peer do ECN? */ |
diff --git a/include/net/sctp/tsnmap.h b/include/net/sctp/tsnmap.h index e7728bc14ccf..2c5d2b4d5d1e 100644 --- a/include/net/sctp/tsnmap.h +++ b/include/net/sctp/tsnmap.h | |||
| @@ -117,7 +117,8 @@ void sctp_tsnmap_free(struct sctp_tsnmap *map); | |||
| 117 | int sctp_tsnmap_check(const struct sctp_tsnmap *, __u32 tsn); | 117 | int sctp_tsnmap_check(const struct sctp_tsnmap *, __u32 tsn); |
| 118 | 118 | ||
| 119 | /* Mark this TSN as seen. */ | 119 | /* Mark this TSN as seen. */ |
| 120 | int sctp_tsnmap_mark(struct sctp_tsnmap *, __u32 tsn); | 120 | int sctp_tsnmap_mark(struct sctp_tsnmap *, __u32 tsn, |
| 121 | struct sctp_transport *trans); | ||
| 121 | 122 | ||
| 122 | /* Mark this TSN and all lower as seen. */ | 123 | /* Mark this TSN and all lower as seen. */ |
| 123 | void sctp_tsnmap_skip(struct sctp_tsnmap *map, __u32 tsn); | 124 | void sctp_tsnmap_skip(struct sctp_tsnmap *map, __u32 tsn); |
diff --git a/net/core/dev.c b/net/core/dev.c index 6df214041a5e..84f01ba81a34 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1136,8 +1136,8 @@ void dev_load(struct net *net, const char *name) | |||
| 1136 | no_module = request_module("netdev-%s", name); | 1136 | no_module = request_module("netdev-%s", name); |
| 1137 | if (no_module && capable(CAP_SYS_MODULE)) { | 1137 | if (no_module && capable(CAP_SYS_MODULE)) { |
| 1138 | if (!request_module("%s", name)) | 1138 | if (!request_module("%s", name)) |
| 1139 | pr_err("Loading kernel module for a network device with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev-%s instead.\n", | 1139 | pr_warn("Loading kernel module for a network device with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev-%s instead.\n", |
| 1140 | name); | 1140 | name); |
| 1141 | } | 1141 | } |
| 1142 | } | 1142 | } |
| 1143 | EXPORT_SYMBOL(dev_load); | 1143 | EXPORT_SYMBOL(dev_load); |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 66e4fcdd1c6b..a4bb856de08f 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -1342,7 +1342,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
| 1342 | struct ieee80211_local *local = sdata->local; | 1342 | struct ieee80211_local *local = sdata->local; |
| 1343 | struct sta_info *sta; | 1343 | struct sta_info *sta; |
| 1344 | u32 changed = 0; | 1344 | u32 changed = 0; |
| 1345 | u8 bssid[ETH_ALEN]; | ||
| 1346 | 1345 | ||
| 1347 | ASSERT_MGD_MTX(ifmgd); | 1346 | ASSERT_MGD_MTX(ifmgd); |
| 1348 | 1347 | ||
| @@ -1354,10 +1353,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
| 1354 | 1353 | ||
| 1355 | ieee80211_stop_poll(sdata); | 1354 | ieee80211_stop_poll(sdata); |
| 1356 | 1355 | ||
| 1357 | memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN); | ||
| 1358 | |||
| 1359 | ifmgd->associated = NULL; | 1356 | ifmgd->associated = NULL; |
| 1360 | memset(ifmgd->bssid, 0, ETH_ALEN); | ||
| 1361 | 1357 | ||
| 1362 | /* | 1358 | /* |
| 1363 | * we need to commit the associated = NULL change because the | 1359 | * we need to commit the associated = NULL change because the |
| @@ -1377,7 +1373,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
| 1377 | netif_carrier_off(sdata->dev); | 1373 | netif_carrier_off(sdata->dev); |
| 1378 | 1374 | ||
| 1379 | mutex_lock(&local->sta_mtx); | 1375 | mutex_lock(&local->sta_mtx); |
| 1380 | sta = sta_info_get(sdata, bssid); | 1376 | sta = sta_info_get(sdata, ifmgd->bssid); |
| 1381 | if (sta) { | 1377 | if (sta) { |
| 1382 | set_sta_flag(sta, WLAN_STA_BLOCK_BA); | 1378 | set_sta_flag(sta, WLAN_STA_BLOCK_BA); |
| 1383 | ieee80211_sta_tear_down_BA_sessions(sta, tx); | 1379 | ieee80211_sta_tear_down_BA_sessions(sta, tx); |
| @@ -1386,13 +1382,16 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
| 1386 | 1382 | ||
| 1387 | /* deauthenticate/disassociate now */ | 1383 | /* deauthenticate/disassociate now */ |
| 1388 | if (tx || frame_buf) | 1384 | if (tx || frame_buf) |
| 1389 | ieee80211_send_deauth_disassoc(sdata, bssid, stype, reason, | 1385 | ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, stype, |
| 1390 | tx, frame_buf); | 1386 | reason, tx, frame_buf); |
| 1391 | 1387 | ||
| 1392 | /* flush out frame */ | 1388 | /* flush out frame */ |
| 1393 | if (tx) | 1389 | if (tx) |
| 1394 | drv_flush(local, false); | 1390 | drv_flush(local, false); |
| 1395 | 1391 | ||
| 1392 | /* clear bssid only after building the needed mgmt frames */ | ||
| 1393 | memset(ifmgd->bssid, 0, ETH_ALEN); | ||
| 1394 | |||
| 1396 | /* remove AP and TDLS peers */ | 1395 | /* remove AP and TDLS peers */ |
| 1397 | sta_info_flush(local, sdata); | 1396 | sta_info_flush(local, sdata); |
| 1398 | 1397 | ||
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 7bcecf73aafb..965e6ec0adb6 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -2455,7 +2455,7 @@ ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx) | |||
| 2455 | * frames that we didn't handle, including returning unknown | 2455 | * frames that we didn't handle, including returning unknown |
| 2456 | * ones. For all other modes we will return them to the sender, | 2456 | * ones. For all other modes we will return them to the sender, |
| 2457 | * setting the 0x80 bit in the action category, as required by | 2457 | * setting the 0x80 bit in the action category, as required by |
| 2458 | * 802.11-2007 7.3.1.11. | 2458 | * 802.11-2012 9.24.4. |
| 2459 | * Newer versions of hostapd shall also use the management frame | 2459 | * Newer versions of hostapd shall also use the management frame |
| 2460 | * registration mechanisms, but older ones still use cooked | 2460 | * registration mechanisms, but older ones still use cooked |
| 2461 | * monitor interfaces so push all frames there. | 2461 | * monitor interfaces so push all frames there. |
| @@ -2465,6 +2465,9 @@ ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx) | |||
| 2465 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) | 2465 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) |
| 2466 | return RX_DROP_MONITOR; | 2466 | return RX_DROP_MONITOR; |
| 2467 | 2467 | ||
| 2468 | if (is_multicast_ether_addr(mgmt->da)) | ||
| 2469 | return RX_DROP_MONITOR; | ||
| 2470 | |||
| 2468 | /* do not return rejected action frames */ | 2471 | /* do not return rejected action frames */ |
| 2469 | if (mgmt->u.action.category & 0x80) | 2472 | if (mgmt->u.action.category & 0x80) |
| 2470 | return RX_DROP_UNUSABLE; | 2473 | return RX_DROP_UNUSABLE; |
diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c index 819c342f5b30..9730882697aa 100644 --- a/net/netfilter/ipset/ip_set_core.c +++ b/net/netfilter/ipset/ip_set_core.c | |||
| @@ -640,6 +640,14 @@ find_free_id(const char *name, ip_set_id_t *index, struct ip_set **set) | |||
| 640 | } | 640 | } |
| 641 | 641 | ||
| 642 | static int | 642 | static int |
| 643 | ip_set_none(struct sock *ctnl, struct sk_buff *skb, | ||
| 644 | const struct nlmsghdr *nlh, | ||
| 645 | const struct nlattr * const attr[]) | ||
| 646 | { | ||
| 647 | return -EOPNOTSUPP; | ||
| 648 | } | ||
| 649 | |||
| 650 | static int | ||
| 643 | ip_set_create(struct sock *ctnl, struct sk_buff *skb, | 651 | ip_set_create(struct sock *ctnl, struct sk_buff *skb, |
| 644 | const struct nlmsghdr *nlh, | 652 | const struct nlmsghdr *nlh, |
| 645 | const struct nlattr * const attr[]) | 653 | const struct nlattr * const attr[]) |
| @@ -1539,6 +1547,10 @@ nlmsg_failure: | |||
| 1539 | } | 1547 | } |
| 1540 | 1548 | ||
| 1541 | static const struct nfnl_callback ip_set_netlink_subsys_cb[IPSET_MSG_MAX] = { | 1549 | static const struct nfnl_callback ip_set_netlink_subsys_cb[IPSET_MSG_MAX] = { |
| 1550 | [IPSET_CMD_NONE] = { | ||
| 1551 | .call = ip_set_none, | ||
| 1552 | .attr_count = IPSET_ATTR_CMD_MAX, | ||
| 1553 | }, | ||
| 1542 | [IPSET_CMD_CREATE] = { | 1554 | [IPSET_CMD_CREATE] = { |
| 1543 | .call = ip_set_create, | 1555 | .call = ip_set_create, |
| 1544 | .attr_count = IPSET_ATTR_CMD_MAX, | 1556 | .attr_count = IPSET_ATTR_CMD_MAX, |
diff --git a/net/netfilter/ipset/ip_set_hash_netiface.c b/net/netfilter/ipset/ip_set_hash_netiface.c index ee863943c826..d5d3607ae7bc 100644 --- a/net/netfilter/ipset/ip_set_hash_netiface.c +++ b/net/netfilter/ipset/ip_set_hash_netiface.c | |||
| @@ -38,30 +38,6 @@ struct iface_node { | |||
| 38 | 38 | ||
| 39 | #define iface_data(n) (rb_entry(n, struct iface_node, node)->iface) | 39 | #define iface_data(n) (rb_entry(n, struct iface_node, node)->iface) |
| 40 | 40 | ||
| 41 | static inline long | ||
| 42 | ifname_compare(const char *_a, const char *_b) | ||
| 43 | { | ||
| 44 | const long *a = (const long *)_a; | ||
| 45 | const long *b = (const long *)_b; | ||
| 46 | |||
| 47 | BUILD_BUG_ON(IFNAMSIZ > 4 * sizeof(unsigned long)); | ||
| 48 | if (a[0] != b[0]) | ||
| 49 | return a[0] - b[0]; | ||
| 50 | if (IFNAMSIZ > sizeof(long)) { | ||
| 51 | if (a[1] != b[1]) | ||
| 52 | return a[1] - b[1]; | ||
| 53 | } | ||
| 54 | if (IFNAMSIZ > 2 * sizeof(long)) { | ||
| 55 | if (a[2] != b[2]) | ||
| 56 | return a[2] - b[2]; | ||
| 57 | } | ||
| 58 | if (IFNAMSIZ > 3 * sizeof(long)) { | ||
| 59 | if (a[3] != b[3]) | ||
| 60 | return a[3] - b[3]; | ||
| 61 | } | ||
| 62 | return 0; | ||
| 63 | } | ||
| 64 | |||
| 65 | static void | 41 | static void |
| 66 | rbtree_destroy(struct rb_root *root) | 42 | rbtree_destroy(struct rb_root *root) |
| 67 | { | 43 | { |
| @@ -99,7 +75,7 @@ iface_test(struct rb_root *root, const char **iface) | |||
| 99 | 75 | ||
| 100 | while (n) { | 76 | while (n) { |
| 101 | const char *d = iface_data(n); | 77 | const char *d = iface_data(n); |
| 102 | long res = ifname_compare(*iface, d); | 78 | int res = strcmp(*iface, d); |
| 103 | 79 | ||
| 104 | if (res < 0) | 80 | if (res < 0) |
| 105 | n = n->rb_left; | 81 | n = n->rb_left; |
| @@ -121,7 +97,7 @@ iface_add(struct rb_root *root, const char **iface) | |||
| 121 | 97 | ||
| 122 | while (*n) { | 98 | while (*n) { |
| 123 | char *ifname = iface_data(*n); | 99 | char *ifname = iface_data(*n); |
| 124 | long res = ifname_compare(*iface, ifname); | 100 | int res = strcmp(*iface, ifname); |
| 125 | 101 | ||
| 126 | p = *n; | 102 | p = *n; |
| 127 | if (res < 0) | 103 | if (res < 0) |
| @@ -366,7 +342,7 @@ hash_netiface4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 366 | struct hash_netiface4_elem data = { .cidr = HOST_MASK }; | 342 | struct hash_netiface4_elem data = { .cidr = HOST_MASK }; |
| 367 | u32 ip = 0, ip_to, last; | 343 | u32 ip = 0, ip_to, last; |
| 368 | u32 timeout = h->timeout; | 344 | u32 timeout = h->timeout; |
| 369 | char iface[IFNAMSIZ] = {}; | 345 | char iface[IFNAMSIZ]; |
| 370 | int ret; | 346 | int ret; |
| 371 | 347 | ||
| 372 | if (unlikely(!tb[IPSET_ATTR_IP] || | 348 | if (unlikely(!tb[IPSET_ATTR_IP] || |
| @@ -663,7 +639,7 @@ hash_netiface6_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 663 | ipset_adtfn adtfn = set->variant->adt[adt]; | 639 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 664 | struct hash_netiface6_elem data = { .cidr = HOST_MASK }; | 640 | struct hash_netiface6_elem data = { .cidr = HOST_MASK }; |
| 665 | u32 timeout = h->timeout; | 641 | u32 timeout = h->timeout; |
| 666 | char iface[IFNAMSIZ] = {}; | 642 | char iface[IFNAMSIZ]; |
| 667 | int ret; | 643 | int ret; |
| 668 | 644 | ||
| 669 | if (unlikely(!tb[IPSET_ATTR_IP] || | 645 | if (unlikely(!tb[IPSET_ATTR_IP] || |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index dd811b8dd97c..d43e3c122f7b 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
| @@ -76,19 +76,19 @@ static void __ip_vs_del_service(struct ip_vs_service *svc); | |||
| 76 | 76 | ||
| 77 | #ifdef CONFIG_IP_VS_IPV6 | 77 | #ifdef CONFIG_IP_VS_IPV6 |
| 78 | /* Taken from rt6_fill_node() in net/ipv6/route.c, is there a better way? */ | 78 | /* Taken from rt6_fill_node() in net/ipv6/route.c, is there a better way? */ |
| 79 | static int __ip_vs_addr_is_local_v6(struct net *net, | 79 | static bool __ip_vs_addr_is_local_v6(struct net *net, |
| 80 | const struct in6_addr *addr) | 80 | const struct in6_addr *addr) |
| 81 | { | 81 | { |
| 82 | struct rt6_info *rt; | ||
| 83 | struct flowi6 fl6 = { | 82 | struct flowi6 fl6 = { |
| 84 | .daddr = *addr, | 83 | .daddr = *addr, |
| 85 | }; | 84 | }; |
| 85 | struct dst_entry *dst = ip6_route_output(net, NULL, &fl6); | ||
| 86 | bool is_local; | ||
| 86 | 87 | ||
| 87 | rt = (struct rt6_info *)ip6_route_output(net, NULL, &fl6); | 88 | is_local = !dst->error && dst->dev && (dst->dev->flags & IFF_LOOPBACK); |
| 88 | if (rt && rt->dst.dev && (rt->dst.dev->flags & IFF_LOOPBACK)) | ||
| 89 | return 1; | ||
| 90 | 89 | ||
| 91 | return 0; | 90 | dst_release(dst); |
| 91 | return is_local; | ||
| 92 | } | 92 | } |
| 93 | #endif | 93 | #endif |
| 94 | 94 | ||
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index 3e797d1fcb94..791d56bbd74a 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c | |||
| @@ -169,8 +169,10 @@ replay: | |||
| 169 | 169 | ||
| 170 | err = nla_parse(cda, ss->cb[cb_id].attr_count, | 170 | err = nla_parse(cda, ss->cb[cb_id].attr_count, |
| 171 | attr, attrlen, ss->cb[cb_id].policy); | 171 | attr, attrlen, ss->cb[cb_id].policy); |
| 172 | if (err < 0) | 172 | if (err < 0) { |
| 173 | rcu_read_unlock(); | ||
| 173 | return err; | 174 | return err; |
| 175 | } | ||
| 174 | 176 | ||
| 175 | if (nc->call_rcu) { | 177 | if (nc->call_rcu) { |
| 176 | err = nc->call_rcu(net->nfnl, skb, nlh, | 178 | err = nc->call_rcu(net->nfnl, skb, nlh, |
diff --git a/net/nfc/nci/ntf.c b/net/nfc/nci/ntf.c index cb2646179e5f..2ab196a9f228 100644 --- a/net/nfc/nci/ntf.c +++ b/net/nfc/nci/ntf.c | |||
| @@ -106,7 +106,7 @@ static __u8 *nci_extract_rf_params_nfca_passive_poll(struct nci_dev *ndev, | |||
| 106 | nfca_poll->sens_res = __le16_to_cpu(*((__u16 *)data)); | 106 | nfca_poll->sens_res = __le16_to_cpu(*((__u16 *)data)); |
| 107 | data += 2; | 107 | data += 2; |
| 108 | 108 | ||
| 109 | nfca_poll->nfcid1_len = *data++; | 109 | nfca_poll->nfcid1_len = min_t(__u8, *data++, NFC_NFCID1_MAXSIZE); |
| 110 | 110 | ||
| 111 | pr_debug("sens_res 0x%x, nfcid1_len %d\n", | 111 | pr_debug("sens_res 0x%x, nfcid1_len %d\n", |
| 112 | nfca_poll->sens_res, nfca_poll->nfcid1_len); | 112 | nfca_poll->sens_res, nfca_poll->nfcid1_len); |
| @@ -130,7 +130,7 @@ static __u8 *nci_extract_rf_params_nfcb_passive_poll(struct nci_dev *ndev, | |||
| 130 | struct rf_tech_specific_params_nfcb_poll *nfcb_poll, | 130 | struct rf_tech_specific_params_nfcb_poll *nfcb_poll, |
| 131 | __u8 *data) | 131 | __u8 *data) |
| 132 | { | 132 | { |
| 133 | nfcb_poll->sensb_res_len = *data++; | 133 | nfcb_poll->sensb_res_len = min_t(__u8, *data++, NFC_SENSB_RES_MAXSIZE); |
| 134 | 134 | ||
| 135 | pr_debug("sensb_res_len %d\n", nfcb_poll->sensb_res_len); | 135 | pr_debug("sensb_res_len %d\n", nfcb_poll->sensb_res_len); |
| 136 | 136 | ||
| @@ -145,7 +145,7 @@ static __u8 *nci_extract_rf_params_nfcf_passive_poll(struct nci_dev *ndev, | |||
| 145 | __u8 *data) | 145 | __u8 *data) |
| 146 | { | 146 | { |
| 147 | nfcf_poll->bit_rate = *data++; | 147 | nfcf_poll->bit_rate = *data++; |
| 148 | nfcf_poll->sensf_res_len = *data++; | 148 | nfcf_poll->sensf_res_len = min_t(__u8, *data++, NFC_SENSF_RES_MAXSIZE); |
| 149 | 149 | ||
| 150 | pr_debug("bit_rate %d, sensf_res_len %d\n", | 150 | pr_debug("bit_rate %d, sensf_res_len %d\n", |
| 151 | nfcf_poll->bit_rate, nfcf_poll->sensf_res_len); | 151 | nfcf_poll->bit_rate, nfcf_poll->sensf_res_len); |
| @@ -331,7 +331,7 @@ static int nci_extract_activation_params_iso_dep(struct nci_dev *ndev, | |||
| 331 | switch (ntf->activation_rf_tech_and_mode) { | 331 | switch (ntf->activation_rf_tech_and_mode) { |
| 332 | case NCI_NFC_A_PASSIVE_POLL_MODE: | 332 | case NCI_NFC_A_PASSIVE_POLL_MODE: |
| 333 | nfca_poll = &ntf->activation_params.nfca_poll_iso_dep; | 333 | nfca_poll = &ntf->activation_params.nfca_poll_iso_dep; |
| 334 | nfca_poll->rats_res_len = *data++; | 334 | nfca_poll->rats_res_len = min_t(__u8, *data++, 20); |
| 335 | pr_debug("rats_res_len %d\n", nfca_poll->rats_res_len); | 335 | pr_debug("rats_res_len %d\n", nfca_poll->rats_res_len); |
| 336 | if (nfca_poll->rats_res_len > 0) { | 336 | if (nfca_poll->rats_res_len > 0) { |
| 337 | memcpy(nfca_poll->rats_res, | 337 | memcpy(nfca_poll->rats_res, |
| @@ -341,7 +341,7 @@ static int nci_extract_activation_params_iso_dep(struct nci_dev *ndev, | |||
| 341 | 341 | ||
| 342 | case NCI_NFC_B_PASSIVE_POLL_MODE: | 342 | case NCI_NFC_B_PASSIVE_POLL_MODE: |
| 343 | nfcb_poll = &ntf->activation_params.nfcb_poll_iso_dep; | 343 | nfcb_poll = &ntf->activation_params.nfcb_poll_iso_dep; |
| 344 | nfcb_poll->attrib_res_len = *data++; | 344 | nfcb_poll->attrib_res_len = min_t(__u8, *data++, 50); |
| 345 | pr_debug("attrib_res_len %d\n", nfcb_poll->attrib_res_len); | 345 | pr_debug("attrib_res_len %d\n", nfcb_poll->attrib_res_len); |
| 346 | if (nfcb_poll->attrib_res_len > 0) { | 346 | if (nfcb_poll->attrib_res_len > 0) { |
| 347 | memcpy(nfcb_poll->attrib_res, | 347 | memcpy(nfcb_poll->attrib_res, |
diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c index ec1134c9e07f..8b8a6a2b2bad 100644 --- a/net/nfc/rawsock.c +++ b/net/nfc/rawsock.c | |||
| @@ -54,7 +54,10 @@ static int rawsock_release(struct socket *sock) | |||
| 54 | { | 54 | { |
| 55 | struct sock *sk = sock->sk; | 55 | struct sock *sk = sock->sk; |
| 56 | 56 | ||
| 57 | pr_debug("sock=%p\n", sock); | 57 | pr_debug("sock=%p sk=%p\n", sock, sk); |
| 58 | |||
| 59 | if (!sk) | ||
| 60 | return 0; | ||
| 58 | 61 | ||
| 59 | sock_orphan(sk); | 62 | sock_orphan(sk); |
| 60 | sock_put(sk); | 63 | sock_put(sk); |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 5bc9ab161b37..b16517ee1aaf 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
| @@ -271,6 +271,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a | |||
| 271 | */ | 271 | */ |
| 272 | asoc->peer.sack_needed = 1; | 272 | asoc->peer.sack_needed = 1; |
| 273 | asoc->peer.sack_cnt = 0; | 273 | asoc->peer.sack_cnt = 0; |
| 274 | asoc->peer.sack_generation = 1; | ||
| 274 | 275 | ||
| 275 | /* Assume that the peer will tell us if he recognizes ASCONF | 276 | /* Assume that the peer will tell us if he recognizes ASCONF |
| 276 | * as part of INIT exchange. | 277 | * as part of INIT exchange. |
diff --git a/net/sctp/output.c b/net/sctp/output.c index f1b7d4bb591e..6ae47acaaec6 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
| @@ -248,6 +248,11 @@ static sctp_xmit_t sctp_packet_bundle_sack(struct sctp_packet *pkt, | |||
| 248 | /* If the SACK timer is running, we have a pending SACK */ | 248 | /* If the SACK timer is running, we have a pending SACK */ |
| 249 | if (timer_pending(timer)) { | 249 | if (timer_pending(timer)) { |
| 250 | struct sctp_chunk *sack; | 250 | struct sctp_chunk *sack; |
| 251 | |||
| 252 | if (pkt->transport->sack_generation != | ||
| 253 | pkt->transport->asoc->peer.sack_generation) | ||
| 254 | return retval; | ||
| 255 | |||
| 251 | asoc->a_rwnd = asoc->rwnd; | 256 | asoc->a_rwnd = asoc->rwnd; |
| 252 | sack = sctp_make_sack(asoc); | 257 | sack = sctp_make_sack(asoc); |
| 253 | if (sack) { | 258 | if (sack) { |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index a85eeeb55dd0..b6de71efb140 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
| @@ -734,8 +734,10 @@ struct sctp_chunk *sctp_make_sack(const struct sctp_association *asoc) | |||
| 734 | int len; | 734 | int len; |
| 735 | __u32 ctsn; | 735 | __u32 ctsn; |
| 736 | __u16 num_gabs, num_dup_tsns; | 736 | __u16 num_gabs, num_dup_tsns; |
| 737 | struct sctp_association *aptr = (struct sctp_association *)asoc; | ||
| 737 | struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map; | 738 | struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map; |
| 738 | struct sctp_gap_ack_block gabs[SCTP_MAX_GABS]; | 739 | struct sctp_gap_ack_block gabs[SCTP_MAX_GABS]; |
| 740 | struct sctp_transport *trans; | ||
| 739 | 741 | ||
| 740 | memset(gabs, 0, sizeof(gabs)); | 742 | memset(gabs, 0, sizeof(gabs)); |
| 741 | ctsn = sctp_tsnmap_get_ctsn(map); | 743 | ctsn = sctp_tsnmap_get_ctsn(map); |
| @@ -805,6 +807,20 @@ struct sctp_chunk *sctp_make_sack(const struct sctp_association *asoc) | |||
| 805 | sctp_addto_chunk(retval, sizeof(__u32) * num_dup_tsns, | 807 | sctp_addto_chunk(retval, sizeof(__u32) * num_dup_tsns, |
| 806 | sctp_tsnmap_get_dups(map)); | 808 | sctp_tsnmap_get_dups(map)); |
| 807 | 809 | ||
| 810 | /* Once we have a sack generated, check to see what our sack | ||
| 811 | * generation is, if its 0, reset the transports to 0, and reset | ||
| 812 | * the association generation to 1 | ||
| 813 | * | ||
| 814 | * The idea is that zero is never used as a valid generation for the | ||
| 815 | * association so no transport will match after a wrap event like this, | ||
| 816 | * Until the next sack | ||
| 817 | */ | ||
| 818 | if (++aptr->peer.sack_generation == 0) { | ||
| 819 | list_for_each_entry(trans, &asoc->peer.transport_addr_list, | ||
| 820 | transports) | ||
| 821 | trans->sack_generation = 0; | ||
| 822 | aptr->peer.sack_generation = 1; | ||
| 823 | } | ||
| 808 | nodata: | 824 | nodata: |
| 809 | return retval; | 825 | return retval; |
| 810 | } | 826 | } |
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index c96d1a81cf42..8716da1a8592 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
| @@ -1268,7 +1268,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
| 1268 | case SCTP_CMD_REPORT_TSN: | 1268 | case SCTP_CMD_REPORT_TSN: |
| 1269 | /* Record the arrival of a TSN. */ | 1269 | /* Record the arrival of a TSN. */ |
| 1270 | error = sctp_tsnmap_mark(&asoc->peer.tsn_map, | 1270 | error = sctp_tsnmap_mark(&asoc->peer.tsn_map, |
| 1271 | cmd->obj.u32); | 1271 | cmd->obj.u32, NULL); |
| 1272 | break; | 1272 | break; |
| 1273 | 1273 | ||
| 1274 | case SCTP_CMD_REPORT_FWDTSN: | 1274 | case SCTP_CMD_REPORT_FWDTSN: |
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index b026ba0c6992..1dcceb6e0ce6 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
| @@ -68,6 +68,8 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, | |||
| 68 | peer->af_specific = sctp_get_af_specific(addr->sa.sa_family); | 68 | peer->af_specific = sctp_get_af_specific(addr->sa.sa_family); |
| 69 | memset(&peer->saddr, 0, sizeof(union sctp_addr)); | 69 | memset(&peer->saddr, 0, sizeof(union sctp_addr)); |
| 70 | 70 | ||
| 71 | peer->sack_generation = 0; | ||
| 72 | |||
| 71 | /* From 6.3.1 RTO Calculation: | 73 | /* From 6.3.1 RTO Calculation: |
| 72 | * | 74 | * |
| 73 | * C1) Until an RTT measurement has been made for a packet sent to the | 75 | * C1) Until an RTT measurement has been made for a packet sent to the |
diff --git a/net/sctp/tsnmap.c b/net/sctp/tsnmap.c index f1e40cebc981..b5fb7c409023 100644 --- a/net/sctp/tsnmap.c +++ b/net/sctp/tsnmap.c | |||
| @@ -114,7 +114,8 @@ int sctp_tsnmap_check(const struct sctp_tsnmap *map, __u32 tsn) | |||
| 114 | 114 | ||
| 115 | 115 | ||
| 116 | /* Mark this TSN as seen. */ | 116 | /* Mark this TSN as seen. */ |
| 117 | int sctp_tsnmap_mark(struct sctp_tsnmap *map, __u32 tsn) | 117 | int sctp_tsnmap_mark(struct sctp_tsnmap *map, __u32 tsn, |
| 118 | struct sctp_transport *trans) | ||
| 118 | { | 119 | { |
| 119 | u16 gap; | 120 | u16 gap; |
| 120 | 121 | ||
| @@ -133,6 +134,9 @@ int sctp_tsnmap_mark(struct sctp_tsnmap *map, __u32 tsn) | |||
| 133 | */ | 134 | */ |
| 134 | map->max_tsn_seen++; | 135 | map->max_tsn_seen++; |
| 135 | map->cumulative_tsn_ack_point++; | 136 | map->cumulative_tsn_ack_point++; |
| 137 | if (trans) | ||
| 138 | trans->sack_generation = | ||
| 139 | trans->asoc->peer.sack_generation; | ||
| 136 | map->base_tsn++; | 140 | map->base_tsn++; |
| 137 | } else { | 141 | } else { |
| 138 | /* Either we already have a gap, or about to record a gap, so | 142 | /* Either we already have a gap, or about to record a gap, so |
diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c index 8a84017834c2..33d894776192 100644 --- a/net/sctp/ulpevent.c +++ b/net/sctp/ulpevent.c | |||
| @@ -715,7 +715,8 @@ struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc, | |||
| 715 | * can mark it as received so the tsn_map is updated correctly. | 715 | * can mark it as received so the tsn_map is updated correctly. |
| 716 | */ | 716 | */ |
| 717 | if (sctp_tsnmap_mark(&asoc->peer.tsn_map, | 717 | if (sctp_tsnmap_mark(&asoc->peer.tsn_map, |
| 718 | ntohl(chunk->subh.data_hdr->tsn))) | 718 | ntohl(chunk->subh.data_hdr->tsn), |
| 719 | chunk->transport)) | ||
| 719 | goto fail_mark; | 720 | goto fail_mark; |
| 720 | 721 | ||
| 721 | /* First calculate the padding, so we don't inadvertently | 722 | /* First calculate the padding, so we don't inadvertently |
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c index f2d1de7f2ffb..f5a6a4f4faf7 100644 --- a/net/sctp/ulpqueue.c +++ b/net/sctp/ulpqueue.c | |||
| @@ -1051,7 +1051,7 @@ void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, | |||
| 1051 | if (chunk && (freed >= needed)) { | 1051 | if (chunk && (freed >= needed)) { |
| 1052 | __u32 tsn; | 1052 | __u32 tsn; |
| 1053 | tsn = ntohl(chunk->subh.data_hdr->tsn); | 1053 | tsn = ntohl(chunk->subh.data_hdr->tsn); |
| 1054 | sctp_tsnmap_mark(&asoc->peer.tsn_map, tsn); | 1054 | sctp_tsnmap_mark(&asoc->peer.tsn_map, tsn, chunk->transport); |
| 1055 | sctp_ulpq_tail_data(ulpq, chunk, gfp); | 1055 | sctp_ulpq_tail_data(ulpq, chunk, gfp); |
| 1056 | 1056 | ||
| 1057 | sctp_ulpq_partial_delivery(ulpq, chunk, gfp); | 1057 | sctp_ulpq_partial_delivery(ulpq, chunk, gfp); |
