Commit 01d66fbd authored by Bob Copeland's avatar Bob Copeland Committed by Johannes Berg
Browse files

{nl,mac}80211: add dot11MeshConnectedToMeshGate to meshconf



When userspace is controlling mesh routing, it may have better
knowledge about whether a mesh STA is connected to a mesh
gate than the kernel mpath table.  Add dot11MeshConnectedToMeshGate
to the mesh config so that such applications can explicitly
signal that a mesh STA is connected to a gate, which will then
be advertised in the beacon.

Signed-off-by: default avatarBob Copeland <bobcopeland@fb.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent dbdaee7a
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -1562,6 +1562,10 @@ struct bss_parameters {
 * @plink_timeout: If no tx activity is seen from a STA we've established
 * @plink_timeout: If no tx activity is seen from a STA we've established
 *	peering with for longer than this time (in seconds), then remove it
 *	peering with for longer than this time (in seconds), then remove it
 *	from the STA's list of peers.  Default is 30 minutes.
 *	from the STA's list of peers.  Default is 30 minutes.
 * @dot11MeshConnectedToMeshGate: if set to true, advertise that this STA is
 *      connected to a mesh gate in mesh formation info.  If false, the
 *      value in mesh formation is determined by the presence of root paths
 *      in the mesh path table
 */
 */
struct mesh_config {
struct mesh_config {
	u16 dot11MeshRetryTimeout;
	u16 dot11MeshRetryTimeout;
@@ -1581,6 +1585,7 @@ struct mesh_config {
	u16 dot11MeshHWMPperrMinInterval;
	u16 dot11MeshHWMPperrMinInterval;
	u16 dot11MeshHWMPnetDiameterTraversalTime;
	u16 dot11MeshHWMPnetDiameterTraversalTime;
	u8 dot11MeshHWMPRootMode;
	u8 dot11MeshHWMPRootMode;
	bool dot11MeshConnectedToMeshGate;
	u16 dot11MeshHWMPRannInterval;
	u16 dot11MeshHWMPRannInterval;
	bool dot11MeshGateAnnouncementProtocol;
	bool dot11MeshGateAnnouncementProtocol;
	bool dot11MeshForwarding;
	bool dot11MeshForwarding;
+7 −1
Original line number Original line Diff line number Diff line
@@ -3117,7 +3117,7 @@ enum nl80211_sta_bss_param {
 *	some packets with an FCS error due to TA corruption. Hence this counter
 *	some packets with an FCS error due to TA corruption. Hence this counter
 *	might not be fully accurate.
 *	might not be fully accurate.
 * @NL80211_STA_INFO_CONNECTED_TO_GATE: set to true if STA has a path to a
 * @NL80211_STA_INFO_CONNECTED_TO_GATE: set to true if STA has a path to a
 *	mesh gate
 *	mesh gate (u8, 0 or 1)
 * @__NL80211_STA_INFO_AFTER_LAST: internal
 * @__NL80211_STA_INFO_AFTER_LAST: internal
 * @NL80211_STA_INFO_MAX: highest possible station info attribute
 * @NL80211_STA_INFO_MAX: highest possible station info attribute
 */
 */
@@ -3940,6 +3940,11 @@ enum nl80211_mesh_power_mode {
 *	remove it from the STA's list of peers. You may set this to 0 to disable
 *	remove it from the STA's list of peers. You may set this to 0 to disable
 *	the removal of the STA. Default is 30 minutes.
 *	the removal of the STA. Default is 30 minutes.
 *
 *
 * @NL80211_MESHCONF_CONNECTED_TO_GATE: If set to true then this mesh STA
 *	will advertise that it is connected to a gate in the mesh formation
 *	field.  If left unset then the mesh formation field will only
 *	advertise such if there is an active root mesh path.
 *
 * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
 * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
 */
 */
enum nl80211_meshconf_params {
enum nl80211_meshconf_params {
@@ -3972,6 +3977,7 @@ enum nl80211_meshconf_params {
	NL80211_MESHCONF_POWER_MODE,
	NL80211_MESHCONF_POWER_MODE,
	NL80211_MESHCONF_AWAKE_WINDOW,
	NL80211_MESHCONF_AWAKE_WINDOW,
	NL80211_MESHCONF_PLINK_TIMEOUT,
	NL80211_MESHCONF_PLINK_TIMEOUT,
	NL80211_MESHCONF_CONNECTED_TO_GATE,


	/* keep last */
	/* keep last */
	__NL80211_MESHCONF_ATTR_AFTER_LAST,
	__NL80211_MESHCONF_ATTR_AFTER_LAST,
+3 −0
Original line number Original line Diff line number Diff line
@@ -2028,6 +2028,9 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
			nconf->dot11MeshAwakeWindowDuration;
			nconf->dot11MeshAwakeWindowDuration;
	if (_chg_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask))
	if (_chg_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask))
		conf->plink_timeout = nconf->plink_timeout;
		conf->plink_timeout = nconf->plink_timeout;
	if (_chg_mesh_attr(NL80211_MESHCONF_CONNECTED_TO_GATE, mask))
		conf->dot11MeshConnectedToMeshGate =
			nconf->dot11MeshConnectedToMeshGate;
	ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
	ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
	return 0;
	return 0;
}
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -641,6 +641,8 @@ IEEE80211_IF_FILE(dot11MeshHWMPconfirmationInterval,
IEEE80211_IF_FILE(power_mode, u.mesh.mshcfg.power_mode, DEC);
IEEE80211_IF_FILE(power_mode, u.mesh.mshcfg.power_mode, DEC);
IEEE80211_IF_FILE(dot11MeshAwakeWindowDuration,
IEEE80211_IF_FILE(dot11MeshAwakeWindowDuration,
		  u.mesh.mshcfg.dot11MeshAwakeWindowDuration, DEC);
		  u.mesh.mshcfg.dot11MeshAwakeWindowDuration, DEC);
IEEE80211_IF_FILE(dot11MeshConnectedToMeshGate,
		  u.mesh.mshcfg.dot11MeshConnectedToMeshGate, DEC);
#endif
#endif


#define DEBUGFS_ADD_MODE(name, mode) \
#define DEBUGFS_ADD_MODE(name, mode) \
@@ -762,6 +764,7 @@ static void add_mesh_config(struct ieee80211_sub_if_data *sdata)
	MESHPARAMS_ADD(dot11MeshHWMPconfirmationInterval);
	MESHPARAMS_ADD(dot11MeshHWMPconfirmationInterval);
	MESHPARAMS_ADD(power_mode);
	MESHPARAMS_ADD(power_mode);
	MESHPARAMS_ADD(dot11MeshAwakeWindowDuration);
	MESHPARAMS_ADD(dot11MeshAwakeWindowDuration);
	MESHPARAMS_ADD(dot11MeshConnectedToMeshGate);
#undef MESHPARAMS_ADD
#undef MESHPARAMS_ADD
}
}
#endif
#endif
+2 −1
Original line number Original line Diff line number Diff line
@@ -255,7 +255,8 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata,
	u8 *pos, neighbors;
	u8 *pos, neighbors;
	u8 meshconf_len = sizeof(struct ieee80211_meshconf_ie);
	u8 meshconf_len = sizeof(struct ieee80211_meshconf_ie);
	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;


	if (skb_tailroom(skb) < 2 + meshconf_len)
	if (skb_tailroom(skb) < 2 + meshconf_len)
		return -ENOMEM;
		return -ENOMEM;
Loading