Commit | Line | Data |
---|---|---|
71e9bd3f | 1 | // SPDX-License-Identifier: GPL-2.0 |
5adef66a LF |
2 | /****************************************************************************** |
3 | * | |
4 | * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. | |
5 | * | |
5adef66a | 6 | ******************************************************************************/ |
5adef66a LF |
7 | #include <osdep_service.h> |
8 | #include <drv_types.h> | |
9 | ||
10 | #include <wifi.h> | |
11 | #include <recv_osdep.h> | |
12 | ||
13 | #include <osdep_intf.h> | |
17452ee9 | 14 | #include <usb_ops_linux.h> |
5adef66a | 15 | |
5adef66a LF |
16 | /* alloc os related resource in struct recv_buf */ |
17 | int rtw_os_recvbuf_resource_alloc(struct adapter *padapter, | |
18 | struct recv_buf *precvbuf) | |
19 | { | |
5adef66a LF |
20 | precvbuf->pskb = NULL; |
21 | precvbuf->reuse = false; | |
469d3807 SM |
22 | precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL); |
23 | if (!precvbuf->purb) | |
24 | return _FAIL; | |
25 | return _SUCCESS; | |
5adef66a LF |
26 | } |
27 | ||
5adef66a LF |
28 | void rtw_handle_tkip_mic_err(struct adapter *padapter, u8 bgroup) |
29 | { | |
30 | union iwreq_data wrqu; | |
a98a5c27 MS |
31 | struct iw_michaelmicfailure ev; |
32 | struct mlme_priv *pmlmepriv = &padapter->mlmepriv; | |
33 | struct security_priv *psecuritypriv = &padapter->securitypriv; | |
5adef66a LF |
34 | u32 cur_time = 0; |
35 | ||
36 | if (psecuritypriv->last_mic_err_time == 0) { | |
c01fb496 | 37 | psecuritypriv->last_mic_err_time = jiffies; |
5adef66a | 38 | } else { |
c01fb496 | 39 | cur_time = jiffies; |
5adef66a | 40 | |
c3da4dea | 41 | if (cur_time - psecuritypriv->last_mic_err_time < 60 * HZ) { |
5adef66a LF |
42 | psecuritypriv->btkip_countermeasure = true; |
43 | psecuritypriv->last_mic_err_time = 0; | |
44 | psecuritypriv->btkip_countermeasure_time = cur_time; | |
45 | } else { | |
c01fb496 | 46 | psecuritypriv->last_mic_err_time = jiffies; |
5adef66a LF |
47 | } |
48 | } | |
49 | ||
1ce39848 | 50 | memset(&ev, 0x00, sizeof(ev)); |
5adef66a LF |
51 | if (bgroup) |
52 | ev.flags |= IW_MICFAILURE_GROUP; | |
53 | else | |
54 | ev.flags |= IW_MICFAILURE_PAIRWISE; | |
55 | ||
56 | ev.src_addr.sa_family = ARPHRD_ETHER; | |
57 | memcpy(ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[0], ETH_ALEN); | |
1ce39848 | 58 | memset(&wrqu, 0x00, sizeof(wrqu)); |
5adef66a LF |
59 | wrqu.data.length = sizeof(ev); |
60 | wireless_send_event(padapter->pnetdev, IWEVMICHAELMICFAILURE, | |
61 | &wrqu, (char *)&ev); | |
62 | } | |
63 | ||
5adef66a | 64 | int rtw_recv_indicatepkt(struct adapter *padapter, |
f31cca8e | 65 | struct recv_frame *precv_frame) |
5adef66a LF |
66 | { |
67 | struct recv_priv *precvpriv; | |
68 | struct __queue *pfree_recv_queue; | |
69 | struct sk_buff *skb; | |
70 | struct mlme_priv *pmlmepriv = &padapter->mlmepriv; | |
71 | ||
056ef758 MS |
72 | precvpriv = &padapter->recvpriv; |
73 | pfree_recv_queue = &precvpriv->free_recv_queue; | |
5adef66a | 74 | |
f31cca8e | 75 | skb = precv_frame->pkt; |
fc749a9a | 76 | if (!skb) { |
5adef66a | 77 | RT_TRACE(_module_recv_osdep_c_, _drv_err_, |
c3c4b8e5 | 78 | ("%s():skb == NULL something wrong!!!!\n", __func__)); |
5adef66a LF |
79 | goto _recv_indicatepkt_drop; |
80 | } | |
81 | ||
5adef66a LF |
82 | if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { |
83 | struct sk_buff *pskb2 = NULL; | |
84 | struct sta_info *psta = NULL; | |
85 | struct sta_priv *pstapriv = &padapter->stapriv; | |
f31cca8e | 86 | struct rx_pkt_attrib *pattrib = &precv_frame->attrib; |
247e415f | 87 | bool mcast = is_multicast_ether_addr(pattrib->dst); |
5adef66a | 88 | |
f42f52aa LF |
89 | if (memcmp(pattrib->dst, myid(&padapter->eeprompriv), |
90 | ETH_ALEN)) { | |
247e415f | 91 | if (mcast) { |
5adef66a LF |
92 | psta = rtw_get_bcmc_stainfo(padapter); |
93 | pskb2 = skb_clone(skb, GFP_ATOMIC); | |
94 | } else { | |
95 | psta = rtw_get_stainfo(pstapriv, pattrib->dst); | |
96 | } | |
97 | ||
98 | if (psta) { | |
99 | struct net_device *pnetdev; | |
100 | ||
101 | pnetdev = (struct net_device *)padapter->pnetdev; | |
102 | skb->dev = pnetdev; | |
103 | skb_set_queue_mapping(skb, rtw_recv_select_queue(skb)); | |
104 | ||
105 | rtw_xmit_entry(skb, pnetdev); | |
106 | ||
247e415f | 107 | if (mcast) |
5adef66a LF |
108 | skb = pskb2; |
109 | else | |
110 | goto _recv_indicatepkt_end; | |
111 | } | |
112 | } | |
113 | } | |
114 | ||
5adef66a LF |
115 | skb->ip_summed = CHECKSUM_NONE; |
116 | skb->dev = padapter->pnetdev; | |
117 | skb->protocol = eth_type_trans(skb, padapter->pnetdev); | |
118 | ||
119 | netif_rx(skb); | |
120 | ||
121 | _recv_indicatepkt_end: | |
122 | ||
123 | /* pointers to NULL before rtw_free_recvframe() */ | |
f31cca8e | 124 | precv_frame->pkt = NULL; |
5adef66a LF |
125 | |
126 | rtw_free_recvframe(precv_frame, pfree_recv_queue); | |
127 | ||
128 | RT_TRACE(_module_recv_osdep_c_, _drv_info_, | |
c3c4b8e5 | 129 | ("\n %s :after netif_rx!!!!\n", __func__)); |
5adef66a | 130 | |
5adef66a LF |
131 | return _SUCCESS; |
132 | ||
133 | _recv_indicatepkt_drop: | |
134 | ||
135 | /* enqueue back to free_recv_queue */ | |
9b276d2b | 136 | rtw_free_recvframe(precv_frame, pfree_recv_queue); |
5adef66a | 137 | |
a98a5c27 | 138 | return _FAIL; |
5adef66a LF |
139 | } |
140 | ||
5adef66a LF |
141 | void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl) |
142 | { | |
b7749656 KC |
143 | timer_setup(&preorder_ctrl->reordering_ctrl_timer, |
144 | rtw_reordering_ctrl_timeout_handler, 0); | |
5adef66a | 145 | } |