diff options
Diffstat (limited to 'net/mac80211/tx.c')
| -rw-r--r-- | net/mac80211/tx.c | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index acf712ffb5e6..c5e8c9c31f76 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -1811,37 +1811,31 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
| 1811 | meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, | 1811 | meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, |
| 1812 | sdata, NULL, NULL); | 1812 | sdata, NULL, NULL); |
| 1813 | } else { | 1813 | } else { |
| 1814 | int is_mesh_mcast = 1; | 1814 | /* DS -> MBSS (802.11-2012 13.11.3.3). |
| 1815 | const u8 *mesh_da; | 1815 | * For unicast with unknown forwarding information, |
| 1816 | * destination might be in the MBSS or if that fails | ||
| 1817 | * forwarded to another mesh gate. In either case | ||
| 1818 | * resolution will be handled in ieee80211_xmit(), so | ||
| 1819 | * leave the original DA. This also works for mcast */ | ||
| 1820 | const u8 *mesh_da = skb->data; | ||
| 1821 | |||
| 1822 | if (mppath) | ||
| 1823 | mesh_da = mppath->mpp; | ||
| 1824 | else if (mpath) | ||
| 1825 | mesh_da = mpath->dst; | ||
| 1826 | rcu_read_unlock(); | ||
| 1816 | 1827 | ||
| 1817 | if (is_multicast_ether_addr(skb->data)) | ||
| 1818 | /* DA TA mSA AE:SA */ | ||
| 1819 | mesh_da = skb->data; | ||
| 1820 | else { | ||
| 1821 | static const u8 bcast[ETH_ALEN] = | ||
| 1822 | { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; | ||
| 1823 | if (mppath) { | ||
| 1824 | /* RA TA mDA mSA AE:DA SA */ | ||
| 1825 | mesh_da = mppath->mpp; | ||
| 1826 | is_mesh_mcast = 0; | ||
| 1827 | } else if (mpath) { | ||
| 1828 | mesh_da = mpath->dst; | ||
| 1829 | is_mesh_mcast = 0; | ||
| 1830 | } else { | ||
| 1831 | /* DA TA mSA AE:SA */ | ||
| 1832 | mesh_da = bcast; | ||
| 1833 | } | ||
| 1834 | } | ||
| 1835 | hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, | 1828 | hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, |
| 1836 | mesh_da, sdata->vif.addr); | 1829 | mesh_da, sdata->vif.addr); |
| 1837 | rcu_read_unlock(); | 1830 | if (is_multicast_ether_addr(mesh_da)) |
| 1838 | if (is_mesh_mcast) | 1831 | /* DA TA mSA AE:SA */ |
| 1839 | meshhdrlen = | 1832 | meshhdrlen = |
| 1840 | ieee80211_new_mesh_header(&mesh_hdr, | 1833 | ieee80211_new_mesh_header(&mesh_hdr, |
| 1841 | sdata, | 1834 | sdata, |
| 1842 | skb->data + ETH_ALEN, | 1835 | skb->data + ETH_ALEN, |
| 1843 | NULL); | 1836 | NULL); |
| 1844 | else | 1837 | else |
| 1838 | /* RA TA mDA mSA AE:DA SA */ | ||
| 1845 | meshhdrlen = | 1839 | meshhdrlen = |
| 1846 | ieee80211_new_mesh_header(&mesh_hdr, | 1840 | ieee80211_new_mesh_header(&mesh_hdr, |
| 1847 | sdata, | 1841 | sdata, |
