+/*
+ * uqmi -- tiny QMI support implementation
+ *
+ * Copyright (C) 2014-2015 Felix Fietkau <nbd@openwrt.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ */
+
+#include <stdlib.h>
+
#include "qmi-message.h"
static struct qmi_wds_start_network_request wds_sn_req = {
QMI_INIT(authentication_preference,
QMI_WDS_AUTHENTICATION_PAP | QMI_WDS_AUTHENTICATION_CHAP),
};
+static struct qmi_wds_stop_network_request wds_stn_req;
#define cmd_wds_set_auth_cb no_cb
static enum qmi_cmd_result
return QMI_CMD_DONE;
}
- blobmsg_add_string(&status, "error", "Invalid auth mode (valid: pap, chap, both, none)");
+ uqmi_add_error("Invalid auth mode (valid: pap, chap, both, none)");
return QMI_CMD_EXIT;
}
return QMI_CMD_DONE;
}
+#define cmd_wds_set_autoconnect_cb no_cb
+static enum qmi_cmd_result
+cmd_wds_set_autoconnect_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
+{
+ qmi_set(&wds_sn_req, enable_autoconnect, true);
+ qmi_set(&wds_stn_req, disable_autoconnect, true);
+ return QMI_CMD_DONE;
+}
+
static void
cmd_wds_start_network_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
{
qmi_parse_wds_start_network_response(msg, &res);
if (res.set.packet_data_handle)
- blobmsg_add_u32(&status, "handle", res.data.packet_data_handle);
+ blobmsg_add_u32(&status, NULL, res.data.packet_data_handle);
}
static enum qmi_cmd_result
qmi_set_wds_start_network_request(msg, &wds_sn_req);
return QMI_CMD_REQUEST;
}
+
+#define cmd_wds_stop_network_cb no_cb
+static enum qmi_cmd_result
+cmd_wds_stop_network_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
+{
+ uint32_t pdh = strtoul(arg, NULL, 0);
+
+ qmi_set(&wds_stn_req, packet_data_handle, pdh);
+ qmi_set_wds_stop_network_request(msg, &wds_stn_req);
+ return QMI_CMD_REQUEST;
+}
+
+static void
+cmd_wds_get_packet_service_status_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
+{
+ struct qmi_wds_get_packet_service_status_response res;
+ const char *data_status[] = {
+ [QMI_WDS_CONNECTION_STATUS_UNKNOWN] = "unknown",
+ [QMI_WDS_CONNECTION_STATUS_DISCONNECTED] = "disconnected",
+ [QMI_WDS_CONNECTION_STATUS_CONNECTED] = "connected",
+ [QMI_WDS_CONNECTION_STATUS_SUSPENDED] = "suspended",
+ [QMI_WDS_CONNECTION_STATUS_AUTHENTICATING] = "authenticating",
+ };
+ int s = 0;
+
+ qmi_parse_wds_get_packet_service_status_response(msg, &res);
+ if (res.set.connection_status &&
+ res.data.connection_status < ARRAY_SIZE(data_status))
+ s = res.data.connection_status;
+
+ blobmsg_add_string(&status, NULL, data_status[s]);
+}
+
+static enum qmi_cmd_result
+cmd_wds_get_packet_service_status_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
+{
+ qmi_set_wds_get_packet_service_status_request(msg);
+ return QMI_CMD_REQUEST;
+}
+
+#define cmd_wds_set_autoconnect_setting_cb no_cb
+static enum qmi_cmd_result
+cmd_wds_set_autoconnect_setting_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
+{
+ struct qmi_wds_set_autoconnect_setting_request ac_req;
+ const char *modes[] = {
+ [QMI_WDS_AUTOCONNECT_DISABLED] = "disabled",
+ [QMI_WDS_AUTOCONNECT_ENABLED] = "enabled",
+ [QMI_WDS_AUTOCONNECT_PAUSED] = "paused",
+ };
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(modes); i++) {
+ if (strcasecmp(modes[i], arg) != 0)
+ continue;
+
+ qmi_set(&ac_req, setting, i);
+ qmi_set_wds_set_autoconnect_setting_request(msg, &ac_req);
+ return QMI_CMD_DONE;
+ }
+
+ uqmi_add_error("Invalid value (valid: disabled, enabled, paused)");
+ return QMI_CMD_EXIT;
+}
+
+#define cmd_wds_reset_cb no_cb
+static enum qmi_cmd_result
+cmd_wds_reset_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
+{
+ qmi_set_wds_reset_request(msg);
+ return QMI_CMD_REQUEST;
+}