Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

wifi: mac80211: simplify __ieee80211_rx_h_amsdu() loop

The loop handling individual subframes can be simplified to
not use a somewhat confusing goto inside the loop.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250709233537.a217a1e8c667.I5283df9627912c06c8327b5786d6b715c6f3a4e1@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>

+8 -15
+8 -15
net/mac80211/rx.c
··· 3033 3033 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 3034 3034 __le16 fc = hdr->frame_control; 3035 3035 struct sk_buff_head frame_list; 3036 - ieee80211_rx_result res; 3037 3036 struct ethhdr ethhdr; 3038 3037 const u8 *check_da = ethhdr.h_dest, *check_sa = ethhdr.h_source; 3039 3038 ··· 3094 3095 while (!skb_queue_empty(&frame_list)) { 3095 3096 rx->skb = __skb_dequeue(&frame_list); 3096 3097 3097 - res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb); 3098 - switch (res) { 3098 + switch (ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb)) { 3099 3099 case RX_QUEUED: 3100 - continue; 3101 - case RX_CONTINUE: 3102 3100 break; 3101 + case RX_CONTINUE: 3102 + if (ieee80211_frame_allowed(rx, fc)) { 3103 + ieee80211_deliver_skb(rx); 3104 + break; 3105 + } 3106 + fallthrough; 3103 3107 default: 3104 - goto free; 3108 + dev_kfree_skb(rx->skb); 3105 3109 } 3106 - 3107 - if (!ieee80211_frame_allowed(rx, fc)) 3108 - goto free; 3109 - 3110 - ieee80211_deliver_skb(rx); 3111 - continue; 3112 - 3113 - free: 3114 - dev_kfree_skb(rx->skb); 3115 3110 } 3116 3111 3117 3112 return RX_QUEUED;