A new value for NM80211Mode is introduced (NM_802_11_MODE_AP) and the
new mode is passed to wpa_supplicant analogous to adhoc-mode.

Signed-off-by: Jan Luebbe <j...@pengutronix.de>
---
Hi!

Would something like the patch below be acceptable?

Currently the frequency is still hard-coded, which I would change if
the general approach is fine.

Regards,
Jan

 include/NetworkManager.h                           |    3 +-
 libnm-util/nm-setting-wireless.c                   |    6 ++--
 libnm-util/nm-setting-wireless.h                   |    7 +++++
 src/nm-device-wifi.c                               |    5 ++++
 src/nm-wifi-ap.c                                   |    4 ++-
 src/supplicant-manager/nm-supplicant-config.c      |   30 +++++++++++++++++---
 .../nm-supplicant-settings-verify.c                |    2 +-
 7 files changed, 47 insertions(+), 10 deletions(-)

diff --git a/include/NetworkManager.h b/include/NetworkManager.h
index 0aa31ae..f1b484f 100644
--- a/include/NetworkManager.h
+++ b/include/NetworkManager.h
@@ -233,7 +233,8 @@ typedef enum {
 typedef enum {
        NM_802_11_MODE_UNKNOWN = 0,
        NM_802_11_MODE_ADHOC,
-       NM_802_11_MODE_INFRA
+       NM_802_11_MODE_INFRA,
+       NM_802_11_MODE_AP
 } NM80211Mode;
 
 /**
diff --git a/libnm-util/nm-setting-wireless.c b/libnm-util/nm-setting-wireless.c
index 3188251..ff8584b 100644
--- a/libnm-util/nm-setting-wireless.c
+++ b/libnm-util/nm-setting-wireless.c
@@ -568,7 +568,7 @@ static gboolean
 verify (NMSetting *setting, GSList *all_settings, GError **error)
 {
        NMSettingWirelessPrivate *priv = NM_SETTING_WIRELESS_GET_PRIVATE 
(setting);
-       const char *valid_modes[] = { NM_SETTING_WIRELESS_MODE_INFRA, 
NM_SETTING_WIRELESS_MODE_ADHOC, NULL };
+       const char *valid_modes[] = { NM_SETTING_WIRELESS_MODE_INFRA, 
NM_SETTING_WIRELESS_MODE_ADHOC, NM_SETTING_WIRELESS_MODE_AP, NULL };
        const char *valid_bands[] = { "a", "bg", NULL };
        GSList *iter;
 
@@ -866,8 +866,8 @@ nm_setting_wireless_class_init (NMSettingWirelessClass 
*setting_class)
                (object_class, PROP_MODE,
                 g_param_spec_string (NM_SETTING_WIRELESS_MODE,
                                                  "Mode",
-                                                 "WiFi network mode; one of 
'infrastructure' or "
-                                                 "'adhoc'.  If blank, 
infrastructure is assumed.",
+                                                 "WiFi network mode; one of 
'infrastructure', "
+                                                 "'adhoc' or 'ap'.  If blank, 
infrastructure is assumed.",
                                                  NULL,
                                                  G_PARAM_READWRITE | 
NM_SETTING_PARAM_SERIALIZE));
 
diff --git a/libnm-util/nm-setting-wireless.h b/libnm-util/nm-setting-wireless.h
index 3182f41..99cbe41 100644
--- a/libnm-util/nm-setting-wireless.h
+++ b/libnm-util/nm-setting-wireless.h
@@ -85,6 +85,13 @@ GQuark nm_setting_wireless_error_quark (void);
 #define NM_SETTING_WIRELESS_MODE_ADHOC  "adhoc"
 
 /**
+ * NM_SETTING_WIRELESS_MODE_ADHOC:
+ *
+ * Indicates AP/master mode where this device is the access point.
+ */
+#define NM_SETTING_WIRELESS_MODE_AP     "ap"
+
+/**
  * NM_SETTING_WIRELESS_MODE_INFRA
  *
  * Indicates infrastructure mode where an access point is expected to be 
present
diff --git a/src/nm-device-wifi.c b/src/nm-device-wifi.c
index ed964a5..a52d895 100644
--- a/src/nm-device-wifi.c
+++ b/src/nm-device-wifi.c
@@ -696,6 +696,11 @@ periodic_update (NMDeviceWifi *self)
        NMAccessPoint *new_ap;
        guint32 new_rate, percent;
 
+       /* In AP mode we currently have nothing to do. */
+       if (priv->current_ap && (nm_ap_get_mode (priv->current_ap) == 
NM_802_11_MODE_AP)) {
+               return;
+       }
+
        /* In IBSS mode, most newer firmware/drivers do "BSS coalescing" where
         * multiple IBSS stations using the same SSID will eventually switch to
         * using the same BSSID to avoid network segmentation.  When this 
happens,
diff --git a/src/nm-wifi-ap.c b/src/nm-wifi-ap.c
index 92a99b6..009ca5c 100644
--- a/src/nm-wifi-ap.c
+++ b/src/nm-wifi-ap.c
@@ -652,6 +652,8 @@ nm_ap_new_fake_from_connection (NMConnection *connection)
                        nm_ap_set_mode (ap, NM_802_11_MODE_INFRA);
                else if (!strcmp (mode, "adhoc"))
                        nm_ap_set_mode (ap, NM_802_11_MODE_ADHOC);
+               else if (!strcmp (mode, "ap"))
+                       nm_ap_set_mode (ap, NM_802_11_MODE_AP);
                else
                        goto error;
        } else {
@@ -967,7 +969,7 @@ void nm_ap_set_mode (NMAccessPoint *ap, const NM80211Mode 
mode)
 
        g_return_if_fail (NM_IS_AP (ap));
 
-       if (mode == NM_802_11_MODE_ADHOC || mode == NM_802_11_MODE_INFRA) {
+       if (mode == NM_802_11_MODE_ADHOC || mode == NM_802_11_MODE_INFRA || 
mode == NM_802_11_MODE_AP) {
                priv = NM_AP_GET_PRIVATE (ap);
 
                if (priv->mode != mode) {
diff --git a/src/supplicant-manager/nm-supplicant-config.c 
b/src/supplicant-manager/nm-supplicant-config.c
index a8e4ab9..70f9a03 100644
--- a/src/supplicant-manager/nm-supplicant-config.c
+++ b/src/supplicant-manager/nm-supplicant-config.c
@@ -367,7 +367,7 @@ nm_supplicant_config_add_setting_wireless 
(NMSupplicantConfig * self,
                                            gboolean has_scan_capa_ssid)
 {
        NMSupplicantConfigPrivate *priv;
-       gboolean is_adhoc;
+       gboolean is_adhoc, is_ap;
        const char *mode;
        const GByteArray *id;
 
@@ -378,7 +378,8 @@ nm_supplicant_config_add_setting_wireless 
(NMSupplicantConfig * self,
 
        mode = nm_setting_wireless_get_mode (setting);
        is_adhoc = (mode && !strcmp (mode, "adhoc")) ? TRUE : FALSE;
-       if (is_adhoc)
+       is_ap = (mode && !strcmp (mode, "ap")) ? TRUE : FALSE;
+       if (is_adhoc || is_ap)
                priv->ap_scan = 2;
        else if (is_broadcast == FALSE) {
                /* drivers that support scanning specific SSIDs should use
@@ -395,7 +396,7 @@ nm_supplicant_config_add_setting_wireless 
(NMSupplicantConfig * self,
 
        if (is_adhoc) {
                if (!nm_supplicant_config_add_option (self, "mode", "1", -1, 
FALSE)) {
-                       nm_log_warn (LOGD_SUPPLICANT, "Error adding mode to 
supplicant config.");
+                       nm_log_warn (LOGD_SUPPLICANT, "Error adding mode=1 
(adhoc) to supplicant config.");
                        return FALSE;
                }
 
@@ -412,10 +413,31 @@ nm_supplicant_config_add_setting_wireless 
(NMSupplicantConfig * self,
                }
        }
 
+       if (is_ap) {
+               if (!nm_supplicant_config_add_option (self, "mode", "2", -1, 
FALSE)) {
+                       nm_log_warn (LOGD_SUPPLICANT, "Error adding mode=2 (ap) 
to supplicant config.");
+                       return FALSE;
+               }
+               
+               adhoc_freq=2442; // channel 7
+
+               if (adhoc_freq) {
+                       char *str_freq;
+
+                       str_freq = g_strdup_printf ("%u", adhoc_freq);
+                       if (!nm_supplicant_config_add_option (self, 
"frequency", str_freq, -1, FALSE)) {
+                               g_free (str_freq);
+                               nm_log_warn (LOGD_SUPPLICANT, "Error adding AP 
frequency to supplicant config.");
+                               return FALSE;
+                       }
+                       g_free (str_freq);
+               }
+       }
+
        /* Except for Ad-Hoc networks, request that the driver probe for the
         * specific SSID we want to associate with.
         */
-       if (!is_adhoc) {
+       if (!(is_adhoc || is_ap)) {
                if (!nm_supplicant_config_add_option (self, "scan_ssid", "1", 
-1, FALSE))
                        return FALSE;
        }
diff --git a/src/supplicant-manager/nm-supplicant-settings-verify.c 
b/src/supplicant-manager/nm-supplicant-settings-verify.c
index 76de84d..143e51a 100644
--- a/src/supplicant-manager/nm-supplicant-settings-verify.c
+++ b/src/supplicant-manager/nm-supplicant-settings-verify.c
@@ -91,7 +91,7 @@ static const struct Opt opt_table[] = {
        { "ssid",               TYPE_BYTES,   0, 32,FALSE,  NULL },
        { "bssid",              TYPE_KEYWORD, 0, 0, FALSE,  NULL },
        { "scan_ssid",          TYPE_INT,     0, 1, FALSE,  NULL },
-       { "mode",               TYPE_INT,     0, 1, FALSE,  NULL },
+       { "mode",               TYPE_INT,     0, 2, FALSE,  NULL },
        { "frequency",          TYPE_INT,     2412, 5825, FALSE,  NULL },
        { "auth_alg",           TYPE_KEYWORD, 0, 0, FALSE,  auth_alg_allowed },
        { "psk",                TYPE_BYTES,   0, 0, FALSE,  NULL },
-- 
1.7.10

_______________________________________________
networkmanager-list mailing list
networkmanager-list@gnome.org
https://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to