aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/nl80211.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless/nl80211.c')
-rw-r--r--net/wireless/nl80211.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 195424eee77d..1394115cde95 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -3430,6 +3430,46 @@ void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
3430 NL80211_CMD_DISASSOCIATE); 3430 NL80211_CMD_DISASSOCIATE);
3431} 3431}
3432 3432
3433void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
3434 struct net_device *netdev, const u8 *addr,
3435 enum nl80211_key_type key_type, int key_id,
3436 const u8 *tsc)
3437{
3438 struct sk_buff *msg;
3439 void *hdr;
3440
3441 msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
3442 if (!msg)
3443 return;
3444
3445 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
3446 if (!hdr) {
3447 nlmsg_free(msg);
3448 return;
3449 }
3450
3451 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
3452 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
3453 if (addr)
3454 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
3455 NLA_PUT_U32(msg, NL80211_ATTR_KEY_TYPE, key_type);
3456 NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
3457 if (tsc)
3458 NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, 6, tsc);
3459
3460 if (genlmsg_end(msg, hdr) < 0) {
3461 nlmsg_free(msg);
3462 return;
3463 }
3464
3465 genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, GFP_KERNEL);
3466 return;
3467
3468 nla_put_failure:
3469 genlmsg_cancel(msg, hdr);
3470 nlmsg_free(msg);
3471}
3472
3433/* initialisation/exit functions */ 3473/* initialisation/exit functions */
3434 3474
3435int nl80211_init(void) 3475int nl80211_init(void)