cfg80211: pass TDLS initiator in tdls_mgmt operations
The TDLS initiator is set once during link setup. If determines the address ordering in the link identifier IE. Fix dependent drivers - mwifiex and mac80211. Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
17e6a59a36
commit
31fa97c5de
|
@ -2631,7 +2631,8 @@ static int
|
||||||
mwifiex_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
|
mwifiex_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
|
||||||
const u8 *peer, u8 action_code, u8 dialog_token,
|
const u8 *peer, u8 action_code, u8 dialog_token,
|
||||||
u16 status_code, u32 peer_capability,
|
u16 status_code, u32 peer_capability,
|
||||||
const u8 *extra_ies, size_t extra_ies_len)
|
bool initiator, const u8 *extra_ies,
|
||||||
|
size_t extra_ies_len)
|
||||||
{
|
{
|
||||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -2500,7 +2500,7 @@ struct cfg80211_ops {
|
||||||
int (*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev,
|
int (*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev,
|
||||||
const u8 *peer, u8 action_code, u8 dialog_token,
|
const u8 *peer, u8 action_code, u8 dialog_token,
|
||||||
u16 status_code, u32 peer_capability,
|
u16 status_code, u32 peer_capability,
|
||||||
const u8 *buf, size_t len);
|
bool initiator, const u8 *buf, size_t len);
|
||||||
int (*tdls_oper)(struct wiphy *wiphy, struct net_device *dev,
|
int (*tdls_oper)(struct wiphy *wiphy, struct net_device *dev,
|
||||||
const u8 *peer, enum nl80211_tdls_operation oper);
|
const u8 *peer, enum nl80211_tdls_operation oper);
|
||||||
|
|
||||||
|
|
|
@ -1591,6 +1591,9 @@ enum nl80211_commands {
|
||||||
* creation then the new interface will be owned by the netlink socket
|
* creation then the new interface will be owned by the netlink socket
|
||||||
* that created it and will be destroyed when the socket is closed
|
* that created it and will be destroyed when the socket is closed
|
||||||
*
|
*
|
||||||
|
* @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is
|
||||||
|
* the TDLS link initiator.
|
||||||
|
*
|
||||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||||
*/
|
*/
|
||||||
|
@ -1931,6 +1934,8 @@ enum nl80211_attrs {
|
||||||
NL80211_ATTR_CSA_C_OFFSETS_TX,
|
NL80211_ATTR_CSA_C_OFFSETS_TX,
|
||||||
NL80211_ATTR_MAX_CSA_COUNTERS,
|
NL80211_ATTR_MAX_CSA_COUNTERS,
|
||||||
|
|
||||||
|
NL80211_ATTR_TDLS_INITIATOR,
|
||||||
|
|
||||||
/* add attributes here, update the policy in nl80211.c */
|
/* add attributes here, update the policy in nl80211.c */
|
||||||
|
|
||||||
__NL80211_ATTR_AFTER_LAST,
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
|
|
|
@ -1867,7 +1867,8 @@ int ieee80211_max_num_channels(struct ieee80211_local *local);
|
||||||
int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
|
int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
|
||||||
const u8 *peer, u8 action_code, u8 dialog_token,
|
const u8 *peer, u8 action_code, u8 dialog_token,
|
||||||
u16 status_code, u32 peer_capability,
|
u16 status_code, u32 peer_capability,
|
||||||
const u8 *extra_ies, size_t extra_ies_len);
|
bool initiator, const u8 *extra_ies,
|
||||||
|
size_t extra_ies_len);
|
||||||
int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
|
int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
|
||||||
const u8 *peer, enum nl80211_tdls_operation oper);
|
const u8 *peer, enum nl80211_tdls_operation oper);
|
||||||
|
|
||||||
|
|
|
@ -299,7 +299,8 @@ fail:
|
||||||
int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
|
int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
|
||||||
const u8 *peer, u8 action_code, u8 dialog_token,
|
const u8 *peer, u8 action_code, u8 dialog_token,
|
||||||
u16 status_code, u32 peer_capability,
|
u16 status_code, u32 peer_capability,
|
||||||
const u8 *extra_ies, size_t extra_ies_len)
|
bool initiator, const u8 *extra_ies,
|
||||||
|
size_t extra_ies_len)
|
||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
|
|
@ -337,6 +337,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
|
||||||
[NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
|
[NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
|
||||||
[NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
|
[NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
|
||||||
[NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
|
[NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
|
||||||
|
[NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG },
|
||||||
[NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
|
[NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
|
||||||
[NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
|
[NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
|
||||||
.len = IEEE80211_MAX_DATA_LEN },
|
.len = IEEE80211_MAX_DATA_LEN },
|
||||||
|
@ -7365,6 +7366,7 @@ static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
|
||||||
u32 peer_capability = 0;
|
u32 peer_capability = 0;
|
||||||
u16 status_code;
|
u16 status_code;
|
||||||
u8 *peer;
|
u8 *peer;
|
||||||
|
bool initiator;
|
||||||
|
|
||||||
if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
|
if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
|
||||||
!rdev->ops->tdls_mgmt)
|
!rdev->ops->tdls_mgmt)
|
||||||
|
@ -7381,12 +7383,14 @@ static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
|
||||||
action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
|
action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
|
||||||
status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
|
status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
|
||||||
dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
|
dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
|
||||||
|
initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
|
||||||
if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
|
if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
|
||||||
peer_capability =
|
peer_capability =
|
||||||
nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
|
nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
|
||||||
|
|
||||||
return rdev_tdls_mgmt(rdev, dev, peer, action_code,
|
return rdev_tdls_mgmt(rdev, dev, peer, action_code,
|
||||||
dialog_token, status_code, peer_capability,
|
dialog_token, status_code, peer_capability,
|
||||||
|
initiator,
|
||||||
nla_data(info->attrs[NL80211_ATTR_IE]),
|
nla_data(info->attrs[NL80211_ATTR_IE]),
|
||||||
nla_len(info->attrs[NL80211_ATTR_IE]));
|
nla_len(info->attrs[NL80211_ATTR_IE]));
|
||||||
}
|
}
|
||||||
|
|
|
@ -751,15 +751,15 @@ static inline int rdev_tdls_mgmt(struct cfg80211_registered_device *rdev,
|
||||||
struct net_device *dev, u8 *peer,
|
struct net_device *dev, u8 *peer,
|
||||||
u8 action_code, u8 dialog_token,
|
u8 action_code, u8 dialog_token,
|
||||||
u16 status_code, u32 peer_capability,
|
u16 status_code, u32 peer_capability,
|
||||||
const u8 *buf, size_t len)
|
bool initiator, const u8 *buf, size_t len)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
trace_rdev_tdls_mgmt(&rdev->wiphy, dev, peer, action_code,
|
trace_rdev_tdls_mgmt(&rdev->wiphy, dev, peer, action_code,
|
||||||
dialog_token, status_code, peer_capability,
|
dialog_token, status_code, peer_capability,
|
||||||
buf, len);
|
initiator, buf, len);
|
||||||
ret = rdev->ops->tdls_mgmt(&rdev->wiphy, dev, peer, action_code,
|
ret = rdev->ops->tdls_mgmt(&rdev->wiphy, dev, peer, action_code,
|
||||||
dialog_token, status_code, peer_capability,
|
dialog_token, status_code, peer_capability,
|
||||||
buf, len);
|
initiator, buf, len);
|
||||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1454,9 +1454,9 @@ TRACE_EVENT(rdev_tdls_mgmt,
|
||||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
|
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
|
||||||
u8 *peer, u8 action_code, u8 dialog_token,
|
u8 *peer, u8 action_code, u8 dialog_token,
|
||||||
u16 status_code, u32 peer_capability,
|
u16 status_code, u32 peer_capability,
|
||||||
const u8 *buf, size_t len),
|
bool initiator, const u8 *buf, size_t len),
|
||||||
TP_ARGS(wiphy, netdev, peer, action_code, dialog_token, status_code,
|
TP_ARGS(wiphy, netdev, peer, action_code, dialog_token, status_code,
|
||||||
peer_capability, buf, len),
|
peer_capability, initiator, buf, len),
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
WIPHY_ENTRY
|
WIPHY_ENTRY
|
||||||
NETDEV_ENTRY
|
NETDEV_ENTRY
|
||||||
|
@ -1465,6 +1465,7 @@ TRACE_EVENT(rdev_tdls_mgmt,
|
||||||
__field(u8, dialog_token)
|
__field(u8, dialog_token)
|
||||||
__field(u16, status_code)
|
__field(u16, status_code)
|
||||||
__field(u32, peer_capability)
|
__field(u32, peer_capability)
|
||||||
|
__field(bool, initiator)
|
||||||
__dynamic_array(u8, buf, len)
|
__dynamic_array(u8, buf, len)
|
||||||
),
|
),
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
|
@ -1475,13 +1476,16 @@ TRACE_EVENT(rdev_tdls_mgmt,
|
||||||
__entry->dialog_token = dialog_token;
|
__entry->dialog_token = dialog_token;
|
||||||
__entry->status_code = status_code;
|
__entry->status_code = status_code;
|
||||||
__entry->peer_capability = peer_capability;
|
__entry->peer_capability = peer_capability;
|
||||||
|
__entry->initiator = initiator;
|
||||||
memcpy(__get_dynamic_array(buf), buf, len);
|
memcpy(__get_dynamic_array(buf), buf, len);
|
||||||
),
|
),
|
||||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", " MAC_PR_FMT ", action_code: %u, "
|
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", " MAC_PR_FMT ", action_code: %u, "
|
||||||
"dialog_token: %u, status_code: %u, peer_capability: %u buf: %#.2x ",
|
"dialog_token: %u, status_code: %u, peer_capability: %u "
|
||||||
|
"initiator: %s buf: %#.2x ",
|
||||||
WIPHY_PR_ARG, NETDEV_PR_ARG, MAC_PR_ARG(peer),
|
WIPHY_PR_ARG, NETDEV_PR_ARG, MAC_PR_ARG(peer),
|
||||||
__entry->action_code, __entry->dialog_token,
|
__entry->action_code, __entry->dialog_token,
|
||||||
__entry->status_code, __entry->peer_capability,
|
__entry->status_code, __entry->peer_capability,
|
||||||
|
BOOL_TO_STR(__entry->initiator),
|
||||||
((u8 *)__get_dynamic_array(buf))[0])
|
((u8 *)__get_dynamic_array(buf))[0])
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue