diff options
Diffstat (limited to 'net/wireless/nl80211.c')
-rw-r--r-- | net/wireless/nl80211.c | 40 |
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 | ||
3433 | void 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 | ||
3435 | int nl80211_init(void) | 3475 | int nl80211_init(void) |