diff options
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 92fa95741761..f842f901d179 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -1899,6 +1899,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | |||
1899 | struct ieee80211_local *local = rx->local; | 1899 | struct ieee80211_local *local = rx->local; |
1900 | struct ieee80211_sub_if_data *sdata = rx->sdata; | 1900 | struct ieee80211_sub_if_data *sdata = rx->sdata; |
1901 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | 1901 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); |
1902 | __le16 reason = cpu_to_le16(WLAN_REASON_MESH_PATH_NOFORWARD); | ||
1902 | u16 q; | 1903 | u16 q; |
1903 | 1904 | ||
1904 | hdr = (struct ieee80211_hdr *) skb->data; | 1905 | hdr = (struct ieee80211_hdr *) skb->data; |
@@ -1985,13 +1986,14 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | |||
1985 | fwded_mcast); | 1986 | fwded_mcast); |
1986 | memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN); | 1987 | memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN); |
1987 | } else { | 1988 | } else { |
1988 | int err; | 1989 | if (mesh_nexthop_lookup(fwd_skb, sdata)) { |
1989 | err = mesh_nexthop_lookup(fwd_skb, sdata); | 1990 | /* can't resolve next hop, send a PERR */ |
1990 | /* Failed to immediately resolve next hop: | 1991 | mesh_path_error_tx(sdata->u.mesh.mshcfg.element_ttl, |
1991 | * fwded frame was dropped or will be added | 1992 | fwd_hdr->addr3, 0, reason, |
1992 | * later to the pending skb queue. */ | 1993 | fwd_hdr->addr2, sdata); |
1993 | if (err) | 1994 | sdata->u.mesh.mshstats.dropped_frames_no_route++; |
1994 | return RX_DROP_MONITOR; | 1995 | return RX_DROP_MONITOR; |
1996 | } | ||
1995 | 1997 | ||
1996 | IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh, | 1998 | IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh, |
1997 | fwded_unicast); | 1999 | fwded_unicast); |