mac80211: remove trivial rx_data->fc users
Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Родитель
fc32f9243d
Коммит
a7767f958a
|
@ -352,9 +352,10 @@ static void ieee80211_parse_qos(struct ieee80211_rx_data *rx)
|
||||||
static void ieee80211_verify_ip_alignment(struct ieee80211_rx_data *rx)
|
static void ieee80211_verify_ip_alignment(struct ieee80211_rx_data *rx)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT
|
#ifdef CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT
|
||||||
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||||
int hdrlen;
|
int hdrlen;
|
||||||
|
|
||||||
if (!WLAN_FC_DATA_PRESENT(rx->fc))
|
if (!ieee80211_is_data_present(hdr->frame_control))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -376,7 +377,7 @@ static void ieee80211_verify_ip_alignment(struct ieee80211_rx_data *rx)
|
||||||
* header and the payload is not supported, the driver is required
|
* header and the payload is not supported, the driver is required
|
||||||
* to move the 802.11 header further back in that case.
|
* to move the 802.11 header further back in that case.
|
||||||
*/
|
*/
|
||||||
hdrlen = ieee80211_get_hdrlen(rx->fc);
|
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||||
if (rx->flags & IEEE80211_RX_AMSDU)
|
if (rx->flags & IEEE80211_RX_AMSDU)
|
||||||
hdrlen += ETH_HLEN;
|
hdrlen += ETH_HLEN;
|
||||||
WARN_ON_ONCE(((unsigned long)(rx->skb->data + hdrlen)) & 3);
|
WARN_ON_ONCE(((unsigned long)(rx->skb->data + hdrlen)) & 3);
|
||||||
|
@ -415,14 +416,11 @@ ieee80211_rx_h_passive_scan(struct ieee80211_rx_data *rx)
|
||||||
static ieee80211_rx_result
|
static ieee80211_rx_result
|
||||||
ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
|
ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
|
||||||
{
|
{
|
||||||
int hdrlen = ieee80211_get_hdrlen(rx->fc);
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
|
unsigned int hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||||
|
|
||||||
#define msh_h_get(h, l) ((struct ieee80211s_hdr *) ((u8 *)h + l))
|
if (ieee80211_is_data(hdr->frame_control)) {
|
||||||
|
if (!ieee80211_has_a4(hdr->frame_control))
|
||||||
if ((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) {
|
|
||||||
if (!((rx->fc & IEEE80211_FCTL_FROMDS) &&
|
|
||||||
(rx->fc & IEEE80211_FCTL_TODS)))
|
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
if (memcmp(hdr->addr4, rx->dev->dev_addr, ETH_ALEN) == 0)
|
if (memcmp(hdr->addr4, rx->dev->dev_addr, ETH_ALEN) == 0)
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
|
@ -435,27 +433,30 @@ ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
|
||||||
if (!rx->sta || sta_plink_state(rx->sta) != PLINK_ESTAB) {
|
if (!rx->sta || sta_plink_state(rx->sta) != PLINK_ESTAB) {
|
||||||
struct ieee80211_mgmt *mgmt;
|
struct ieee80211_mgmt *mgmt;
|
||||||
|
|
||||||
if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT)
|
if (!ieee80211_is_mgmt(hdr->frame_control))
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
|
|
||||||
switch (rx->fc & IEEE80211_FCTL_STYPE) {
|
if (ieee80211_is_action(hdr->frame_control)) {
|
||||||
case IEEE80211_STYPE_ACTION:
|
|
||||||
mgmt = (struct ieee80211_mgmt *)hdr;
|
mgmt = (struct ieee80211_mgmt *)hdr;
|
||||||
if (mgmt->u.action.category != PLINK_CATEGORY)
|
if (mgmt->u.action.category != PLINK_CATEGORY)
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
/* fall through on else */
|
|
||||||
case IEEE80211_STYPE_PROBE_REQ:
|
|
||||||
case IEEE80211_STYPE_PROBE_RESP:
|
|
||||||
case IEEE80211_STYPE_BEACON:
|
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return RX_DROP_MONITOR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA &&
|
if (ieee80211_is_probe_req(hdr->frame_control) ||
|
||||||
is_multicast_ether_addr(hdr->addr1) &&
|
ieee80211_is_probe_resp(hdr->frame_control) ||
|
||||||
mesh_rmc_check(hdr->addr4, msh_h_get(hdr, hdrlen), rx->dev))
|
ieee80211_is_beacon(hdr->frame_control))
|
||||||
|
return RX_CONTINUE;
|
||||||
|
|
||||||
|
return RX_DROP_MONITOR;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#define msh_h_get(h, l) ((struct ieee80211s_hdr *) ((u8 *)h + l))
|
||||||
|
|
||||||
|
if (ieee80211_is_data(hdr->frame_control) &&
|
||||||
|
is_multicast_ether_addr(hdr->addr1) &&
|
||||||
|
mesh_rmc_check(hdr->addr4, msh_h_get(hdr, hdrlen), rx->dev))
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
#undef msh_h_get
|
#undef msh_h_get
|
||||||
|
|
||||||
|
@ -466,13 +467,11 @@ ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
|
||||||
static ieee80211_rx_result debug_noinline
|
static ieee80211_rx_result debug_noinline
|
||||||
ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
|
ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
|
||||||
{
|
{
|
||||||
struct ieee80211_hdr *hdr;
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||||
|
|
||||||
hdr = (struct ieee80211_hdr *) rx->skb->data;
|
|
||||||
|
|
||||||
/* Drop duplicate 802.11 retransmissions (IEEE 802.11 Chap. 9.2.9) */
|
/* Drop duplicate 802.11 retransmissions (IEEE 802.11 Chap. 9.2.9) */
|
||||||
if (rx->sta && !is_multicast_ether_addr(hdr->addr1)) {
|
if (rx->sta && !is_multicast_ether_addr(hdr->addr1)) {
|
||||||
if (unlikely(rx->fc & IEEE80211_FCTL_RETRY &&
|
if (unlikely(ieee80211_has_retry(hdr->frame_control) &&
|
||||||
rx->sta->last_seq_ctrl[rx->queue] ==
|
rx->sta->last_seq_ctrl[rx->queue] ==
|
||||||
hdr->seq_ctrl)) {
|
hdr->seq_ctrl)) {
|
||||||
if (rx->flags & IEEE80211_RX_RA_MATCH) {
|
if (rx->flags & IEEE80211_RX_RA_MATCH) {
|
||||||
|
@ -501,15 +500,14 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
|
||||||
if (ieee80211_vif_is_mesh(&rx->sdata->vif))
|
if (ieee80211_vif_is_mesh(&rx->sdata->vif))
|
||||||
return ieee80211_rx_mesh_check(rx);
|
return ieee80211_rx_mesh_check(rx);
|
||||||
|
|
||||||
if (unlikely(((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA ||
|
if (unlikely((ieee80211_is_data(hdr->frame_control) ||
|
||||||
((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL &&
|
ieee80211_is_pspoll(hdr->frame_control)) &&
|
||||||
(rx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL)) &&
|
|
||||||
rx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
|
rx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
|
||||||
(!rx->sta || !test_sta_flags(rx->sta, WLAN_STA_ASSOC)))) {
|
(!rx->sta || !test_sta_flags(rx->sta, WLAN_STA_ASSOC)))) {
|
||||||
if ((!(rx->fc & IEEE80211_FCTL_FROMDS) &&
|
if ((!ieee80211_has_fromds(hdr->frame_control) &&
|
||||||
!(rx->fc & IEEE80211_FCTL_TODS) &&
|
!ieee80211_has_tods(hdr->frame_control) &&
|
||||||
(rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)
|
ieee80211_is_data(hdr->frame_control)) ||
|
||||||
|| !(rx->flags & IEEE80211_RX_RA_MATCH)) {
|
!(rx->flags & IEEE80211_RX_RA_MATCH)) {
|
||||||
/* Drop IBSS frames and frames for other hosts
|
/* Drop IBSS frames and frames for other hosts
|
||||||
* silently. */
|
* silently. */
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
|
@ -525,7 +523,7 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
|
||||||
static ieee80211_rx_result debug_noinline
|
static ieee80211_rx_result debug_noinline
|
||||||
ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||||
{
|
{
|
||||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||||
int keyidx;
|
int keyidx;
|
||||||
int hdrlen;
|
int hdrlen;
|
||||||
ieee80211_rx_result result = RX_DROP_UNUSABLE;
|
ieee80211_rx_result result = RX_DROP_UNUSABLE;
|
||||||
|
@ -557,7 +555,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||||
* possible.
|
* possible.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!(rx->fc & IEEE80211_FCTL_PROTECTED))
|
if (!ieee80211_has_protected(hdr->frame_control))
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -586,7 +584,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||||
(rx->status->flag & RX_FLAG_IV_STRIPPED))
|
(rx->status->flag & RX_FLAG_IV_STRIPPED))
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
|
||||||
hdrlen = ieee80211_get_hdrlen(rx->fc);
|
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||||
|
|
||||||
if (rx->skb->len < 8 + hdrlen)
|
if (rx->skb->len < 8 + hdrlen)
|
||||||
return RX_DROP_UNUSABLE; /* TODO: count this? */
|
return RX_DROP_UNUSABLE; /* TODO: count this? */
|
||||||
|
@ -618,7 +616,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||||
|
|
||||||
/* Check for weak IVs if possible */
|
/* Check for weak IVs if possible */
|
||||||
if (rx->sta && rx->key->conf.alg == ALG_WEP &&
|
if (rx->sta && rx->key->conf.alg == ALG_WEP &&
|
||||||
((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) &&
|
ieee80211_is_data(hdr->frame_control) &&
|
||||||
(!(rx->status->flag & RX_FLAG_IV_STRIPPED) ||
|
(!(rx->status->flag & RX_FLAG_IV_STRIPPED) ||
|
||||||
!(rx->status->flag & RX_FLAG_DECRYPTED)) &&
|
!(rx->status->flag & RX_FLAG_DECRYPTED)) &&
|
||||||
ieee80211_wep_is_weak_iv(rx->skb, rx->key))
|
ieee80211_wep_is_weak_iv(rx->skb, rx->key))
|
||||||
|
@ -710,7 +708,7 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
|
||||||
{
|
{
|
||||||
struct sta_info *sta = rx->sta;
|
struct sta_info *sta = rx->sta;
|
||||||
struct net_device *dev = rx->dev;
|
struct net_device *dev = rx->dev;
|
||||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||||
|
|
||||||
if (!sta)
|
if (!sta)
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
@ -744,21 +742,20 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
|
||||||
sta->last_qual = rx->status->qual;
|
sta->last_qual = rx->status->qual;
|
||||||
sta->last_noise = rx->status->noise;
|
sta->last_noise = rx->status->noise;
|
||||||
|
|
||||||
if (!(rx->fc & IEEE80211_FCTL_MOREFRAGS)) {
|
if (!ieee80211_has_morefrags(hdr->frame_control)) {
|
||||||
/* Change STA power saving mode only in the end of a frame
|
/* Change STA power saving mode only in the end of a frame
|
||||||
* exchange sequence */
|
* exchange sequence */
|
||||||
if (test_sta_flags(sta, WLAN_STA_PS) &&
|
if (test_sta_flags(sta, WLAN_STA_PS) &&
|
||||||
!(rx->fc & IEEE80211_FCTL_PM))
|
!ieee80211_has_pm(hdr->frame_control))
|
||||||
rx->sent_ps_buffered += ap_sta_ps_end(dev, sta);
|
rx->sent_ps_buffered += ap_sta_ps_end(dev, sta);
|
||||||
else if (!test_sta_flags(sta, WLAN_STA_PS) &&
|
else if (!test_sta_flags(sta, WLAN_STA_PS) &&
|
||||||
(rx->fc & IEEE80211_FCTL_PM))
|
ieee80211_has_pm(hdr->frame_control))
|
||||||
ap_sta_ps_start(dev, sta);
|
ap_sta_ps_start(dev, sta);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Drop data::nullfunc frames silently, since they are used only to
|
/* Drop data::nullfunc frames silently, since they are used only to
|
||||||
* control station power saving mode. */
|
* control station power saving mode. */
|
||||||
if ((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA &&
|
if (ieee80211_is_nullfunc(hdr->frame_control)) {
|
||||||
(rx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_NULLFUNC) {
|
|
||||||
I802_DEBUG_INC(rx->local->rx_handlers_drop_nullfunc);
|
I802_DEBUG_INC(rx->local->rx_handlers_drop_nullfunc);
|
||||||
/* Update counter and free packet here to avoid counting this
|
/* Update counter and free packet here to avoid counting this
|
||||||
* as a dropped packed. */
|
* as a dropped packed. */
|
||||||
|
@ -1465,15 +1462,15 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx)
|
||||||
struct ieee80211_local *local = rx->local;
|
struct ieee80211_local *local = rx->local;
|
||||||
struct ieee80211_hw *hw = &local->hw;
|
struct ieee80211_hw *hw = &local->hw;
|
||||||
struct sk_buff *skb = rx->skb;
|
struct sk_buff *skb = rx->skb;
|
||||||
struct ieee80211_bar *bar = (struct ieee80211_bar *) skb->data;
|
struct ieee80211_bar *bar = (struct ieee80211_bar *)skb->data;
|
||||||
struct tid_ampdu_rx *tid_agg_rx;
|
struct tid_ampdu_rx *tid_agg_rx;
|
||||||
u16 start_seq_num;
|
u16 start_seq_num;
|
||||||
u16 tid;
|
u16 tid;
|
||||||
|
|
||||||
if (likely((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_CTL))
|
if (likely(!ieee80211_is_ctl(bar->frame_control)))
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
|
||||||
if ((rx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BACK_REQ) {
|
if (ieee80211_is_back_req(bar->frame_control)) {
|
||||||
if (!rx->sta)
|
if (!rx->sta)
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
tid = le16_to_cpu(bar->control) >> 12;
|
tid = le16_to_cpu(bar->control) >> 12;
|
||||||
|
@ -1527,11 +1524,12 @@ static void ieee80211_rx_michael_mic_report(struct net_device *dev,
|
||||||
struct ieee80211_hdr *hdr,
|
struct ieee80211_hdr *hdr,
|
||||||
struct ieee80211_rx_data *rx)
|
struct ieee80211_rx_data *rx)
|
||||||
{
|
{
|
||||||
int keyidx, hdrlen;
|
int keyidx;
|
||||||
|
unsigned int hdrlen;
|
||||||
DECLARE_MAC_BUF(mac);
|
DECLARE_MAC_BUF(mac);
|
||||||
DECLARE_MAC_BUF(mac2);
|
DECLARE_MAC_BUF(mac2);
|
||||||
|
|
||||||
hdrlen = ieee80211_get_hdrlen_from_skb(rx->skb);
|
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||||
if (rx->skb->len >= hdrlen + 4)
|
if (rx->skb->len >= hdrlen + 4)
|
||||||
keyidx = rx->skb->data[hdrlen + 3] >> 6;
|
keyidx = rx->skb->data[hdrlen + 3] >> 6;
|
||||||
else
|
else
|
||||||
|
@ -1545,7 +1543,7 @@ static void ieee80211_rx_michael_mic_report(struct net_device *dev,
|
||||||
goto ignore;
|
goto ignore;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(rx->fc & IEEE80211_FCTL_PROTECTED))
|
if (!ieee80211_has_protected(hdr->frame_control))
|
||||||
goto ignore;
|
goto ignore;
|
||||||
|
|
||||||
if (rx->sdata->vif.type == IEEE80211_IF_TYPE_AP && keyidx) {
|
if (rx->sdata->vif.type == IEEE80211_IF_TYPE_AP && keyidx) {
|
||||||
|
@ -1558,9 +1556,8 @@ static void ieee80211_rx_michael_mic_report(struct net_device *dev,
|
||||||
goto ignore;
|
goto ignore;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA &&
|
if (!ieee80211_is_data(hdr->frame_control) &&
|
||||||
((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
|
!ieee80211_is_auth(hdr->frame_control))
|
||||||
(rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_AUTH))
|
|
||||||
goto ignore;
|
goto ignore;
|
||||||
|
|
||||||
mac80211_ev_michael_mic_failure(rx->dev, keyidx, hdr);
|
mac80211_ev_michael_mic_failure(rx->dev, keyidx, hdr);
|
||||||
|
@ -1731,8 +1728,7 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
|
||||||
case IEEE80211_IF_TYPE_IBSS:
|
case IEEE80211_IF_TYPE_IBSS:
|
||||||
if (!bssid)
|
if (!bssid)
|
||||||
return 0;
|
return 0;
|
||||||
if ((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT &&
|
if (ieee80211_is_beacon(hdr->frame_control)) {
|
||||||
(rx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON) {
|
|
||||||
if (!rx->sta)
|
if (!rx->sta)
|
||||||
rx->sta = ieee80211_ibss_add_sta(sdata->dev,
|
rx->sta = ieee80211_ibss_add_sta(sdata->dev,
|
||||||
rx->skb, bssid, hdr->addr2,
|
rx->skb, bssid, hdr->addr2,
|
||||||
|
@ -1783,8 +1779,7 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
case IEEE80211_IF_TYPE_WDS:
|
case IEEE80211_IF_TYPE_WDS:
|
||||||
if (bssid ||
|
if (bssid || !ieee80211_is_data(hdr->frame_control))
|
||||||
(rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA)
|
|
||||||
return 0;
|
return 0;
|
||||||
if (compare_ether_addr(sdata->u.wds.remote_addr, hdr->addr2))
|
if (compare_ether_addr(sdata->u.wds.remote_addr, hdr->addr2))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче