aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/mac80211.h10
-rw-r--r--net/mac80211/driver-ops.h16
-rw-r--r--net/mac80211/key.c5
-rw-r--r--net/mac80211/trace.h23
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
1023static inline void
1024drv_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
1824TRACE_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