diff options
Diffstat (limited to 'net/mac80211/rx.c')
| -rw-r--r-- | net/mac80211/rx.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 45aad3d3108c..c2a6da5d80da 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -231,7 +231,7 @@ static void ieee80211_handle_mu_mimo_mon(struct ieee80211_sub_if_data *sdata, | |||
| 231 | struct ieee80211_hdr_3addr hdr; | 231 | struct ieee80211_hdr_3addr hdr; |
| 232 | u8 category; | 232 | u8 category; |
| 233 | u8 action_code; | 233 | u8 action_code; |
| 234 | } __packed action; | 234 | } __packed __aligned(2) action; |
| 235 | 235 | ||
| 236 | if (!sdata) | 236 | if (!sdata) |
| 237 | return; | 237 | return; |
| @@ -2644,6 +2644,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | |||
| 2644 | struct ieee80211_sub_if_data *sdata = rx->sdata; | 2644 | struct ieee80211_sub_if_data *sdata = rx->sdata; |
| 2645 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; | 2645 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; |
| 2646 | u16 ac, q, hdrlen; | 2646 | u16 ac, q, hdrlen; |
| 2647 | int tailroom = 0; | ||
| 2647 | 2648 | ||
| 2648 | hdr = (struct ieee80211_hdr *) skb->data; | 2649 | hdr = (struct ieee80211_hdr *) skb->data; |
| 2649 | hdrlen = ieee80211_hdrlen(hdr->frame_control); | 2650 | hdrlen = ieee80211_hdrlen(hdr->frame_control); |
| @@ -2723,15 +2724,21 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | |||
| 2723 | skb_set_queue_mapping(skb, q); | 2724 | skb_set_queue_mapping(skb, q); |
| 2724 | 2725 | ||
| 2725 | if (!--mesh_hdr->ttl) { | 2726 | if (!--mesh_hdr->ttl) { |
| 2726 | IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_ttl); | 2727 | if (!is_multicast_ether_addr(hdr->addr1)) |
| 2728 | IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, | ||
| 2729 | dropped_frames_ttl); | ||
| 2727 | goto out; | 2730 | goto out; |
| 2728 | } | 2731 | } |
| 2729 | 2732 | ||
| 2730 | if (!ifmsh->mshcfg.dot11MeshForwarding) | 2733 | if (!ifmsh->mshcfg.dot11MeshForwarding) |
| 2731 | goto out; | 2734 | goto out; |
| 2732 | 2735 | ||
| 2736 | if (sdata->crypto_tx_tailroom_needed_cnt) | ||
| 2737 | tailroom = IEEE80211_ENCRYPT_TAILROOM; | ||
| 2738 | |||
| 2733 | fwd_skb = skb_copy_expand(skb, local->tx_headroom + | 2739 | fwd_skb = skb_copy_expand(skb, local->tx_headroom + |
| 2734 | sdata->encrypt_headroom, 0, GFP_ATOMIC); | 2740 | sdata->encrypt_headroom, |
| 2741 | tailroom, GFP_ATOMIC); | ||
| 2735 | if (!fwd_skb) | 2742 | if (!fwd_skb) |
| 2736 | goto out; | 2743 | goto out; |
| 2737 | 2744 | ||
