diff options
-rw-r--r-- | net/mac80211/tx.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index f6018178f33c..865bdaf06ff1 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1811,7 +1811,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1811 | int nh_pos, h_pos; | 1811 | int nh_pos, h_pos; |
1812 | struct sta_info *sta = NULL; | 1812 | struct sta_info *sta = NULL; |
1813 | bool wme_sta = false, authorized = false, tdls_auth = false; | 1813 | bool wme_sta = false, authorized = false, tdls_auth = false; |
1814 | bool tdls_direct = false; | 1814 | bool tdls_peer = false, tdls_setup_frame = false; |
1815 | bool multicast; | 1815 | bool multicast; |
1816 | u32 info_flags = 0; | 1816 | u32 info_flags = 0; |
1817 | u16 info_id = 0; | 1817 | u16 info_id = 0; |
@@ -1953,34 +1953,35 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1953 | #endif | 1953 | #endif |
1954 | case NL80211_IFTYPE_STATION: | 1954 | case NL80211_IFTYPE_STATION: |
1955 | if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) { | 1955 | if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) { |
1956 | bool tdls_peer = false; | ||
1957 | |||
1958 | sta = sta_info_get(sdata, skb->data); | 1956 | sta = sta_info_get(sdata, skb->data); |
1959 | if (sta) { | 1957 | if (sta) { |
1960 | authorized = test_sta_flag(sta, | 1958 | authorized = test_sta_flag(sta, |
1961 | WLAN_STA_AUTHORIZED); | 1959 | WLAN_STA_AUTHORIZED); |
1962 | wme_sta = test_sta_flag(sta, WLAN_STA_WME); | 1960 | wme_sta = test_sta_flag(sta, WLAN_STA_WME); |
1963 | tdls_peer = test_sta_flag(sta, | 1961 | tdls_peer = test_sta_flag(sta, |
1964 | WLAN_STA_TDLS_PEER); | 1962 | WLAN_STA_TDLS_PEER); |
1965 | tdls_auth = test_sta_flag(sta, | 1963 | tdls_auth = test_sta_flag(sta, |
1966 | WLAN_STA_TDLS_PEER_AUTH); | 1964 | WLAN_STA_TDLS_PEER_AUTH); |
1967 | } | 1965 | } |
1968 | 1966 | ||
1969 | /* | 1967 | if (tdls_peer) |
1970 | * If the TDLS link is enabled, send everything | 1968 | tdls_setup_frame = |
1971 | * directly. Otherwise, allow TDLS setup frames | 1969 | ethertype == ETH_P_TDLS && |
1972 | * to be transmitted indirectly. | 1970 | skb->len > 14 && |
1973 | */ | 1971 | skb->data[14] == WLAN_TDLS_SNAP_RFTYPE; |
1974 | tdls_direct = tdls_peer && (tdls_auth || | ||
1975 | !(ethertype == ETH_P_TDLS && skb->len > 14 && | ||
1976 | skb->data[14] == WLAN_TDLS_SNAP_RFTYPE)); | ||
1977 | } | 1972 | } |
1978 | 1973 | ||
1979 | if (tdls_direct) { | 1974 | /* |
1980 | /* link during setup - throw out frames to peer */ | 1975 | * TDLS link during setup - throw out frames to peer. We allow |
1981 | if (!tdls_auth) | 1976 | * TDLS-setup frames to unauthorized peers for the special case |
1982 | goto fail_rcu; | 1977 | * of a link teardown after a TDLS sta is removed due to being |
1978 | * unreachable. | ||
1979 | */ | ||
1980 | if (tdls_peer && !tdls_auth && !tdls_setup_frame) | ||
1981 | goto fail_rcu; | ||
1983 | 1982 | ||
1983 | /* send direct packets to authorized TDLS peers */ | ||
1984 | if (tdls_peer && tdls_auth) { | ||
1984 | /* DA SA BSSID */ | 1985 | /* DA SA BSSID */ |
1985 | memcpy(hdr.addr1, skb->data, ETH_ALEN); | 1986 | memcpy(hdr.addr1, skb->data, ETH_ALEN); |
1986 | memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN); | 1987 | memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN); |