aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2011-05-09 14:17:09 -0700
committerDmitry Shmidt <dimitrysh@google.com>2011-05-09 14:24:53 -0700
commitbd567ad93e03f285fdad93464100148cd5ae7941 (patch)
tree3bd37dde445d86b2eb37a711ccd0a4fe3a806c1d
parent0716c12e57090ce9904fb5948da1285fc36c1fe4 (diff)
downloadwpa_supplicant_8-bd567ad93e03f285fdad93464100148cd5ae7941.tar.gz
Add extended 'driver' command
Change-Id: Ib589f44f471c1198973ee0a0695b90097fcc9b33 Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
-rw-r--r--src/drivers/driver.h11
-rw-r--r--wpa_supplicant/ctrl_iface.c15
-rw-r--r--wpa_supplicant/driver_i.h8
3 files changed, 34 insertions, 0 deletions
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 8efd697a..2a3efa4f 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -2241,6 +2241,17 @@ struct wpa_driver_ops {
* @signal_info: Connection info structure
*/
int (*signal_poll)(void *priv, struct wpa_signal_info *signal_info);
+
+ /**
+ * driver_cmd - execute driver-specific command
+ * @priv: private driver interface data
+ * @cmd: command to execute
+ * @buf: return buffer
+ * @buf_len: buffer length
+ *
+ * Returns: 0 on success, -1 on failure
+ */
+ int (*driver_cmd)(void *priv, char *cmd, char *buf, size_t buf_len);
};
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index 82e1c048..ecf2e08c 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -2986,6 +2986,18 @@ static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s, char *buf,
}
+static int wpa_supplicant_driver_cmd(struct wpa_supplicant *wpa_s, char *cmd,
+ char *buf, size_t buflen)
+{
+ int ret;
+
+ ret = wpa_drv_driver_cmd(wpa_s, cmd, buf, buflen);
+ if (ret == 0)
+ ret = sprintf(buf, "%s\n", "OK");
+ return ret;
+}
+
+
char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
char *buf, size_t *resp_len)
{
@@ -3387,6 +3399,9 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
} else if (os_strncmp(buf, "SIGNAL_POLL", 11) == 0) {
reply_len = wpa_supplicant_signal_poll(wpa_s, reply,
reply_size);
+ } else if (os_strncmp(buf, "DRIVER ", 7) == 0) {
+ reply_len = wpa_supplicant_driver_cmd(wpa_s, buf + 7, reply,
+ reply_size);
} else {
os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
reply_len = 16;
diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h
index 0d436dd1..b0c5ef01 100644
--- a/wpa_supplicant/driver_i.h
+++ b/wpa_supplicant/driver_i.h
@@ -704,4 +704,12 @@ static inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
}
+static inline int wpa_drv_driver_cmd(struct wpa_supplicant *wpa_s,
+ char *cmd, char *buf, size_t buf_len)
+{
+ if (!wpa_s->driver->driver_cmd)
+ return -1;
+ return wpa_s->driver->driver_cmd(wpa_s->drv_priv, cmd, buf, buf_len);
+}
+
#endif /* DRIVER_I_H */