Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 266515
b: refs/heads/master
c: 941c93c
h: refs/heads/master
i:
  266513: b3040c1
  266511: a3ab30b
v: v3
  • Loading branch information
Arik Nemtsov authored and John W. Linville committed Sep 30, 2011
1 parent caa8668 commit 5643917
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 07ba55d7f1d0da174c9bc545c713b44cee760197
refs/heads/master: 941c93cd039852b7ab02c74f4698c99d82bd6cfe
10 changes: 10 additions & 0 deletions trunk/net/mac80211/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -2427,6 +2427,7 @@ static int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
static int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
u8 *peer, enum nl80211_tdls_operation oper)
{
struct sta_info *sta;
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);

if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS))
Expand All @@ -2441,6 +2442,15 @@ static int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,

switch (oper) {
case NL80211_TDLS_ENABLE_LINK:
rcu_read_lock();
sta = sta_info_get(sdata, peer);
if (!sta) {
rcu_read_unlock();
return -ENOLINK;
}

set_sta_flags(sta, WLAN_STA_TDLS_PEER_AUTH);
rcu_read_unlock();
break;
case NL80211_TDLS_DISABLE_LINK:
return sta_info_destroy_addr(sdata, peer);
Expand Down
5 changes: 4 additions & 1 deletion trunk/net/mac80211/sta_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@
* station in power-save mode, reply when the driver unblocks.
* @WLAN_STA_PS_DRIVER_BUF: Station has frames pending in driver internal
* buffers. Automatically cleared on station wake-up.
* @WLAN_STA_TDLS_PEER: station is a TDLS peer.
* @WLAN_STA_TDLS_PEER: Station is a TDLS peer.
* @WLAN_STA_TDLS_PEER_AUTH: This TDLS peer is authorized to send direct
* packets. This means the link is enabled.
*/
enum ieee80211_sta_info_flags {
WLAN_STA_AUTH = 1<<0,
Expand All @@ -63,6 +65,7 @@ enum ieee80211_sta_info_flags {
WLAN_STA_PSPOLL = 1<<13,
WLAN_STA_PS_DRIVER_BUF = 1<<14,
WLAN_STA_TDLS_PEER = 1<<15,
WLAN_STA_TDLS_PEER_AUTH = 1<<16,
};

#define STA_TID_NUM 16
Expand Down
42 changes: 38 additions & 4 deletions trunk/net/mac80211/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1726,6 +1726,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
struct sta_info *sta = NULL;
u32 sta_flags = 0;
struct sk_buff *tmp_skb;
bool tdls_direct = false;

if (unlikely(skb->len < ETH_HLEN)) {
ret = NETDEV_TX_OK;
Expand Down Expand Up @@ -1837,18 +1838,51 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
break;
#endif
case NL80211_IFTYPE_STATION:
memcpy(hdr.addr1, sdata->u.mgd.bssid, ETH_ALEN);
if (sdata->u.mgd.use_4addr &&
cpu_to_be16(ethertype) != sdata->control_port_protocol) {
fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS);
if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) {
rcu_read_lock();
sta = sta_info_get(sdata, skb->data);
if (sta)
sta_flags = get_sta_flags(sta);
rcu_read_unlock();

/*
* If the TDLS link is enabled, send everything
* directly. Otherwise, allow TDLS setup frames
* to be transmitted indirectly.
*/
tdls_direct =
(sta_flags & WLAN_STA_TDLS_PEER) &&
((sta_flags & WLAN_STA_TDLS_PEER_AUTH) ||
!(ethertype == ETH_P_TDLS && skb->len > 14 &&
skb->data[14] == WLAN_TDLS_SNAP_RFTYPE));
}

if (tdls_direct) {
/* link during setup - throw out frames to peer */
if (!(sta_flags & WLAN_STA_TDLS_PEER_AUTH)) {
ret = NETDEV_TX_OK;
goto fail;
}

/* DA SA BSSID */
memcpy(hdr.addr1, skb->data, ETH_ALEN);
memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
memcpy(hdr.addr3, sdata->u.mgd.bssid, ETH_ALEN);
hdrlen = 24;
} else if (sdata->u.mgd.use_4addr &&
cpu_to_be16(ethertype) != sdata->control_port_protocol) {
fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS |
IEEE80211_FCTL_TODS);
/* RA TA DA SA */
memcpy(hdr.addr1, sdata->u.mgd.bssid, ETH_ALEN);
memcpy(hdr.addr2, sdata->vif.addr, ETH_ALEN);
memcpy(hdr.addr3, skb->data, ETH_ALEN);
memcpy(hdr.addr4, skb->data + ETH_ALEN, ETH_ALEN);
hdrlen = 30;
} else {
fc |= cpu_to_le16(IEEE80211_FCTL_TODS);
/* BSSID SA DA */
memcpy(hdr.addr1, sdata->u.mgd.bssid, ETH_ALEN);
memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
memcpy(hdr.addr3, skb->data, ETH_ALEN);
hdrlen = 24;
Expand Down
5 changes: 3 additions & 2 deletions trunk/net/wireless/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,8 +396,9 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,
}
break;
case cpu_to_le16(0):
if (iftype != NL80211_IFTYPE_ADHOC)
return -1;
if (iftype != NL80211_IFTYPE_ADHOC &&
iftype != NL80211_IFTYPE_STATION)
return -1;
break;
}

Expand Down

0 comments on commit 5643917

Please sign in to comment.