diff options
-rw-r--r-- | include/net/mac80211.h | 10 | ||||
-rw-r--r-- | net/mac80211/driver-ops.h | 16 | ||||
-rw-r--r-- | net/mac80211/key.c | 5 | ||||
-rw-r--r-- | net/mac80211/trace.h | 23 |
4 files changed, 53 insertions, 1 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 3037f49e51c8..e0825a9dbfea 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -1630,6 +1630,10 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb); | |||
1630 | * rekeying), it will not include a valid phase 1 key. The valid phase 1 key is | 1630 | * rekeying), it will not include a valid phase 1 key. The valid phase 1 key is |
1631 | * provided by update_tkip_key only. The trigger that makes mac80211 call this | 1631 | * provided by update_tkip_key only. The trigger that makes mac80211 call this |
1632 | * handler is software decryption with wrap around of iv16. | 1632 | * handler is software decryption with wrap around of iv16. |
1633 | * | ||
1634 | * The set_default_unicast_key() call updates the default WEP key index | ||
1635 | * configured to the hardware for WEP encryption type. This is required | ||
1636 | * for devices that support offload of data packets (e.g. ARP responses). | ||
1633 | */ | 1637 | */ |
1634 | 1638 | ||
1635 | /** | 1639 | /** |
@@ -2208,6 +2212,10 @@ enum ieee80211_rate_control_changed { | |||
2208 | * After rekeying was done it should (for example during resume) notify | 2212 | * After rekeying was done it should (for example during resume) notify |
2209 | * userspace of the new replay counter using ieee80211_gtk_rekey_notify(). | 2213 | * userspace of the new replay counter using ieee80211_gtk_rekey_notify(). |
2210 | * | 2214 | * |
2215 | * @set_default_unicast_key: Set the default (unicast) key index, useful for | ||
2216 | * WEP when the device sends data packets autonomously, e.g. for ARP | ||
2217 | * offloading. The index can be 0-3, or -1 for unsetting it. | ||
2218 | * | ||
2211 | * @hw_scan: Ask the hardware to service the scan request, no need to start | 2219 | * @hw_scan: Ask the hardware to service the scan request, no need to start |
2212 | * the scan state machine in stack. The scan must honour the channel | 2220 | * the scan state machine in stack. The scan must honour the channel |
2213 | * configuration done by the regulatory agent in the wiphy's | 2221 | * configuration done by the regulatory agent in the wiphy's |
@@ -2539,6 +2547,8 @@ struct ieee80211_ops { | |||
2539 | void (*set_rekey_data)(struct ieee80211_hw *hw, | 2547 | void (*set_rekey_data)(struct ieee80211_hw *hw, |
2540 | struct ieee80211_vif *vif, | 2548 | struct ieee80211_vif *vif, |
2541 | struct cfg80211_gtk_rekey_data *data); | 2549 | struct cfg80211_gtk_rekey_data *data); |
2550 | void (*set_default_unicast_key)(struct ieee80211_hw *hw, | ||
2551 | struct ieee80211_vif *vif, int idx); | ||
2542 | int (*hw_scan)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 2552 | int (*hw_scan)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
2543 | struct cfg80211_scan_request *req); | 2553 | struct cfg80211_scan_request *req); |
2544 | void (*cancel_hw_scan)(struct ieee80211_hw *hw, | 2554 | void (*cancel_hw_scan)(struct ieee80211_hw *hw, |
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index 0c07f94c5378..e6033b06caba 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h | |||
@@ -1020,4 +1020,20 @@ static inline void drv_restart_complete(struct ieee80211_local *local) | |||
1020 | trace_drv_return_void(local); | 1020 | trace_drv_return_void(local); |
1021 | } | 1021 | } |
1022 | 1022 | ||
1023 | static inline void | ||
1024 | drv_set_default_unicast_key(struct ieee80211_local *local, | ||
1025 | struct ieee80211_sub_if_data *sdata, | ||
1026 | int key_idx) | ||
1027 | { | ||
1028 | check_sdata_in_driver(sdata); | ||
1029 | |||
1030 | WARN_ON_ONCE(key_idx < -1 || key_idx > 3); | ||
1031 | |||
1032 | trace_drv_set_default_unicast_key(local, sdata, key_idx); | ||
1033 | if (local->ops->set_default_unicast_key) | ||
1034 | local->ops->set_default_unicast_key(&local->hw, &sdata->vif, | ||
1035 | key_idx); | ||
1036 | trace_drv_return_void(local); | ||
1037 | } | ||
1038 | |||
1023 | #endif /* __MAC80211_DRIVER_OPS */ | 1039 | #endif /* __MAC80211_DRIVER_OPS */ |
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index 619c5d697999..ef252eb58c36 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
@@ -204,8 +204,11 @@ static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, | |||
204 | if (idx >= 0 && idx < NUM_DEFAULT_KEYS) | 204 | if (idx >= 0 && idx < NUM_DEFAULT_KEYS) |
205 | key = key_mtx_dereference(sdata->local, sdata->keys[idx]); | 205 | key = key_mtx_dereference(sdata->local, sdata->keys[idx]); |
206 | 206 | ||
207 | if (uni) | 207 | if (uni) { |
208 | rcu_assign_pointer(sdata->default_unicast_key, key); | 208 | rcu_assign_pointer(sdata->default_unicast_key, key); |
209 | drv_set_default_unicast_key(sdata->local, sdata, idx); | ||
210 | } | ||
211 | |||
209 | if (multi) | 212 | if (multi) |
210 | rcu_assign_pointer(sdata->default_multicast_key, key); | 213 | rcu_assign_pointer(sdata->default_multicast_key, key); |
211 | 214 | ||
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h index 41861b91daa3..9341b9359b66 100644 --- a/net/mac80211/trace.h +++ b/net/mac80211/trace.h | |||
@@ -1821,6 +1821,29 @@ TRACE_EVENT(stop_queue, | |||
1821 | ) | 1821 | ) |
1822 | ); | 1822 | ); |
1823 | 1823 | ||
1824 | TRACE_EVENT(drv_set_default_unicast_key, | ||
1825 | TP_PROTO(struct ieee80211_local *local, | ||
1826 | struct ieee80211_sub_if_data *sdata, | ||
1827 | int key_idx), | ||
1828 | |||
1829 | TP_ARGS(local, sdata, key_idx), | ||
1830 | |||
1831 | TP_STRUCT__entry( | ||
1832 | LOCAL_ENTRY | ||
1833 | VIF_ENTRY | ||
1834 | __field(int, key_idx) | ||
1835 | ), | ||
1836 | |||
1837 | TP_fast_assign( | ||
1838 | LOCAL_ASSIGN; | ||
1839 | VIF_ASSIGN; | ||
1840 | __entry->key_idx = key_idx; | ||
1841 | ), | ||
1842 | |||
1843 | TP_printk(LOCAL_PR_FMT VIF_PR_FMT " key_idx:%d", | ||
1844 | LOCAL_PR_ARG, VIF_PR_ARG, __entry->key_idx) | ||
1845 | ); | ||
1846 | |||
1824 | #ifdef CONFIG_MAC80211_MESSAGE_TRACING | 1847 | #ifdef CONFIG_MAC80211_MESSAGE_TRACING |
1825 | #undef TRACE_SYSTEM | 1848 | #undef TRACE_SYSTEM |
1826 | #define TRACE_SYSTEM mac80211_msg | 1849 | #define TRACE_SYSTEM mac80211_msg |