[PATCH v4 08/10] mesh: Add virtual interface on booting
Masashi Honma
masashi.honma
Mon Dec 15 19:29:12 PST 2014
This functionality is used to create mesh gate.
Signed-off-by: Masashi Honma <masashi.honma at gmail.com>
---
wpa_supplicant/README | 4 +++-
wpa_supplicant/ctrl_iface.c | 2 +-
wpa_supplicant/doc/docbook/wpa_supplicant.sgml | 10 +++++++++-
wpa_supplicant/main.c | 10 +++++++++-
wpa_supplicant/mesh.c | 9 ++++++---
wpa_supplicant/mesh.h | 2 +-
wpa_supplicant/wpa_supplicant.c | 11 +++++++++++
wpa_supplicant/wpa_supplicant_i.h | 11 +++++++++++
8 files changed, 51 insertions(+), 8 deletions(-)
diff --git a/wpa_supplicant/README b/wpa_supplicant/README
index 653848e..b4f8543 100644
--- a/wpa_supplicant/README
+++ b/wpa_supplicant/README
@@ -413,7 +413,8 @@ usage:
[-G<group>] \
-i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] [-p<driver_param>] \
[-b<br_ifname> [-N -i<ifname> -c<conf> [-C<ctrl>] [-D<driver>] \
- [-p<driver_param>] [-b<br_ifname>] [-m<P2P Device config file>] ...
+ [-p<driver_param>] [-b<br_ifname>] [-m<P2P Device config file>] \
+ [-n<Mesh Device config file>] ...
options:
-b = optional bridge interface name
@@ -439,6 +440,7 @@ options:
-W = wait for a control interface monitor before starting
-N = start describing new interface
-m = Configuration file for the P2P Device
+ -n = Configuration file for the Mesh Device
drivers:
nl80211 = Linux nl80211/cfg80211
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index c9eb56d..ad7978c 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -2436,7 +2436,7 @@ static int wpa_supplicant_ctrl_iface_mesh_interface_add(
os_strlcpy(ifname, pos, sizeof(ifname));
}
- if (wpas_mesh_add_interface(wpa_s, ifname, sizeof(ifname)) < 0)
+ if (wpas_mesh_add_interface(wpa_s, ifname, sizeof(ifname), NULL) < 0)
return -1;
os_strlcpy(reply, ifname, max_len);
diff --git a/wpa_supplicant/doc/docbook/wpa_supplicant.sgml b/wpa_supplicant/doc/docbook/wpa_supplicant.sgml
index 182060d..db5076f 100644
--- a/wpa_supplicant/doc/docbook/wpa_supplicant.sgml
+++ b/wpa_supplicant/doc/docbook/wpa_supplicant.sgml
@@ -12,12 +12,13 @@
<refsynopsisdiv>
<cmdsynopsis>
<command>wpa_supplicant</command>
- <arg>-BddfhKLqqsTtuvW</arg>
+ <arg>-BddfhKLnqqsTtuvW</arg>
<arg>-i<replaceable>ifname</replaceable></arg>
<arg>-c<replaceable>config file</replaceable></arg>
<arg>-D<replaceable>driver</replaceable></arg>
<arg>-P<replaceable>PID_file</replaceable></arg>
<arg>-f<replaceable>output file</replaceable></arg>
+ <arg>-n<replaceable>mesh config file</replaceable></arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1>
@@ -493,6 +494,13 @@
<para>Start describing new interface.</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term>-n</term>
+ <listitem>
+ <para>Configuration file for the Mesh Device interface.</para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
diff --git a/wpa_supplicant/main.c b/wpa_supplicant/main.c
index 13e9769..a2110e4 100644
--- a/wpa_supplicant/main.c
+++ b/wpa_supplicant/main.c
@@ -98,6 +98,9 @@ static void usage(void)
#ifdef CONFIG_P2P
" -m = Configuration file for the P2P Device interface\n"
#endif /* CONFIG_P2P */
+#ifdef CONFIG_MESH
+ " -n = Configuration file for the Mesh Device interface\n"
+#endif /* CONFIG_MESH */
" -N = start describing new interface\n");
printf("example:\n"
@@ -175,7 +178,7 @@ int main(int argc, char *argv[])
for (;;) {
c = getopt(argc, argv,
- "b:Bc:C:D:de:f:g:G:hi:I:KLm:No:O:p:P:qsTtuvW");
+ "b:Bc:C:D:de:f:g:G:hi:I:KLmn:No:O:p:P:qsTtuvW");
if (c < 0)
break;
switch (c) {
@@ -240,6 +243,11 @@ int main(int argc, char *argv[])
iface->conf_p2p_dev = optarg;
break;
#endif /* CONFIG_P2P */
+#ifdef CONFIG_MESH
+ case 'n':
+ iface->conf_mesh = optarg;
+ break;
+#endif /* CONFIG_MESH */
case 'o':
params.override_driver = optarg;
break;
diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c
index 68187e0..a5785f2 100644
--- a/wpa_supplicant/mesh.c
+++ b/wpa_supplicant/mesh.c
@@ -498,7 +498,7 @@ static int wpas_mesh_get_ifname(struct wpa_supplicant *wpa_s, char *ifname,
int wpas_mesh_add_interface(struct wpa_supplicant *wpa_s, char *ifname,
- size_t len)
+ size_t len, const char *confname)
{
struct wpa_interface iface;
struct wpa_supplicant *mesh_wpa_s;
@@ -510,7 +510,8 @@ int wpas_mesh_add_interface(struct wpa_supplicant *wpa_s, char *ifname,
if (wpa_drv_if_add(wpa_s, WPA_IF_MESH, ifname, NULL, NULL, NULL, addr,
NULL) < 0) {
wpa_printf(MSG_ERROR,
- "mesh: Failed to create new mesh interface");
+ "mesh: Failed to create new mesh interface %s",
+ ifname);
return -1;
}
wpa_printf(MSG_INFO, "mesh: Created virtual interface %s addr "
@@ -520,7 +521,9 @@ int wpas_mesh_add_interface(struct wpa_supplicant *wpa_s, char *ifname,
iface.ifname = ifname;
iface.driver = wpa_s->driver->name;
iface.driver_param = wpa_s->conf->driver_param;
- iface.ctrl_interface = wpa_s->conf->ctrl_interface;
+ iface.confname = confname;
+ iface.ctrl_interface =
+ confname == NULL ? wpa_s->conf->ctrl_interface : NULL;
mesh_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
if (!mesh_wpa_s) {
diff --git a/wpa_supplicant/mesh.h b/wpa_supplicant/mesh.h
index 3cb7f1b..bb4d05b 100644
--- a/wpa_supplicant/mesh.h
+++ b/wpa_supplicant/mesh.h
@@ -17,7 +17,7 @@ void wpa_supplicant_mesh_iface_deinit(struct wpa_supplicant *wpa_s,
int wpas_mesh_scan_result_text(const u8 *ies, size_t ies_len, char *buf,
char *end);
int wpas_mesh_add_interface(struct wpa_supplicant *wpa_s, char *ifname,
- size_t len);
+ size_t len, const char *confname);
#ifdef CONFIG_MESH
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 8ea023a..16c55ea 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -4006,6 +4006,9 @@ struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
struct wpa_supplicant *wpa_s;
struct wpa_interface t_iface;
struct wpa_ssid *ssid;
+#ifdef CONFIG_MESH
+ char ifname[IFNAMSIZ + 1];
+#endif /* CONFIG_MESH */
if (global == NULL || iface == NULL)
return NULL;
@@ -4064,6 +4067,14 @@ struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
/* Try to continue without. P2P will be disabled. */
}
#endif /* CONFIG_P2P */
+#ifdef CONFIG_MESH
+ if (iface->conf_mesh != NULL &&
+ (wpa_s->drv_flags & WPA_DRIVER_FLAGS_MESH)) {
+ ifname[0] = '\0';
+ wpas_mesh_add_interface(wpa_s, ifname, sizeof(ifname),
+ iface->conf_mesh);
+ }
+#endif /* CONFIG_MESH */
return wpa_s;
}
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index b0f3866..56aec62 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -77,6 +77,17 @@ struct wpa_interface {
const char *conf_p2p_dev;
#endif /* CONFIG_P2P */
+#ifdef CONFIG_MESH
+ /**
+ * conf_mesh - Additional configuration file used to hold the mesh
+ * network configuration parameters.
+ *
+ * This can also be %NULL. In such a case, virtual interface for mesh
+ * will not be created.
+ */
+ const char *conf_mesh;
+#endif /* CONFIG_MESH */
+
/**
* ctrl_interface - Control interface parameter
*
--
1.9.1
More information about the Hostap
mailing list