diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-12 14:12:06 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-12 14:12:06 -0500 |
| commit | e697b8d13ede3893724898d983eff3f8c9183643 (patch) | |
| tree | 0144d2d98d33e92a1d93739f0db12997c000d456 | |
| parent | 46015977e70f672ae6b20a1b5fb1e361208365ba (diff) | |
| parent | 2994c63863ac350c4c8c6a65d8110749c2abb95c (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (39 commits)
[INET]: Small possible memory leak in FIB rules
[NETNS]: init dev_base_lock only once
[UNIX]: The unix_nr_socks limit can be exceeded
[AF_UNIX]: Convert socks to unix_socks in scan_inflight, not in callbacks
[AF_UNIX]: Make unix_tot_inflight counter non-atomic
[AF_PACKET]: Allow multicast traffic to be caught by ORIGDEV when bonded
ssb: Fix PCMCIA-host lowlevel bus access
mac80211: fix MAC80211_RCSIMPLE Kconfig
mac80211: make "decrypt failed" messages conditional upon MAC80211_DEBUG
mac80211: use IW_AUTH_PRIVACY_INVOKED rather than IW_AUTH_KEY_MGMT
mac80211: remove unused driver ops
mac80211: remove ieee80211_common.h
softmac: MAINTAINERS update
rfkill: Fix sparse warning
rfkill: Use mutex_lock() at register and add sanity check
iwlwifi: select proper rate control algorithm
mac80211: allow driver to ask for a rate control algorithm
mac80211: don't allow registering the same rate control twice
rfkill: Use subsys_initcall
mac80211: make simple rate control algorithm built-in
...
45 files changed, 380 insertions, 428 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 6a9702726239..cad0882754a6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3454,15 +3454,10 @@ L: lm-sensors@lm-sensors.org | |||
| 3454 | S: Maintained | 3454 | S: Maintained |
| 3455 | 3455 | ||
| 3456 | SOFTMAC LAYER (IEEE 802.11) | 3456 | SOFTMAC LAYER (IEEE 802.11) |
| 3457 | P: Johannes Berg | ||
| 3458 | M: johannes@sipsolutions.net | ||
| 3459 | P: Joe Jezak | ||
| 3460 | M: josejx@gentoo.org | ||
| 3461 | P: Daniel Drake | 3457 | P: Daniel Drake |
| 3462 | M: dsd@gentoo.org | 3458 | M: dsd@gentoo.org |
| 3463 | W: http://softmac.sipsolutions.net/ | ||
| 3464 | L: linux-wireless@vger.kernel.org | 3459 | L: linux-wireless@vger.kernel.org |
| 3465 | S: Maintained | 3460 | S: Obsolete |
| 3466 | 3461 | ||
| 3467 | SOFTWARE RAID (Multiple Disks) SUPPORT | 3462 | SOFTWARE RAID (Multiple Disks) SUPPORT |
| 3468 | P: Ingo Molnar | 3463 | P: Ingo Molnar |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 4f22a7174caf..be7c9f42a340 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -8354,6 +8354,8 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 8354 | } | 8354 | } |
| 8355 | SET_IEEE80211_DEV(hw, &pdev->dev); | 8355 | SET_IEEE80211_DEV(hw, &pdev->dev); |
| 8356 | 8356 | ||
| 8357 | hw->rate_control_algorithm = "iwl-3945-rs"; | ||
| 8358 | |||
| 8357 | IWL_DEBUG_INFO("*** LOAD DRIVER ***\n"); | 8359 | IWL_DEBUG_INFO("*** LOAD DRIVER ***\n"); |
| 8358 | priv = hw->priv; | 8360 | priv = hw->priv; |
| 8359 | priv->hw = hw; | 8361 | priv->hw = hw; |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index d60adcb9bd4a..6757c6c1b25a 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
| @@ -8955,6 +8955,8 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 8955 | } | 8955 | } |
| 8956 | SET_IEEE80211_DEV(hw, &pdev->dev); | 8956 | SET_IEEE80211_DEV(hw, &pdev->dev); |
| 8957 | 8957 | ||
| 8958 | hw->rate_control_algorithm = "iwl-4965-rs"; | ||
| 8959 | |||
| 8958 | IWL_DEBUG_INFO("*** LOAD DRIVER ***\n"); | 8960 | IWL_DEBUG_INFO("*** LOAD DRIVER ***\n"); |
| 8959 | priv = hw->priv; | 8961 | priv = hw->priv; |
| 8960 | priv->hw = hw; | 8962 | priv->hw = hw; |
diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c index c12a741b5574..85a20546e827 100644 --- a/drivers/ssb/main.c +++ b/drivers/ssb/main.c | |||
| @@ -440,6 +440,7 @@ static int ssb_devices_register(struct ssb_bus *bus) | |||
| 440 | break; | 440 | break; |
| 441 | case SSB_BUSTYPE_PCMCIA: | 441 | case SSB_BUSTYPE_PCMCIA: |
| 442 | #ifdef CONFIG_SSB_PCMCIAHOST | 442 | #ifdef CONFIG_SSB_PCMCIAHOST |
| 443 | sdev->irq = bus->host_pcmcia->irq.AssignedIRQ; | ||
| 443 | dev->parent = &bus->host_pcmcia->dev; | 444 | dev->parent = &bus->host_pcmcia->dev; |
| 444 | #endif | 445 | #endif |
| 445 | break; | 446 | break; |
| @@ -1147,7 +1148,10 @@ static int __init ssb_modinit(void) | |||
| 1147 | 1148 | ||
| 1148 | return err; | 1149 | return err; |
| 1149 | } | 1150 | } |
| 1150 | subsys_initcall(ssb_modinit); | 1151 | /* ssb must be initialized after PCI but before the ssb drivers. |
| 1152 | * That means we must use some initcall between subsys_initcall | ||
| 1153 | * and device_initcall. */ | ||
| 1154 | fs_initcall(ssb_modinit); | ||
| 1151 | 1155 | ||
| 1152 | static void __exit ssb_modexit(void) | 1156 | static void __exit ssb_modexit(void) |
| 1153 | { | 1157 | { |
diff --git a/drivers/ssb/pcmcia.c b/drivers/ssb/pcmcia.c index b6abee846f02..bb44a76b3eb5 100644 --- a/drivers/ssb/pcmcia.c +++ b/drivers/ssb/pcmcia.c | |||
| @@ -63,17 +63,17 @@ int ssb_pcmcia_switch_coreidx(struct ssb_bus *bus, | |||
| 63 | err = pcmcia_access_configuration_register(pdev, ®); | 63 | err = pcmcia_access_configuration_register(pdev, ®); |
| 64 | if (err != CS_SUCCESS) | 64 | if (err != CS_SUCCESS) |
| 65 | goto error; | 65 | goto error; |
| 66 | read_addr |= (reg.Value & 0xF) << 12; | 66 | read_addr |= ((u32)(reg.Value & 0x0F)) << 12; |
| 67 | reg.Offset = 0x30; | 67 | reg.Offset = 0x30; |
| 68 | err = pcmcia_access_configuration_register(pdev, ®); | 68 | err = pcmcia_access_configuration_register(pdev, ®); |
| 69 | if (err != CS_SUCCESS) | 69 | if (err != CS_SUCCESS) |
| 70 | goto error; | 70 | goto error; |
| 71 | read_addr |= reg.Value << 16; | 71 | read_addr |= ((u32)reg.Value) << 16; |
| 72 | reg.Offset = 0x32; | 72 | reg.Offset = 0x32; |
| 73 | err = pcmcia_access_configuration_register(pdev, ®); | 73 | err = pcmcia_access_configuration_register(pdev, ®); |
| 74 | if (err != CS_SUCCESS) | 74 | if (err != CS_SUCCESS) |
| 75 | goto error; | 75 | goto error; |
| 76 | read_addr |= reg.Value << 24; | 76 | read_addr |= ((u32)reg.Value) << 24; |
| 77 | 77 | ||
| 78 | cur_core = (read_addr - SSB_ENUM_BASE) / SSB_CORE_SIZE; | 78 | cur_core = (read_addr - SSB_ENUM_BASE) / SSB_CORE_SIZE; |
| 79 | if (cur_core == coreidx) | 79 | if (cur_core == coreidx) |
| @@ -152,28 +152,29 @@ error: | |||
| 152 | goto out_unlock; | 152 | goto out_unlock; |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | /* These are the main device register access functions. | 155 | static int select_core_and_segment(struct ssb_device *dev, |
| 156 | * do_select_core is inline to have the likely hotpath inline. | 156 | u16 *offset) |
| 157 | * All unlikely codepaths are out-of-line. */ | ||
| 158 | static inline int do_select_core(struct ssb_bus *bus, | ||
| 159 | struct ssb_device *dev, | ||
| 160 | u16 *offset) | ||
| 161 | { | 157 | { |
| 158 | struct ssb_bus *bus = dev->bus; | ||
| 162 | int err; | 159 | int err; |
| 163 | u8 need_seg = (*offset >= 0x800) ? 1 : 0; | 160 | u8 need_segment; |
| 161 | |||
| 162 | if (*offset >= 0x800) { | ||
| 163 | *offset -= 0x800; | ||
| 164 | need_segment = 1; | ||
| 165 | } else | ||
| 166 | need_segment = 0; | ||
| 164 | 167 | ||
| 165 | if (unlikely(dev != bus->mapped_device)) { | 168 | if (unlikely(dev != bus->mapped_device)) { |
| 166 | err = ssb_pcmcia_switch_core(bus, dev); | 169 | err = ssb_pcmcia_switch_core(bus, dev); |
| 167 | if (unlikely(err)) | 170 | if (unlikely(err)) |
| 168 | return err; | 171 | return err; |
| 169 | } | 172 | } |
| 170 | if (unlikely(need_seg != bus->mapped_pcmcia_seg)) { | 173 | if (unlikely(need_segment != bus->mapped_pcmcia_seg)) { |
| 171 | err = ssb_pcmcia_switch_segment(bus, need_seg); | 174 | err = ssb_pcmcia_switch_segment(bus, need_segment); |
| 172 | if (unlikely(err)) | 175 | if (unlikely(err)) |
| 173 | return err; | 176 | return err; |
| 174 | } | 177 | } |
| 175 | if (need_seg == 1) | ||
| 176 | *offset -= 0x800; | ||
| 177 | 178 | ||
| 178 | return 0; | 179 | return 0; |
| 179 | } | 180 | } |
| @@ -181,32 +182,31 @@ static inline int do_select_core(struct ssb_bus *bus, | |||
| 181 | static u16 ssb_pcmcia_read16(struct ssb_device *dev, u16 offset) | 182 | static u16 ssb_pcmcia_read16(struct ssb_device *dev, u16 offset) |
| 182 | { | 183 | { |
| 183 | struct ssb_bus *bus = dev->bus; | 184 | struct ssb_bus *bus = dev->bus; |
| 184 | u16 x; | ||
| 185 | 185 | ||
| 186 | if (unlikely(do_select_core(bus, dev, &offset))) | 186 | if (unlikely(select_core_and_segment(dev, &offset))) |
| 187 | return 0xFFFF; | 187 | return 0xFFFF; |
| 188 | x = readw(bus->mmio + offset); | ||
| 189 | 188 | ||
| 190 | return x; | 189 | return readw(bus->mmio + offset); |
| 191 | } | 190 | } |
| 192 | 191 | ||
| 193 | static u32 ssb_pcmcia_read32(struct ssb_device *dev, u16 offset) | 192 | static u32 ssb_pcmcia_read32(struct ssb_device *dev, u16 offset) |
| 194 | { | 193 | { |
| 195 | struct ssb_bus *bus = dev->bus; | 194 | struct ssb_bus *bus = dev->bus; |
| 196 | u32 x; | 195 | u32 lo, hi; |
| 197 | 196 | ||
| 198 | if (unlikely(do_select_core(bus, dev, &offset))) | 197 | if (unlikely(select_core_and_segment(dev, &offset))) |
| 199 | return 0xFFFFFFFF; | 198 | return 0xFFFFFFFF; |
| 200 | x = readl(bus->mmio + offset); | 199 | lo = readw(bus->mmio + offset); |
| 200 | hi = readw(bus->mmio + offset + 2); | ||
| 201 | 201 | ||
| 202 | return x; | 202 | return (lo | (hi << 16)); |
| 203 | } | 203 | } |
| 204 | 204 | ||
| 205 | static void ssb_pcmcia_write16(struct ssb_device *dev, u16 offset, u16 value) | 205 | static void ssb_pcmcia_write16(struct ssb_device *dev, u16 offset, u16 value) |
| 206 | { | 206 | { |
| 207 | struct ssb_bus *bus = dev->bus; | 207 | struct ssb_bus *bus = dev->bus; |
| 208 | 208 | ||
| 209 | if (unlikely(do_select_core(bus, dev, &offset))) | 209 | if (unlikely(select_core_and_segment(dev, &offset))) |
| 210 | return; | 210 | return; |
| 211 | writew(value, bus->mmio + offset); | 211 | writew(value, bus->mmio + offset); |
| 212 | } | 212 | } |
| @@ -215,12 +215,12 @@ static void ssb_pcmcia_write32(struct ssb_device *dev, u16 offset, u32 value) | |||
| 215 | { | 215 | { |
| 216 | struct ssb_bus *bus = dev->bus; | 216 | struct ssb_bus *bus = dev->bus; |
| 217 | 217 | ||
| 218 | if (unlikely(do_select_core(bus, dev, &offset))) | 218 | if (unlikely(select_core_and_segment(dev, &offset))) |
| 219 | return; | 219 | return; |
| 220 | readw(bus->mmio + offset); | 220 | writeb((value & 0xFF000000) >> 24, bus->mmio + offset + 3); |
| 221 | writew(value >> 16, bus->mmio + offset + 2); | 221 | writeb((value & 0x00FF0000) >> 16, bus->mmio + offset + 2); |
| 222 | readw(bus->mmio + offset); | 222 | writeb((value & 0x0000FF00) >> 8, bus->mmio + offset + 1); |
| 223 | writew(value, bus->mmio + offset); | 223 | writeb((value & 0x000000FF) >> 0, bus->mmio + offset + 0); |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | /* Not "static", as it's used in main.c */ | 226 | /* Not "static", as it's used in main.c */ |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 94e49915a8c0..91140fe8c119 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -387,7 +387,9 @@ extern void skb_truesize_bug(struct sk_buff *skb); | |||
| 387 | 387 | ||
| 388 | static inline void skb_truesize_check(struct sk_buff *skb) | 388 | static inline void skb_truesize_check(struct sk_buff *skb) |
| 389 | { | 389 | { |
| 390 | if (unlikely((int)skb->truesize < sizeof(struct sk_buff) + skb->len)) | 390 | int len = sizeof(struct sk_buff) + skb->len; |
| 391 | |||
| 392 | if (unlikely((int)skb->truesize < len)) | ||
| 391 | skb_truesize_bug(skb); | 393 | skb_truesize_bug(skb); |
| 392 | } | 394 | } |
| 393 | 395 | ||
diff --git a/include/net/af_unix.h b/include/net/af_unix.h index 0864a775de24..a1c805d7f488 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h | |||
| @@ -12,7 +12,7 @@ extern void unix_gc(void); | |||
| 12 | 12 | ||
| 13 | #define UNIX_HASH_SIZE 256 | 13 | #define UNIX_HASH_SIZE 256 |
| 14 | 14 | ||
| 15 | extern atomic_t unix_tot_inflight; | 15 | extern unsigned int unix_tot_inflight; |
| 16 | 16 | ||
| 17 | struct unix_address { | 17 | struct unix_address { |
| 18 | atomic_t refcnt; | 18 | atomic_t refcnt; |
diff --git a/include/net/dst.h b/include/net/dst.h index e9ff4a4caef9..2f65e894b829 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
| @@ -143,6 +143,13 @@ static inline void dst_hold(struct dst_entry * dst) | |||
| 143 | atomic_inc(&dst->__refcnt); | 143 | atomic_inc(&dst->__refcnt); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | static inline void dst_use(struct dst_entry *dst, unsigned long time) | ||
| 147 | { | ||
| 148 | dst_hold(dst); | ||
| 149 | dst->__use++; | ||
| 150 | dst->lastuse = time; | ||
| 151 | } | ||
| 152 | |||
| 146 | static inline | 153 | static inline |
| 147 | struct dst_entry * dst_clone(struct dst_entry * dst) | 154 | struct dst_entry * dst_clone(struct dst_entry * dst) |
| 148 | { | 155 | { |
diff --git a/include/net/fib_rules.h b/include/net/fib_rules.h index 017aebd90683..41a301e38643 100644 --- a/include/net/fib_rules.h +++ b/include/net/fib_rules.h | |||
| @@ -107,4 +107,7 @@ extern int fib_rules_unregister(struct fib_rules_ops *); | |||
| 107 | extern int fib_rules_lookup(struct fib_rules_ops *, | 107 | extern int fib_rules_lookup(struct fib_rules_ops *, |
| 108 | struct flowi *, int flags, | 108 | struct flowi *, int flags, |
| 109 | struct fib_lookup_arg *); | 109 | struct fib_lookup_arg *); |
| 110 | extern int fib_default_rule_add(struct fib_rules_ops *, | ||
| 111 | u32 pref, u32 table, | ||
| 112 | u32 flags); | ||
| 110 | #endif | 113 | #endif |
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index 8461cda37490..469216d93663 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
| 24 | #include <linux/types.h> | 24 | #include <linux/types.h> |
| 25 | #include <linux/wait.h> | 25 | #include <linux/wait.h> |
| 26 | #include <linux/vmalloc.h> | ||
| 26 | 27 | ||
| 27 | #include <net/inet_connection_sock.h> | 28 | #include <net/inet_connection_sock.h> |
| 28 | #include <net/inet_sock.h> | 29 | #include <net/inet_sock.h> |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 5fcc4c104340..17b60391fcd6 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -706,11 +706,16 @@ enum ieee80211_hw_flags { | |||
| 706 | * | 706 | * |
| 707 | * @queues: number of available hardware transmit queues for | 707 | * @queues: number of available hardware transmit queues for |
| 708 | * data packets. WMM/QoS requires at least four. | 708 | * data packets. WMM/QoS requires at least four. |
| 709 | * | ||
| 710 | * @rate_control_algorithm: rate control algorithm for this hardware. | ||
| 711 | * If unset (NULL), the default algorithm will be used. Must be | ||
| 712 | * set before calling ieee80211_register_hw(). | ||
| 709 | */ | 713 | */ |
| 710 | struct ieee80211_hw { | 714 | struct ieee80211_hw { |
| 711 | struct ieee80211_conf conf; | 715 | struct ieee80211_conf conf; |
| 712 | struct wiphy *wiphy; | 716 | struct wiphy *wiphy; |
| 713 | struct workqueue_struct *workqueue; | 717 | struct workqueue_struct *workqueue; |
| 718 | const char *rate_control_algorithm; | ||
| 714 | void *priv; | 719 | void *priv; |
| 715 | u32 flags; | 720 | u32 flags; |
| 716 | unsigned int extra_tx_headroom; | 721 | unsigned int extra_tx_headroom; |
| @@ -936,27 +941,11 @@ enum ieee80211_erp_change_flags { | |||
| 936 | * and remove_interface calls, i.e. while the interface with the | 941 | * and remove_interface calls, i.e. while the interface with the |
| 937 | * given local_address is enabled. | 942 | * given local_address is enabled. |
| 938 | * | 943 | * |
| 939 | * @set_ieee8021x: Enable/disable IEEE 802.1X. This item requests wlan card | ||
| 940 | * to pass unencrypted EAPOL-Key frames even when encryption is | ||
| 941 | * configured. If the wlan card does not require such a configuration, | ||
| 942 | * this function pointer can be set to NULL. | ||
| 943 | * | ||
| 944 | * @set_port_auth: Set port authorization state (IEEE 802.1X PAE) to be | ||
| 945 | * authorized (@authorized=1) or unauthorized (=0). This function can be | ||
| 946 | * used if the wlan hardware or low-level driver implements PAE. | ||
| 947 | * mac80211 will filter frames based on authorization state in any case, | ||
| 948 | * so this function pointer can be NULL if low-level driver does not | ||
| 949 | * require event notification about port state changes. | ||
| 950 | * | ||
| 951 | * @hw_scan: Ask the hardware to service the scan request, no need to start | 944 | * @hw_scan: Ask the hardware to service the scan request, no need to start |
| 952 | * the scan state machine in stack. | 945 | * the scan state machine in stack. |
| 953 | * | 946 | * |
| 954 | * @get_stats: return low-level statistics | 947 | * @get_stats: return low-level statistics |
| 955 | * | 948 | * |
| 956 | * @set_privacy_invoked: For devices that generate their own beacons and probe | ||
| 957 | * response or association responses this updates the state of privacy_invoked | ||
| 958 | * returns 0 for success or an error number. | ||
| 959 | * | ||
| 960 | * @get_sequence_counter: For devices that have internal sequence counters this | 949 | * @get_sequence_counter: For devices that have internal sequence counters this |
| 961 | * callback allows mac80211 to access the current value of a counter. | 950 | * callback allows mac80211 to access the current value of a counter. |
| 962 | * This callback seems not well-defined, tell us if you need it. | 951 | * This callback seems not well-defined, tell us if you need it. |
| @@ -1029,14 +1018,9 @@ struct ieee80211_ops { | |||
| 1029 | int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd, | 1018 | int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd, |
| 1030 | const u8 *local_address, const u8 *address, | 1019 | const u8 *local_address, const u8 *address, |
| 1031 | struct ieee80211_key_conf *key); | 1020 | struct ieee80211_key_conf *key); |
| 1032 | int (*set_ieee8021x)(struct ieee80211_hw *hw, int use_ieee8021x); | ||
| 1033 | int (*set_port_auth)(struct ieee80211_hw *hw, u8 *addr, | ||
| 1034 | int authorized); | ||
| 1035 | int (*hw_scan)(struct ieee80211_hw *hw, u8 *ssid, size_t len); | 1021 | int (*hw_scan)(struct ieee80211_hw *hw, u8 *ssid, size_t len); |
| 1036 | int (*get_stats)(struct ieee80211_hw *hw, | 1022 | int (*get_stats)(struct ieee80211_hw *hw, |
| 1037 | struct ieee80211_low_level_stats *stats); | 1023 | struct ieee80211_low_level_stats *stats); |
| 1038 | int (*set_privacy_invoked)(struct ieee80211_hw *hw, | ||
| 1039 | int privacy_invoked); | ||
| 1040 | int (*get_sequence_counter)(struct ieee80211_hw *hw, | 1024 | int (*get_sequence_counter)(struct ieee80211_hw *hw, |
| 1041 | u8* addr, u8 keyidx, u8 txrx, | 1025 | u8* addr, u8 keyidx, u8 txrx, |
| 1042 | u32* iv32, u16* iv16); | 1026 | u32* iv32, u16* iv16); |
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 1037748c14db..6567213959cb 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
| @@ -376,6 +376,7 @@ void vlan_setup(struct net_device *new_dev) | |||
| 376 | new_dev->init = vlan_dev_init; | 376 | new_dev->init = vlan_dev_init; |
| 377 | new_dev->open = vlan_dev_open; | 377 | new_dev->open = vlan_dev_open; |
| 378 | new_dev->stop = vlan_dev_stop; | 378 | new_dev->stop = vlan_dev_stop; |
| 379 | new_dev->set_mac_address = vlan_set_mac_address; | ||
| 379 | new_dev->set_multicast_list = vlan_dev_set_multicast_list; | 380 | new_dev->set_multicast_list = vlan_dev_set_multicast_list; |
| 380 | new_dev->change_rx_flags = vlan_change_rx_flags; | 381 | new_dev->change_rx_flags = vlan_change_rx_flags; |
| 381 | new_dev->destructor = free_netdev; | 382 | new_dev->destructor = free_netdev; |
| @@ -636,6 +637,10 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | |||
| 636 | if (!vlandev) | 637 | if (!vlandev) |
| 637 | continue; | 638 | continue; |
| 638 | 639 | ||
| 640 | flgs = vlandev->flags; | ||
| 641 | if (!(flgs & IFF_UP)) | ||
| 642 | continue; | ||
| 643 | |||
| 639 | vlan_sync_address(dev, vlandev); | 644 | vlan_sync_address(dev, vlandev); |
| 640 | } | 645 | } |
| 641 | break; | 646 | break; |
diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h index cf4a80d06b35..2cd1393073ec 100644 --- a/net/8021q/vlan.h +++ b/net/8021q/vlan.h | |||
| @@ -60,6 +60,7 @@ int vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb, struct net_device *dev | |||
| 60 | int vlan_dev_change_mtu(struct net_device *dev, int new_mtu); | 60 | int vlan_dev_change_mtu(struct net_device *dev, int new_mtu); |
| 61 | int vlan_dev_open(struct net_device* dev); | 61 | int vlan_dev_open(struct net_device* dev); |
| 62 | int vlan_dev_stop(struct net_device* dev); | 62 | int vlan_dev_stop(struct net_device* dev); |
| 63 | int vlan_set_mac_address(struct net_device *dev, void *p); | ||
| 63 | int vlan_dev_ioctl(struct net_device* dev, struct ifreq *ifr, int cmd); | 64 | int vlan_dev_ioctl(struct net_device* dev, struct ifreq *ifr, int cmd); |
| 64 | void vlan_dev_set_ingress_priority(const struct net_device *dev, | 65 | void vlan_dev_set_ingress_priority(const struct net_device *dev, |
| 65 | u32 skb_prio, short vlan_prio); | 66 | u32 skb_prio, short vlan_prio); |
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 1a1740aa9a8b..7a36878241da 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
| @@ -665,6 +665,32 @@ int vlan_dev_stop(struct net_device *dev) | |||
| 665 | return 0; | 665 | return 0; |
| 666 | } | 666 | } |
| 667 | 667 | ||
| 668 | int vlan_set_mac_address(struct net_device *dev, void *p) | ||
| 669 | { | ||
| 670 | struct net_device *real_dev = VLAN_DEV_INFO(dev)->real_dev; | ||
| 671 | struct sockaddr *addr = p; | ||
| 672 | int err; | ||
| 673 | |||
| 674 | if (!is_valid_ether_addr(addr->sa_data)) | ||
| 675 | return -EADDRNOTAVAIL; | ||
| 676 | |||
| 677 | if (!(dev->flags & IFF_UP)) | ||
| 678 | goto out; | ||
| 679 | |||
| 680 | if (compare_ether_addr(addr->sa_data, real_dev->dev_addr)) { | ||
| 681 | err = dev_unicast_add(real_dev, addr->sa_data, ETH_ALEN); | ||
| 682 | if (err < 0) | ||
| 683 | return err; | ||
| 684 | } | ||
| 685 | |||
| 686 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) | ||
| 687 | dev_unicast_delete(real_dev, dev->dev_addr, ETH_ALEN); | ||
| 688 | |||
| 689 | out: | ||
| 690 | memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); | ||
| 691 | return 0; | ||
| 692 | } | ||
| 693 | |||
| 668 | int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | 694 | int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
| 669 | { | 695 | { |
| 670 | struct net_device *real_dev = VLAN_DEV_INFO(dev)->real_dev; | 696 | struct net_device *real_dev = VLAN_DEV_INFO(dev)->real_dev; |
diff --git a/net/core/dev.c b/net/core/dev.c index be6cedab5aa8..dd7e30754cbc 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -4330,7 +4330,6 @@ static struct hlist_head *netdev_create_hash(void) | |||
| 4330 | static int __net_init netdev_init(struct net *net) | 4330 | static int __net_init netdev_init(struct net *net) |
| 4331 | { | 4331 | { |
| 4332 | INIT_LIST_HEAD(&net->dev_base_head); | 4332 | INIT_LIST_HEAD(&net->dev_base_head); |
| 4333 | rwlock_init(&dev_base_lock); | ||
| 4334 | 4333 | ||
| 4335 | net->dev_name_head = netdev_create_hash(); | 4334 | net->dev_name_head = netdev_create_hash(); |
| 4336 | if (net->dev_name_head == NULL) | 4335 | if (net->dev_name_head == NULL) |
diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c index ae354057d84c..647973daca2b 100644 --- a/net/core/dev_mcast.c +++ b/net/core/dev_mcast.c | |||
| @@ -168,13 +168,13 @@ void dev_mc_unsync(struct net_device *to, struct net_device *from) | |||
| 168 | da = from->mc_list; | 168 | da = from->mc_list; |
| 169 | while (da != NULL) { | 169 | while (da != NULL) { |
| 170 | next = da->next; | 170 | next = da->next; |
| 171 | if (!da->da_synced) | 171 | if (da->da_synced) { |
| 172 | continue; | 172 | __dev_addr_delete(&to->mc_list, &to->mc_count, |
| 173 | __dev_addr_delete(&to->mc_list, &to->mc_count, | 173 | da->da_addr, da->da_addrlen, 0); |
| 174 | da->da_addr, da->da_addrlen, 0); | 174 | da->da_synced = 0; |
| 175 | da->da_synced = 0; | 175 | __dev_addr_delete(&from->mc_list, &from->mc_count, |
| 176 | __dev_addr_delete(&from->mc_list, &from->mc_count, | 176 | da->da_addr, da->da_addrlen, 0); |
| 177 | da->da_addr, da->da_addrlen, 0); | 177 | } |
| 178 | da = next; | 178 | da = next; |
| 179 | } | 179 | } |
| 180 | __dev_set_rx_mode(to); | 180 | __dev_set_rx_mode(to); |
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index 13de6f53f098..848132b6cb73 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c | |||
| @@ -18,6 +18,28 @@ | |||
| 18 | static LIST_HEAD(rules_ops); | 18 | static LIST_HEAD(rules_ops); |
| 19 | static DEFINE_SPINLOCK(rules_mod_lock); | 19 | static DEFINE_SPINLOCK(rules_mod_lock); |
| 20 | 20 | ||
| 21 | int fib_default_rule_add(struct fib_rules_ops *ops, | ||
| 22 | u32 pref, u32 table, u32 flags) | ||
| 23 | { | ||
| 24 | struct fib_rule *r; | ||
| 25 | |||
| 26 | r = kzalloc(ops->rule_size, GFP_KERNEL); | ||
| 27 | if (r == NULL) | ||
| 28 | return -ENOMEM; | ||
| 29 | |||
| 30 | atomic_set(&r->refcnt, 1); | ||
| 31 | r->action = FR_ACT_TO_TBL; | ||
| 32 | r->pref = pref; | ||
| 33 | r->table = table; | ||
| 34 | r->flags = flags; | ||
| 35 | |||
| 36 | /* The lock is not required here, the list in unreacheable | ||
| 37 | * at the moment this function is called */ | ||
| 38 | list_add_tail(&r->list, &ops->rules_list); | ||
| 39 | return 0; | ||
| 40 | } | ||
| 41 | EXPORT_SYMBOL(fib_default_rule_add); | ||
| 42 | |||
| 21 | static void notify_rule_change(int event, struct fib_rule *rule, | 43 | static void notify_rule_change(int event, struct fib_rule *rule, |
| 22 | struct fib_rules_ops *ops, struct nlmsghdr *nlh, | 44 | struct fib_rules_ops *ops, struct nlmsghdr *nlh, |
| 23 | u32 pid); | 45 | u32 pid); |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 97eee5e8fbbe..66663e5d7acd 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
| @@ -293,9 +293,7 @@ static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route * | |||
| 293 | dn_rt_hash_table[hash].chain); | 293 | dn_rt_hash_table[hash].chain); |
| 294 | rcu_assign_pointer(dn_rt_hash_table[hash].chain, rth); | 294 | rcu_assign_pointer(dn_rt_hash_table[hash].chain, rth); |
| 295 | 295 | ||
| 296 | rth->u.dst.__use++; | 296 | dst_use(&rth->u.dst, now); |
| 297 | dst_hold(&rth->u.dst); | ||
| 298 | rth->u.dst.lastuse = now; | ||
| 299 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); | 297 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); |
| 300 | 298 | ||
| 301 | dnrt_drop(rt); | 299 | dnrt_drop(rt); |
| @@ -308,9 +306,7 @@ static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route * | |||
| 308 | rcu_assign_pointer(rt->u.dst.dn_next, dn_rt_hash_table[hash].chain); | 306 | rcu_assign_pointer(rt->u.dst.dn_next, dn_rt_hash_table[hash].chain); |
| 309 | rcu_assign_pointer(dn_rt_hash_table[hash].chain, rt); | 307 | rcu_assign_pointer(dn_rt_hash_table[hash].chain, rt); |
| 310 | 308 | ||
| 311 | dst_hold(&rt->u.dst); | 309 | dst_use(&rt->u.dst, now); |
| 312 | rt->u.dst.__use++; | ||
| 313 | rt->u.dst.lastuse = now; | ||
| 314 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); | 310 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); |
| 315 | *rp = rt; | 311 | *rp = rt; |
| 316 | return 0; | 312 | return 0; |
| @@ -1182,9 +1178,7 @@ static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *fl | |||
| 1182 | (flp->mark == rt->fl.mark) && | 1178 | (flp->mark == rt->fl.mark) && |
| 1183 | (rt->fl.iif == 0) && | 1179 | (rt->fl.iif == 0) && |
| 1184 | (rt->fl.oif == flp->oif)) { | 1180 | (rt->fl.oif == flp->oif)) { |
| 1185 | rt->u.dst.lastuse = jiffies; | 1181 | dst_use(&rt->u.dst, jiffies); |
| 1186 | dst_hold(&rt->u.dst); | ||
| 1187 | rt->u.dst.__use++; | ||
| 1188 | rcu_read_unlock_bh(); | 1182 | rcu_read_unlock_bh(); |
| 1189 | *pprt = &rt->u.dst; | 1183 | *pprt = &rt->u.dst; |
| 1190 | return 0; | 1184 | return 0; |
| @@ -1456,9 +1450,7 @@ int dn_route_input(struct sk_buff *skb) | |||
| 1456 | (rt->fl.oif == 0) && | 1450 | (rt->fl.oif == 0) && |
| 1457 | (rt->fl.mark == skb->mark) && | 1451 | (rt->fl.mark == skb->mark) && |
| 1458 | (rt->fl.iif == cb->iif)) { | 1452 | (rt->fl.iif == cb->iif)) { |
| 1459 | rt->u.dst.lastuse = jiffies; | 1453 | dst_use(&rt->u.dst, jiffies); |
| 1460 | dst_hold(&rt->u.dst); | ||
| 1461 | rt->u.dst.__use++; | ||
| 1462 | rcu_read_unlock(); | 1454 | rcu_read_unlock(); |
| 1463 | skb->dst = (struct dst_entry *)rt; | 1455 | skb->dst = (struct dst_entry *)rt; |
| 1464 | return 0; | 1456 | return 0; |
diff --git a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c index ddd3f04f0919..ffebea04cc99 100644 --- a/net/decnet/dn_rules.c +++ b/net/decnet/dn_rules.c | |||
| @@ -48,15 +48,6 @@ struct dn_fib_rule | |||
| 48 | u8 flags; | 48 | u8 flags; |
| 49 | }; | 49 | }; |
| 50 | 50 | ||
| 51 | static struct dn_fib_rule default_rule = { | ||
| 52 | .common = { | ||
| 53 | .refcnt = ATOMIC_INIT(2), | ||
| 54 | .pref = 0x7fff, | ||
| 55 | .table = RT_TABLE_MAIN, | ||
| 56 | .action = FR_ACT_TO_TBL, | ||
| 57 | }, | ||
| 58 | }; | ||
| 59 | |||
| 60 | 51 | ||
| 61 | int dn_fib_lookup(struct flowi *flp, struct dn_fib_res *res) | 52 | int dn_fib_lookup(struct flowi *flp, struct dn_fib_res *res) |
| 62 | { | 53 | { |
| @@ -262,8 +253,8 @@ static struct fib_rules_ops dn_fib_rules_ops = { | |||
| 262 | 253 | ||
| 263 | void __init dn_fib_rules_init(void) | 254 | void __init dn_fib_rules_init(void) |
| 264 | { | 255 | { |
| 265 | list_add_tail(&default_rule.common.list, | 256 | BUG_ON(fib_default_rule_add(&dn_fib_rules_ops, 0x7fff, |
| 266 | &dn_fib_rules_ops.rules_list); | 257 | RT_TABLE_MAIN, 0)); |
| 267 | fib_rules_register(&dn_fib_rules_ops); | 258 | fib_rules_register(&dn_fib_rules_ops); |
| 268 | } | 259 | } |
| 269 | 260 | ||
diff --git a/net/ieee80211/softmac/ieee80211softmac_wx.c b/net/ieee80211/softmac/ieee80211softmac_wx.c index ac36767b56e8..e01b59aedc54 100644 --- a/net/ieee80211/softmac/ieee80211softmac_wx.c +++ b/net/ieee80211/softmac/ieee80211softmac_wx.c | |||
| @@ -470,7 +470,7 @@ ieee80211softmac_wx_set_mlme(struct net_device *dev, | |||
| 470 | { | 470 | { |
| 471 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); | 471 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); |
| 472 | struct iw_mlme *mlme = (struct iw_mlme *)extra; | 472 | struct iw_mlme *mlme = (struct iw_mlme *)extra; |
| 473 | u16 reason = cpu_to_le16(mlme->reason_code); | 473 | u16 reason = mlme->reason_code; |
| 474 | struct ieee80211softmac_network *net; | 474 | struct ieee80211softmac_network *net; |
| 475 | int err = -EINVAL; | 475 | int err = -EINVAL; |
| 476 | 476 | ||
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index f16839c6a721..a0ada3a8d8dd 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c | |||
| @@ -49,33 +49,6 @@ struct fib4_rule | |||
| 49 | #endif | 49 | #endif |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | static struct fib4_rule default_rule = { | ||
| 53 | .common = { | ||
| 54 | .refcnt = ATOMIC_INIT(2), | ||
| 55 | .pref = 0x7FFF, | ||
| 56 | .table = RT_TABLE_DEFAULT, | ||
| 57 | .action = FR_ACT_TO_TBL, | ||
| 58 | }, | ||
| 59 | }; | ||
| 60 | |||
| 61 | static struct fib4_rule main_rule = { | ||
| 62 | .common = { | ||
| 63 | .refcnt = ATOMIC_INIT(2), | ||
| 64 | .pref = 0x7FFE, | ||
| 65 | .table = RT_TABLE_MAIN, | ||
| 66 | .action = FR_ACT_TO_TBL, | ||
| 67 | }, | ||
| 68 | }; | ||
| 69 | |||
| 70 | static struct fib4_rule local_rule = { | ||
| 71 | .common = { | ||
| 72 | .refcnt = ATOMIC_INIT(2), | ||
| 73 | .table = RT_TABLE_LOCAL, | ||
| 74 | .action = FR_ACT_TO_TBL, | ||
| 75 | .flags = FIB_RULE_PERMANENT, | ||
| 76 | }, | ||
| 77 | }; | ||
| 78 | |||
| 79 | #ifdef CONFIG_NET_CLS_ROUTE | 52 | #ifdef CONFIG_NET_CLS_ROUTE |
| 80 | u32 fib_rules_tclass(struct fib_result *res) | 53 | u32 fib_rules_tclass(struct fib_result *res) |
| 81 | { | 54 | { |
| @@ -319,11 +292,27 @@ static struct fib_rules_ops fib4_rules_ops = { | |||
| 319 | .owner = THIS_MODULE, | 292 | .owner = THIS_MODULE, |
| 320 | }; | 293 | }; |
| 321 | 294 | ||
| 322 | void __init fib4_rules_init(void) | 295 | static int __init fib_default_rules_init(void) |
| 323 | { | 296 | { |
| 324 | list_add_tail(&local_rule.common.list, &fib4_rules_ops.rules_list); | 297 | int err; |
| 325 | list_add_tail(&main_rule.common.list, &fib4_rules_ops.rules_list); | 298 | |
| 326 | list_add_tail(&default_rule.common.list, &fib4_rules_ops.rules_list); | 299 | err = fib_default_rule_add(&fib4_rules_ops, 0, |
| 300 | RT_TABLE_LOCAL, FIB_RULE_PERMANENT); | ||
| 301 | if (err < 0) | ||
| 302 | return err; | ||
| 303 | err = fib_default_rule_add(&fib4_rules_ops, 0x7FFE, | ||
| 304 | RT_TABLE_MAIN, 0); | ||
| 305 | if (err < 0) | ||
| 306 | return err; | ||
| 307 | err = fib_default_rule_add(&fib4_rules_ops, 0x7FFF, | ||
| 308 | RT_TABLE_DEFAULT, 0); | ||
| 309 | if (err < 0) | ||
| 310 | return err; | ||
| 311 | return 0; | ||
| 312 | } | ||
| 327 | 313 | ||
| 314 | void __init fib4_rules_init(void) | ||
| 315 | { | ||
| 316 | BUG_ON(fib_default_rules_init()); | ||
| 328 | fib_rules_register(&fib4_rules_ops); | 317 | fib_rules_register(&fib4_rules_ops); |
| 329 | } | 318 | } |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 21b12de9e653..45651834e1e2 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -851,9 +851,7 @@ restart: | |||
| 851 | */ | 851 | */ |
| 852 | rcu_assign_pointer(rt_hash_table[hash].chain, rth); | 852 | rcu_assign_pointer(rt_hash_table[hash].chain, rth); |
| 853 | 853 | ||
| 854 | rth->u.dst.__use++; | 854 | dst_use(&rth->u.dst, now); |
| 855 | dst_hold(&rth->u.dst); | ||
| 856 | rth->u.dst.lastuse = now; | ||
| 857 | spin_unlock_bh(rt_hash_lock_addr(hash)); | 855 | spin_unlock_bh(rt_hash_lock_addr(hash)); |
| 858 | 856 | ||
| 859 | rt_drop(rt); | 857 | rt_drop(rt); |
| @@ -1813,11 +1811,6 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
| 1813 | goto martian_destination; | 1811 | goto martian_destination; |
| 1814 | 1812 | ||
| 1815 | err = ip_mkroute_input(skb, &res, &fl, in_dev, daddr, saddr, tos); | 1813 | err = ip_mkroute_input(skb, &res, &fl, in_dev, daddr, saddr, tos); |
| 1816 | if (err == -ENOBUFS) | ||
| 1817 | goto e_nobufs; | ||
| 1818 | if (err == -EINVAL) | ||
| 1819 | goto e_inval; | ||
| 1820 | |||
| 1821 | done: | 1814 | done: |
| 1822 | in_dev_put(in_dev); | 1815 | in_dev_put(in_dev); |
| 1823 | if (free_res) | 1816 | if (free_res) |
| @@ -1935,9 +1928,7 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
| 1935 | rth->fl.oif == 0 && | 1928 | rth->fl.oif == 0 && |
| 1936 | rth->fl.mark == skb->mark && | 1929 | rth->fl.mark == skb->mark && |
| 1937 | rth->fl.fl4_tos == tos) { | 1930 | rth->fl.fl4_tos == tos) { |
| 1938 | rth->u.dst.lastuse = jiffies; | 1931 | dst_use(&rth->u.dst, jiffies); |
| 1939 | dst_hold(&rth->u.dst); | ||
| 1940 | rth->u.dst.__use++; | ||
| 1941 | RT_CACHE_STAT_INC(in_hit); | 1932 | RT_CACHE_STAT_INC(in_hit); |
| 1942 | rcu_read_unlock(); | 1933 | rcu_read_unlock(); |
| 1943 | skb->dst = (struct dst_entry*)rth; | 1934 | skb->dst = (struct dst_entry*)rth; |
| @@ -2331,9 +2322,7 @@ int __ip_route_output_key(struct rtable **rp, const struct flowi *flp) | |||
| 2331 | rth->fl.mark == flp->mark && | 2322 | rth->fl.mark == flp->mark && |
| 2332 | !((rth->fl.fl4_tos ^ flp->fl4_tos) & | 2323 | !((rth->fl.fl4_tos ^ flp->fl4_tos) & |
| 2333 | (IPTOS_RT_MASK | RTO_ONLINK))) { | 2324 | (IPTOS_RT_MASK | RTO_ONLINK))) { |
| 2334 | rth->u.dst.lastuse = jiffies; | 2325 | dst_use(&rth->u.dst, jiffies); |
| 2335 | dst_hold(&rth->u.dst); | ||
| 2336 | rth->u.dst.__use++; | ||
| 2337 | RT_CACHE_STAT_INC(out_hit); | 2326 | RT_CACHE_STAT_INC(out_hit); |
| 2338 | rcu_read_unlock_bh(); | 2327 | rcu_read_unlock_bh(); |
| 2339 | *rp = rth; | 2328 | *rp = rth; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index ca9590f4f520..20c9440ab85e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -1400,11 +1400,9 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
| 1400 | /* DSACK info lost if out-of-mem, try SACK still */ | 1400 | /* DSACK info lost if out-of-mem, try SACK still */ |
| 1401 | if (in_sack <= 0) | 1401 | if (in_sack <= 0) |
| 1402 | in_sack = tcp_match_skb_to_sack(sk, skb, start_seq, end_seq); | 1402 | in_sack = tcp_match_skb_to_sack(sk, skb, start_seq, end_seq); |
| 1403 | if (in_sack < 0) | 1403 | if (unlikely(in_sack < 0)) |
| 1404 | break; | 1404 | break; |
| 1405 | 1405 | ||
| 1406 | fack_count += tcp_skb_pcount(skb); | ||
| 1407 | |||
| 1408 | sacked = TCP_SKB_CB(skb)->sacked; | 1406 | sacked = TCP_SKB_CB(skb)->sacked; |
| 1409 | 1407 | ||
| 1410 | /* Account D-SACK for retransmitted packet. */ | 1408 | /* Account D-SACK for retransmitted packet. */ |
| @@ -1419,19 +1417,17 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
| 1419 | if ((dup_sack && in_sack) && | 1417 | if ((dup_sack && in_sack) && |
| 1420 | (sacked&TCPCB_SACKED_ACKED)) | 1418 | (sacked&TCPCB_SACKED_ACKED)) |
| 1421 | reord = min(fack_count, reord); | 1419 | reord = min(fack_count, reord); |
| 1422 | } else { | ||
| 1423 | /* If it was in a hole, we detected reordering. */ | ||
| 1424 | if (fack_count < prior_fackets && | ||
| 1425 | !(sacked&TCPCB_SACKED_ACKED)) | ||
| 1426 | reord = min(fack_count, reord); | ||
| 1427 | } | 1420 | } |
| 1428 | 1421 | ||
| 1429 | /* Nothing to do; acked frame is about to be dropped. */ | 1422 | /* Nothing to do; acked frame is about to be dropped. */ |
| 1423 | fack_count += tcp_skb_pcount(skb); | ||
| 1430 | continue; | 1424 | continue; |
| 1431 | } | 1425 | } |
| 1432 | 1426 | ||
| 1433 | if (!in_sack) | 1427 | if (!in_sack) { |
| 1428 | fack_count += tcp_skb_pcount(skb); | ||
| 1434 | continue; | 1429 | continue; |
| 1430 | } | ||
| 1435 | 1431 | ||
| 1436 | if (!(sacked&TCPCB_SACKED_ACKED)) { | 1432 | if (!(sacked&TCPCB_SACKED_ACKED)) { |
| 1437 | if (sacked & TCPCB_SACKED_RETRANS) { | 1433 | if (sacked & TCPCB_SACKED_RETRANS) { |
| @@ -1448,12 +1444,17 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
| 1448 | tp->retransmit_skb_hint = NULL; | 1444 | tp->retransmit_skb_hint = NULL; |
| 1449 | } | 1445 | } |
| 1450 | } else { | 1446 | } else { |
| 1451 | /* New sack for not retransmitted frame, | 1447 | if (!(sacked & TCPCB_RETRANS)) { |
| 1452 | * which was in hole. It is reordering. | 1448 | /* New sack for not retransmitted frame, |
| 1453 | */ | 1449 | * which was in hole. It is reordering. |
| 1454 | if (!(sacked & TCPCB_RETRANS) && | 1450 | */ |
| 1455 | fack_count < prior_fackets) | 1451 | if (fack_count < prior_fackets) |
| 1456 | reord = min(fack_count, reord); | 1452 | reord = min(fack_count, reord); |
| 1453 | |||
| 1454 | /* SACK enhanced F-RTO (RFC4138; Appendix B) */ | ||
| 1455 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->frto_highmark)) | ||
| 1456 | flag |= FLAG_ONLY_ORIG_SACKED; | ||
| 1457 | } | ||
| 1457 | 1458 | ||
| 1458 | if (sacked & TCPCB_LOST) { | 1459 | if (sacked & TCPCB_LOST) { |
| 1459 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_LOST; | 1460 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_LOST; |
| @@ -1462,24 +1463,13 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
| 1462 | /* clear lost hint */ | 1463 | /* clear lost hint */ |
| 1463 | tp->retransmit_skb_hint = NULL; | 1464 | tp->retransmit_skb_hint = NULL; |
| 1464 | } | 1465 | } |
| 1465 | /* SACK enhanced F-RTO detection. | ||
| 1466 | * Set flag if and only if non-rexmitted | ||
| 1467 | * segments below frto_highmark are | ||
| 1468 | * SACKed (RFC4138; Appendix B). | ||
| 1469 | * Clearing correct due to in-order walk | ||
| 1470 | */ | ||
| 1471 | if (after(end_seq, tp->frto_highmark)) { | ||
| 1472 | flag &= ~FLAG_ONLY_ORIG_SACKED; | ||
| 1473 | } else { | ||
| 1474 | if (!(sacked & TCPCB_RETRANS)) | ||
| 1475 | flag |= FLAG_ONLY_ORIG_SACKED; | ||
| 1476 | } | ||
| 1477 | } | 1466 | } |
| 1478 | 1467 | ||
| 1479 | TCP_SKB_CB(skb)->sacked |= TCPCB_SACKED_ACKED; | 1468 | TCP_SKB_CB(skb)->sacked |= TCPCB_SACKED_ACKED; |
| 1480 | flag |= FLAG_DATA_SACKED; | 1469 | flag |= FLAG_DATA_SACKED; |
| 1481 | tp->sacked_out += tcp_skb_pcount(skb); | 1470 | tp->sacked_out += tcp_skb_pcount(skb); |
| 1482 | 1471 | ||
| 1472 | fack_count += tcp_skb_pcount(skb); | ||
| 1483 | if (fack_count > tp->fackets_out) | 1473 | if (fack_count > tp->fackets_out) |
| 1484 | tp->fackets_out = fack_count; | 1474 | tp->fackets_out = fack_count; |
| 1485 | 1475 | ||
| @@ -1490,6 +1480,8 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
| 1490 | } else { | 1480 | } else { |
| 1491 | if (dup_sack && (sacked&TCPCB_RETRANS)) | 1481 | if (dup_sack && (sacked&TCPCB_RETRANS)) |
| 1492 | reord = min(fack_count, reord); | 1482 | reord = min(fack_count, reord); |
| 1483 | |||
| 1484 | fack_count += tcp_skb_pcount(skb); | ||
| 1493 | } | 1485 | } |
| 1494 | 1486 | ||
| 1495 | /* D-SACK. We can detect redundant retransmission | 1487 | /* D-SACK. We can detect redundant retransmission |
| @@ -1504,6 +1496,12 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
| 1504 | tp->retransmit_skb_hint = NULL; | 1496 | tp->retransmit_skb_hint = NULL; |
| 1505 | } | 1497 | } |
| 1506 | } | 1498 | } |
| 1499 | |||
| 1500 | /* SACK enhanced FRTO (RFC4138, Appendix B): Clearing correct | ||
| 1501 | * due to in-order walk | ||
| 1502 | */ | ||
| 1503 | if (after(end_seq, tp->frto_highmark)) | ||
| 1504 | flag &= ~FLAG_ONLY_ORIG_SACKED; | ||
| 1507 | } | 1505 | } |
| 1508 | 1506 | ||
| 1509 | if (tp->retrans_out && | 1507 | if (tp->retrans_out && |
| @@ -1515,7 +1513,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
| 1515 | 1513 | ||
| 1516 | if ((reord < tp->fackets_out) && icsk->icsk_ca_state != TCP_CA_Loss && | 1514 | if ((reord < tp->fackets_out) && icsk->icsk_ca_state != TCP_CA_Loss && |
| 1517 | (!tp->frto_highmark || after(tp->snd_una, tp->frto_highmark))) | 1515 | (!tp->frto_highmark || after(tp->snd_una, tp->frto_highmark))) |
| 1518 | tcp_update_reordering(sk, ((tp->fackets_out + 1) - reord), 0); | 1516 | tcp_update_reordering(sk, tp->fackets_out - reord, 0); |
| 1519 | 1517 | ||
| 1520 | #if FASTRETRANS_DEBUG > 0 | 1518 | #if FASTRETRANS_DEBUG > 0 |
| 1521 | BUG_TRAP((int)tp->sacked_out >= 0); | 1519 | BUG_TRAP((int)tp->sacked_out >= 0); |
| @@ -2630,7 +2628,8 @@ static u32 tcp_tso_acked(struct sock *sk, struct sk_buff *skb) | |||
| 2630 | * is before the ack sequence we can discard it as it's confirmed to have | 2628 | * is before the ack sequence we can discard it as it's confirmed to have |
| 2631 | * arrived at the other end. | 2629 | * arrived at the other end. |
| 2632 | */ | 2630 | */ |
| 2633 | static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p) | 2631 | static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p, |
| 2632 | int prior_fackets) | ||
| 2634 | { | 2633 | { |
| 2635 | struct tcp_sock *tp = tcp_sk(sk); | 2634 | struct tcp_sock *tp = tcp_sk(sk); |
| 2636 | const struct inet_connection_sock *icsk = inet_csk(sk); | 2635 | const struct inet_connection_sock *icsk = inet_csk(sk); |
| @@ -2639,6 +2638,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p) | |||
| 2639 | int fully_acked = 1; | 2638 | int fully_acked = 1; |
| 2640 | int flag = 0; | 2639 | int flag = 0; |
| 2641 | int prior_packets = tp->packets_out; | 2640 | int prior_packets = tp->packets_out; |
| 2641 | u32 cnt = 0; | ||
| 2642 | u32 reord = tp->packets_out; | ||
| 2642 | s32 seq_rtt = -1; | 2643 | s32 seq_rtt = -1; |
| 2643 | ktime_t last_ackt = net_invalid_timestamp(); | 2644 | ktime_t last_ackt = net_invalid_timestamp(); |
| 2644 | 2645 | ||
| @@ -2679,10 +2680,14 @@ static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p) | |||
| 2679 | if ((flag & FLAG_DATA_ACKED) || | 2680 | if ((flag & FLAG_DATA_ACKED) || |
| 2680 | (packets_acked > 1)) | 2681 | (packets_acked > 1)) |
| 2681 | flag |= FLAG_NONHEAD_RETRANS_ACKED; | 2682 | flag |= FLAG_NONHEAD_RETRANS_ACKED; |
| 2682 | } else if (seq_rtt < 0) { | 2683 | } else { |
| 2683 | seq_rtt = now - scb->when; | 2684 | if (seq_rtt < 0) { |
| 2684 | if (fully_acked) | 2685 | seq_rtt = now - scb->when; |
| 2685 | last_ackt = skb->tstamp; | 2686 | if (fully_acked) |
| 2687 | last_ackt = skb->tstamp; | ||
| 2688 | } | ||
| 2689 | if (!(sacked & TCPCB_SACKED_ACKED)) | ||
| 2690 | reord = min(cnt, reord); | ||
| 2686 | } | 2691 | } |
| 2687 | 2692 | ||
| 2688 | if (sacked & TCPCB_SACKED_ACKED) | 2693 | if (sacked & TCPCB_SACKED_ACKED) |
| @@ -2693,12 +2698,16 @@ static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p) | |||
| 2693 | if ((sacked & TCPCB_URG) && tp->urg_mode && | 2698 | if ((sacked & TCPCB_URG) && tp->urg_mode && |
| 2694 | !before(end_seq, tp->snd_up)) | 2699 | !before(end_seq, tp->snd_up)) |
| 2695 | tp->urg_mode = 0; | 2700 | tp->urg_mode = 0; |
| 2696 | } else if (seq_rtt < 0) { | 2701 | } else { |
| 2697 | seq_rtt = now - scb->when; | 2702 | if (seq_rtt < 0) { |
| 2698 | if (fully_acked) | 2703 | seq_rtt = now - scb->when; |
| 2699 | last_ackt = skb->tstamp; | 2704 | if (fully_acked) |
| 2705 | last_ackt = skb->tstamp; | ||
| 2706 | } | ||
| 2707 | reord = min(cnt, reord); | ||
| 2700 | } | 2708 | } |
| 2701 | tp->packets_out -= packets_acked; | 2709 | tp->packets_out -= packets_acked; |
| 2710 | cnt += packets_acked; | ||
| 2702 | 2711 | ||
| 2703 | /* Initial outgoing SYN's get put onto the write_queue | 2712 | /* Initial outgoing SYN's get put onto the write_queue |
| 2704 | * just like anything else we transmit. It is not | 2713 | * just like anything else we transmit. It is not |
| @@ -2730,13 +2739,18 @@ static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p) | |||
| 2730 | tcp_ack_update_rtt(sk, flag, seq_rtt); | 2739 | tcp_ack_update_rtt(sk, flag, seq_rtt); |
| 2731 | tcp_rearm_rto(sk); | 2740 | tcp_rearm_rto(sk); |
| 2732 | 2741 | ||
| 2742 | if (tcp_is_reno(tp)) { | ||
| 2743 | tcp_remove_reno_sacks(sk, pkts_acked); | ||
| 2744 | } else { | ||
| 2745 | /* Non-retransmitted hole got filled? That's reordering */ | ||
| 2746 | if (reord < prior_fackets) | ||
| 2747 | tcp_update_reordering(sk, tp->fackets_out - reord, 0); | ||
| 2748 | } | ||
| 2749 | |||
| 2733 | tp->fackets_out -= min(pkts_acked, tp->fackets_out); | 2750 | tp->fackets_out -= min(pkts_acked, tp->fackets_out); |
| 2734 | /* hint's skb might be NULL but we don't need to care */ | 2751 | /* hint's skb might be NULL but we don't need to care */ |
| 2735 | tp->fastpath_cnt_hint -= min_t(u32, pkts_acked, | 2752 | tp->fastpath_cnt_hint -= min_t(u32, pkts_acked, |
| 2736 | tp->fastpath_cnt_hint); | 2753 | tp->fastpath_cnt_hint); |
| 2737 | if (tcp_is_reno(tp)) | ||
| 2738 | tcp_remove_reno_sacks(sk, pkts_acked); | ||
| 2739 | |||
| 2740 | if (ca_ops->pkts_acked) { | 2754 | if (ca_ops->pkts_acked) { |
| 2741 | s32 rtt_us = -1; | 2755 | s32 rtt_us = -1; |
| 2742 | 2756 | ||
| @@ -3019,6 +3033,7 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag) | |||
| 3019 | u32 ack_seq = TCP_SKB_CB(skb)->seq; | 3033 | u32 ack_seq = TCP_SKB_CB(skb)->seq; |
| 3020 | u32 ack = TCP_SKB_CB(skb)->ack_seq; | 3034 | u32 ack = TCP_SKB_CB(skb)->ack_seq; |
| 3021 | u32 prior_in_flight; | 3035 | u32 prior_in_flight; |
| 3036 | u32 prior_fackets; | ||
| 3022 | s32 seq_rtt; | 3037 | s32 seq_rtt; |
| 3023 | int prior_packets; | 3038 | int prior_packets; |
| 3024 | int frto_cwnd = 0; | 3039 | int frto_cwnd = 0; |
| @@ -3043,6 +3058,8 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag) | |||
| 3043 | tp->bytes_acked += min(ack - prior_snd_una, tp->mss_cache); | 3058 | tp->bytes_acked += min(ack - prior_snd_una, tp->mss_cache); |
| 3044 | } | 3059 | } |
| 3045 | 3060 | ||
| 3061 | prior_fackets = tp->fackets_out; | ||
| 3062 | |||
| 3046 | if (!(flag&FLAG_SLOWPATH) && after(ack, prior_snd_una)) { | 3063 | if (!(flag&FLAG_SLOWPATH) && after(ack, prior_snd_una)) { |
| 3047 | /* Window is constant, pure forward advance. | 3064 | /* Window is constant, pure forward advance. |
| 3048 | * No more checks are required. | 3065 | * No more checks are required. |
| @@ -3084,7 +3101,7 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag) | |||
| 3084 | prior_in_flight = tcp_packets_in_flight(tp); | 3101 | prior_in_flight = tcp_packets_in_flight(tp); |
| 3085 | 3102 | ||
| 3086 | /* See if we can take anything off of the retransmit queue. */ | 3103 | /* See if we can take anything off of the retransmit queue. */ |
| 3087 | flag |= tcp_clean_rtx_queue(sk, &seq_rtt); | 3104 | flag |= tcp_clean_rtx_queue(sk, &seq_rtt, prior_fackets); |
| 3088 | 3105 | ||
| 3089 | /* Guarantee sacktag reordering detection against wrap-arounds */ | 3106 | /* Guarantee sacktag reordering detection against wrap-arounds */ |
| 3090 | if (before(tp->frto_highmark, tp->snd_una)) | 3107 | if (before(tp->frto_highmark, tp->snd_una)) |
diff --git a/net/ipv4/tunnel4.c b/net/ipv4/tunnel4.c index a794a8ca8b4f..978b3fd61e65 100644 --- a/net/ipv4/tunnel4.c +++ b/net/ipv4/tunnel4.c | |||
| @@ -17,6 +17,11 @@ static struct xfrm_tunnel *tunnel4_handlers; | |||
| 17 | static struct xfrm_tunnel *tunnel64_handlers; | 17 | static struct xfrm_tunnel *tunnel64_handlers; |
| 18 | static DEFINE_MUTEX(tunnel4_mutex); | 18 | static DEFINE_MUTEX(tunnel4_mutex); |
| 19 | 19 | ||
| 20 | static inline struct xfrm_tunnel **fam_handlers(unsigned short family) | ||
| 21 | { | ||
| 22 | return (family == AF_INET) ? &tunnel4_handlers : &tunnel64_handlers; | ||
| 23 | } | ||
| 24 | |||
| 20 | int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family) | 25 | int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family) |
| 21 | { | 26 | { |
| 22 | struct xfrm_tunnel **pprev; | 27 | struct xfrm_tunnel **pprev; |
| @@ -25,8 +30,7 @@ int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family) | |||
| 25 | 30 | ||
| 26 | mutex_lock(&tunnel4_mutex); | 31 | mutex_lock(&tunnel4_mutex); |
| 27 | 32 | ||
| 28 | for (pprev = (family == AF_INET) ? &tunnel4_handlers : &tunnel64_handlers; | 33 | for (pprev = fam_handlers(family); *pprev; pprev = &(*pprev)->next) { |
| 29 | *pprev; pprev = &(*pprev)->next) { | ||
| 30 | if ((*pprev)->priority > priority) | 34 | if ((*pprev)->priority > priority) |
| 31 | break; | 35 | break; |
| 32 | if ((*pprev)->priority == priority) | 36 | if ((*pprev)->priority == priority) |
| @@ -53,8 +57,7 @@ int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family) | |||
| 53 | 57 | ||
| 54 | mutex_lock(&tunnel4_mutex); | 58 | mutex_lock(&tunnel4_mutex); |
| 55 | 59 | ||
| 56 | for (pprev = (family == AF_INET) ? &tunnel4_handlers : &tunnel64_handlers; | 60 | for (pprev = fam_handlers(family); *pprev; pprev = &(*pprev)->next) { |
| 57 | *pprev; pprev = &(*pprev)->next) { | ||
| 58 | if (*pprev == handler) { | 61 | if (*pprev == handler) { |
| 59 | *pprev = handler->next; | 62 | *pprev = handler->next; |
| 60 | ret = 0; | 63 | ret = 0; |
| @@ -118,6 +121,17 @@ static void tunnel4_err(struct sk_buff *skb, u32 info) | |||
| 118 | break; | 121 | break; |
| 119 | } | 122 | } |
| 120 | 123 | ||
| 124 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 125 | static void tunnel64_err(struct sk_buff *skb, u32 info) | ||
| 126 | { | ||
| 127 | struct xfrm_tunnel *handler; | ||
| 128 | |||
| 129 | for (handler = tunnel64_handlers; handler; handler = handler->next) | ||
| 130 | if (!handler->err_handler(skb, info)) | ||
| 131 | break; | ||
| 132 | } | ||
| 133 | #endif | ||
| 134 | |||
| 121 | static struct net_protocol tunnel4_protocol = { | 135 | static struct net_protocol tunnel4_protocol = { |
| 122 | .handler = tunnel4_rcv, | 136 | .handler = tunnel4_rcv, |
| 123 | .err_handler = tunnel4_err, | 137 | .err_handler = tunnel4_err, |
| @@ -127,7 +141,7 @@ static struct net_protocol tunnel4_protocol = { | |||
| 127 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 141 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| 128 | static struct net_protocol tunnel64_protocol = { | 142 | static struct net_protocol tunnel64_protocol = { |
| 129 | .handler = tunnel64_rcv, | 143 | .handler = tunnel64_rcv, |
| 130 | .err_handler = tunnel4_err, | 144 | .err_handler = tunnel64_err, |
| 131 | .no_policy = 1, | 145 | .no_policy = 1, |
| 132 | }; | 146 | }; |
| 133 | #endif | 147 | #endif |
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 706622af206f..428c6b0e26d8 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c | |||
| @@ -31,25 +31,6 @@ struct fib6_rule | |||
| 31 | 31 | ||
| 32 | static struct fib_rules_ops fib6_rules_ops; | 32 | static struct fib_rules_ops fib6_rules_ops; |
| 33 | 33 | ||
| 34 | static struct fib6_rule main_rule = { | ||
| 35 | .common = { | ||
| 36 | .refcnt = ATOMIC_INIT(2), | ||
| 37 | .pref = 0x7FFE, | ||
| 38 | .action = FR_ACT_TO_TBL, | ||
| 39 | .table = RT6_TABLE_MAIN, | ||
| 40 | }, | ||
| 41 | }; | ||
| 42 | |||
| 43 | static struct fib6_rule local_rule = { | ||
| 44 | .common = { | ||
| 45 | .refcnt = ATOMIC_INIT(2), | ||
| 46 | .pref = 0, | ||
| 47 | .action = FR_ACT_TO_TBL, | ||
| 48 | .table = RT6_TABLE_LOCAL, | ||
| 49 | .flags = FIB_RULE_PERMANENT, | ||
| 50 | }, | ||
| 51 | }; | ||
| 52 | |||
| 53 | struct dst_entry *fib6_rule_lookup(struct flowi *fl, int flags, | 34 | struct dst_entry *fib6_rule_lookup(struct flowi *fl, int flags, |
| 54 | pol_lookup_t lookup) | 35 | pol_lookup_t lookup) |
| 55 | { | 36 | { |
| @@ -270,11 +251,23 @@ static struct fib_rules_ops fib6_rules_ops = { | |||
| 270 | .owner = THIS_MODULE, | 251 | .owner = THIS_MODULE, |
| 271 | }; | 252 | }; |
| 272 | 253 | ||
| 273 | void __init fib6_rules_init(void) | 254 | static int __init fib6_default_rules_init(void) |
| 274 | { | 255 | { |
| 275 | list_add_tail(&local_rule.common.list, &fib6_rules_ops.rules_list); | 256 | int err; |
| 276 | list_add_tail(&main_rule.common.list, &fib6_rules_ops.rules_list); | 257 | |
| 258 | err = fib_default_rule_add(&fib6_rules_ops, 0, | ||
| 259 | RT6_TABLE_LOCAL, FIB_RULE_PERMANENT); | ||
| 260 | if (err < 0) | ||
| 261 | return err; | ||
| 262 | err = fib_default_rule_add(&fib6_rules_ops, 0x7FFE, RT6_TABLE_MAIN, 0); | ||
| 263 | if (err < 0) | ||
| 264 | return err; | ||
| 265 | return 0; | ||
| 266 | } | ||
| 277 | 267 | ||
| 268 | void __init fib6_rules_init(void) | ||
| 269 | { | ||
| 270 | BUG_ON(fib6_default_rules_init()); | ||
| 278 | fib_rules_register(&fib6_rules_ops); | 271 | fib_rules_register(&fib6_rules_ops); |
| 279 | } | 272 | } |
| 280 | 273 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 973a97abc446..6ecb5e6fae2e 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -544,12 +544,8 @@ restart: | |||
| 544 | rt = rt6_device_match(rt, fl->oif, flags); | 544 | rt = rt6_device_match(rt, fl->oif, flags); |
| 545 | BACKTRACK(&fl->fl6_src); | 545 | BACKTRACK(&fl->fl6_src); |
| 546 | out: | 546 | out: |
| 547 | dst_hold(&rt->u.dst); | 547 | dst_use(&rt->u.dst, jiffies); |
| 548 | read_unlock_bh(&table->tb6_lock); | 548 | read_unlock_bh(&table->tb6_lock); |
| 549 | |||
| 550 | rt->u.dst.lastuse = jiffies; | ||
| 551 | rt->u.dst.__use++; | ||
| 552 | |||
| 553 | return rt; | 549 | return rt; |
| 554 | 550 | ||
| 555 | } | 551 | } |
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index a195a66e0cc7..c76a9523091b 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c | |||
| @@ -92,11 +92,6 @@ extern int ipxrtr_route_skb(struct sk_buff *skb); | |||
| 92 | extern struct ipx_route *ipxrtr_lookup(__be32 net); | 92 | extern struct ipx_route *ipxrtr_lookup(__be32 net); |
| 93 | extern int ipxrtr_ioctl(unsigned int cmd, void __user *arg); | 93 | extern int ipxrtr_ioctl(unsigned int cmd, void __user *arg); |
| 94 | 94 | ||
| 95 | #undef IPX_REFCNT_DEBUG | ||
| 96 | #ifdef IPX_REFCNT_DEBUG | ||
| 97 | atomic_t ipx_sock_nr; | ||
| 98 | #endif | ||
| 99 | |||
| 100 | struct ipx_interface *ipx_interfaces_head(void) | 95 | struct ipx_interface *ipx_interfaces_head(void) |
| 101 | { | 96 | { |
| 102 | struct ipx_interface *rc = NULL; | 97 | struct ipx_interface *rc = NULL; |
| @@ -151,14 +146,7 @@ static void ipx_destroy_socket(struct sock *sk) | |||
| 151 | { | 146 | { |
| 152 | ipx_remove_socket(sk); | 147 | ipx_remove_socket(sk); |
| 153 | skb_queue_purge(&sk->sk_receive_queue); | 148 | skb_queue_purge(&sk->sk_receive_queue); |
| 154 | #ifdef IPX_REFCNT_DEBUG | 149 | sk_refcnt_debug_dec(sk); |
| 155 | atomic_dec(&ipx_sock_nr); | ||
| 156 | printk(KERN_DEBUG "IPX socket %p released, %d are still alive\n", sk, | ||
| 157 | atomic_read(&ipx_sock_nr)); | ||
| 158 | if (atomic_read(&sk->sk_refcnt) != 1) | ||
| 159 | printk(KERN_DEBUG "Destruction sock ipx %p delayed, cnt=%d\n", | ||
| 160 | sk, atomic_read(&sk->sk_refcnt)); | ||
| 161 | #endif | ||
| 162 | sock_put(sk); | 150 | sock_put(sk); |
| 163 | } | 151 | } |
| 164 | 152 | ||
| @@ -1384,11 +1372,8 @@ static int ipx_create(struct net *net, struct socket *sock, int protocol) | |||
| 1384 | sk = sk_alloc(net, PF_IPX, GFP_KERNEL, &ipx_proto); | 1372 | sk = sk_alloc(net, PF_IPX, GFP_KERNEL, &ipx_proto); |
| 1385 | if (!sk) | 1373 | if (!sk) |
| 1386 | goto out; | 1374 | goto out; |
| 1387 | #ifdef IPX_REFCNT_DEBUG | 1375 | |
| 1388 | atomic_inc(&ipx_sock_nr); | 1376 | sk_refcnt_debug_inc(sk); |
| 1389 | printk(KERN_DEBUG "IPX socket %p created, now we have %d alive\n", sk, | ||
| 1390 | atomic_read(&ipx_sock_nr)); | ||
| 1391 | #endif | ||
| 1392 | sock_init_data(sock, sk); | 1377 | sock_init_data(sock, sk); |
| 1393 | sk->sk_no_check = 1; /* Checksum off by default */ | 1378 | sk->sk_no_check = 1; /* Checksum off by default */ |
| 1394 | sock->ops = &ipx_dgram_ops; | 1379 | sock->ops = &ipx_dgram_ops; |
| @@ -1409,6 +1394,7 @@ static int ipx_release(struct socket *sock) | |||
| 1409 | 1394 | ||
| 1410 | sock_set_flag(sk, SOCK_DEAD); | 1395 | sock_set_flag(sk, SOCK_DEAD); |
| 1411 | sock->sk = NULL; | 1396 | sock->sk = NULL; |
| 1397 | sk_refcnt_debug_release(sk); | ||
| 1412 | ipx_destroy_socket(sk); | 1398 | ipx_destroy_socket(sk); |
| 1413 | out: | 1399 | out: |
| 1414 | return 0; | 1400 | return 0; |
diff --git a/net/mac80211/Kconfig b/net/mac80211/Kconfig index 6fffb3845ab6..ce176e691afe 100644 --- a/net/mac80211/Kconfig +++ b/net/mac80211/Kconfig | |||
| @@ -13,6 +13,18 @@ config MAC80211 | |||
| 13 | This option enables the hardware independent IEEE 802.11 | 13 | This option enables the hardware independent IEEE 802.11 |
| 14 | networking stack. | 14 | networking stack. |
| 15 | 15 | ||
| 16 | config MAC80211_RCSIMPLE | ||
| 17 | bool "'simple' rate control algorithm" if EMBEDDED | ||
| 18 | default y | ||
| 19 | depends on MAC80211 | ||
| 20 | help | ||
| 21 | This option allows you to turn off the 'simple' rate | ||
| 22 | control algorithm in mac80211. If you do turn it off, | ||
| 23 | you absolutely need another rate control algorithm. | ||
| 24 | |||
| 25 | Say Y unless you know you will have another algorithm | ||
| 26 | available. | ||
| 27 | |||
| 16 | config MAC80211_LEDS | 28 | config MAC80211_LEDS |
| 17 | bool "Enable LED triggers" | 29 | bool "Enable LED triggers" |
| 18 | depends on MAC80211 && LEDS_TRIGGERS | 30 | depends on MAC80211 && LEDS_TRIGGERS |
diff --git a/net/mac80211/Makefile b/net/mac80211/Makefile index 219cd9f9341f..1e6237b34846 100644 --- a/net/mac80211/Makefile +++ b/net/mac80211/Makefile | |||
| @@ -1,8 +1,9 @@ | |||
| 1 | obj-$(CONFIG_MAC80211) += mac80211.o rc80211_simple.o | 1 | obj-$(CONFIG_MAC80211) += mac80211.o |
| 2 | 2 | ||
| 3 | mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o | 3 | mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o |
| 4 | mac80211-objs-$(CONFIG_MAC80211_DEBUGFS) += debugfs.o debugfs_sta.o debugfs_netdev.o debugfs_key.o | 4 | mac80211-objs-$(CONFIG_MAC80211_DEBUGFS) += debugfs.o debugfs_sta.o debugfs_netdev.o debugfs_key.o |
| 5 | mac80211-objs-$(CONFIG_NET_SCHED) += wme.o | 5 | mac80211-objs-$(CONFIG_NET_SCHED) += wme.o |
| 6 | mac80211-objs-$(CONFIG_MAC80211_RCSIMPLE) += rc80211_simple.o | ||
| 6 | 7 | ||
| 7 | mac80211-objs := \ | 8 | mac80211-objs := \ |
| 8 | ieee80211.o \ | 9 | ieee80211.o \ |
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index f484ca7ade9c..e0ee65a969bc 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
| @@ -1072,7 +1072,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
| 1072 | ieee80211_debugfs_add_netdev(IEEE80211_DEV_TO_SUB_IF(local->mdev)); | 1072 | ieee80211_debugfs_add_netdev(IEEE80211_DEV_TO_SUB_IF(local->mdev)); |
| 1073 | ieee80211_if_set_type(local->mdev, IEEE80211_IF_TYPE_AP); | 1073 | ieee80211_if_set_type(local->mdev, IEEE80211_IF_TYPE_AP); |
| 1074 | 1074 | ||
| 1075 | result = ieee80211_init_rate_ctrl_alg(local, NULL); | 1075 | result = ieee80211_init_rate_ctrl_alg(local, |
| 1076 | hw->rate_control_algorithm); | ||
| 1076 | if (result < 0) { | 1077 | if (result < 0) { |
| 1077 | printk(KERN_DEBUG "%s: Failed to initialize rate control " | 1078 | printk(KERN_DEBUG "%s: Failed to initialize rate control " |
| 1078 | "algorithm\n", wiphy_name(local->hw.wiphy)); | 1079 | "algorithm\n", wiphy_name(local->hw.wiphy)); |
| @@ -1233,8 +1234,17 @@ static int __init ieee80211_init(void) | |||
| 1233 | 1234 | ||
| 1234 | BUILD_BUG_ON(sizeof(struct ieee80211_tx_packet_data) > sizeof(skb->cb)); | 1235 | BUILD_BUG_ON(sizeof(struct ieee80211_tx_packet_data) > sizeof(skb->cb)); |
| 1235 | 1236 | ||
| 1237 | #ifdef CONFIG_MAC80211_RCSIMPLE | ||
| 1238 | ret = ieee80211_rate_control_register(&mac80211_rcsimple); | ||
| 1239 | if (ret) | ||
| 1240 | return ret; | ||
| 1241 | #endif | ||
| 1242 | |||
| 1236 | ret = ieee80211_wme_register(); | 1243 | ret = ieee80211_wme_register(); |
| 1237 | if (ret) { | 1244 | if (ret) { |
| 1245 | #ifdef CONFIG_MAC80211_RCSIMPLE | ||
| 1246 | ieee80211_rate_control_unregister(&mac80211_rcsimple); | ||
| 1247 | #endif | ||
| 1238 | printk(KERN_DEBUG "ieee80211_init: failed to " | 1248 | printk(KERN_DEBUG "ieee80211_init: failed to " |
| 1239 | "initialize WME (err=%d)\n", ret); | 1249 | "initialize WME (err=%d)\n", ret); |
| 1240 | return ret; | 1250 | return ret; |
| @@ -1248,6 +1258,10 @@ static int __init ieee80211_init(void) | |||
| 1248 | 1258 | ||
| 1249 | static void __exit ieee80211_exit(void) | 1259 | static void __exit ieee80211_exit(void) |
| 1250 | { | 1260 | { |
| 1261 | #ifdef CONFIG_MAC80211_RCSIMPLE | ||
| 1262 | ieee80211_rate_control_unregister(&mac80211_rcsimple); | ||
| 1263 | #endif | ||
| 1264 | |||
| 1251 | ieee80211_wme_unregister(); | 1265 | ieee80211_wme_unregister(); |
| 1252 | ieee80211_debugfs_netdev_exit(); | 1266 | ieee80211_debugfs_netdev_exit(); |
| 1253 | } | 1267 | } |
diff --git a/net/mac80211/ieee80211_common.h b/net/mac80211/ieee80211_common.h deleted file mode 100644 index c15295d43d87..000000000000 --- a/net/mac80211/ieee80211_common.h +++ /dev/null | |||
| @@ -1,91 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * IEEE 802.11 driver (80211.o) -- hostapd interface | ||
| 3 | * Copyright 2002-2004, Instant802 Networks, Inc. | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License version 2 as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef IEEE80211_COMMON_H | ||
| 11 | #define IEEE80211_COMMON_H | ||
| 12 | |||
| 13 | #include <linux/types.h> | ||
| 14 | |||
| 15 | /* | ||
| 16 | * This is common header information with user space. It is used on all | ||
| 17 | * frames sent to wlan#ap interface. | ||
| 18 | */ | ||
| 19 | |||
| 20 | #define IEEE80211_FI_VERSION 0x80211001 | ||
| 21 | |||
| 22 | struct ieee80211_frame_info { | ||
| 23 | __be32 version; | ||
| 24 | __be32 length; | ||
| 25 | __be64 mactime; | ||
| 26 | __be64 hosttime; | ||
| 27 | __be32 phytype; | ||
| 28 | __be32 channel; | ||
| 29 | __be32 datarate; | ||
| 30 | __be32 antenna; | ||
| 31 | __be32 priority; | ||
| 32 | __be32 ssi_type; | ||
| 33 | __be32 ssi_signal; | ||
| 34 | __be32 ssi_noise; | ||
| 35 | __be32 preamble; | ||
| 36 | __be32 encoding; | ||
| 37 | |||
| 38 | /* Note: this structure is otherwise identical to capture format used | ||
| 39 | * in linux-wlan-ng, but this additional field is used to provide meta | ||
| 40 | * data about the frame to hostapd. This was the easiest method for | ||
| 41 | * providing this information, but this might change in the future. */ | ||
| 42 | __be32 msg_type; | ||
| 43 | } __attribute__ ((packed)); | ||
| 44 | |||
| 45 | |||
| 46 | enum ieee80211_msg_type { | ||
| 47 | ieee80211_msg_normal = 0, | ||
| 48 | ieee80211_msg_tx_callback_ack = 1, | ||
| 49 | ieee80211_msg_tx_callback_fail = 2, | ||
| 50 | /* hole at 3, was ieee80211_msg_passive_scan but unused */ | ||
| 51 | /* hole at 4, was ieee80211_msg_wep_frame_unknown_key but now unused */ | ||
| 52 | ieee80211_msg_michael_mic_failure = 5, | ||
| 53 | /* hole at 6, was monitor but never sent to userspace */ | ||
| 54 | ieee80211_msg_sta_not_assoc = 7, | ||
| 55 | /* 8 was ieee80211_msg_set_aid_for_sta */ | ||
| 56 | /* 9 was ieee80211_msg_key_threshold_notification */ | ||
| 57 | /* 11 was ieee80211_msg_radar */ | ||
| 58 | }; | ||
| 59 | |||
| 60 | struct ieee80211_msg_key_notification { | ||
| 61 | int tx_rx_count; | ||
| 62 | char ifname[IFNAMSIZ]; | ||
| 63 | u8 addr[ETH_ALEN]; /* ff:ff:ff:ff:ff:ff for broadcast keys */ | ||
| 64 | }; | ||
| 65 | |||
| 66 | |||
| 67 | enum ieee80211_phytype { | ||
| 68 | ieee80211_phytype_fhss_dot11_97 = 1, | ||
| 69 | ieee80211_phytype_dsss_dot11_97 = 2, | ||
| 70 | ieee80211_phytype_irbaseband = 3, | ||
| 71 | ieee80211_phytype_dsss_dot11_b = 4, | ||
| 72 | ieee80211_phytype_pbcc_dot11_b = 5, | ||
| 73 | ieee80211_phytype_ofdm_dot11_g = 6, | ||
| 74 | ieee80211_phytype_pbcc_dot11_g = 7, | ||
| 75 | ieee80211_phytype_ofdm_dot11_a = 8, | ||
| 76 | }; | ||
| 77 | |||
| 78 | enum ieee80211_ssi_type { | ||
| 79 | ieee80211_ssi_none = 0, | ||
| 80 | ieee80211_ssi_norm = 1, /* normalized, 0-1000 */ | ||
| 81 | ieee80211_ssi_dbm = 2, | ||
| 82 | ieee80211_ssi_raw = 3, /* raw SSI */ | ||
| 83 | }; | ||
| 84 | |||
| 85 | struct ieee80211_radar_info { | ||
| 86 | int channel; | ||
| 87 | int radar; | ||
| 88 | int radar_type; | ||
| 89 | }; | ||
| 90 | |||
| 91 | #endif /* IEEE80211_COMMON_H */ | ||
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 4b4ed2a5803c..b4e32ab3664d 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -230,6 +230,7 @@ struct ieee80211_if_vlan { | |||
| 230 | #define IEEE80211_STA_AUTO_SSID_SEL BIT(10) | 230 | #define IEEE80211_STA_AUTO_SSID_SEL BIT(10) |
| 231 | #define IEEE80211_STA_AUTO_BSSID_SEL BIT(11) | 231 | #define IEEE80211_STA_AUTO_BSSID_SEL BIT(11) |
| 232 | #define IEEE80211_STA_AUTO_CHANNEL_SEL BIT(12) | 232 | #define IEEE80211_STA_AUTO_CHANNEL_SEL BIT(12) |
| 233 | #define IEEE80211_STA_PRIVACY_INVOKED BIT(13) | ||
| 233 | struct ieee80211_if_sta { | 234 | struct ieee80211_if_sta { |
| 234 | enum { | 235 | enum { |
| 235 | IEEE80211_DISABLED, IEEE80211_AUTHENTICATE, | 236 | IEEE80211_DISABLED, IEEE80211_AUTHENTICATE, |
| @@ -259,7 +260,6 @@ struct ieee80211_if_sta { | |||
| 259 | unsigned long request; | 260 | unsigned long request; |
| 260 | struct sk_buff_head skb_queue; | 261 | struct sk_buff_head skb_queue; |
| 261 | 262 | ||
| 262 | int key_management_enabled; | ||
| 263 | unsigned long last_probe; | 263 | unsigned long last_probe; |
| 264 | 264 | ||
| 265 | #define IEEE80211_AUTH_ALG_OPEN BIT(0) | 265 | #define IEEE80211_AUTH_ALG_OPEN BIT(0) |
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c index 6caa3ec2cff7..7027eed4d4ae 100644 --- a/net/mac80211/ieee80211_ioctl.c +++ b/net/mac80211/ieee80211_ioctl.c | |||
| @@ -917,7 +917,6 @@ static int ieee80211_ioctl_siwauth(struct net_device *dev, | |||
| 917 | struct iw_request_info *info, | 917 | struct iw_request_info *info, |
| 918 | struct iw_param *data, char *extra) | 918 | struct iw_param *data, char *extra) |
| 919 | { | 919 | { |
| 920 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
| 921 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 920 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
| 922 | int ret = 0; | 921 | int ret = 0; |
| 923 | 922 | ||
| @@ -927,18 +926,21 @@ static int ieee80211_ioctl_siwauth(struct net_device *dev, | |||
| 927 | case IW_AUTH_CIPHER_GROUP: | 926 | case IW_AUTH_CIPHER_GROUP: |
| 928 | case IW_AUTH_WPA_ENABLED: | 927 | case IW_AUTH_WPA_ENABLED: |
| 929 | case IW_AUTH_RX_UNENCRYPTED_EAPOL: | 928 | case IW_AUTH_RX_UNENCRYPTED_EAPOL: |
| 930 | break; | ||
| 931 | case IW_AUTH_KEY_MGMT: | 929 | case IW_AUTH_KEY_MGMT: |
| 930 | break; | ||
| 931 | case IW_AUTH_PRIVACY_INVOKED: | ||
| 932 | if (sdata->type != IEEE80211_IF_TYPE_STA) | 932 | if (sdata->type != IEEE80211_IF_TYPE_STA) |
| 933 | ret = -EINVAL; | 933 | ret = -EINVAL; |
| 934 | else { | 934 | else { |
| 935 | sdata->u.sta.flags &= ~IEEE80211_STA_PRIVACY_INVOKED; | ||
| 935 | /* | 936 | /* |
| 936 | * Key management was set by wpa_supplicant, | 937 | * Privacy invoked by wpa_supplicant, store the |
| 937 | * we only need this to associate to a network | 938 | * value and allow associating to a protected |
| 938 | * that has privacy enabled regardless of not | 939 | * network without having a key up front. |
| 939 | * having a key. | ||
| 940 | */ | 940 | */ |
| 941 | sdata->u.sta.key_management_enabled = !!data->value; | 941 | if (data->value) |
| 942 | sdata->u.sta.flags |= | ||
| 943 | IEEE80211_STA_PRIVACY_INVOKED; | ||
| 942 | } | 944 | } |
| 943 | break; | 945 | break; |
| 944 | case IW_AUTH_80211_AUTH_ALG: | 946 | case IW_AUTH_80211_AUTH_ALG: |
| @@ -948,11 +950,6 @@ static int ieee80211_ioctl_siwauth(struct net_device *dev, | |||
| 948 | else | 950 | else |
| 949 | ret = -EOPNOTSUPP; | 951 | ret = -EOPNOTSUPP; |
| 950 | break; | 952 | break; |
| 951 | case IW_AUTH_PRIVACY_INVOKED: | ||
| 952 | if (local->ops->set_privacy_invoked) | ||
| 953 | ret = local->ops->set_privacy_invoked( | ||
| 954 | local_to_hw(local), data->value); | ||
| 955 | break; | ||
| 956 | default: | 953 | default: |
| 957 | ret = -EOPNOTSUPP; | 954 | ret = -EOPNOTSUPP; |
| 958 | break; | 955 | break; |
diff --git a/net/mac80211/ieee80211_rate.c b/net/mac80211/ieee80211_rate.c index 93abb8fff141..7254bd609839 100644 --- a/net/mac80211/ieee80211_rate.c +++ b/net/mac80211/ieee80211_rate.c | |||
| @@ -25,13 +25,25 @@ int ieee80211_rate_control_register(struct rate_control_ops *ops) | |||
| 25 | { | 25 | { |
| 26 | struct rate_control_alg *alg; | 26 | struct rate_control_alg *alg; |
| 27 | 27 | ||
| 28 | if (!ops->name) | ||
| 29 | return -EINVAL; | ||
| 30 | |||
| 31 | mutex_lock(&rate_ctrl_mutex); | ||
| 32 | list_for_each_entry(alg, &rate_ctrl_algs, list) { | ||
| 33 | if (!strcmp(alg->ops->name, ops->name)) { | ||
| 34 | /* don't register an algorithm twice */ | ||
| 35 | WARN_ON(1); | ||
| 36 | return -EALREADY; | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 28 | alg = kzalloc(sizeof(*alg), GFP_KERNEL); | 40 | alg = kzalloc(sizeof(*alg), GFP_KERNEL); |
| 29 | if (alg == NULL) { | 41 | if (alg == NULL) { |
| 42 | mutex_unlock(&rate_ctrl_mutex); | ||
| 30 | return -ENOMEM; | 43 | return -ENOMEM; |
| 31 | } | 44 | } |
| 32 | alg->ops = ops; | 45 | alg->ops = ops; |
| 33 | 46 | ||
| 34 | mutex_lock(&rate_ctrl_mutex); | ||
| 35 | list_add_tail(&alg->list, &rate_ctrl_algs); | 47 | list_add_tail(&alg->list, &rate_ctrl_algs); |
| 36 | mutex_unlock(&rate_ctrl_mutex); | 48 | mutex_unlock(&rate_ctrl_mutex); |
| 37 | 49 | ||
| @@ -61,9 +73,12 @@ ieee80211_try_rate_control_ops_get(const char *name) | |||
| 61 | struct rate_control_alg *alg; | 73 | struct rate_control_alg *alg; |
| 62 | struct rate_control_ops *ops = NULL; | 74 | struct rate_control_ops *ops = NULL; |
| 63 | 75 | ||
| 76 | if (!name) | ||
| 77 | return NULL; | ||
| 78 | |||
| 64 | mutex_lock(&rate_ctrl_mutex); | 79 | mutex_lock(&rate_ctrl_mutex); |
| 65 | list_for_each_entry(alg, &rate_ctrl_algs, list) { | 80 | list_for_each_entry(alg, &rate_ctrl_algs, list) { |
| 66 | if (!name || !strcmp(alg->ops->name, name)) | 81 | if (!strcmp(alg->ops->name, name)) |
| 67 | if (try_module_get(alg->ops->module)) { | 82 | if (try_module_get(alg->ops->module)) { |
| 68 | ops = alg->ops; | 83 | ops = alg->ops; |
| 69 | break; | 84 | break; |
| @@ -80,9 +95,12 @@ ieee80211_rate_control_ops_get(const char *name) | |||
| 80 | { | 95 | { |
| 81 | struct rate_control_ops *ops; | 96 | struct rate_control_ops *ops; |
| 82 | 97 | ||
| 98 | if (!name) | ||
| 99 | name = "simple"; | ||
| 100 | |||
| 83 | ops = ieee80211_try_rate_control_ops_get(name); | 101 | ops = ieee80211_try_rate_control_ops_get(name); |
| 84 | if (!ops) { | 102 | if (!ops) { |
| 85 | request_module("rc80211_%s", name ? name : "default"); | 103 | request_module("rc80211_%s", name); |
| 86 | ops = ieee80211_try_rate_control_ops_get(name); | 104 | ops = ieee80211_try_rate_control_ops_get(name); |
| 87 | } | 105 | } |
| 88 | return ops; | 106 | return ops; |
diff --git a/net/mac80211/ieee80211_rate.h b/net/mac80211/ieee80211_rate.h index 7cd1ebab4f83..23688139ffb3 100644 --- a/net/mac80211/ieee80211_rate.h +++ b/net/mac80211/ieee80211_rate.h | |||
| @@ -65,6 +65,9 @@ struct rate_control_ref { | |||
| 65 | struct kref kref; | 65 | struct kref kref; |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | /* default 'simple' algorithm */ | ||
| 69 | extern struct rate_control_ops mac80211_rcsimple; | ||
| 70 | |||
| 68 | int ieee80211_rate_control_register(struct rate_control_ops *ops); | 71 | int ieee80211_rate_control_register(struct rate_control_ops *ops); |
| 69 | void ieee80211_rate_control_unregister(struct rate_control_ops *ops); | 72 | void ieee80211_rate_control_unregister(struct rate_control_ops *ops); |
| 70 | 73 | ||
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index fda0e06453e8..2079e988fc56 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c | |||
| @@ -704,10 +704,11 @@ static int ieee80211_privacy_mismatch(struct net_device *dev, | |||
| 704 | { | 704 | { |
| 705 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 705 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
| 706 | struct ieee80211_sta_bss *bss; | 706 | struct ieee80211_sta_bss *bss; |
| 707 | int res = 0; | 707 | int bss_privacy; |
| 708 | int wep_privacy; | ||
| 709 | int privacy_invoked; | ||
| 708 | 710 | ||
| 709 | if (!ifsta || (ifsta->flags & IEEE80211_STA_MIXED_CELL) || | 711 | if (!ifsta || (ifsta->flags & IEEE80211_STA_MIXED_CELL)) |
| 710 | ifsta->key_management_enabled) | ||
| 711 | return 0; | 712 | return 0; |
| 712 | 713 | ||
| 713 | bss = ieee80211_rx_bss_get(dev, ifsta->bssid, local->hw.conf.channel, | 714 | bss = ieee80211_rx_bss_get(dev, ifsta->bssid, local->hw.conf.channel, |
| @@ -715,13 +716,16 @@ static int ieee80211_privacy_mismatch(struct net_device *dev, | |||
| 715 | if (!bss) | 716 | if (!bss) |
| 716 | return 0; | 717 | return 0; |
| 717 | 718 | ||
| 718 | if (ieee80211_sta_wep_configured(dev) != | 719 | bss_privacy = !!(bss->capability & WLAN_CAPABILITY_PRIVACY); |
| 719 | !!(bss->capability & WLAN_CAPABILITY_PRIVACY)) | 720 | wep_privacy = !!ieee80211_sta_wep_configured(dev); |
| 720 | res = 1; | 721 | privacy_invoked = !!(ifsta->flags & IEEE80211_STA_PRIVACY_INVOKED); |
| 721 | 722 | ||
| 722 | ieee80211_rx_bss_put(dev, bss); | 723 | ieee80211_rx_bss_put(dev, bss); |
| 723 | 724 | ||
| 724 | return res; | 725 | if ((bss_privacy == wep_privacy) || (bss_privacy == privacy_invoked)) |
| 726 | return 0; | ||
| 727 | |||
| 728 | return 1; | ||
| 725 | } | 729 | } |
| 726 | 730 | ||
| 727 | 731 | ||
diff --git a/net/mac80211/rc80211_simple.c b/net/mac80211/rc80211_simple.c index 314b8de88862..da72737364e4 100644 --- a/net/mac80211/rc80211_simple.c +++ b/net/mac80211/rc80211_simple.c | |||
| @@ -7,7 +7,6 @@ | |||
| 7 | * published by the Free Software Foundation. | 7 | * published by the Free Software Foundation. |
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | #include <linux/module.h> | ||
| 11 | #include <linux/init.h> | 10 | #include <linux/init.h> |
| 12 | #include <linux/netdevice.h> | 11 | #include <linux/netdevice.h> |
| 13 | #include <linux/types.h> | 12 | #include <linux/types.h> |
| @@ -29,8 +28,6 @@ | |||
| 29 | #define RATE_CONTROL_INTERVAL (HZ / 20) | 28 | #define RATE_CONTROL_INTERVAL (HZ / 20) |
| 30 | #define RATE_CONTROL_MIN_TX 10 | 29 | #define RATE_CONTROL_MIN_TX 10 |
| 31 | 30 | ||
| 32 | MODULE_ALIAS("rc80211_default"); | ||
| 33 | |||
| 34 | static void rate_control_rate_inc(struct ieee80211_local *local, | 31 | static void rate_control_rate_inc(struct ieee80211_local *local, |
| 35 | struct sta_info *sta) | 32 | struct sta_info *sta) |
| 36 | { | 33 | { |
| @@ -394,8 +391,7 @@ static void rate_control_simple_remove_sta_debugfs(void *priv, void *priv_sta) | |||
| 394 | } | 391 | } |
| 395 | #endif | 392 | #endif |
| 396 | 393 | ||
| 397 | static struct rate_control_ops rate_control_simple = { | 394 | struct rate_control_ops mac80211_rcsimple = { |
| 398 | .module = THIS_MODULE, | ||
| 399 | .name = "simple", | 395 | .name = "simple", |
| 400 | .tx_status = rate_control_simple_tx_status, | 396 | .tx_status = rate_control_simple_tx_status, |
| 401 | .get_rate = rate_control_simple_get_rate, | 397 | .get_rate = rate_control_simple_get_rate, |
| @@ -410,22 +406,3 @@ static struct rate_control_ops rate_control_simple = { | |||
| 410 | .remove_sta_debugfs = rate_control_simple_remove_sta_debugfs, | 406 | .remove_sta_debugfs = rate_control_simple_remove_sta_debugfs, |
| 411 | #endif | 407 | #endif |
| 412 | }; | 408 | }; |
| 413 | |||
| 414 | |||
| 415 | static int __init rate_control_simple_init(void) | ||
| 416 | { | ||
| 417 | return ieee80211_rate_control_register(&rate_control_simple); | ||
| 418 | } | ||
| 419 | |||
| 420 | |||
| 421 | static void __exit rate_control_simple_exit(void) | ||
| 422 | { | ||
| 423 | ieee80211_rate_control_unregister(&rate_control_simple); | ||
| 424 | } | ||
| 425 | |||
| 426 | |||
| 427 | subsys_initcall(rate_control_simple_init); | ||
| 428 | module_exit(rate_control_simple_exit); | ||
| 429 | |||
| 430 | MODULE_DESCRIPTION("Simple rate control algorithm for ieee80211"); | ||
| 431 | MODULE_LICENSE("GPL"); | ||
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index ece77766ea2b..428a9fcf57d6 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -509,9 +509,11 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx) | |||
| 509 | rx->key->tx_rx_count++; | 509 | rx->key->tx_rx_count++; |
| 510 | /* TODO: add threshold stuff again */ | 510 | /* TODO: add threshold stuff again */ |
| 511 | } else { | 511 | } else { |
| 512 | #ifdef CONFIG_MAC80211_DEBUG | ||
| 512 | if (net_ratelimit()) | 513 | if (net_ratelimit()) |
| 513 | printk(KERN_DEBUG "%s: RX protected frame," | 514 | printk(KERN_DEBUG "%s: RX protected frame," |
| 514 | " but have no key\n", rx->dev->name); | 515 | " but have no key\n", rx->dev->name); |
| 516 | #endif /* CONFIG_MAC80211_DEBUG */ | ||
| 515 | return TXRX_DROP; | 517 | return TXRX_DROP; |
| 516 | } | 518 | } |
| 517 | 519 | ||
diff --git a/net/mac80211/wep.c b/net/mac80211/wep.c index a84a23310ff4..9bf0e1cc530a 100644 --- a/net/mac80211/wep.c +++ b/net/mac80211/wep.c | |||
| @@ -314,9 +314,11 @@ ieee80211_crypto_wep_decrypt(struct ieee80211_txrx_data *rx) | |||
| 314 | 314 | ||
| 315 | if (!(rx->u.rx.status->flag & RX_FLAG_DECRYPTED)) { | 315 | if (!(rx->u.rx.status->flag & RX_FLAG_DECRYPTED)) { |
| 316 | if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) { | 316 | if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) { |
| 317 | #ifdef CONFIG_MAC80211_DEBUG | ||
| 317 | if (net_ratelimit()) | 318 | if (net_ratelimit()) |
| 318 | printk(KERN_DEBUG "%s: RX WEP frame, decrypt " | 319 | printk(KERN_DEBUG "%s: RX WEP frame, decrypt " |
| 319 | "failed\n", rx->dev->name); | 320 | "failed\n", rx->dev->name); |
| 321 | #endif /* CONFIG_MAC80211_DEBUG */ | ||
| 320 | return TXRX_DROP; | 322 | return TXRX_DROP; |
| 321 | } | 323 | } |
| 322 | } else if (!(rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED)) { | 324 | } else if (!(rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED)) { |
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c index 6695efba57ec..20cec1cb956f 100644 --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c | |||
| @@ -323,9 +323,12 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_txrx_data *rx) | |||
| 323 | &rx->u.rx.tkip_iv32, | 323 | &rx->u.rx.tkip_iv32, |
| 324 | &rx->u.rx.tkip_iv16); | 324 | &rx->u.rx.tkip_iv16); |
| 325 | if (res != TKIP_DECRYPT_OK || wpa_test) { | 325 | if (res != TKIP_DECRYPT_OK || wpa_test) { |
| 326 | printk(KERN_DEBUG "%s: TKIP decrypt failed for RX frame from " | 326 | #ifdef CONFIG_MAC80211_DEBUG |
| 327 | "%s (res=%d)\n", | 327 | if (net_ratelimit()) |
| 328 | rx->dev->name, print_mac(mac, rx->sta->addr), res); | 328 | printk(KERN_DEBUG "%s: TKIP decrypt failed for RX " |
| 329 | "frame from %s (res=%d)\n", rx->dev->name, | ||
| 330 | print_mac(mac, rx->sta->addr), res); | ||
| 331 | #endif /* CONFIG_MAC80211_DEBUG */ | ||
| 329 | return TXRX_DROP; | 332 | return TXRX_DROP; |
| 330 | } | 333 | } |
| 331 | 334 | ||
| @@ -594,9 +597,12 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_txrx_data *rx) | |||
| 594 | skb->data + hdrlen + CCMP_HDR_LEN, data_len, | 597 | skb->data + hdrlen + CCMP_HDR_LEN, data_len, |
| 595 | skb->data + skb->len - CCMP_MIC_LEN, | 598 | skb->data + skb->len - CCMP_MIC_LEN, |
| 596 | skb->data + hdrlen + CCMP_HDR_LEN)) { | 599 | skb->data + hdrlen + CCMP_HDR_LEN)) { |
| 597 | printk(KERN_DEBUG "%s: CCMP decrypt failed for RX " | 600 | #ifdef CONFIG_MAC80211_DEBUG |
| 598 | "frame from %s\n", rx->dev->name, | 601 | if (net_ratelimit()) |
| 599 | print_mac(mac, rx->sta->addr)); | 602 | printk(KERN_DEBUG "%s: CCMP decrypt failed " |
| 603 | "for RX frame from %s\n", rx->dev->name, | ||
| 604 | print_mac(mac, rx->sta->addr)); | ||
| 605 | #endif /* CONFIG_MAC80211_DEBUG */ | ||
| 600 | return TXRX_DROP; | 606 | return TXRX_DROP; |
| 601 | } | 607 | } |
| 602 | } | 608 | } |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 4cb2dfba0993..eb6be5030c70 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -139,9 +139,6 @@ dev->hard_header == NULL (ll header is added by device, we cannot control it) | |||
| 139 | static HLIST_HEAD(packet_sklist); | 139 | static HLIST_HEAD(packet_sklist); |
| 140 | static DEFINE_RWLOCK(packet_sklist_lock); | 140 | static DEFINE_RWLOCK(packet_sklist_lock); |
| 141 | 141 | ||
| 142 | static atomic_t packet_socks_nr; | ||
| 143 | |||
| 144 | |||
| 145 | /* Private packet socket structures. */ | 142 | /* Private packet socket structures. */ |
| 146 | 143 | ||
| 147 | struct packet_mclist | 144 | struct packet_mclist |
| @@ -236,10 +233,7 @@ static void packet_sock_destruct(struct sock *sk) | |||
| 236 | return; | 233 | return; |
| 237 | } | 234 | } |
| 238 | 235 | ||
| 239 | atomic_dec(&packet_socks_nr); | 236 | sk_refcnt_debug_dec(sk); |
| 240 | #ifdef PACKET_REFCNT_DEBUG | ||
| 241 | printk(KERN_DEBUG "PACKET socket %p is free, %d are alive\n", sk, atomic_read(&packet_socks_nr)); | ||
| 242 | #endif | ||
| 243 | } | 237 | } |
| 244 | 238 | ||
| 245 | 239 | ||
| @@ -515,7 +509,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet | |||
| 515 | sll->sll_hatype = dev->type; | 509 | sll->sll_hatype = dev->type; |
| 516 | sll->sll_protocol = skb->protocol; | 510 | sll->sll_protocol = skb->protocol; |
| 517 | sll->sll_pkttype = skb->pkt_type; | 511 | sll->sll_pkttype = skb->pkt_type; |
| 518 | if (unlikely(po->origdev) && skb->pkt_type == PACKET_HOST) | 512 | if (unlikely(po->origdev)) |
| 519 | sll->sll_ifindex = orig_dev->ifindex; | 513 | sll->sll_ifindex = orig_dev->ifindex; |
| 520 | else | 514 | else |
| 521 | sll->sll_ifindex = dev->ifindex; | 515 | sll->sll_ifindex = dev->ifindex; |
| @@ -661,7 +655,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe | |||
| 661 | sll->sll_hatype = dev->type; | 655 | sll->sll_hatype = dev->type; |
| 662 | sll->sll_protocol = skb->protocol; | 656 | sll->sll_protocol = skb->protocol; |
| 663 | sll->sll_pkttype = skb->pkt_type; | 657 | sll->sll_pkttype = skb->pkt_type; |
| 664 | if (unlikely(po->origdev) && skb->pkt_type == PACKET_HOST) | 658 | if (unlikely(po->origdev)) |
| 665 | sll->sll_ifindex = orig_dev->ifindex; | 659 | sll->sll_ifindex = orig_dev->ifindex; |
| 666 | else | 660 | else |
| 667 | sll->sll_ifindex = dev->ifindex; | 661 | sll->sll_ifindex = dev->ifindex; |
| @@ -849,6 +843,7 @@ static int packet_release(struct socket *sock) | |||
| 849 | /* Purge queues */ | 843 | /* Purge queues */ |
| 850 | 844 | ||
| 851 | skb_queue_purge(&sk->sk_receive_queue); | 845 | skb_queue_purge(&sk->sk_receive_queue); |
| 846 | sk_refcnt_debug_release(sk); | ||
| 852 | 847 | ||
| 853 | sock_put(sk); | 848 | sock_put(sk); |
| 854 | return 0; | 849 | return 0; |
| @@ -1010,7 +1005,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol) | |||
| 1010 | po->num = proto; | 1005 | po->num = proto; |
| 1011 | 1006 | ||
| 1012 | sk->sk_destruct = packet_sock_destruct; | 1007 | sk->sk_destruct = packet_sock_destruct; |
| 1013 | atomic_inc(&packet_socks_nr); | 1008 | sk_refcnt_debug_inc(sk); |
| 1014 | 1009 | ||
| 1015 | /* | 1010 | /* |
| 1016 | * Attach a protocol block | 1011 | * Attach a protocol block |
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index 51d151c0e962..73d60a307129 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
| @@ -27,6 +27,10 @@ | |||
| 27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 28 | #include <linux/rfkill.h> | 28 | #include <linux/rfkill.h> |
| 29 | 29 | ||
| 30 | /* Get declaration of rfkill_switch_all() to shut up sparse. */ | ||
| 31 | #include "rfkill-input.h" | ||
| 32 | |||
| 33 | |||
| 30 | MODULE_AUTHOR("Ivo van Doorn <IvDoorn@gmail.com>"); | 34 | MODULE_AUTHOR("Ivo van Doorn <IvDoorn@gmail.com>"); |
| 31 | MODULE_VERSION("1.0"); | 35 | MODULE_VERSION("1.0"); |
| 32 | MODULE_DESCRIPTION("RF switch support"); | 36 | MODULE_DESCRIPTION("RF switch support"); |
| @@ -276,21 +280,17 @@ static struct class rfkill_class = { | |||
| 276 | 280 | ||
| 277 | static int rfkill_add_switch(struct rfkill *rfkill) | 281 | static int rfkill_add_switch(struct rfkill *rfkill) |
| 278 | { | 282 | { |
| 279 | int retval; | 283 | int error; |
| 280 | |||
| 281 | retval = mutex_lock_interruptible(&rfkill_mutex); | ||
| 282 | if (retval) | ||
| 283 | return retval; | ||
| 284 | 284 | ||
| 285 | retval = rfkill_toggle_radio(rfkill, rfkill_states[rfkill->type]); | 285 | mutex_lock(&rfkill_mutex); |
| 286 | if (retval) | ||
| 287 | goto out; | ||
| 288 | 286 | ||
| 289 | list_add_tail(&rfkill->node, &rfkill_list); | 287 | error = rfkill_toggle_radio(rfkill, rfkill_states[rfkill->type]); |
| 288 | if (!error) | ||
| 289 | list_add_tail(&rfkill->node, &rfkill_list); | ||
| 290 | 290 | ||
| 291 | out: | ||
| 292 | mutex_unlock(&rfkill_mutex); | 291 | mutex_unlock(&rfkill_mutex); |
| 293 | return retval; | 292 | |
| 293 | return error; | ||
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | static void rfkill_remove_switch(struct rfkill *rfkill) | 296 | static void rfkill_remove_switch(struct rfkill *rfkill) |
| @@ -387,20 +387,23 @@ int rfkill_register(struct rfkill *rfkill) | |||
| 387 | 387 | ||
| 388 | if (!rfkill->toggle_radio) | 388 | if (!rfkill->toggle_radio) |
| 389 | return -EINVAL; | 389 | return -EINVAL; |
| 390 | if (rfkill->type >= RFKILL_TYPE_MAX) | ||
| 391 | return -EINVAL; | ||
| 392 | |||
| 393 | snprintf(dev->bus_id, sizeof(dev->bus_id), | ||
| 394 | "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1); | ||
| 395 | |||
| 396 | rfkill_led_trigger_register(rfkill); | ||
| 390 | 397 | ||
| 391 | error = rfkill_add_switch(rfkill); | 398 | error = rfkill_add_switch(rfkill); |
| 392 | if (error) | 399 | if (error) |
| 393 | return error; | 400 | return error; |
| 394 | 401 | ||
| 395 | snprintf(dev->bus_id, sizeof(dev->bus_id), | ||
| 396 | "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1); | ||
| 397 | |||
| 398 | error = device_add(dev); | 402 | error = device_add(dev); |
| 399 | if (error) { | 403 | if (error) { |
| 400 | rfkill_remove_switch(rfkill); | 404 | rfkill_remove_switch(rfkill); |
| 401 | return error; | 405 | return error; |
| 402 | } | 406 | } |
| 403 | rfkill_led_trigger_register(rfkill); | ||
| 404 | 407 | ||
| 405 | return 0; | 408 | return 0; |
| 406 | } | 409 | } |
| @@ -416,9 +419,9 @@ EXPORT_SYMBOL(rfkill_register); | |||
| 416 | */ | 419 | */ |
| 417 | void rfkill_unregister(struct rfkill *rfkill) | 420 | void rfkill_unregister(struct rfkill *rfkill) |
| 418 | { | 421 | { |
| 419 | rfkill_led_trigger_unregister(rfkill); | ||
| 420 | device_del(&rfkill->dev); | 422 | device_del(&rfkill->dev); |
| 421 | rfkill_remove_switch(rfkill); | 423 | rfkill_remove_switch(rfkill); |
| 424 | rfkill_led_trigger_unregister(rfkill); | ||
| 422 | put_device(&rfkill->dev); | 425 | put_device(&rfkill->dev); |
| 423 | } | 426 | } |
| 424 | EXPORT_SYMBOL(rfkill_unregister); | 427 | EXPORT_SYMBOL(rfkill_unregister); |
| @@ -448,5 +451,5 @@ static void __exit rfkill_exit(void) | |||
| 448 | class_unregister(&rfkill_class); | 451 | class_unregister(&rfkill_class); |
| 449 | } | 452 | } |
| 450 | 453 | ||
| 451 | module_init(rfkill_init); | 454 | subsys_initcall(rfkill_init); |
| 452 | module_exit(rfkill_exit); | 455 | module_exit(rfkill_exit); |
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index 53171029439f..c39008209164 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c | |||
| @@ -613,17 +613,7 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle, | |||
| 613 | memcpy(&n->sel, s, sizeof(*s) + s->nkeys*sizeof(struct tc_u32_key)); | 613 | memcpy(&n->sel, s, sizeof(*s) + s->nkeys*sizeof(struct tc_u32_key)); |
| 614 | n->ht_up = ht; | 614 | n->ht_up = ht; |
| 615 | n->handle = handle; | 615 | n->handle = handle; |
| 616 | { | 616 | n->fshift = s->hmask ? ffs(ntohl(s->hmask)) - 1 : 0; |
| 617 | u8 i = 0; | ||
| 618 | u32 mask = ntohl(s->hmask); | ||
| 619 | if (mask) { | ||
| 620 | while (!(mask & 1)) { | ||
| 621 | i++; | ||
| 622 | mask>>=1; | ||
| 623 | } | ||
| 624 | } | ||
| 625 | n->fshift = i; | ||
| 626 | } | ||
| 627 | 617 | ||
| 628 | #ifdef CONFIG_CLS_U32_MARK | 618 | #ifdef CONFIG_CLS_U32_MARK |
| 629 | if (tb[TCA_U32_MARK-1]) { | 619 | if (tb[TCA_U32_MARK-1]) { |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 515e7a692f9b..e835da8fc091 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -457,7 +457,7 @@ static int unix_release_sock (struct sock *sk, int embrion) | |||
| 457 | * What the above comment does talk about? --ANK(980817) | 457 | * What the above comment does talk about? --ANK(980817) |
| 458 | */ | 458 | */ |
| 459 | 459 | ||
| 460 | if (atomic_read(&unix_tot_inflight)) | 460 | if (unix_tot_inflight) |
| 461 | unix_gc(); /* Garbage collect fds */ | 461 | unix_gc(); /* Garbage collect fds */ |
| 462 | 462 | ||
| 463 | return 0; | 463 | return 0; |
| @@ -599,15 +599,14 @@ static struct sock * unix_create1(struct net *net, struct socket *sock) | |||
| 599 | struct sock *sk = NULL; | 599 | struct sock *sk = NULL; |
| 600 | struct unix_sock *u; | 600 | struct unix_sock *u; |
| 601 | 601 | ||
| 602 | if (atomic_read(&unix_nr_socks) >= 2*get_max_files()) | 602 | atomic_inc(&unix_nr_socks); |
| 603 | if (atomic_read(&unix_nr_socks) > 2 * get_max_files()) | ||
| 603 | goto out; | 604 | goto out; |
| 604 | 605 | ||
| 605 | sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto); | 606 | sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto); |
| 606 | if (!sk) | 607 | if (!sk) |
| 607 | goto out; | 608 | goto out; |
| 608 | 609 | ||
| 609 | atomic_inc(&unix_nr_socks); | ||
| 610 | |||
| 611 | sock_init_data(sock,sk); | 610 | sock_init_data(sock,sk); |
| 612 | lockdep_set_class(&sk->sk_receive_queue.lock, | 611 | lockdep_set_class(&sk->sk_receive_queue.lock, |
| 613 | &af_unix_sk_receive_queue_lock_key); | 612 | &af_unix_sk_receive_queue_lock_key); |
| @@ -625,6 +624,8 @@ static struct sock * unix_create1(struct net *net, struct socket *sock) | |||
| 625 | init_waitqueue_head(&u->peer_wait); | 624 | init_waitqueue_head(&u->peer_wait); |
| 626 | unix_insert_socket(unix_sockets_unbound, sk); | 625 | unix_insert_socket(unix_sockets_unbound, sk); |
| 627 | out: | 626 | out: |
| 627 | if (sk == NULL) | ||
| 628 | atomic_dec(&unix_nr_socks); | ||
| 628 | return sk; | 629 | return sk; |
| 629 | } | 630 | } |
| 630 | 631 | ||
diff --git a/net/unix/garbage.c b/net/unix/garbage.c index 406b6433e467..ebdff3d877a1 100644 --- a/net/unix/garbage.c +++ b/net/unix/garbage.c | |||
| @@ -92,7 +92,7 @@ static LIST_HEAD(gc_inflight_list); | |||
| 92 | static LIST_HEAD(gc_candidates); | 92 | static LIST_HEAD(gc_candidates); |
| 93 | static DEFINE_SPINLOCK(unix_gc_lock); | 93 | static DEFINE_SPINLOCK(unix_gc_lock); |
| 94 | 94 | ||
| 95 | atomic_t unix_tot_inflight = ATOMIC_INIT(0); | 95 | unsigned int unix_tot_inflight; |
| 96 | 96 | ||
| 97 | 97 | ||
| 98 | static struct sock *unix_get_socket(struct file *filp) | 98 | static struct sock *unix_get_socket(struct file *filp) |
| @@ -133,7 +133,7 @@ void unix_inflight(struct file *fp) | |||
| 133 | } else { | 133 | } else { |
| 134 | BUG_ON(list_empty(&u->link)); | 134 | BUG_ON(list_empty(&u->link)); |
| 135 | } | 135 | } |
| 136 | atomic_inc(&unix_tot_inflight); | 136 | unix_tot_inflight++; |
| 137 | spin_unlock(&unix_gc_lock); | 137 | spin_unlock(&unix_gc_lock); |
| 138 | } | 138 | } |
| 139 | } | 139 | } |
| @@ -147,7 +147,7 @@ void unix_notinflight(struct file *fp) | |||
| 147 | BUG_ON(list_empty(&u->link)); | 147 | BUG_ON(list_empty(&u->link)); |
| 148 | if (atomic_dec_and_test(&u->inflight)) | 148 | if (atomic_dec_and_test(&u->inflight)) |
| 149 | list_del_init(&u->link); | 149 | list_del_init(&u->link); |
| 150 | atomic_dec(&unix_tot_inflight); | 150 | unix_tot_inflight--; |
| 151 | spin_unlock(&unix_gc_lock); | 151 | spin_unlock(&unix_gc_lock); |
| 152 | } | 152 | } |
| 153 | } | 153 | } |
| @@ -161,7 +161,7 @@ static inline struct sk_buff *sock_queue_head(struct sock *sk) | |||
| 161 | for (skb = sock_queue_head(sk)->next, next = skb->next; \ | 161 | for (skb = sock_queue_head(sk)->next, next = skb->next; \ |
| 162 | skb != sock_queue_head(sk); skb = next, next = skb->next) | 162 | skb != sock_queue_head(sk); skb = next, next = skb->next) |
| 163 | 163 | ||
| 164 | static void scan_inflight(struct sock *x, void (*func)(struct sock *), | 164 | static void scan_inflight(struct sock *x, void (*func)(struct unix_sock *), |
| 165 | struct sk_buff_head *hitlist) | 165 | struct sk_buff_head *hitlist) |
| 166 | { | 166 | { |
| 167 | struct sk_buff *skb; | 167 | struct sk_buff *skb; |
| @@ -185,9 +185,9 @@ static void scan_inflight(struct sock *x, void (*func)(struct sock *), | |||
| 185 | * if it indeed does so | 185 | * if it indeed does so |
| 186 | */ | 186 | */ |
| 187 | struct sock *sk = unix_get_socket(*fp++); | 187 | struct sock *sk = unix_get_socket(*fp++); |
| 188 | if(sk) { | 188 | if (sk) { |
| 189 | hit = true; | 189 | hit = true; |
| 190 | func(sk); | 190 | func(unix_sk(sk)); |
| 191 | } | 191 | } |
| 192 | } | 192 | } |
| 193 | if (hit && hitlist != NULL) { | 193 | if (hit && hitlist != NULL) { |
| @@ -199,7 +199,7 @@ static void scan_inflight(struct sock *x, void (*func)(struct sock *), | |||
| 199 | spin_unlock(&x->sk_receive_queue.lock); | 199 | spin_unlock(&x->sk_receive_queue.lock); |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | static void scan_children(struct sock *x, void (*func)(struct sock *), | 202 | static void scan_children(struct sock *x, void (*func)(struct unix_sock *), |
| 203 | struct sk_buff_head *hitlist) | 203 | struct sk_buff_head *hitlist) |
| 204 | { | 204 | { |
| 205 | if (x->sk_state != TCP_LISTEN) | 205 | if (x->sk_state != TCP_LISTEN) |
| @@ -235,20 +235,18 @@ static void scan_children(struct sock *x, void (*func)(struct sock *), | |||
| 235 | } | 235 | } |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | static void dec_inflight(struct sock *sk) | 238 | static void dec_inflight(struct unix_sock *usk) |
| 239 | { | 239 | { |
| 240 | atomic_dec(&unix_sk(sk)->inflight); | 240 | atomic_dec(&usk->inflight); |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | static void inc_inflight(struct sock *sk) | 243 | static void inc_inflight(struct unix_sock *usk) |
| 244 | { | 244 | { |
| 245 | atomic_inc(&unix_sk(sk)->inflight); | 245 | atomic_inc(&usk->inflight); |
| 246 | } | 246 | } |
| 247 | 247 | ||
| 248 | static void inc_inflight_move_tail(struct sock *sk) | 248 | static void inc_inflight_move_tail(struct unix_sock *u) |
| 249 | { | 249 | { |
| 250 | struct unix_sock *u = unix_sk(sk); | ||
| 251 | |||
| 252 | atomic_inc(&u->inflight); | 250 | atomic_inc(&u->inflight); |
| 253 | /* | 251 | /* |
| 254 | * If this is still a candidate, move it to the end of the | 252 | * If this is still a candidate, move it to the end of the |
