Commit e232f884 authored by Michael Straube's avatar Michael Straube Committed by Greg Kroah-Hartman
Browse files

staging: rtl8188eu: use is_multicast_ether_addr in rtw_recv.c



Use is_multicast_ether_addr instead of custom IS_MCAST in
core/rtw_recv.c. In all uses the address array/memory is
properly aligned.

Signed-off-by: default avatarMichael Straube <straube.linux@gmail.com>
Reviewed-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3bd589eb
Loading
Loading
Loading
Loading
+18 −17
Original line number Original line Diff line number Diff line
@@ -233,7 +233,7 @@ static int recvframe_chkmic(struct adapter *adapter,


		/* calculate mic code */
		/* calculate mic code */
		if (stainfo) {
		if (stainfo) {
			if (IS_MCAST(prxattrib->ra)) {
			if (is_multicast_ether_addr(prxattrib->ra)) {
				if (!psecuritypriv) {
				if (!psecuritypriv) {
					res = _FAIL;
					res = _FAIL;
					RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
					RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
@@ -321,11 +321,11 @@ static int recvframe_chkmic(struct adapter *adapter,


				/*  double check key_index for some timing issue , */
				/*  double check key_index for some timing issue , */
				/*  cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue */
				/*  cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue */
				if ((IS_MCAST(prxattrib->ra) == true)  && (prxattrib->key_index != pmlmeinfo->key_index))
				if (is_multicast_ether_addr(prxattrib->ra) && prxattrib->key_index != pmlmeinfo->key_index)
					brpt_micerror = false;
					brpt_micerror = false;


				if ((prxattrib->bdecrypted) && (brpt_micerror)) {
				if ((prxattrib->bdecrypted) && (brpt_micerror)) {
					rtw_handle_tkip_mic_err(adapter, (u8)IS_MCAST(prxattrib->ra));
					rtw_handle_tkip_mic_err(adapter, (u8)is_multicast_ether_addr(prxattrib->ra));
					RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, (" mic error :prxattrib->bdecrypted=%d ", prxattrib->bdecrypted));
					RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, (" mic error :prxattrib->bdecrypted=%d ", prxattrib->bdecrypted));
					DBG_88E(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted);
					DBG_88E(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted);
				} else {
				} else {
@@ -335,7 +335,7 @@ static int recvframe_chkmic(struct adapter *adapter,
				res = _FAIL;
				res = _FAIL;
			} else {
			} else {
				/* mic checked ok */
				/* mic checked ok */
				if ((!psecuritypriv->bcheck_grpkey) && (IS_MCAST(prxattrib->ra))) {
				if (!psecuritypriv->bcheck_grpkey && is_multicast_ether_addr(prxattrib->ra)) {
					psecuritypriv->bcheck_grpkey = true;
					psecuritypriv->bcheck_grpkey = true;
					RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("psecuritypriv->bcheck_grpkey = true"));
					RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("psecuritypriv->bcheck_grpkey = true"));
				}
				}
@@ -648,7 +648,7 @@ int sta2sta_data_frame(struct adapter *adapter, struct recv_frame *precv_frame,
	u8 *mybssid  = get_bssid(pmlmepriv);
	u8 *mybssid  = get_bssid(pmlmepriv);
	u8 *myhwaddr = myid(&adapter->eeprompriv);
	u8 *myhwaddr = myid(&adapter->eeprompriv);
	u8 *sta_addr = NULL;
	u8 *sta_addr = NULL;
	int bmcast = IS_MCAST(pattrib->dst);
	bool mcast = is_multicast_ether_addr(pattrib->dst);


	if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true) ||
	if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true) ||
	    (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true)) {
	    (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true)) {
@@ -659,7 +659,7 @@ int sta2sta_data_frame(struct adapter *adapter, struct recv_frame *precv_frame,
			goto exit;
			goto exit;
		}
		}


		if ((memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) {
		if (memcmp(myhwaddr, pattrib->dst, ETH_ALEN) && !mcast) {
			ret = _FAIL;
			ret = _FAIL;
			goto exit;
			goto exit;
		}
		}
@@ -681,9 +681,9 @@ int sta2sta_data_frame(struct adapter *adapter, struct recv_frame *precv_frame,
		}
		}
		sta_addr = pattrib->bssid;
		sta_addr = pattrib->bssid;
	} else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
	} else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
		if (bmcast) {
		if (mcast) {
			/*  For AP mode, if DA == MCAST, then BSSID should be also MCAST */
			/*  For AP mode, if DA == MCAST, then BSSID should be also MCAST */
			if (!IS_MCAST(pattrib->bssid)) {
			if (!is_multicast_ether_addr(pattrib->bssid)) {
					ret = _FAIL;
					ret = _FAIL;
					goto exit;
					goto exit;
			}
			}
@@ -700,7 +700,7 @@ int sta2sta_data_frame(struct adapter *adapter, struct recv_frame *precv_frame,
		ret  = _FAIL;
		ret  = _FAIL;
	}
	}


	if (bmcast)
	if (mcast)
		*psta = rtw_get_bcmc_stainfo(adapter);
		*psta = rtw_get_bcmc_stainfo(adapter);
	else
	else
		*psta = rtw_get_stainfo(pstapriv, sta_addr); /*  get ap_info */
		*psta = rtw_get_stainfo(pstapriv, sta_addr); /*  get ap_info */
@@ -727,7 +727,7 @@ static int ap2sta_data_frame(
	struct	mlme_priv *pmlmepriv = &adapter->mlmepriv;
	struct	mlme_priv *pmlmepriv = &adapter->mlmepriv;
	u8 *mybssid  = get_bssid(pmlmepriv);
	u8 *mybssid  = get_bssid(pmlmepriv);
	u8 *myhwaddr = myid(&adapter->eeprompriv);
	u8 *myhwaddr = myid(&adapter->eeprompriv);
	int bmcast = IS_MCAST(pattrib->dst);
	bool mcast = is_multicast_ether_addr(pattrib->dst);


	if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true) &&
	if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true) &&
	    (check_fwstate(pmlmepriv, _FW_LINKED) == true ||
	    (check_fwstate(pmlmepriv, _FW_LINKED) == true ||
@@ -740,7 +740,7 @@ static int ap2sta_data_frame(
		}
		}


		/*  da should be for me */
		/*  da should be for me */
		if ((memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) {
		if (memcmp(myhwaddr, pattrib->dst, ETH_ALEN) && !mcast) {
			RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
			RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
				 (" %s:  compare DA fail; DA=%pM\n", __func__, (pattrib->dst)));
				 (" %s:  compare DA fail; DA=%pM\n", __func__, (pattrib->dst)));
			ret = _FAIL;
			ret = _FAIL;
@@ -755,7 +755,7 @@ static int ap2sta_data_frame(
				 (" %s:  compare BSSID fail ; BSSID=%pM\n", __func__, (pattrib->bssid)));
				 (" %s:  compare BSSID fail ; BSSID=%pM\n", __func__, (pattrib->bssid)));
			RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("mybssid=%pM\n", (mybssid)));
			RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("mybssid=%pM\n", (mybssid)));


			if (!bmcast) {
			if (!mcast) {
				DBG_88E("issue_deauth to the nonassociated ap=%pM for the reason(7)\n", (pattrib->bssid));
				DBG_88E("issue_deauth to the nonassociated ap=%pM for the reason(7)\n", (pattrib->bssid));
				issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
				issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
			}
			}
@@ -764,7 +764,7 @@ static int ap2sta_data_frame(
			goto exit;
			goto exit;
		}
		}


		if (bmcast)
		if (mcast)
			*psta = rtw_get_bcmc_stainfo(adapter);
			*psta = rtw_get_bcmc_stainfo(adapter);
		else
		else
			*psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /*  get ap_info */
			*psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /*  get ap_info */
@@ -789,7 +789,7 @@ static int ap2sta_data_frame(
		ret = RTW_RX_HANDLED;
		ret = RTW_RX_HANDLED;
		goto exit;
		goto exit;
	} else {
	} else {
		if (!memcmp(myhwaddr, pattrib->dst, ETH_ALEN) && (!bmcast)) {
		if (!memcmp(myhwaddr, pattrib->dst, ETH_ALEN) && !mcast) {
			*psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /*  get sta_info */
			*psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /*  get sta_info */
			if (*psta == NULL) {
			if (*psta == NULL) {
				DBG_88E("issue_deauth to the ap =%pM for the reason(7)\n", (pattrib->bssid));
				DBG_88E("issue_deauth to the ap =%pM for the reason(7)\n", (pattrib->bssid));
@@ -1129,9 +1129,9 @@ static int validate_recv_data_frame(struct adapter *adapter,


	if (pattrib->privacy) {
	if (pattrib->privacy) {
		RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("%s:pattrib->privacy=%x\n", __func__, pattrib->privacy));
		RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("%s:pattrib->privacy=%x\n", __func__, pattrib->privacy));
		RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("\n ^^^^^^^^^^^IS_MCAST(pattrib->ra(0x%02x))=%d^^^^^^^^^^^^^^^6\n", pattrib->ra[0], IS_MCAST(pattrib->ra)));
		RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("\n ^^^^^^^^^^^is_multicast_ether_addr(pattrib->ra(0x%02x))=%d^^^^^^^^^^^^^^^6\n", pattrib->ra[0], is_multicast_ether_addr(pattrib->ra)));


		GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, IS_MCAST(pattrib->ra));
		GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, is_multicast_ether_addr(pattrib->ra));


		RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("\n pattrib->encrypt=%d\n", pattrib->encrypt));
		RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("\n pattrib->encrypt=%d\n", pattrib->encrypt));


@@ -1971,7 +1971,8 @@ static int recv_func(struct adapter *padapter, struct recv_frame *rframe)
	if (ret == _SUCCESS) {
	if (ret == _SUCCESS) {
		/* check if need to enqueue into uc_swdec_pending_queue*/
		/* check if need to enqueue into uc_swdec_pending_queue*/
		if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
		if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
		    !IS_MCAST(prxattrib->ra) && prxattrib->encrypt > 0 &&
		    !is_multicast_ether_addr(prxattrib->ra) &&
		    prxattrib->encrypt > 0 &&
		    prxattrib->bdecrypted == 0 &&
		    prxattrib->bdecrypted == 0 &&
		    !is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm) &&
		    !is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm) &&
		    !psecuritypriv->busetkipkey) {
		    !psecuritypriv->busetkipkey) {