Commit 184eebe6 authored by Markus Theil's avatar Markus Theil Committed by Johannes Berg

cfg80211/mac80211: add connected to auth server to meshconf

Besides information about num of peerings and gate connectivity,
the mesh formation byte also contains a flag for authentication
server connectivity, that currently cannot be set in the mesh conf.
This patch adds this capability, which is necessary to implement
802.1X authentication in mesh mode.
Signed-off-by: default avatarMarkus Theil <markus.theil@tu-ilmenau.de>
Link: https://lore.kernel.org/r/20200611140238.427461-1-markus.theil@tu-ilmenau.deSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent e3718a61
...@@ -1895,6 +1895,7 @@ struct mesh_config { ...@@ -1895,6 +1895,7 @@ struct mesh_config {
u16 dot11MeshHWMPnetDiameterTraversalTime; u16 dot11MeshHWMPnetDiameterTraversalTime;
u8 dot11MeshHWMPRootMode; u8 dot11MeshHWMPRootMode;
bool dot11MeshConnectedToMeshGate; bool dot11MeshConnectedToMeshGate;
bool dot11MeshConnectedToAuthServer;
u16 dot11MeshHWMPRannInterval; u16 dot11MeshHWMPRannInterval;
bool dot11MeshGateAnnouncementProtocol; bool dot11MeshGateAnnouncementProtocol;
bool dot11MeshForwarding; bool dot11MeshForwarding;
......
...@@ -4242,6 +4242,10 @@ enum nl80211_mesh_power_mode { ...@@ -4242,6 +4242,10 @@ enum nl80211_mesh_power_mode {
* better. So if using this setting you will likely also want to disable * better. So if using this setting you will likely also want to disable
* dot11MeshForwarding and use another mesh routing protocol on top. * dot11MeshForwarding and use another mesh routing protocol on top.
* *
* @NL80211_MESHCONF_CONNECTED_TO_AS: If set to true then this mesh STA
* will advertise that it is connected to a authentication server
* in the mesh formation field.
*
* @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
*/ */
enum nl80211_meshconf_params { enum nl80211_meshconf_params {
...@@ -4276,6 +4280,7 @@ enum nl80211_meshconf_params { ...@@ -4276,6 +4280,7 @@ enum nl80211_meshconf_params {
NL80211_MESHCONF_PLINK_TIMEOUT, NL80211_MESHCONF_PLINK_TIMEOUT,
NL80211_MESHCONF_CONNECTED_TO_GATE, NL80211_MESHCONF_CONNECTED_TO_GATE,
NL80211_MESHCONF_NOLEARN, NL80211_MESHCONF_NOLEARN,
NL80211_MESHCONF_CONNECTED_TO_AS,
/* keep last */ /* keep last */
__NL80211_MESHCONF_ATTR_AFTER_LAST, __NL80211_MESHCONF_ATTR_AFTER_LAST,
......
...@@ -2128,6 +2128,9 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy, ...@@ -2128,6 +2128,9 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
nconf->dot11MeshConnectedToMeshGate; nconf->dot11MeshConnectedToMeshGate;
if (_chg_mesh_attr(NL80211_MESHCONF_NOLEARN, mask)) if (_chg_mesh_attr(NL80211_MESHCONF_NOLEARN, mask))
conf->dot11MeshNolearn = nconf->dot11MeshNolearn; conf->dot11MeshNolearn = nconf->dot11MeshNolearn;
if (_chg_mesh_attr(NL80211_MESHCONF_CONNECTED_TO_AS, mask))
conf->dot11MeshConnectedToAuthServer =
nconf->dot11MeshConnectedToAuthServer;
ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON); ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
return 0; return 0;
} }
......
...@@ -639,6 +639,8 @@ IEEE80211_IF_FILE(dot11MeshAwakeWindowDuration, ...@@ -639,6 +639,8 @@ IEEE80211_IF_FILE(dot11MeshAwakeWindowDuration,
IEEE80211_IF_FILE(dot11MeshConnectedToMeshGate, IEEE80211_IF_FILE(dot11MeshConnectedToMeshGate,
u.mesh.mshcfg.dot11MeshConnectedToMeshGate, DEC); u.mesh.mshcfg.dot11MeshConnectedToMeshGate, DEC);
IEEE80211_IF_FILE(dot11MeshNolearn, u.mesh.mshcfg.dot11MeshNolearn, DEC); IEEE80211_IF_FILE(dot11MeshNolearn, u.mesh.mshcfg.dot11MeshNolearn, DEC);
IEEE80211_IF_FILE(dot11MeshConnectedToAuthServer,
u.mesh.mshcfg.dot11MeshConnectedToAuthServer, DEC);
#endif #endif
#define DEBUGFS_ADD_MODE(name, mode) \ #define DEBUGFS_ADD_MODE(name, mode) \
...@@ -764,6 +766,7 @@ static void add_mesh_config(struct ieee80211_sub_if_data *sdata) ...@@ -764,6 +766,7 @@ static void add_mesh_config(struct ieee80211_sub_if_data *sdata)
MESHPARAMS_ADD(dot11MeshAwakeWindowDuration); MESHPARAMS_ADD(dot11MeshAwakeWindowDuration);
MESHPARAMS_ADD(dot11MeshConnectedToMeshGate); MESHPARAMS_ADD(dot11MeshConnectedToMeshGate);
MESHPARAMS_ADD(dot11MeshNolearn); MESHPARAMS_ADD(dot11MeshNolearn);
MESHPARAMS_ADD(dot11MeshConnectedToAuthServer);
#undef MESHPARAMS_ADD #undef MESHPARAMS_ADD
} }
#endif #endif
......
...@@ -260,6 +260,7 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, ...@@ -260,6 +260,7 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata,
bool is_connected_to_gate = ifmsh->num_gates > 0 || bool is_connected_to_gate = ifmsh->num_gates > 0 ||
ifmsh->mshcfg.dot11MeshGateAnnouncementProtocol || ifmsh->mshcfg.dot11MeshGateAnnouncementProtocol ||
ifmsh->mshcfg.dot11MeshConnectedToMeshGate; ifmsh->mshcfg.dot11MeshConnectedToMeshGate;
bool is_connected_to_as = ifmsh->mshcfg.dot11MeshConnectedToAuthServer;
if (skb_tailroom(skb) < 2 + meshconf_len) if (skb_tailroom(skb) < 2 + meshconf_len)
return -ENOMEM; return -ENOMEM;
...@@ -284,7 +285,9 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, ...@@ -284,7 +285,9 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata,
/* Mesh Formation Info - number of neighbors */ /* Mesh Formation Info - number of neighbors */
neighbors = atomic_read(&ifmsh->estab_plinks); neighbors = atomic_read(&ifmsh->estab_plinks);
neighbors = min_t(int, neighbors, IEEE80211_MAX_MESH_PEERINGS); neighbors = min_t(int, neighbors, IEEE80211_MAX_MESH_PEERINGS);
*pos++ = (neighbors << 1) | is_connected_to_gate; *pos++ = (is_connected_to_as << 7) |
(neighbors << 1) |
is_connected_to_gate;
/* Mesh capability */ /* Mesh capability */
*pos = 0x00; *pos = 0x00;
*pos |= ifmsh->mshcfg.dot11MeshForwarding ? *pos |= ifmsh->mshcfg.dot11MeshForwarding ?
......
...@@ -6887,7 +6887,9 @@ static int nl80211_get_mesh_config(struct sk_buff *skb, ...@@ -6887,7 +6887,9 @@ static int nl80211_get_mesh_config(struct sk_buff *skb,
nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE, nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE,
cur_params.dot11MeshConnectedToMeshGate) || cur_params.dot11MeshConnectedToMeshGate) ||
nla_put_u8(msg, NL80211_MESHCONF_NOLEARN, nla_put_u8(msg, NL80211_MESHCONF_NOLEARN,
cur_params.dot11MeshNolearn)) cur_params.dot11MeshNolearn) ||
nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS,
cur_params.dot11MeshConnectedToAuthServer))
goto nla_put_failure; goto nla_put_failure;
nla_nest_end(msg, pinfoattr); nla_nest_end(msg, pinfoattr);
genlmsg_end(msg, hdr); genlmsg_end(msg, hdr);
...@@ -6946,6 +6948,7 @@ nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { ...@@ -6946,6 +6948,7 @@ nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
[NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
[NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1), [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
[NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1), [NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
[NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
}; };
static const struct nla_policy static const struct nla_policy
...@@ -7058,6 +7061,9 @@ do { \ ...@@ -7058,6 +7061,9 @@ do { \
FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask, FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask,
NL80211_MESHCONF_CONNECTED_TO_GATE, NL80211_MESHCONF_CONNECTED_TO_GATE,
nla_get_u8); nla_get_u8);
FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask,
NL80211_MESHCONF_CONNECTED_TO_AS,
nla_get_u8);
/* /*
* Check HT operation mode based on * Check HT operation mode based on
* IEEE 802.11-2016 9.4.2.57 HT Operation element. * IEEE 802.11-2016 9.4.2.57 HT Operation element.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment