diff options
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r-- | net/mac80211/tx.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 68c2fbd16ebb..5950e3abead9 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1750,6 +1750,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1750 | __le16 fc; | 1750 | __le16 fc; |
1751 | struct ieee80211_hdr hdr; | 1751 | struct ieee80211_hdr hdr; |
1752 | struct ieee80211s_hdr mesh_hdr __maybe_unused; | 1752 | struct ieee80211s_hdr mesh_hdr __maybe_unused; |
1753 | struct mesh_path *mppath = NULL; | ||
1753 | const u8 *encaps_data; | 1754 | const u8 *encaps_data; |
1754 | int encaps_len, skip_header_bytes; | 1755 | int encaps_len, skip_header_bytes; |
1755 | int nh_pos, h_pos; | 1756 | int nh_pos, h_pos; |
@@ -1810,16 +1811,23 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1810 | ret = NETDEV_TX_OK; | 1811 | ret = NETDEV_TX_OK; |
1811 | goto fail; | 1812 | goto fail; |
1812 | } | 1813 | } |
1814 | if (!is_multicast_ether_addr(skb->data)) | ||
1815 | mppath = mpp_path_lookup(skb->data, sdata); | ||
1813 | 1816 | ||
1817 | /* | ||
1818 | * Do not use address extension, if it is a packet from | ||
1819 | * the same interface and the destination is not being | ||
1820 | * proxied by any other mest point. | ||
1821 | */ | ||
1814 | if (compare_ether_addr(sdata->vif.addr, | 1822 | if (compare_ether_addr(sdata->vif.addr, |
1815 | skb->data + ETH_ALEN) == 0) { | 1823 | skb->data + ETH_ALEN) == 0 && |
1824 | (!mppath || !compare_ether_addr(mppath->mpp, skb->data))) { | ||
1816 | hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, | 1825 | hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, |
1817 | skb->data, skb->data + ETH_ALEN); | 1826 | skb->data, skb->data + ETH_ALEN); |
1818 | meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, | 1827 | meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, |
1819 | sdata, NULL, NULL); | 1828 | sdata, NULL, NULL); |
1820 | } else { | 1829 | } else { |
1821 | /* packet from other interface */ | 1830 | /* packet from other interface */ |
1822 | struct mesh_path *mppath; | ||
1823 | int is_mesh_mcast = 1; | 1831 | int is_mesh_mcast = 1; |
1824 | const u8 *mesh_da; | 1832 | const u8 *mesh_da; |
1825 | 1833 | ||
@@ -1830,8 +1838,6 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1830 | else { | 1838 | else { |
1831 | static const u8 bcast[ETH_ALEN] = | 1839 | static const u8 bcast[ETH_ALEN] = |
1832 | { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; | 1840 | { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; |
1833 | |||
1834 | mppath = mpp_path_lookup(skb->data, sdata); | ||
1835 | if (mppath) { | 1841 | if (mppath) { |
1836 | /* RA TA mDA mSA AE:DA SA */ | 1842 | /* RA TA mDA mSA AE:DA SA */ |
1837 | mesh_da = mppath->mpp; | 1843 | mesh_da = mppath->mpp; |