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;

Reply via email to