Commit | Line | Data |
---|---|---|
6039f6d2 JM |
1 | /* |
2 | * cfg80211 MLME SAP interface | |
3 | * | |
4 | * Copyright (c) 2009, Jouni Malinen <j@w1.fi> | |
5 | */ | |
6 | ||
7 | #include <linux/kernel.h> | |
8 | #include <linux/module.h> | |
9 | #include <linux/netdevice.h> | |
10 | #include <linux/nl80211.h> | |
11 | #include <net/cfg80211.h> | |
12 | #include "core.h" | |
13 | #include "nl80211.h" | |
14 | ||
15 | void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len) | |
16 | { | |
17 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | |
18 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | |
19 | nl80211_send_rx_auth(rdev, dev, buf, len); | |
20 | } | |
21 | EXPORT_SYMBOL(cfg80211_send_rx_auth); | |
22 | ||
23 | void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len) | |
24 | { | |
25 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | |
26 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | |
27 | nl80211_send_rx_assoc(rdev, dev, buf, len); | |
28 | } | |
29 | EXPORT_SYMBOL(cfg80211_send_rx_assoc); | |
30 | ||
53b46b84 | 31 | void cfg80211_send_deauth(struct net_device *dev, const u8 *buf, size_t len) |
6039f6d2 JM |
32 | { |
33 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | |
34 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | |
53b46b84 | 35 | nl80211_send_deauth(rdev, dev, buf, len); |
6039f6d2 | 36 | } |
53b46b84 | 37 | EXPORT_SYMBOL(cfg80211_send_deauth); |
6039f6d2 | 38 | |
53b46b84 | 39 | void cfg80211_send_disassoc(struct net_device *dev, const u8 *buf, size_t len) |
6039f6d2 JM |
40 | { |
41 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | |
42 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | |
53b46b84 | 43 | nl80211_send_disassoc(rdev, dev, buf, len); |
6039f6d2 | 44 | } |
53b46b84 | 45 | EXPORT_SYMBOL(cfg80211_send_disassoc); |
a3b8b056 | 46 | |
1965c853 JM |
47 | static void cfg80211_wext_disconnected(struct net_device *dev) |
48 | { | |
49 | #ifdef CONFIG_WIRELESS_EXT | |
50 | union iwreq_data wrqu; | |
51 | memset(&wrqu, 0, sizeof(wrqu)); | |
52 | wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); | |
53 | #endif | |
54 | } | |
55 | ||
56 | void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr) | |
57 | { | |
58 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | |
59 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | |
60 | nl80211_send_auth_timeout(rdev, dev, addr); | |
61 | cfg80211_wext_disconnected(dev); | |
62 | } | |
63 | EXPORT_SYMBOL(cfg80211_send_auth_timeout); | |
64 | ||
65 | void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr) | |
66 | { | |
67 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | |
68 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | |
69 | nl80211_send_assoc_timeout(rdev, dev, addr); | |
70 | cfg80211_wext_disconnected(dev); | |
71 | } | |
72 | EXPORT_SYMBOL(cfg80211_send_assoc_timeout); | |
73 | ||
a3b8b056 JM |
74 | void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr, |
75 | enum nl80211_key_type key_type, int key_id, | |
76 | const u8 *tsc) | |
77 | { | |
78 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | |
79 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | |
f58d4ed9 JB |
80 | #ifdef CONFIG_WIRELESS_EXT |
81 | union iwreq_data wrqu; | |
82 | char *buf = kmalloc(128, GFP_ATOMIC); | |
83 | ||
84 | if (buf) { | |
85 | sprintf(buf, "MLME-MICHAELMICFAILURE.indication(" | |
86 | "keyid=%d %scast addr=%pM)", key_id, | |
87 | key_type == NL80211_KEYTYPE_GROUP ? "broad" : "uni", | |
88 | addr); | |
89 | memset(&wrqu, 0, sizeof(wrqu)); | |
90 | wrqu.data.length = strlen(buf); | |
91 | wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); | |
92 | kfree(buf); | |
93 | } | |
94 | #endif | |
95 | ||
a3b8b056 JM |
96 | nl80211_michael_mic_failure(rdev, dev, addr, key_type, key_id, tsc); |
97 | } | |
98 | EXPORT_SYMBOL(cfg80211_michael_mic_failure); |