summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2019-01-24 15:32:06 +0100
committerLubomir Rintel <lkundrak@v3.sk>2019-07-29 10:47:44 +0200
commitf1ab27a2971ca4d1bd894c531f1f78b4506955b0 (patch)
tree439aaa89427c1976a791995d3ac690125d9b39ba
parentf249956cf7e6fdcef0dc2dcb76ca938f9e3dff21 (diff)
downloadNetworkManager-f1ab27a2971ca4d1bd894c531f1f78b4506955b0.tar.gz
setting-wireless: allow Mesh mode
-rw-r--r--libnm-core/nm-setting-wireless.c8
-rw-r--r--libnm-core/nm-setting-wireless.h7
-rw-r--r--src/platform/wifi/nm-wifi-utils-nl80211.c15
-rw-r--r--src/platform/wifi/nm-wifi-utils.c3
4 files changed, 27 insertions, 6 deletions
diff --git a/libnm-core/nm-setting-wireless.c b/libnm-core/nm-setting-wireless.c
index cfcc72b49d..4f40d4ea85 100644
--- a/libnm-core/nm-setting-wireless.c
+++ b/libnm-core/nm-setting-wireless.c
@@ -757,7 +757,13 @@ static gboolean
verify (NMSetting *setting, NMConnection *connection, GError **error)
{
NMSettingWirelessPrivate *priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting);
- const char *valid_modes[] = { NM_SETTING_WIRELESS_MODE_INFRA, NM_SETTING_WIRELESS_MODE_ADHOC, NM_SETTING_WIRELESS_MODE_AP, NULL };
+ const char *valid_modes[] = {
+ NM_SETTING_WIRELESS_MODE_INFRA,
+ NM_SETTING_WIRELESS_MODE_ADHOC,
+ NM_SETTING_WIRELESS_MODE_AP,
+ NM_SETTING_WIRELESS_MODE_MESH,
+ NULL
+ };
const char *valid_bands[] = { "a", "bg", NULL };
guint i;
gsize length;
diff --git a/libnm-core/nm-setting-wireless.h b/libnm-core/nm-setting-wireless.h
index 4a61ffa7aa..dcb11e11c5 100644
--- a/libnm-core/nm-setting-wireless.h
+++ b/libnm-core/nm-setting-wireless.h
@@ -123,6 +123,13 @@ typedef enum { /*< flags >*/
#define NM_SETTING_WIRELESS_MODE_INFRA "infrastructure"
/**
+ * NM_SETTING_WIRELESS_MODE_MESH:
+ *
+ * Indicates that the connection should create a mesh point.
+ */
+#define NM_SETTING_WIRELESS_MODE_MESH "mesh"
+
+/**
* NMSettingWirelessPowersave:
* @NM_SETTING_WIRELESS_POWERSAVE_DEFAULT: use the default value
* @NM_SETTING_WIRELESS_POWERSAVE_IGNORE: don't touch existing setting
diff --git a/src/platform/wifi/nm-wifi-utils-nl80211.c b/src/platform/wifi/nm-wifi-utils-nl80211.c
index cf71e243bc..164dada4e9 100644
--- a/src/platform/wifi/nm-wifi-utils-nl80211.c
+++ b/src/platform/wifi/nm-wifi-utils-nl80211.c
@@ -199,6 +199,9 @@ nl80211_iface_info_handler (struct nl_msg *msg, void *arg)
case NL80211_IFTYPE_STATION:
info->mode = NM_802_11_MODE_INFRA;
break;
+ case NL80211_IFTYPE_MESH_POINT:
+ info->mode = NM_802_11_MODE_MESH;
+ break;
}
return NL_SKIP;
@@ -241,6 +244,9 @@ wifi_nl80211_set_mode (NMWifiUtils *data, const NM80211Mode mode)
case NM_802_11_MODE_AP:
NLA_PUT_U32 (msg, NL80211_ATTR_IFTYPE, NL80211_IFTYPE_AP);
break;
+ case NM_802_11_MODE_MESH:
+ NLA_PUT_U32 (msg, NL80211_ATTR_IFTYPE, NL80211_IFTYPE_MESH_POINT);
+ break;
default:
g_assert_not_reached ();
}
@@ -892,10 +898,11 @@ static int nl80211_wiphy_info_handler (struct nl_msg *msg, void *arg)
int i;
nla_for_each_nested (nl_mode, tb[NL80211_ATTR_SUPPORTED_IFTYPES], i) {
- if (nla_type (nl_mode) == NL80211_IFTYPE_AP)
- info->caps |= NM_WIFI_DEVICE_CAP_AP;
- else if (nla_type (nl_mode) == NL80211_IFTYPE_ADHOC)
- info->caps |= NM_WIFI_DEVICE_CAP_ADHOC;
+ switch (nla_type (nl_mode)) {
+ case NL80211_IFTYPE_AP: info->caps |= NM_WIFI_DEVICE_CAP_AP; break;
+ case NL80211_IFTYPE_ADHOC: info->caps |= NM_WIFI_DEVICE_CAP_ADHOC; break;
+ case NL80211_IFTYPE_MESH_POINT: info->caps |= NM_WIFI_DEVICE_CAP_MESH; break;
+ }
}
}
diff --git a/src/platform/wifi/nm-wifi-utils.c b/src/platform/wifi/nm-wifi-utils.c
index 1682bb1ea5..1e42db6af0 100644
--- a/src/platform/wifi/nm-wifi-utils.c
+++ b/src/platform/wifi/nm-wifi-utils.c
@@ -89,7 +89,8 @@ nm_wifi_utils_set_mode (NMWifiUtils *data, const NM80211Mode mode)
g_return_val_if_fail (data != NULL, FALSE);
g_return_val_if_fail ( (mode == NM_802_11_MODE_INFRA)
|| (mode == NM_802_11_MODE_AP)
- || (mode == NM_802_11_MODE_ADHOC), FALSE);
+ || (mode == NM_802_11_MODE_ADHOC)
+ || (mode == NM_802_11_MODE_MESH), FALSE);
klass = NM_WIFI_UTILS_GET_CLASS (data);