Allow driver and ctrl_interface parameters to be overridden
authorJouni Malinen <j@w1.fi>
Wed, 4 Nov 2009 18:16:15 +0000 (20:16 +0200)
committerJouni Malinen <j@w1.fi>
Wed, 4 Nov 2009 18:16:15 +0000 (20:16 +0200)
New wpa_supplicant command line options -o<driver> and -O<ctrl> can
now be used to override the parameters received in add interface
command from dbus or global ctrl_interface. This can be used, e.g.,
to enable control interface when using NetworkManager (add
-O/var/run/wpa_supplicant into the Exec parameter in
/usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service).
Similarly, this can be used to use another driver wrapper with
NetworkManager (e.g., -onl80211 to replace WEXT with nl80211).

wpa_supplicant/main.c
wpa_supplicant/wpa_supplicant.c
wpa_supplicant/wpa_supplicant_i.h

index 7e77e3f..bb3dcd8 100644 (file)
@@ -34,6 +34,7 @@ static void usage(void)
               "        -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] "
               "[-p<driver_param>] \\\n"
               "        [-b<br_ifname>] [-f<debug file>] \\\n"
+              "        [-o<override driver>] [-O<override ctrl>] \\\n"
               "        [-N -i<ifname> -c<conf> [-C<ctrl>] "
               "[-D<driver>] \\\n"
               "        [-p<driver_param>] [-b<br_ifname>] ...]\n"
@@ -67,6 +68,8 @@ static void usage(void)
        printf("  -t = include timestamp in debug messages\n"
               "  -h = show this help text\n"
               "  -L = show license (GPL and BSD)\n"
+              "  -o = override driver parameter for new interfaces\n"
+              "  -O = override ctrl_interface parameter for new interfaces\n"
               "  -p = driver parameters\n"
               "  -P = PID file\n"
               "  -q = decrease debugging verbosity (-qq even less)\n");
@@ -140,7 +143,7 @@ int main(int argc, char *argv[])
        wpa_supplicant_fd_workaround();
 
        for (;;) {
-               c = getopt(argc, argv, "b:Bc:C:D:df:g:hi:KLNp:P:qstuvW");
+               c = getopt(argc, argv, "b:Bc:C:D:df:g:hi:KLNo:O:p:P:qstuvW");
                if (c < 0)
                        break;
                switch (c) {
@@ -191,6 +194,12 @@ int main(int argc, char *argv[])
                        license();
                        exitcode = 0;
                        goto out;
+               case 'o':
+                       params.override_driver = optarg;
+                       break;
+               case 'O':
+                       params.override_ctrl_interface = optarg;
+                       break;
                case 'p':
                        iface->driver_param = optarg;
                        break;
index 681a9d9..78fa04b 100644 (file)
@@ -2246,6 +2246,7 @@ struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
                                                 struct wpa_interface *iface)
 {
        struct wpa_supplicant *wpa_s;
+       struct wpa_interface t_iface;
 
        if (global == NULL || iface == NULL)
                return NULL;
@@ -2254,7 +2255,22 @@ struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
        if (wpa_s == NULL)
                return NULL;
 
-       if (wpa_supplicant_init_iface(wpa_s, iface)) {
+       t_iface = *iface;
+       if (global->params.override_driver) {
+               wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
+                          "('%s' -> '%s')",
+                          iface->driver, global->params.override_driver);
+               t_iface.driver = global->params.override_driver;
+       }
+       if (global->params.override_ctrl_interface) {
+               wpa_printf(MSG_DEBUG, "Override interface parameter: "
+                          "ctrl_interface ('%s' -> '%s')",
+                          iface->ctrl_interface,
+                          global->params.override_ctrl_interface);
+               t_iface.ctrl_interface =
+                       global->params.override_ctrl_interface;
+       }
+       if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
                wpa_printf(MSG_DEBUG, "Failed to add interface %s",
                           iface->ifname);
                wpa_supplicant_deinit_iface(wpa_s);
@@ -2388,6 +2404,12 @@ struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
        if (params->ctrl_interface)
                global->params.ctrl_interface =
                        os_strdup(params->ctrl_interface);
+       if (params->override_driver)
+               global->params.override_driver =
+                       os_strdup(params->override_driver);
+       if (params->override_ctrl_interface)
+               global->params.override_ctrl_interface =
+                       os_strdup(params->override_ctrl_interface);
        wpa_debug_level = global->params.wpa_debug_level =
                params->wpa_debug_level;
        wpa_debug_show_keys = global->params.wpa_debug_show_keys =
@@ -2514,6 +2536,8 @@ void wpa_supplicant_deinit(struct wpa_global *global)
                os_free(global->params.pid_file);
        }
        os_free(global->params.ctrl_interface);
+       os_free(global->params.override_driver);
+       os_free(global->params.override_ctrl_interface);
 
        os_free(global);
        wpa_debug_close_syslog();
index 699fc0d..d426aaa 100644 (file)
@@ -160,6 +160,24 @@ struct wpa_params {
         * wpa_debug_syslog - Enable log output through syslog
         */
        int wpa_debug_syslog;
+
+       /**
+        * override_driver - Optional driver parameter override
+        *
+        * This parameter can be used to override the driver parameter in
+        * dynamic interface addition to force a specific driver wrapper to be
+        * used instead.
+        */
+       char *override_driver;
+
+       /**
+        * override_ctrl_interface - Optional ctrl_interface override
+        *
+        * This parameter can be used to override the ctrl_interface parameter
+        * in dynamic interface addition to force a control interface to be
+        * created.
+        */
+       char *override_ctrl_interface;
 };
 
 /**