diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/mlme.c | 9 | ||||
-rw-r--r-- | net/wireless/Makefile | 2 | ||||
-rw-r--r-- | net/wireless/mlme.c | 46 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 72 | ||||
-rw-r--r-- | net/wireless/nl80211.h | 12 |
5 files changed, 138 insertions, 3 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 1f49b63d8dd2..6dc7a61bc18b 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1085,11 +1085,13 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, | |||
1085 | case WLAN_AUTH_OPEN: | 1085 | case WLAN_AUTH_OPEN: |
1086 | case WLAN_AUTH_LEAP: | 1086 | case WLAN_AUTH_LEAP: |
1087 | ieee80211_auth_completed(sdata); | 1087 | ieee80211_auth_completed(sdata); |
1088 | cfg80211_send_rx_auth(sdata->dev, (u8 *) mgmt, len); | ||
1088 | break; | 1089 | break; |
1089 | case WLAN_AUTH_SHARED_KEY: | 1090 | case WLAN_AUTH_SHARED_KEY: |
1090 | if (ifmgd->auth_transaction == 4) | 1091 | if (ifmgd->auth_transaction == 4) { |
1091 | ieee80211_auth_completed(sdata); | 1092 | ieee80211_auth_completed(sdata); |
1092 | else | 1093 | cfg80211_send_rx_auth(sdata->dev, (u8 *) mgmt, len); |
1094 | } else | ||
1093 | ieee80211_auth_challenge(sdata, mgmt, len); | 1095 | ieee80211_auth_challenge(sdata, mgmt, len); |
1094 | break; | 1096 | break; |
1095 | } | 1097 | } |
@@ -1125,6 +1127,7 @@ static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, | |||
1125 | 1127 | ||
1126 | ieee80211_set_disassoc(sdata, true, false, 0); | 1128 | ieee80211_set_disassoc(sdata, true, false, 0); |
1127 | ifmgd->flags &= ~IEEE80211_STA_AUTHENTICATED; | 1129 | ifmgd->flags &= ~IEEE80211_STA_AUTHENTICATED; |
1130 | cfg80211_send_rx_deauth(sdata->dev, (u8 *) mgmt, len); | ||
1128 | } | 1131 | } |
1129 | 1132 | ||
1130 | 1133 | ||
@@ -1154,6 +1157,7 @@ static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1154 | } | 1157 | } |
1155 | 1158 | ||
1156 | ieee80211_set_disassoc(sdata, false, false, reason_code); | 1159 | ieee80211_set_disassoc(sdata, false, false, reason_code); |
1160 | cfg80211_send_rx_disassoc(sdata->dev, (u8 *) mgmt, len); | ||
1157 | } | 1161 | } |
1158 | 1162 | ||
1159 | 1163 | ||
@@ -1370,6 +1374,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, | |||
1370 | ieee80211_set_associated(sdata, changed); | 1374 | ieee80211_set_associated(sdata, changed); |
1371 | 1375 | ||
1372 | ieee80211_associated(sdata); | 1376 | ieee80211_associated(sdata); |
1377 | cfg80211_send_rx_assoc(sdata->dev, (u8 *) mgmt, len); | ||
1373 | } | 1378 | } |
1374 | 1379 | ||
1375 | 1380 | ||
diff --git a/net/wireless/Makefile b/net/wireless/Makefile index c157b4d8014b..6d1e7b27b752 100644 --- a/net/wireless/Makefile +++ b/net/wireless/Makefile | |||
@@ -5,7 +5,7 @@ obj-$(CONFIG_LIB80211_CRYPT_WEP) += lib80211_crypt_wep.o | |||
5 | obj-$(CONFIG_LIB80211_CRYPT_CCMP) += lib80211_crypt_ccmp.o | 5 | obj-$(CONFIG_LIB80211_CRYPT_CCMP) += lib80211_crypt_ccmp.o |
6 | obj-$(CONFIG_LIB80211_CRYPT_TKIP) += lib80211_crypt_tkip.o | 6 | obj-$(CONFIG_LIB80211_CRYPT_TKIP) += lib80211_crypt_tkip.o |
7 | 7 | ||
8 | cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o scan.o nl80211.o | 8 | cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o scan.o nl80211.o mlme.o |
9 | cfg80211-$(CONFIG_WIRELESS_EXT) += wext-compat.o | 9 | cfg80211-$(CONFIG_WIRELESS_EXT) += wext-compat.o |
10 | 10 | ||
11 | ccflags-y += -D__CHECK_ENDIAN__ | 11 | ccflags-y += -D__CHECK_ENDIAN__ |
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c new file mode 100644 index 000000000000..bec5721b6f99 --- /dev/null +++ b/net/wireless/mlme.c | |||
@@ -0,0 +1,46 @@ | |||
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 | |||
31 | void cfg80211_send_rx_deauth(struct net_device *dev, const u8 *buf, size_t len) | ||
32 | { | ||
33 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | ||
34 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | ||
35 | nl80211_send_rx_deauth(rdev, dev, buf, len); | ||
36 | } | ||
37 | EXPORT_SYMBOL(cfg80211_send_rx_deauth); | ||
38 | |||
39 | void cfg80211_send_rx_disassoc(struct net_device *dev, const u8 *buf, | ||
40 | size_t len) | ||
41 | { | ||
42 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | ||
43 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | ||
44 | nl80211_send_rx_disassoc(rdev, dev, buf, len); | ||
45 | } | ||
46 | EXPORT_SYMBOL(cfg80211_send_rx_disassoc); | ||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index a3ecf8d73898..c034c2418cb3 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -2830,6 +2830,9 @@ static struct genl_ops nl80211_ops[] = { | |||
2830 | .dumpit = nl80211_dump_scan, | 2830 | .dumpit = nl80211_dump_scan, |
2831 | }, | 2831 | }, |
2832 | }; | 2832 | }; |
2833 | static struct genl_multicast_group nl80211_mlme_mcgrp = { | ||
2834 | .name = "mlme", | ||
2835 | }; | ||
2833 | 2836 | ||
2834 | /* multicast groups */ | 2837 | /* multicast groups */ |
2835 | static struct genl_multicast_group nl80211_config_mcgrp = { | 2838 | static struct genl_multicast_group nl80211_config_mcgrp = { |
@@ -2975,6 +2978,71 @@ nla_put_failure: | |||
2975 | nlmsg_free(msg); | 2978 | nlmsg_free(msg); |
2976 | } | 2979 | } |
2977 | 2980 | ||
2981 | static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, | ||
2982 | struct net_device *netdev, | ||
2983 | const u8 *buf, size_t len, | ||
2984 | enum nl80211_commands cmd) | ||
2985 | { | ||
2986 | struct sk_buff *msg; | ||
2987 | void *hdr; | ||
2988 | |||
2989 | msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); | ||
2990 | if (!msg) | ||
2991 | return; | ||
2992 | |||
2993 | hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); | ||
2994 | if (!hdr) { | ||
2995 | nlmsg_free(msg); | ||
2996 | return; | ||
2997 | } | ||
2998 | |||
2999 | NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx); | ||
3000 | NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex); | ||
3001 | NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf); | ||
3002 | |||
3003 | if (genlmsg_end(msg, hdr) < 0) { | ||
3004 | nlmsg_free(msg); | ||
3005 | return; | ||
3006 | } | ||
3007 | |||
3008 | genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, GFP_KERNEL); | ||
3009 | return; | ||
3010 | |||
3011 | nla_put_failure: | ||
3012 | genlmsg_cancel(msg, hdr); | ||
3013 | nlmsg_free(msg); | ||
3014 | } | ||
3015 | |||
3016 | void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, | ||
3017 | struct net_device *netdev, const u8 *buf, size_t len) | ||
3018 | { | ||
3019 | nl80211_send_mlme_event(rdev, netdev, buf, len, | ||
3020 | NL80211_CMD_AUTHENTICATE); | ||
3021 | } | ||
3022 | |||
3023 | void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, | ||
3024 | struct net_device *netdev, const u8 *buf, | ||
3025 | size_t len) | ||
3026 | { | ||
3027 | nl80211_send_mlme_event(rdev, netdev, buf, len, NL80211_CMD_ASSOCIATE); | ||
3028 | } | ||
3029 | |||
3030 | void nl80211_send_rx_deauth(struct cfg80211_registered_device *rdev, | ||
3031 | struct net_device *netdev, const u8 *buf, | ||
3032 | size_t len) | ||
3033 | { | ||
3034 | nl80211_send_mlme_event(rdev, netdev, buf, len, | ||
3035 | NL80211_CMD_DEAUTHENTICATE); | ||
3036 | } | ||
3037 | |||
3038 | void nl80211_send_rx_disassoc(struct cfg80211_registered_device *rdev, | ||
3039 | struct net_device *netdev, const u8 *buf, | ||
3040 | size_t len) | ||
3041 | { | ||
3042 | nl80211_send_mlme_event(rdev, netdev, buf, len, | ||
3043 | NL80211_CMD_DISASSOCIATE); | ||
3044 | } | ||
3045 | |||
2978 | /* initialisation/exit functions */ | 3046 | /* initialisation/exit functions */ |
2979 | 3047 | ||
2980 | int nl80211_init(void) | 3048 | int nl80211_init(void) |
@@ -3003,6 +3071,10 @@ int nl80211_init(void) | |||
3003 | if (err) | 3071 | if (err) |
3004 | goto err_out; | 3072 | goto err_out; |
3005 | 3073 | ||
3074 | err = genl_register_mc_group(&nl80211_fam, &nl80211_mlme_mcgrp); | ||
3075 | if (err) | ||
3076 | goto err_out; | ||
3077 | |||
3006 | return 0; | 3078 | return 0; |
3007 | err_out: | 3079 | err_out: |
3008 | genl_unregister_family(&nl80211_fam); | 3080 | genl_unregister_family(&nl80211_fam); |
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h index 5b5fe1339de0..b77af4ab80be 100644 --- a/net/wireless/nl80211.h +++ b/net/wireless/nl80211.h | |||
@@ -11,5 +11,17 @@ extern void nl80211_send_scan_done(struct cfg80211_registered_device *rdev, | |||
11 | extern void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev, | 11 | extern void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev, |
12 | struct net_device *netdev); | 12 | struct net_device *netdev); |
13 | extern void nl80211_send_reg_change_event(struct regulatory_request *request); | 13 | extern void nl80211_send_reg_change_event(struct regulatory_request *request); |
14 | extern void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, | ||
15 | struct net_device *netdev, | ||
16 | const u8 *buf, size_t len); | ||
17 | extern void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, | ||
18 | struct net_device *netdev, | ||
19 | const u8 *buf, size_t len); | ||
20 | extern void nl80211_send_rx_deauth(struct cfg80211_registered_device *rdev, | ||
21 | struct net_device *netdev, | ||
22 | const u8 *buf, size_t len); | ||
23 | extern void nl80211_send_rx_disassoc(struct cfg80211_registered_device *rdev, | ||
24 | struct net_device *netdev, | ||
25 | const u8 *buf, size_t len); | ||
14 | 26 | ||
15 | #endif /* __NET_WIRELESS_NL80211_H */ | 27 | #endif /* __NET_WIRELESS_NL80211_H */ |