Module Name: src Committed By: maxv Date: Tue Jan 16 16:04:17 UTC 2018
Modified Files: src/sys/net80211: ieee80211_input.c Log Message: Introduce ieee80211_recv_mgmt_deauth. To generate a diff of this commit: cvs rdiff -u -r1.101 -r1.102 src/sys/net80211/ieee80211_input.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net80211/ieee80211_input.c diff -u src/sys/net80211/ieee80211_input.c:1.101 src/sys/net80211/ieee80211_input.c:1.102 --- src/sys/net80211/ieee80211_input.c:1.101 Tue Jan 16 16:00:17 2018 +++ src/sys/net80211/ieee80211_input.c Tue Jan 16 16:04:16 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ieee80211_input.c,v 1.101 2018/01/16 16:00:17 maxv Exp $ */ +/* $NetBSD: ieee80211_input.c,v 1.102 2018/01/16 16:04:16 maxv Exp $ */ /* * Copyright (c) 2001 Atsushi Onoe @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.81 2005/08/10 16:22:29 sam Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.101 2018/01/16 16:00:17 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.102 2018/01/16 16:04:16 maxv Exp $"); #endif #ifdef _KERNEL_OPT @@ -2802,6 +2802,59 @@ ieee80211_recv_mgmt_assoc_resp(struct ie ieee80211_new_state(ic, IEEE80211_S_RUN, subtype); } +static void +ieee80211_recv_mgmt_deauth(struct ieee80211com *ic, struct mbuf *m0, + struct ieee80211_node *ni, int subtype, int rssi, u_int32_t rstamp) +{ + struct ieee80211_frame *wh; + u_int8_t *frm, *efrm; + IEEE80211_DEBUGVAR(char ebuf[3 * ETHER_ADDR_LEN]); + + wh = mtod(m0, struct ieee80211_frame *); + frm = (u_int8_t *)(wh + 1); + efrm = mtod(m0, u_int8_t *) + m0->m_len; + + u_int16_t reason; + + if (ic->ic_state == IEEE80211_S_SCAN) { + ic->ic_stats.is_rx_mgtdiscard++; + return; + } + /* + * deauth frame format + * [2] reason + */ + IEEE80211_VERIFY_LENGTH(efrm - frm, 2); + reason = le16toh(*(u_int16_t *)frm); + __USE(reason); + ic->ic_stats.is_rx_deauth++; + IEEE80211_NODE_STAT(ni, rx_deauth); + + if (!IEEE80211_ADDR_EQ(wh->i_addr1, ic->ic_myaddr)) { + /* Not intended for this station. */ + ic->ic_stats.is_rx_mgtdiscard++; + return; + } + IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, + "[%s] recv deauthenticate (reason %d)\n", + ether_snprintf(ebuf, sizeof(ebuf), ni->ni_macaddr), reason); + switch (ic->ic_opmode) { + case IEEE80211_M_STA: + ieee80211_new_state(ic, IEEE80211_S_AUTH, + wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK); + break; + case IEEE80211_M_HOSTAP: +#ifndef IEEE80211_NO_HOSTAP + if (ni != ic->ic_bss) + ieee80211_node_leave(ic, ni); +#endif /* !IEEE80211_NO_HOSTAP */ + break; + default: + ic->ic_stats.is_rx_mgtdiscard++; + break; + } +} + /* -------------------------------------------------------------------------- */ void @@ -2840,48 +2893,9 @@ ieee80211_recv_mgmt(struct ieee80211com ieee80211_recv_mgmt_assoc_resp(ic, m0, ni, subtype, rssi, rstamp); return; - case IEEE80211_FC0_SUBTYPE_DEAUTH: { - u_int16_t reason; - - if (ic->ic_state == IEEE80211_S_SCAN) { - ic->ic_stats.is_rx_mgtdiscard++; - return; - } - /* - * deauth frame format - * [2] reason - */ - IEEE80211_VERIFY_LENGTH(efrm - frm, 2); - reason = le16toh(*(u_int16_t *)frm); - __USE(reason); - ic->ic_stats.is_rx_deauth++; - IEEE80211_NODE_STAT(ni, rx_deauth); - - if (!IEEE80211_ADDR_EQ(wh->i_addr1, ic->ic_myaddr)) { - /* Not intended for this station. */ - ic->ic_stats.is_rx_mgtdiscard++; - break; - } - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "[%s] recv deauthenticate (reason %d)\n", - ether_snprintf(ebuf, sizeof(ebuf), ni->ni_macaddr), reason); - switch (ic->ic_opmode) { - case IEEE80211_M_STA: - ieee80211_new_state(ic, IEEE80211_S_AUTH, - wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK); - break; - case IEEE80211_M_HOSTAP: -#ifndef IEEE80211_NO_HOSTAP - if (ni != ic->ic_bss) - ieee80211_node_leave(ic, ni); -#endif /* !IEEE80211_NO_HOSTAP */ - break; - default: - ic->ic_stats.is_rx_mgtdiscard++; - break; - } - break; - } + case IEEE80211_FC0_SUBTYPE_DEAUTH: + ieee80211_recv_mgmt_deauth(ic, m0, ni, subtype, rssi, rstamp); + return; case IEEE80211_FC0_SUBTYPE_DISASSOC: { u_int16_t reason;