|
@@ -386,7 +386,7 @@ static void ieee80211_verify_ip_alignment(struct ieee80211_rx_data *rx)
|
|
|
|
|
|
/* rx handlers */
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_passive_scan(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct ieee80211_local *local = rx->local;
|
|
@@ -463,7 +463,7 @@ ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct ieee80211_hdr *hdr;
|
|
@@ -522,7 +522,7 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
|
|
@@ -710,7 +710,7 @@ static int ap_sta_ps_end(struct net_device *dev, struct sta_info *sta)
|
|
|
return sent;
|
|
|
}
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct sta_info *sta = rx->sta;
|
|
@@ -858,7 +858,7 @@ ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata,
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct ieee80211_hdr *hdr;
|
|
@@ -974,7 +974,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
|
|
return RX_CONTINUE;
|
|
|
}
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_ps_poll(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev);
|
|
@@ -1049,7 +1049,7 @@ ieee80211_rx_h_ps_poll(struct ieee80211_rx_data *rx)
|
|
|
return RX_QUEUED;
|
|
|
}
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_remove_qos_control(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
u16 fc = rx->fc;
|
|
@@ -1367,7 +1367,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct net_device *dev = rx->dev;
|
|
@@ -1484,7 +1484,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
|
|
|
return RX_QUEUED;
|
|
|
}
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct net_device *dev = rx->dev;
|
|
@@ -1515,7 +1515,7 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
|
|
|
return RX_QUEUED;
|
|
|
}
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct ieee80211_local *local = rx->local;
|
|
@@ -1559,7 +1559,7 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx)
|
|
|
return RX_CONTINUE;
|
|
|
}
|
|
|
|
|
|
-static ieee80211_rx_result
|
|
|
+static ieee80211_rx_result debug_noinline
|
|
|
ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
|
|
|
{
|
|
|
struct ieee80211_sub_if_data *sdata;
|
|
@@ -1732,66 +1732,57 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx)
|
|
|
dev_kfree_skb(skb);
|
|
|
}
|
|
|
|
|
|
-typedef ieee80211_rx_result (*ieee80211_rx_handler)(struct ieee80211_rx_data *);
|
|
|
-static ieee80211_rx_handler ieee80211_rx_handlers[] =
|
|
|
-{
|
|
|
- ieee80211_rx_h_passive_scan,
|
|
|
- ieee80211_rx_h_check,
|
|
|
- ieee80211_rx_h_decrypt,
|
|
|
- ieee80211_rx_h_sta_process,
|
|
|
- ieee80211_rx_h_defragment,
|
|
|
- ieee80211_rx_h_ps_poll,
|
|
|
- ieee80211_rx_h_michael_mic_verify,
|
|
|
- /* this must be after decryption - so header is counted in MPDU mic
|
|
|
- * must be before pae and data, so QOS_DATA format frames
|
|
|
- * are not passed to user space by these functions
|
|
|
- */
|
|
|
- ieee80211_rx_h_remove_qos_control,
|
|
|
- ieee80211_rx_h_amsdu,
|
|
|
- ieee80211_rx_h_data,
|
|
|
- ieee80211_rx_h_ctrl,
|
|
|
- ieee80211_rx_h_mgmt,
|
|
|
- NULL
|
|
|
-};
|
|
|
|
|
|
static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata,
|
|
|
struct ieee80211_rx_data *rx,
|
|
|
struct sk_buff *skb)
|
|
|
{
|
|
|
- ieee80211_rx_handler *handler;
|
|
|
ieee80211_rx_result res = RX_DROP_MONITOR;
|
|
|
|
|
|
rx->skb = skb;
|
|
|
rx->sdata = sdata;
|
|
|
rx->dev = sdata->dev;
|
|
|
|
|
|
- for (handler = ieee80211_rx_handlers; *handler != NULL; handler++) {
|
|
|
- res = (*handler)(rx);
|
|
|
-
|
|
|
- switch (res) {
|
|
|
- case RX_CONTINUE:
|
|
|
- continue;
|
|
|
- case RX_DROP_UNUSABLE:
|
|
|
- case RX_DROP_MONITOR:
|
|
|
- I802_DEBUG_INC(sdata->local->rx_handlers_drop);
|
|
|
- if (rx->sta)
|
|
|
- rx->sta->rx_dropped++;
|
|
|
- break;
|
|
|
- case RX_QUEUED:
|
|
|
- I802_DEBUG_INC(sdata->local->rx_handlers_queued);
|
|
|
- break;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
+#define CALL_RXH(rxh) \
|
|
|
+ res = rxh(rx); \
|
|
|
+ if (res != RX_CONTINUE) \
|
|
|
+ goto rxh_done;
|
|
|
+
|
|
|
+ CALL_RXH(ieee80211_rx_h_passive_scan)
|
|
|
+ CALL_RXH(ieee80211_rx_h_check)
|
|
|
+ CALL_RXH(ieee80211_rx_h_decrypt)
|
|
|
+ CALL_RXH(ieee80211_rx_h_sta_process)
|
|
|
+ CALL_RXH(ieee80211_rx_h_defragment)
|
|
|
+ CALL_RXH(ieee80211_rx_h_ps_poll)
|
|
|
+ CALL_RXH(ieee80211_rx_h_michael_mic_verify)
|
|
|
+ /* must be after MMIC verify so header is counted in MPDU mic */
|
|
|
+ CALL_RXH(ieee80211_rx_h_remove_qos_control)
|
|
|
+ CALL_RXH(ieee80211_rx_h_amsdu)
|
|
|
+ CALL_RXH(ieee80211_rx_h_data)
|
|
|
+ CALL_RXH(ieee80211_rx_h_ctrl)
|
|
|
+ CALL_RXH(ieee80211_rx_h_mgmt)
|
|
|
+
|
|
|
+#undef CALL_RXH
|
|
|
+
|
|
|
+ rxh_done:
|
|
|
switch (res) {
|
|
|
- case RX_CONTINUE:
|
|
|
case RX_DROP_MONITOR:
|
|
|
+ I802_DEBUG_INC(sdata->local->rx_handlers_drop);
|
|
|
+ if (rx->sta)
|
|
|
+ rx->sta->rx_dropped++;
|
|
|
+ /* fall through */
|
|
|
+ case RX_CONTINUE:
|
|
|
ieee80211_rx_cooked_monitor(rx);
|
|
|
break;
|
|
|
case RX_DROP_UNUSABLE:
|
|
|
+ I802_DEBUG_INC(sdata->local->rx_handlers_drop);
|
|
|
+ if (rx->sta)
|
|
|
+ rx->sta->rx_dropped++;
|
|
|
dev_kfree_skb(rx->skb);
|
|
|
break;
|
|
|
+ case RX_QUEUED:
|
|
|
+ I802_DEBUG_INC(sdata->local->rx_handlers_queued);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|