diff options
36 files changed, 268 insertions, 137 deletions
diff --git a/Documentation/networking/phonet.txt b/Documentation/networking/phonet.txt index 0e6e592f4f55..6a07e45d4a93 100644 --- a/Documentation/networking/phonet.txt +++ b/Documentation/networking/phonet.txt | |||
@@ -146,8 +146,8 @@ WARNING: | |||
146 | When polling a connected pipe socket for writability, there is an | 146 | When polling a connected pipe socket for writability, there is an |
147 | intrinsic race condition whereby writability might be lost between the | 147 | intrinsic race condition whereby writability might be lost between the |
148 | polling and the writing system calls. In this case, the socket will | 148 | polling and the writing system calls. In this case, the socket will |
149 | block until write because possible again, unless non-blocking mode | 149 | block until write becomes possible again, unless non-blocking mode |
150 | becomes enabled. | 150 | is enabled. |
151 | 151 | ||
152 | 152 | ||
153 | The pipe protocol provides two socket options at the SOL_PNPIPE level: | 153 | The pipe protocol provides two socket options at the SOL_PNPIPE level: |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index 74726990d59e..f05f584ab7bc 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
@@ -1640,6 +1640,11 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw, | |||
1640 | return ret; | 1640 | return ret; |
1641 | } | 1641 | } |
1642 | 1642 | ||
1643 | static int ath9k_no_fragmentation(struct ieee80211_hw *hw, u32 value) | ||
1644 | { | ||
1645 | return -EOPNOTSUPP; | ||
1646 | } | ||
1647 | |||
1643 | static struct ieee80211_ops ath9k_ops = { | 1648 | static struct ieee80211_ops ath9k_ops = { |
1644 | .tx = ath9k_tx, | 1649 | .tx = ath9k_tx, |
1645 | .start = ath9k_start, | 1650 | .start = ath9k_start, |
@@ -1664,7 +1669,8 @@ static struct ieee80211_ops ath9k_ops = { | |||
1664 | .get_tsf = ath9k_get_tsf, | 1669 | .get_tsf = ath9k_get_tsf, |
1665 | .reset_tsf = ath9k_reset_tsf, | 1670 | .reset_tsf = ath9k_reset_tsf, |
1666 | .tx_last_beacon = NULL, | 1671 | .tx_last_beacon = NULL, |
1667 | .ampdu_action = ath9k_ampdu_action | 1672 | .ampdu_action = ath9k_ampdu_action, |
1673 | .set_frag_threshold = ath9k_no_fragmentation, | ||
1668 | }; | 1674 | }; |
1669 | 1675 | ||
1670 | static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 1676 | static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index f6003e7996af..5155b8a760a7 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -833,12 +833,12 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv) | |||
833 | switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) { | 833 | switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) { |
834 | case CSR_HW_REV_TYPE_5100: | 834 | case CSR_HW_REV_TYPE_5100: |
835 | case CSR_HW_REV_TYPE_5300: | 835 | case CSR_HW_REV_TYPE_5300: |
836 | /* 5X00 wants in Celsius */ | 836 | case CSR_HW_REV_TYPE_5350: |
837 | /* 5X00 and 5350 wants in Celsius */ | ||
837 | priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD; | 838 | priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD; |
838 | break; | 839 | break; |
839 | case CSR_HW_REV_TYPE_5150: | 840 | case CSR_HW_REV_TYPE_5150: |
840 | case CSR_HW_REV_TYPE_5350: | 841 | /* 5150 wants in Kelvin */ |
841 | /* 5X50 wants in Kelvin */ | ||
842 | priv->hw_params.ct_kill_threshold = | 842 | priv->hw_params.ct_kill_threshold = |
843 | CELSIUS_TO_KELVIN(CT_KILL_THRESHOLD); | 843 | CELSIUS_TO_KELVIN(CT_KILL_THRESHOLD); |
844 | break; | 844 | break; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 93944de923ca..e2a58e477036 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -2422,7 +2422,7 @@ static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta, | |||
2422 | void *priv_sta) | 2422 | void *priv_sta) |
2423 | { | 2423 | { |
2424 | struct iwl_lq_sta *lq_sta = priv_sta; | 2424 | struct iwl_lq_sta *lq_sta = priv_sta; |
2425 | struct iwl_priv *priv = priv_r; | 2425 | struct iwl_priv *priv __maybe_unused = priv_r; |
2426 | 2426 | ||
2427 | IWL_DEBUG_RATE("enter\n"); | 2427 | IWL_DEBUG_RATE("enter\n"); |
2428 | kfree(lq_sta); | 2428 | kfree(lq_sta); |
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index a912fb68c099..297696de2da0 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
@@ -823,7 +823,9 @@ int lbs_update_channel(struct lbs_private *priv) | |||
823 | int lbs_set_channel(struct lbs_private *priv, u8 channel) | 823 | int lbs_set_channel(struct lbs_private *priv, u8 channel) |
824 | { | 824 | { |
825 | struct cmd_ds_802_11_rf_channel cmd; | 825 | struct cmd_ds_802_11_rf_channel cmd; |
826 | #ifdef DEBUG | ||
826 | u8 old_channel = priv->curbssparams.channel; | 827 | u8 old_channel = priv->curbssparams.channel; |
828 | #endif | ||
827 | int ret = 0; | 829 | int ret = 0; |
828 | 830 | ||
829 | lbs_deb_enter(LBS_DEB_CMD); | 831 | lbs_deb_enter(LBS_DEB_CMD); |
diff --git a/drivers/net/wireless/orinoco_cs.c b/drivers/net/wireless/orinoco_cs.c index e585684e59a0..6fcf2bda7cdf 100644 --- a/drivers/net/wireless/orinoco_cs.c +++ b/drivers/net/wireless/orinoco_cs.c | |||
@@ -378,6 +378,7 @@ static int orinoco_cs_resume(struct pcmcia_device *link) | |||
378 | struct orinoco_private *priv = netdev_priv(dev); | 378 | struct orinoco_private *priv = netdev_priv(dev); |
379 | struct orinoco_pccard *card = priv->card; | 379 | struct orinoco_pccard *card = priv->card; |
380 | int err = 0; | 380 | int err = 0; |
381 | unsigned long flags; | ||
381 | 382 | ||
382 | if (! test_bit(0, &card->hard_reset_in_progress)) { | 383 | if (! test_bit(0, &card->hard_reset_in_progress)) { |
383 | err = orinoco_reinit_firmware(dev); | 384 | err = orinoco_reinit_firmware(dev); |
@@ -387,7 +388,7 @@ static int orinoco_cs_resume(struct pcmcia_device *link) | |||
387 | return -EIO; | 388 | return -EIO; |
388 | } | 389 | } |
389 | 390 | ||
390 | spin_lock(&priv->lock); | 391 | spin_lock_irqsave(&priv->lock, flags); |
391 | 392 | ||
392 | netif_device_attach(dev); | 393 | netif_device_attach(dev); |
393 | priv->hw_unavailable--; | 394 | priv->hw_unavailable--; |
@@ -399,7 +400,7 @@ static int orinoco_cs_resume(struct pcmcia_device *link) | |||
399 | dev->name, err); | 400 | dev->name, err); |
400 | } | 401 | } |
401 | 402 | ||
402 | spin_unlock(&priv->lock); | 403 | spin_unlock_irqrestore(&priv->lock, flags); |
403 | } | 404 | } |
404 | 405 | ||
405 | return err; | 406 | return err; |
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 1994aa199d37..117c7d3a52b0 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -479,7 +479,6 @@ static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) | |||
479 | printk(KERN_ERR "p54: eeprom parse failed!\n"); | 479 | printk(KERN_ERR "p54: eeprom parse failed!\n"); |
480 | return err; | 480 | return err; |
481 | } | 481 | } |
482 | EXPORT_SYMBOL_GPL(p54_parse_eeprom); | ||
483 | 482 | ||
484 | static int p54_rssi_to_dbm(struct ieee80211_hw *dev, int rssi) | 483 | static int p54_rssi_to_dbm(struct ieee80211_hw *dev, int rssi) |
485 | { | 484 | { |
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index 1912f5e9a0a9..75d749bccb0d 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
@@ -39,6 +39,7 @@ static struct usb_device_id p54u_table[] __devinitdata = { | |||
39 | {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */ | 39 | {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */ |
40 | {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */ | 40 | {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */ |
41 | {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */ | 41 | {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */ |
42 | {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */ | ||
42 | {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */ | 43 | {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */ |
43 | {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */ | 44 | {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */ |
44 | {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */ | 45 | {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */ |
@@ -63,8 +64,8 @@ static struct usb_device_id p54u_table[] __devinitdata = { | |||
63 | {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */ | 64 | {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */ |
64 | {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */ | 65 | {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */ |
65 | {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */ | 66 | {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */ |
66 | {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */ | ||
67 | {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */ | 67 | {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */ |
68 | {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */ | ||
68 | {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */ | 69 | {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */ |
69 | {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */ | 70 | {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */ |
70 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ | 71 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 1676ac484790..451d410ecdae 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -374,7 +374,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) | |||
374 | struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX); | 374 | struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX); |
375 | struct txentry_desc txdesc; | 375 | struct txentry_desc txdesc; |
376 | struct skb_frame_desc *skbdesc; | 376 | struct skb_frame_desc *skbdesc; |
377 | unsigned int iv_len; | 377 | unsigned int iv_len = 0; |
378 | 378 | ||
379 | if (unlikely(rt2x00queue_full(queue))) | 379 | if (unlikely(rt2x00queue_full(queue))) |
380 | return -EINVAL; | 380 | return -EINVAL; |
@@ -395,6 +395,9 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) | |||
395 | entry->skb = skb; | 395 | entry->skb = skb; |
396 | rt2x00queue_create_tx_descriptor(entry, &txdesc); | 396 | rt2x00queue_create_tx_descriptor(entry, &txdesc); |
397 | 397 | ||
398 | if (IEEE80211_SKB_CB(skb)->control.hw_key != NULL) | ||
399 | iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len; | ||
400 | |||
398 | /* | 401 | /* |
399 | * All information is retreived from the skb->cb array, | 402 | * All information is retreived from the skb->cb array, |
400 | * now we should claim ownership of the driver part of that | 403 | * now we should claim ownership of the driver part of that |
@@ -410,9 +413,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) | |||
410 | * the frame so we can provide it to the driver seperately. | 413 | * the frame so we can provide it to the driver seperately. |
411 | */ | 414 | */ |
412 | if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) && | 415 | if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) && |
413 | !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags) && | 416 | !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags)) { |
414 | (IEEE80211_SKB_CB(skb)->control.hw_key != NULL)) { | ||
415 | iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len; | ||
416 | rt2x00crypto_tx_remove_iv(skb, iv_len); | 417 | rt2x00crypto_tx_remove_iv(skb, iv_len); |
417 | } | 418 | } |
418 | 419 | ||
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c index e9902613e2ee..431e3c78bf27 100644 --- a/drivers/net/wireless/rtl8187_dev.c +++ b/drivers/net/wireless/rtl8187_dev.c | |||
@@ -33,10 +33,13 @@ MODULE_LICENSE("GPL"); | |||
33 | static struct usb_device_id rtl8187_table[] __devinitdata = { | 33 | static struct usb_device_id rtl8187_table[] __devinitdata = { |
34 | /* Asus */ | 34 | /* Asus */ |
35 | {USB_DEVICE(0x0b05, 0x171d), .driver_info = DEVICE_RTL8187}, | 35 | {USB_DEVICE(0x0b05, 0x171d), .driver_info = DEVICE_RTL8187}, |
36 | /* Belkin */ | ||
37 | {USB_DEVICE(0x050d, 0x705e), .driver_info = DEVICE_RTL8187B}, | ||
36 | /* Realtek */ | 38 | /* Realtek */ |
37 | {USB_DEVICE(0x0bda, 0x8187), .driver_info = DEVICE_RTL8187}, | 39 | {USB_DEVICE(0x0bda, 0x8187), .driver_info = DEVICE_RTL8187}, |
38 | {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B}, | 40 | {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B}, |
39 | {USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B}, | 41 | {USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B}, |
42 | {USB_DEVICE(0x0bda, 0x8198), .driver_info = DEVICE_RTL8187B}, | ||
40 | /* Netgear */ | 43 | /* Netgear */ |
41 | {USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187}, | 44 | {USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187}, |
42 | {USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187}, | 45 | {USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187}, |
diff --git a/drivers/net/wireless/spectrum_cs.c b/drivers/net/wireless/spectrum_cs.c index b0c71c3be467..852789ad34b3 100644 --- a/drivers/net/wireless/spectrum_cs.c +++ b/drivers/net/wireless/spectrum_cs.c | |||
@@ -426,10 +426,11 @@ spectrum_cs_suspend(struct pcmcia_device *link) | |||
426 | { | 426 | { |
427 | struct net_device *dev = link->priv; | 427 | struct net_device *dev = link->priv; |
428 | struct orinoco_private *priv = netdev_priv(dev); | 428 | struct orinoco_private *priv = netdev_priv(dev); |
429 | unsigned long flags; | ||
429 | int err = 0; | 430 | int err = 0; |
430 | 431 | ||
431 | /* Mark the device as stopped, to block IO until later */ | 432 | /* Mark the device as stopped, to block IO until later */ |
432 | spin_lock(&priv->lock); | 433 | spin_lock_irqsave(&priv->lock, flags); |
433 | 434 | ||
434 | err = __orinoco_down(dev); | 435 | err = __orinoco_down(dev); |
435 | if (err) | 436 | if (err) |
@@ -439,7 +440,7 @@ spectrum_cs_suspend(struct pcmcia_device *link) | |||
439 | netif_device_detach(dev); | 440 | netif_device_detach(dev); |
440 | priv->hw_unavailable++; | 441 | priv->hw_unavailable++; |
441 | 442 | ||
442 | spin_unlock(&priv->lock); | 443 | spin_unlock_irqrestore(&priv->lock, flags); |
443 | 444 | ||
444 | return err; | 445 | return err; |
445 | } | 446 | } |
diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h index 03067443198a..a93a8dd33118 100644 --- a/include/linux/icmpv6.h +++ b/include/linux/icmpv6.h | |||
@@ -40,16 +40,18 @@ struct icmp6hdr { | |||
40 | struct icmpv6_nd_ra { | 40 | struct icmpv6_nd_ra { |
41 | __u8 hop_limit; | 41 | __u8 hop_limit; |
42 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 42 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
43 | __u8 reserved:4, | 43 | __u8 reserved:3, |
44 | router_pref:2, | 44 | router_pref:2, |
45 | home_agent:1, | ||
45 | other:1, | 46 | other:1, |
46 | managed:1; | 47 | managed:1; |
47 | 48 | ||
48 | #elif defined(__BIG_ENDIAN_BITFIELD) | 49 | #elif defined(__BIG_ENDIAN_BITFIELD) |
49 | __u8 managed:1, | 50 | __u8 managed:1, |
50 | other:1, | 51 | other:1, |
52 | home_agent:1, | ||
51 | router_pref:2, | 53 | router_pref:2, |
52 | reserved:4; | 54 | reserved:3; |
53 | #else | 55 | #else |
54 | #error "Please fix <asm/byteorder.h>" | 56 | #error "Please fix <asm/byteorder.h>" |
55 | #endif | 57 | #endif |
diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index 0d8424f76899..7d8e0455ccac 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h | |||
@@ -78,6 +78,9 @@ extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, | |||
78 | int echo); | 78 | int echo); |
79 | extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags); | 79 | extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags); |
80 | 80 | ||
81 | extern void nfnl_lock(void); | ||
82 | extern void nfnl_unlock(void); | ||
83 | |||
81 | #define MODULE_ALIAS_NFNL_SUBSYS(subsys) \ | 84 | #define MODULE_ALIAS_NFNL_SUBSYS(subsys) \ |
82 | MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys)) | 85 | MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys)) |
83 | 86 | ||
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 5617a1613c91..d861197f83c7 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -645,7 +645,8 @@ enum ieee80211_key_flags { | |||
645 | * - Temporal Encryption Key (128 bits) | 645 | * - Temporal Encryption Key (128 bits) |
646 | * - Temporal Authenticator Tx MIC Key (64 bits) | 646 | * - Temporal Authenticator Tx MIC Key (64 bits) |
647 | * - Temporal Authenticator Rx MIC Key (64 bits) | 647 | * - Temporal Authenticator Rx MIC Key (64 bits) |
648 | * | 648 | * @icv_len: FIXME |
649 | * @iv_len: FIXME | ||
649 | */ | 650 | */ |
650 | struct ieee80211_key_conf { | 651 | struct ieee80211_key_conf { |
651 | enum ieee80211_key_alg alg; | 652 | enum ieee80211_key_alg alg; |
diff --git a/include/net/netfilter/nf_nat_core.h b/include/net/netfilter/nf_nat_core.h index f29eeb9777e0..58684066388c 100644 --- a/include/net/netfilter/nf_nat_core.h +++ b/include/net/netfilter/nf_nat_core.h | |||
@@ -25,4 +25,12 @@ static inline int nf_nat_initialized(struct nf_conn *ct, | |||
25 | else | 25 | else |
26 | return test_bit(IPS_DST_NAT_DONE_BIT, &ct->status); | 26 | return test_bit(IPS_DST_NAT_DONE_BIT, &ct->status); |
27 | } | 27 | } |
28 | |||
29 | struct nlattr; | ||
30 | |||
31 | extern int | ||
32 | (*nfnetlink_parse_nat_setup_hook)(struct nf_conn *ct, | ||
33 | enum nf_nat_manip_type manip, | ||
34 | struct nlattr *attr); | ||
35 | |||
28 | #endif /* _NF_NAT_CORE_H */ | 36 | #endif /* _NF_NAT_CORE_H */ |
diff --git a/net/802/fc.c b/net/802/fc.c index cb3475ea6fda..34cf1ee014b8 100644 --- a/net/802/fc.c +++ b/net/802/fc.c | |||
@@ -82,13 +82,13 @@ static int fc_header(struct sk_buff *skb, struct net_device *dev, | |||
82 | 82 | ||
83 | static int fc_rebuild_header(struct sk_buff *skb) | 83 | static int fc_rebuild_header(struct sk_buff *skb) |
84 | { | 84 | { |
85 | #ifdef CONFIG_INET | ||
85 | struct fch_hdr *fch=(struct fch_hdr *)skb->data; | 86 | struct fch_hdr *fch=(struct fch_hdr *)skb->data; |
86 | struct fcllc *fcllc=(struct fcllc *)(skb->data+sizeof(struct fch_hdr)); | 87 | struct fcllc *fcllc=(struct fcllc *)(skb->data+sizeof(struct fch_hdr)); |
87 | if(fcllc->ethertype != htons(ETH_P_IP)) { | 88 | if(fcllc->ethertype != htons(ETH_P_IP)) { |
88 | printk("fc_rebuild_header: Don't know how to resolve type %04X addresses ?\n", ntohs(fcllc->ethertype)); | 89 | printk("fc_rebuild_header: Don't know how to resolve type %04X addresses ?\n", ntohs(fcllc->ethertype)); |
89 | return 0; | 90 | return 0; |
90 | } | 91 | } |
91 | #ifdef CONFIG_INET | ||
92 | return arp_find(fch->daddr, skb); | 92 | return arp_find(fch->daddr, skb); |
93 | #else | 93 | #else |
94 | return 0; | 94 | return 0; |
diff --git a/net/bridge/netfilter/Kconfig b/net/bridge/netfilter/Kconfig index 366d3e9d51f8..ba6f73eb06c6 100644 --- a/net/bridge/netfilter/Kconfig +++ b/net/bridge/netfilter/Kconfig | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | menuconfig BRIDGE_NF_EBTABLES | 5 | menuconfig BRIDGE_NF_EBTABLES |
6 | tristate "Ethernet Bridge tables (ebtables) support" | 6 | tristate "Ethernet Bridge tables (ebtables) support" |
7 | depends on BRIDGE && BRIDGE_NETFILTER | ||
7 | select NETFILTER_XTABLES | 8 | select NETFILTER_XTABLES |
8 | help | 9 | help |
9 | ebtables is a general, extensible frame/packet identification | 10 | ebtables is a general, extensible frame/packet identification |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index b0dc818a91d7..f1d07b5c1e17 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
@@ -96,7 +96,7 @@ static void net_free(struct net *net) | |||
96 | return; | 96 | return; |
97 | } | 97 | } |
98 | #endif | 98 | #endif |
99 | 99 | kfree(net->gen); | |
100 | kmem_cache_free(net_cachep, net); | 100 | kmem_cache_free(net_cachep, net); |
101 | } | 101 | } |
102 | 102 | ||
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index 96f9fcef2958..8008c8613027 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
@@ -152,7 +152,7 @@ static struct dn_dev_parms dn_dev_list[] = { | |||
152 | 152 | ||
153 | #define DN_DEV_LIST_SIZE ARRAY_SIZE(dn_dev_list) | 153 | #define DN_DEV_LIST_SIZE ARRAY_SIZE(dn_dev_list) |
154 | 154 | ||
155 | #define DN_DEV_PARMS_OFFSET(x) ((int) ((char *) &((struct dn_dev_parms *)0)->x)) | 155 | #define DN_DEV_PARMS_OFFSET(x) offsetof(struct dn_dev_parms, x) |
156 | 156 | ||
157 | #ifdef CONFIG_SYSCTL | 157 | #ifdef CONFIG_SYSCTL |
158 | 158 | ||
diff --git a/net/ipv4/netfilter/nf_defrag_ipv4.c b/net/ipv4/netfilter/nf_defrag_ipv4.c index aa2c50a180f7..fa2d6b6fc3e5 100644 --- a/net/ipv4/netfilter/nf_defrag_ipv4.c +++ b/net/ipv4/netfilter/nf_defrag_ipv4.c | |||
@@ -41,12 +41,13 @@ static unsigned int ipv4_conntrack_defrag(unsigned int hooknum, | |||
41 | int (*okfn)(struct sk_buff *)) | 41 | int (*okfn)(struct sk_buff *)) |
42 | { | 42 | { |
43 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 43 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
44 | #if !defined(CONFIG_NF_NAT) && !defined(CONFIG_NF_NAT_MODULE) | ||
44 | /* Previously seen (loopback)? Ignore. Do this before | 45 | /* Previously seen (loopback)? Ignore. Do this before |
45 | fragment check. */ | 46 | fragment check. */ |
46 | if (skb->nfct) | 47 | if (skb->nfct) |
47 | return NF_ACCEPT; | 48 | return NF_ACCEPT; |
48 | #endif | 49 | #endif |
49 | 50 | #endif | |
50 | /* Gather fragments. */ | 51 | /* Gather fragments. */ |
51 | if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) { | 52 | if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) { |
52 | if (nf_ct_ipv4_gather_frags(skb, | 53 | if (nf_ct_ipv4_gather_frags(skb, |
diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c index 2ac9eaf1a8c9..a65cf692359f 100644 --- a/net/ipv4/netfilter/nf_nat_core.c +++ b/net/ipv4/netfilter/nf_nat_core.c | |||
@@ -584,6 +584,98 @@ static struct nf_ct_ext_type nat_extend __read_mostly = { | |||
584 | .flags = NF_CT_EXT_F_PREALLOC, | 584 | .flags = NF_CT_EXT_F_PREALLOC, |
585 | }; | 585 | }; |
586 | 586 | ||
587 | #if defined(CONFIG_NF_CT_NETLINK) || defined(CONFIG_NF_CT_NETLINK_MODULE) | ||
588 | |||
589 | #include <linux/netfilter/nfnetlink.h> | ||
590 | #include <linux/netfilter/nfnetlink_conntrack.h> | ||
591 | |||
592 | static const struct nla_policy protonat_nla_policy[CTA_PROTONAT_MAX+1] = { | ||
593 | [CTA_PROTONAT_PORT_MIN] = { .type = NLA_U16 }, | ||
594 | [CTA_PROTONAT_PORT_MAX] = { .type = NLA_U16 }, | ||
595 | }; | ||
596 | |||
597 | static int nfnetlink_parse_nat_proto(struct nlattr *attr, | ||
598 | const struct nf_conn *ct, | ||
599 | struct nf_nat_range *range) | ||
600 | { | ||
601 | struct nlattr *tb[CTA_PROTONAT_MAX+1]; | ||
602 | const struct nf_nat_protocol *npt; | ||
603 | int err; | ||
604 | |||
605 | err = nla_parse_nested(tb, CTA_PROTONAT_MAX, attr, protonat_nla_policy); | ||
606 | if (err < 0) | ||
607 | return err; | ||
608 | |||
609 | npt = nf_nat_proto_find_get(nf_ct_protonum(ct)); | ||
610 | if (npt->nlattr_to_range) | ||
611 | err = npt->nlattr_to_range(tb, range); | ||
612 | nf_nat_proto_put(npt); | ||
613 | return err; | ||
614 | } | ||
615 | |||
616 | static const struct nla_policy nat_nla_policy[CTA_NAT_MAX+1] = { | ||
617 | [CTA_NAT_MINIP] = { .type = NLA_U32 }, | ||
618 | [CTA_NAT_MAXIP] = { .type = NLA_U32 }, | ||
619 | }; | ||
620 | |||
621 | static int | ||
622 | nfnetlink_parse_nat(struct nlattr *nat, | ||
623 | const struct nf_conn *ct, struct nf_nat_range *range) | ||
624 | { | ||
625 | struct nlattr *tb[CTA_NAT_MAX+1]; | ||
626 | int err; | ||
627 | |||
628 | memset(range, 0, sizeof(*range)); | ||
629 | |||
630 | err = nla_parse_nested(tb, CTA_NAT_MAX, nat, nat_nla_policy); | ||
631 | if (err < 0) | ||
632 | return err; | ||
633 | |||
634 | if (tb[CTA_NAT_MINIP]) | ||
635 | range->min_ip = nla_get_be32(tb[CTA_NAT_MINIP]); | ||
636 | |||
637 | if (!tb[CTA_NAT_MAXIP]) | ||
638 | range->max_ip = range->min_ip; | ||
639 | else | ||
640 | range->max_ip = nla_get_be32(tb[CTA_NAT_MAXIP]); | ||
641 | |||
642 | if (range->min_ip) | ||
643 | range->flags |= IP_NAT_RANGE_MAP_IPS; | ||
644 | |||
645 | if (!tb[CTA_NAT_PROTO]) | ||
646 | return 0; | ||
647 | |||
648 | err = nfnetlink_parse_nat_proto(tb[CTA_NAT_PROTO], ct, range); | ||
649 | if (err < 0) | ||
650 | return err; | ||
651 | |||
652 | return 0; | ||
653 | } | ||
654 | |||
655 | static int | ||
656 | nfnetlink_parse_nat_setup(struct nf_conn *ct, | ||
657 | enum nf_nat_manip_type manip, | ||
658 | struct nlattr *attr) | ||
659 | { | ||
660 | struct nf_nat_range range; | ||
661 | |||
662 | if (nfnetlink_parse_nat(attr, ct, &range) < 0) | ||
663 | return -EINVAL; | ||
664 | if (nf_nat_initialized(ct, manip)) | ||
665 | return -EEXIST; | ||
666 | |||
667 | return nf_nat_setup_info(ct, &range, manip); | ||
668 | } | ||
669 | #else | ||
670 | static int | ||
671 | nfnetlink_parse_nat_setup(struct nf_conn *ct, | ||
672 | enum nf_nat_manip_type manip, | ||
673 | struct nlattr *attr) | ||
674 | { | ||
675 | return -EOPNOTSUPP; | ||
676 | } | ||
677 | #endif | ||
678 | |||
587 | static int __net_init nf_nat_net_init(struct net *net) | 679 | static int __net_init nf_nat_net_init(struct net *net) |
588 | { | 680 | { |
589 | net->ipv4.nat_bysource = nf_ct_alloc_hashtable(&nf_nat_htable_size, | 681 | net->ipv4.nat_bysource = nf_ct_alloc_hashtable(&nf_nat_htable_size, |
@@ -654,6 +746,9 @@ static int __init nf_nat_init(void) | |||
654 | 746 | ||
655 | BUG_ON(nf_nat_seq_adjust_hook != NULL); | 747 | BUG_ON(nf_nat_seq_adjust_hook != NULL); |
656 | rcu_assign_pointer(nf_nat_seq_adjust_hook, nf_nat_seq_adjust); | 748 | rcu_assign_pointer(nf_nat_seq_adjust_hook, nf_nat_seq_adjust); |
749 | BUG_ON(nfnetlink_parse_nat_setup_hook != NULL); | ||
750 | rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, | ||
751 | nfnetlink_parse_nat_setup); | ||
657 | return 0; | 752 | return 0; |
658 | 753 | ||
659 | cleanup_extend: | 754 | cleanup_extend: |
@@ -667,10 +762,12 @@ static void __exit nf_nat_cleanup(void) | |||
667 | nf_ct_l3proto_put(l3proto); | 762 | nf_ct_l3proto_put(l3proto); |
668 | nf_ct_extend_unregister(&nat_extend); | 763 | nf_ct_extend_unregister(&nat_extend); |
669 | rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL); | 764 | rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL); |
765 | rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL); | ||
670 | synchronize_net(); | 766 | synchronize_net(); |
671 | } | 767 | } |
672 | 768 | ||
673 | MODULE_LICENSE("GPL"); | 769 | MODULE_LICENSE("GPL"); |
770 | MODULE_ALIAS("nf-nat-ipv4"); | ||
674 | 771 | ||
675 | module_init(nf_nat_init); | 772 | module_init(nf_nat_init); |
676 | module_exit(nf_nat_cleanup); | 773 | module_exit(nf_nat_cleanup); |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 7f39e9b36456..172438320eec 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1199,7 +1199,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) | |||
1199 | } | 1199 | } |
1200 | neigh->flags |= NTF_ROUTER; | 1200 | neigh->flags |= NTF_ROUTER; |
1201 | } else if (rt) { | 1201 | } else if (rt) { |
1202 | rt->rt6i_flags |= (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); | 1202 | rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); |
1203 | } | 1203 | } |
1204 | 1204 | ||
1205 | if (rt) | 1205 | if (rt) |
diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 6b29b03925f1..fd5b3a4e3329 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c | |||
@@ -12,6 +12,7 @@ | |||
12 | 12 | ||
13 | int ip6_route_me_harder(struct sk_buff *skb) | 13 | int ip6_route_me_harder(struct sk_buff *skb) |
14 | { | 14 | { |
15 | struct net *net = dev_net(skb->dst->dev); | ||
15 | struct ipv6hdr *iph = ipv6_hdr(skb); | 16 | struct ipv6hdr *iph = ipv6_hdr(skb); |
16 | struct dst_entry *dst; | 17 | struct dst_entry *dst; |
17 | struct flowi fl = { | 18 | struct flowi fl = { |
@@ -23,7 +24,7 @@ int ip6_route_me_harder(struct sk_buff *skb) | |||
23 | .saddr = iph->saddr, } }, | 24 | .saddr = iph->saddr, } }, |
24 | }; | 25 | }; |
25 | 26 | ||
26 | dst = ip6_route_output(dev_net(skb->dst->dev), skb->sk, &fl); | 27 | dst = ip6_route_output(net, skb->sk, &fl); |
27 | 28 | ||
28 | #ifdef CONFIG_XFRM | 29 | #ifdef CONFIG_XFRM |
29 | if (!(IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) && | 30 | if (!(IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) && |
@@ -33,8 +34,7 @@ int ip6_route_me_harder(struct sk_buff *skb) | |||
33 | #endif | 34 | #endif |
34 | 35 | ||
35 | if (dst->error) { | 36 | if (dst->error) { |
36 | IP6_INC_STATS(&init_net, ip6_dst_idev(dst), | 37 | IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); |
37 | IPSTATS_MIB_OUTNOROUTES); | ||
38 | LIMIT_NETDEBUG(KERN_DEBUG "ip6_route_me_harder: No more route.\n"); | 38 | LIMIT_NETDEBUG(KERN_DEBUG "ip6_route_me_harder: No more route.\n"); |
39 | dst_release(dst); | 39 | dst_release(dst); |
40 | return -EINVAL; | 40 | return -EINVAL; |
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c index 2a4515623776..2ad504fc3414 100644 --- a/net/mac80211/debugfs_netdev.c +++ b/net/mac80211/debugfs_netdev.c | |||
@@ -545,8 +545,12 @@ static int netdev_notify(struct notifier_block *nb, | |||
545 | 545 | ||
546 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 546 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
547 | 547 | ||
548 | sprintf(buf, "netdev:%s", dev->name); | ||
549 | dir = sdata->debugfsdir; | 548 | dir = sdata->debugfsdir; |
549 | |||
550 | if (!dir) | ||
551 | return 0; | ||
552 | |||
553 | sprintf(buf, "netdev:%s", dev->name); | ||
550 | if (!debugfs_rename(dir->d_parent, dir, dir->d_parent, buf)) | 554 | if (!debugfs_rename(dir->d_parent, dir, dir->d_parent, buf)) |
551 | printk(KERN_ERR "mac80211: debugfs: failed to rename debugfs " | 555 | printk(KERN_ERR "mac80211: debugfs: failed to rename debugfs " |
552 | "dir to %s\n", buf); | 556 | "dir to %s\n", buf); |
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index b9902e425f09..189d0bafa91a 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c | |||
@@ -249,11 +249,22 @@ void ieee80211_sta_debugfs_add(struct sta_info *sta) | |||
249 | DECLARE_MAC_BUF(mbuf); | 249 | DECLARE_MAC_BUF(mbuf); |
250 | u8 *mac; | 250 | u8 *mac; |
251 | 251 | ||
252 | sta->debugfs.add_has_run = true; | ||
253 | |||
252 | if (!stations_dir) | 254 | if (!stations_dir) |
253 | return; | 255 | return; |
254 | 256 | ||
255 | mac = print_mac(mbuf, sta->sta.addr); | 257 | mac = print_mac(mbuf, sta->sta.addr); |
256 | 258 | ||
259 | /* | ||
260 | * This might fail due to a race condition: | ||
261 | * When mac80211 unlinks a station, the debugfs entries | ||
262 | * remain, but it is already possible to link a new | ||
263 | * station with the same address which triggers adding | ||
264 | * it to debugfs; therefore, if the old station isn't | ||
265 | * destroyed quickly enough the old station's debugfs | ||
266 | * dir might still be around. | ||
267 | */ | ||
257 | sta->debugfs.dir = debugfs_create_dir(mac, stations_dir); | 268 | sta->debugfs.dir = debugfs_create_dir(mac, stations_dir); |
258 | if (!sta->debugfs.dir) | 269 | if (!sta->debugfs.dir) |
259 | return; | 270 | return; |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 8025b294588b..156e42a003ae 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -816,8 +816,8 @@ struct ieee802_11_elems { | |||
816 | u8 *ext_supp_rates; | 816 | u8 *ext_supp_rates; |
817 | u8 *wmm_info; | 817 | u8 *wmm_info; |
818 | u8 *wmm_param; | 818 | u8 *wmm_param; |
819 | u8 *ht_cap_elem; | 819 | struct ieee80211_ht_cap *ht_cap_elem; |
820 | u8 *ht_info_elem; | 820 | struct ieee80211_ht_addt_info *ht_info_elem; |
821 | u8 *mesh_config; | 821 | u8 *mesh_config; |
822 | u8 *mesh_id; | 822 | u8 *mesh_id; |
823 | u8 *peer_link; | 823 | u8 *peer_link; |
@@ -844,8 +844,6 @@ struct ieee802_11_elems { | |||
844 | u8 ext_supp_rates_len; | 844 | u8 ext_supp_rates_len; |
845 | u8 wmm_info_len; | 845 | u8 wmm_info_len; |
846 | u8 wmm_param_len; | 846 | u8 wmm_param_len; |
847 | u8 ht_cap_elem_len; | ||
848 | u8 ht_info_elem_len; | ||
849 | u8 mesh_config_len; | 847 | u8 mesh_config_len; |
850 | u8 mesh_id_len; | 848 | u8 mesh_id_len; |
851 | u8 peer_link_len; | 849 | u8 peer_link_len; |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 49f86fa56bff..87665d7bb4f9 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1348,10 +1348,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, | |||
1348 | (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) { | 1348 | (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) { |
1349 | struct ieee80211_ht_bss_info bss_info; | 1349 | struct ieee80211_ht_bss_info bss_info; |
1350 | ieee80211_ht_cap_ie_to_ht_info( | 1350 | ieee80211_ht_cap_ie_to_ht_info( |
1351 | (struct ieee80211_ht_cap *) | ||
1352 | elems.ht_cap_elem, &sta->sta.ht_info); | 1351 | elems.ht_cap_elem, &sta->sta.ht_info); |
1353 | ieee80211_ht_addt_info_ie_to_ht_bss_info( | 1352 | ieee80211_ht_addt_info_ie_to_ht_bss_info( |
1354 | (struct ieee80211_ht_addt_info *) | ||
1355 | elems.ht_info_elem, &bss_info); | 1353 | elems.ht_info_elem, &bss_info); |
1356 | ieee80211_handle_ht(local, 1, &sta->sta.ht_info, &bss_info); | 1354 | ieee80211_handle_ht(local, 1, &sta->sta.ht_info, &bss_info); |
1357 | } | 1355 | } |
@@ -1709,7 +1707,6 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, | |||
1709 | struct ieee80211_ht_bss_info bss_info; | 1707 | struct ieee80211_ht_bss_info bss_info; |
1710 | 1708 | ||
1711 | ieee80211_ht_addt_info_ie_to_ht_bss_info( | 1709 | ieee80211_ht_addt_info_ie_to_ht_bss_info( |
1712 | (struct ieee80211_ht_addt_info *) | ||
1713 | elems.ht_info_elem, &bss_info); | 1710 | elems.ht_info_elem, &bss_info); |
1714 | changed |= ieee80211_handle_ht(local, 1, &conf->ht_conf, | 1711 | changed |= ieee80211_handle_ht(local, 1, &conf->ht_conf, |
1715 | &bss_info); | 1712 | &bss_info); |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 8e6685e7ae85..416bb41099f3 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -388,7 +388,8 @@ ieee80211_scan_rx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, | |||
388 | bss = ieee80211_bss_info_update(sdata->local, rx_status, | 388 | bss = ieee80211_bss_info_update(sdata->local, rx_status, |
389 | mgmt, skb->len, &elems, | 389 | mgmt, skb->len, &elems, |
390 | freq, beacon); | 390 | freq, beacon); |
391 | ieee80211_rx_bss_put(sdata->local, bss); | 391 | if (bss) |
392 | ieee80211_rx_bss_put(sdata->local, bss); | ||
392 | 393 | ||
393 | dev_kfree_skb(skb); | 394 | dev_kfree_skb(skb); |
394 | return RX_QUEUED; | 395 | return RX_QUEUED; |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 9b72d15bc8dc..7fef8ea1f5ec 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
@@ -635,7 +635,12 @@ static void sta_info_debugfs_add_work(struct work_struct *work) | |||
635 | 635 | ||
636 | spin_lock_irqsave(&local->sta_lock, flags); | 636 | spin_lock_irqsave(&local->sta_lock, flags); |
637 | list_for_each_entry(tmp, &local->sta_list, list) { | 637 | list_for_each_entry(tmp, &local->sta_list, list) { |
638 | if (!tmp->debugfs.dir) { | 638 | /* |
639 | * debugfs.add_has_run will be set by | ||
640 | * ieee80211_sta_debugfs_add regardless | ||
641 | * of what else it does. | ||
642 | */ | ||
643 | if (!tmp->debugfs.add_has_run) { | ||
639 | sta = tmp; | 644 | sta = tmp; |
640 | __sta_info_pin(sta); | 645 | __sta_info_pin(sta); |
641 | break; | 646 | break; |
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index a6b51862a89d..168a39a298bd 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h | |||
@@ -300,6 +300,7 @@ struct sta_info { | |||
300 | struct dentry *inactive_ms; | 300 | struct dentry *inactive_ms; |
301 | struct dentry *last_seq_ctrl; | 301 | struct dentry *last_seq_ctrl; |
302 | struct dentry *agg_status; | 302 | struct dentry *agg_status; |
303 | bool add_has_run; | ||
303 | } debugfs; | 304 | } debugfs; |
304 | #endif | 305 | #endif |
305 | 306 | ||
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index f32561ec224c..cee4884b9d06 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -529,12 +529,12 @@ void ieee802_11_parse_elems(u8 *start, size_t len, | |||
529 | elems->ext_supp_rates_len = elen; | 529 | elems->ext_supp_rates_len = elen; |
530 | break; | 530 | break; |
531 | case WLAN_EID_HT_CAPABILITY: | 531 | case WLAN_EID_HT_CAPABILITY: |
532 | elems->ht_cap_elem = pos; | 532 | if (elen >= sizeof(struct ieee80211_ht_cap)) |
533 | elems->ht_cap_elem_len = elen; | 533 | elems->ht_cap_elem = (void *)pos; |
534 | break; | 534 | break; |
535 | case WLAN_EID_HT_EXTRA_INFO: | 535 | case WLAN_EID_HT_EXTRA_INFO: |
536 | elems->ht_info_elem = pos; | 536 | if (elen >= sizeof(struct ieee80211_ht_addt_info)) |
537 | elems->ht_info_elem_len = elen; | 537 | elems->ht_info_elem = (void *)pos; |
538 | break; | 538 | break; |
539 | case WLAN_EID_MESH_ID: | 539 | case WLAN_EID_MESH_ID: |
540 | elems->mesh_id = pos; | 540 | elems->mesh_id = pos; |
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 7e0d53abde24..742f811ca416 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
@@ -775,7 +775,7 @@ static int ieee80211_ioctl_siwfrag(struct net_device *dev, | |||
775 | * configure it here */ | 775 | * configure it here */ |
776 | 776 | ||
777 | if (local->ops->set_frag_threshold) | 777 | if (local->ops->set_frag_threshold) |
778 | local->ops->set_frag_threshold( | 778 | return local->ops->set_frag_threshold( |
779 | local_to_hw(local), | 779 | local_to_hw(local), |
780 | local->fragmentation_threshold); | 780 | local->fragmentation_threshold); |
781 | 781 | ||
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 27de3c7b006e..622d7c671cb7 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -38,9 +38,16 @@ | |||
38 | #include <net/netfilter/nf_conntrack_core.h> | 38 | #include <net/netfilter/nf_conntrack_core.h> |
39 | #include <net/netfilter/nf_conntrack_extend.h> | 39 | #include <net/netfilter/nf_conntrack_extend.h> |
40 | #include <net/netfilter/nf_conntrack_acct.h> | 40 | #include <net/netfilter/nf_conntrack_acct.h> |
41 | #include <net/netfilter/nf_nat.h> | ||
41 | 42 | ||
42 | #define NF_CONNTRACK_VERSION "0.5.0" | 43 | #define NF_CONNTRACK_VERSION "0.5.0" |
43 | 44 | ||
45 | unsigned int | ||
46 | (*nfnetlink_parse_nat_setup_hook)(struct nf_conn *ct, | ||
47 | enum nf_nat_manip_type manip, | ||
48 | struct nlattr *attr) __read_mostly; | ||
49 | EXPORT_SYMBOL_GPL(nfnetlink_parse_nat_setup_hook); | ||
50 | |||
44 | DEFINE_SPINLOCK(nf_conntrack_lock); | 51 | DEFINE_SPINLOCK(nf_conntrack_lock); |
45 | EXPORT_SYMBOL_GPL(nf_conntrack_lock); | 52 | EXPORT_SYMBOL_GPL(nf_conntrack_lock); |
46 | 53 | ||
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index cadfd15b44f6..08e82d64eb6f 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -689,71 +689,6 @@ ctnetlink_parse_tuple(struct nlattr *cda[], struct nf_conntrack_tuple *tuple, | |||
689 | return 0; | 689 | return 0; |
690 | } | 690 | } |
691 | 691 | ||
692 | #ifdef CONFIG_NF_NAT_NEEDED | ||
693 | static const struct nla_policy protonat_nla_policy[CTA_PROTONAT_MAX+1] = { | ||
694 | [CTA_PROTONAT_PORT_MIN] = { .type = NLA_U16 }, | ||
695 | [CTA_PROTONAT_PORT_MAX] = { .type = NLA_U16 }, | ||
696 | }; | ||
697 | |||
698 | static int nfnetlink_parse_nat_proto(struct nlattr *attr, | ||
699 | const struct nf_conn *ct, | ||
700 | struct nf_nat_range *range) | ||
701 | { | ||
702 | struct nlattr *tb[CTA_PROTONAT_MAX+1]; | ||
703 | const struct nf_nat_protocol *npt; | ||
704 | int err; | ||
705 | |||
706 | err = nla_parse_nested(tb, CTA_PROTONAT_MAX, attr, protonat_nla_policy); | ||
707 | if (err < 0) | ||
708 | return err; | ||
709 | |||
710 | npt = nf_nat_proto_find_get(nf_ct_protonum(ct)); | ||
711 | if (npt->nlattr_to_range) | ||
712 | err = npt->nlattr_to_range(tb, range); | ||
713 | nf_nat_proto_put(npt); | ||
714 | return err; | ||
715 | } | ||
716 | |||
717 | static const struct nla_policy nat_nla_policy[CTA_NAT_MAX+1] = { | ||
718 | [CTA_NAT_MINIP] = { .type = NLA_U32 }, | ||
719 | [CTA_NAT_MAXIP] = { .type = NLA_U32 }, | ||
720 | }; | ||
721 | |||
722 | static inline int | ||
723 | nfnetlink_parse_nat(struct nlattr *nat, | ||
724 | const struct nf_conn *ct, struct nf_nat_range *range) | ||
725 | { | ||
726 | struct nlattr *tb[CTA_NAT_MAX+1]; | ||
727 | int err; | ||
728 | |||
729 | memset(range, 0, sizeof(*range)); | ||
730 | |||
731 | err = nla_parse_nested(tb, CTA_NAT_MAX, nat, nat_nla_policy); | ||
732 | if (err < 0) | ||
733 | return err; | ||
734 | |||
735 | if (tb[CTA_NAT_MINIP]) | ||
736 | range->min_ip = nla_get_be32(tb[CTA_NAT_MINIP]); | ||
737 | |||
738 | if (!tb[CTA_NAT_MAXIP]) | ||
739 | range->max_ip = range->min_ip; | ||
740 | else | ||
741 | range->max_ip = nla_get_be32(tb[CTA_NAT_MAXIP]); | ||
742 | |||
743 | if (range->min_ip) | ||
744 | range->flags |= IP_NAT_RANGE_MAP_IPS; | ||
745 | |||
746 | if (!tb[CTA_NAT_PROTO]) | ||
747 | return 0; | ||
748 | |||
749 | err = nfnetlink_parse_nat_proto(tb[CTA_NAT_PROTO], ct, range); | ||
750 | if (err < 0) | ||
751 | return err; | ||
752 | |||
753 | return 0; | ||
754 | } | ||
755 | #endif | ||
756 | |||
757 | static inline int | 692 | static inline int |
758 | ctnetlink_parse_help(struct nlattr *attr, char **helper_name) | 693 | ctnetlink_parse_help(struct nlattr *attr, char **helper_name) |
759 | { | 694 | { |
@@ -879,6 +814,34 @@ out: | |||
879 | } | 814 | } |
880 | 815 | ||
881 | static int | 816 | static int |
817 | ctnetlink_parse_nat_setup(struct nf_conn *ct, | ||
818 | enum nf_nat_manip_type manip, | ||
819 | struct nlattr *attr) | ||
820 | { | ||
821 | typeof(nfnetlink_parse_nat_setup_hook) parse_nat_setup; | ||
822 | |||
823 | parse_nat_setup = rcu_dereference(nfnetlink_parse_nat_setup_hook); | ||
824 | if (!parse_nat_setup) { | ||
825 | #ifdef CONFIG_KMOD | ||
826 | rcu_read_unlock(); | ||
827 | nfnl_unlock(); | ||
828 | if (request_module("nf-nat-ipv4") < 0) { | ||
829 | nfnl_lock(); | ||
830 | rcu_read_lock(); | ||
831 | return -EOPNOTSUPP; | ||
832 | } | ||
833 | nfnl_lock(); | ||
834 | rcu_read_lock(); | ||
835 | if (nfnetlink_parse_nat_setup_hook) | ||
836 | return -EAGAIN; | ||
837 | #endif | ||
838 | return -EOPNOTSUPP; | ||
839 | } | ||
840 | |||
841 | return parse_nat_setup(ct, manip, attr); | ||
842 | } | ||
843 | |||
844 | static int | ||
882 | ctnetlink_change_status(struct nf_conn *ct, struct nlattr *cda[]) | 845 | ctnetlink_change_status(struct nf_conn *ct, struct nlattr *cda[]) |
883 | { | 846 | { |
884 | unsigned long d; | 847 | unsigned long d; |
@@ -897,31 +860,6 @@ ctnetlink_change_status(struct nf_conn *ct, struct nlattr *cda[]) | |||
897 | /* ASSURED bit can only be set */ | 860 | /* ASSURED bit can only be set */ |
898 | return -EBUSY; | 861 | return -EBUSY; |
899 | 862 | ||
900 | if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST]) { | ||
901 | #ifndef CONFIG_NF_NAT_NEEDED | ||
902 | return -EOPNOTSUPP; | ||
903 | #else | ||
904 | struct nf_nat_range range; | ||
905 | |||
906 | if (cda[CTA_NAT_DST]) { | ||
907 | if (nfnetlink_parse_nat(cda[CTA_NAT_DST], ct, | ||
908 | &range) < 0) | ||
909 | return -EINVAL; | ||
910 | if (nf_nat_initialized(ct, IP_NAT_MANIP_DST)) | ||
911 | return -EEXIST; | ||
912 | nf_nat_setup_info(ct, &range, IP_NAT_MANIP_DST); | ||
913 | } | ||
914 | if (cda[CTA_NAT_SRC]) { | ||
915 | if (nfnetlink_parse_nat(cda[CTA_NAT_SRC], ct, | ||
916 | &range) < 0) | ||
917 | return -EINVAL; | ||
918 | if (nf_nat_initialized(ct, IP_NAT_MANIP_SRC)) | ||
919 | return -EEXIST; | ||
920 | nf_nat_setup_info(ct, &range, IP_NAT_MANIP_SRC); | ||
921 | } | ||
922 | #endif | ||
923 | } | ||
924 | |||
925 | /* Be careful here, modifying NAT bits can screw up things, | 863 | /* Be careful here, modifying NAT bits can screw up things, |
926 | * so don't let users modify them directly if they don't pass | 864 | * so don't let users modify them directly if they don't pass |
927 | * nf_nat_range. */ | 865 | * nf_nat_range. */ |
@@ -929,6 +867,31 @@ ctnetlink_change_status(struct nf_conn *ct, struct nlattr *cda[]) | |||
929 | return 0; | 867 | return 0; |
930 | } | 868 | } |
931 | 869 | ||
870 | static int | ||
871 | ctnetlink_change_nat(struct nf_conn *ct, struct nlattr *cda[]) | ||
872 | { | ||
873 | #ifdef CONFIG_NF_NAT_NEEDED | ||
874 | int ret; | ||
875 | |||
876 | if (cda[CTA_NAT_DST]) { | ||
877 | ret = ctnetlink_parse_nat_setup(ct, | ||
878 | IP_NAT_MANIP_DST, | ||
879 | cda[CTA_NAT_DST]); | ||
880 | if (ret < 0) | ||
881 | return ret; | ||
882 | } | ||
883 | if (cda[CTA_NAT_SRC]) { | ||
884 | ret = ctnetlink_parse_nat_setup(ct, | ||
885 | IP_NAT_MANIP_SRC, | ||
886 | cda[CTA_NAT_SRC]); | ||
887 | if (ret < 0) | ||
888 | return ret; | ||
889 | } | ||
890 | return 0; | ||
891 | #else | ||
892 | return -EOPNOTSUPP; | ||
893 | #endif | ||
894 | } | ||
932 | 895 | ||
933 | static inline int | 896 | static inline int |
934 | ctnetlink_change_helper(struct nf_conn *ct, struct nlattr *cda[]) | 897 | ctnetlink_change_helper(struct nf_conn *ct, struct nlattr *cda[]) |
@@ -1157,6 +1120,14 @@ ctnetlink_create_conntrack(struct nlattr *cda[], | |||
1157 | } | 1120 | } |
1158 | } | 1121 | } |
1159 | 1122 | ||
1123 | if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST]) { | ||
1124 | err = ctnetlink_change_nat(ct, cda); | ||
1125 | if (err < 0) { | ||
1126 | rcu_read_unlock(); | ||
1127 | goto err; | ||
1128 | } | ||
1129 | } | ||
1130 | |||
1160 | if (cda[CTA_PROTOINFO]) { | 1131 | if (cda[CTA_PROTOINFO]) { |
1161 | err = ctnetlink_change_protoinfo(ct, cda); | 1132 | err = ctnetlink_change_protoinfo(ct, cda); |
1162 | if (err < 0) { | 1133 | if (err < 0) { |
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index b75c9c4a995d..4739f9f961d8 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c | |||
@@ -44,15 +44,17 @@ static struct sock *nfnl = NULL; | |||
44 | static const struct nfnetlink_subsystem *subsys_table[NFNL_SUBSYS_COUNT]; | 44 | static const struct nfnetlink_subsystem *subsys_table[NFNL_SUBSYS_COUNT]; |
45 | static DEFINE_MUTEX(nfnl_mutex); | 45 | static DEFINE_MUTEX(nfnl_mutex); |
46 | 46 | ||
47 | static inline void nfnl_lock(void) | 47 | void nfnl_lock(void) |
48 | { | 48 | { |
49 | mutex_lock(&nfnl_mutex); | 49 | mutex_lock(&nfnl_mutex); |
50 | } | 50 | } |
51 | EXPORT_SYMBOL_GPL(nfnl_lock); | ||
51 | 52 | ||
52 | static inline void nfnl_unlock(void) | 53 | void nfnl_unlock(void) |
53 | { | 54 | { |
54 | mutex_unlock(&nfnl_mutex); | 55 | mutex_unlock(&nfnl_mutex); |
55 | } | 56 | } |
57 | EXPORT_SYMBOL_GPL(nfnl_unlock); | ||
56 | 58 | ||
57 | int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n) | 59 | int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n) |
58 | { | 60 | { |
@@ -132,6 +134,7 @@ static int nfnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
132 | return 0; | 134 | return 0; |
133 | 135 | ||
134 | type = nlh->nlmsg_type; | 136 | type = nlh->nlmsg_type; |
137 | replay: | ||
135 | ss = nfnetlink_get_subsys(type); | 138 | ss = nfnetlink_get_subsys(type); |
136 | if (!ss) { | 139 | if (!ss) { |
137 | #ifdef CONFIG_KMOD | 140 | #ifdef CONFIG_KMOD |
@@ -165,7 +168,10 @@ static int nfnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
165 | } else | 168 | } else |
166 | return -EINVAL; | 169 | return -EINVAL; |
167 | 170 | ||
168 | return nc->call(nfnl, skb, nlh, cda); | 171 | err = nc->call(nfnl, skb, nlh, cda); |
172 | if (err == -EAGAIN) | ||
173 | goto replay; | ||
174 | return err; | ||
169 | } | 175 | } |
170 | } | 176 | } |
171 | 177 | ||
diff --git a/net/wireless/core.c b/net/wireless/core.c index 24fdd4cd22cb..5031db7b275b 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
@@ -184,7 +184,8 @@ int cfg80211_dev_rename(struct cfg80211_registered_device *rdev, | |||
184 | if (result) | 184 | if (result) |
185 | goto out_unlock; | 185 | goto out_unlock; |
186 | 186 | ||
187 | if (!debugfs_rename(rdev->wiphy.debugfsdir->d_parent, | 187 | if (rdev->wiphy.debugfsdir && |
188 | !debugfs_rename(rdev->wiphy.debugfsdir->d_parent, | ||
188 | rdev->wiphy.debugfsdir, | 189 | rdev->wiphy.debugfsdir, |
189 | rdev->wiphy.debugfsdir->d_parent, | 190 | rdev->wiphy.debugfsdir->d_parent, |
190 | newname)) | 191 | newname)) |
@@ -317,6 +318,8 @@ int wiphy_register(struct wiphy *wiphy) | |||
317 | drv->wiphy.debugfsdir = | 318 | drv->wiphy.debugfsdir = |
318 | debugfs_create_dir(wiphy_name(&drv->wiphy), | 319 | debugfs_create_dir(wiphy_name(&drv->wiphy), |
319 | ieee80211_debugfs_dir); | 320 | ieee80211_debugfs_dir); |
321 | if (IS_ERR(drv->wiphy.debugfsdir)) | ||
322 | drv->wiphy.debugfsdir = NULL; | ||
320 | 323 | ||
321 | res = 0; | 324 | res = 0; |
322 | out_unlock: | 325 | out_unlock: |