91cf15cdfcac73dc0ae7c4edeadaca46a663bb07
[project/uqmi.git] / commands-wds.c
1 #include "qmi-message.h"
2
3 static struct qmi_wds_start_network_request wds_sn_req = {
4         QMI_INIT(authentication_preference,
5                  QMI_WDS_AUTHENTICATION_PAP | QMI_WDS_AUTHENTICATION_CHAP),
6 };
7
8 #define cmd_wds_set_auth_cb no_cb
9 static enum qmi_cmd_result
10 cmd_wds_set_auth_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
11 {
12         static const struct {
13                 const char *name;
14                 QmiWdsAuthentication auth;
15         } modes[] = {
16                 { "pap", QMI_WDS_AUTHENTICATION_PAP },
17                 { "chap", QMI_WDS_AUTHENTICATION_CHAP },
18                 { "both", QMI_WDS_AUTHENTICATION_PAP | QMI_WDS_AUTHENTICATION_CHAP },
19                 { "none", QMI_WDS_AUTHENTICATION_NONE },
20         };
21         int i;
22
23         for (i = 0; i < ARRAY_SIZE(modes); i++) {
24                 if (strcasecmp(modes[i].name, arg) != 0)
25                         continue;
26
27                 qmi_set(&wds_sn_req, authentication_preference, modes[i].auth);
28                 return QMI_CMD_DONE;
29         }
30
31         uqmi_add_error("Invalid auth mode (valid: pap, chap, both, none)");
32         return QMI_CMD_EXIT;
33 }
34
35 #define cmd_wds_set_username_cb no_cb
36 static enum qmi_cmd_result
37 cmd_wds_set_username_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
38 {
39         qmi_set_ptr(&wds_sn_req, username, arg);
40         return QMI_CMD_DONE;
41 }
42
43 #define cmd_wds_set_password_cb no_cb
44 static enum qmi_cmd_result
45 cmd_wds_set_password_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
46 {
47         qmi_set_ptr(&wds_sn_req, password, arg);
48         return QMI_CMD_DONE;
49 }
50
51 #define cmd_wds_set_autoconnect_cb no_cb
52 static enum qmi_cmd_result
53 cmd_wds_set_autoconnect_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
54 {
55         qmi_set(&wds_sn_req, enable_autoconnect, true);
56         return QMI_CMD_DONE;
57 }
58
59 static void
60 cmd_wds_start_network_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
61 {
62         struct qmi_wds_start_network_response res;
63
64         qmi_parse_wds_start_network_response(msg, &res);
65         if (res.set.packet_data_handle)
66                 blobmsg_add_u32(&status, NULL, res.data.packet_data_handle);
67 }
68
69 static enum qmi_cmd_result
70 cmd_wds_start_network_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
71 {
72         qmi_set_ptr(&wds_sn_req, apn, arg);
73         qmi_set_wds_start_network_request(msg, &wds_sn_req);
74         return QMI_CMD_REQUEST;
75 }
76
77 static void
78 cmd_wds_get_packet_service_status_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
79 {
80         struct qmi_wds_get_packet_service_status_response res;
81         const char *data_status[] = {
82                 [QMI_WDS_CONNECTION_STATUS_UNKNOWN] = "unknown",
83                 [QMI_WDS_CONNECTION_STATUS_DISCONNECTED] = "disconnected",
84                 [QMI_WDS_CONNECTION_STATUS_CONNECTED] = "connected",
85                 [QMI_WDS_CONNECTION_STATUS_SUSPENDED] = "suspended",
86                 [QMI_WDS_CONNECTION_STATUS_AUTHENTICATING] = "authenticating",
87         };
88         int s = 0;
89
90         qmi_parse_wds_get_packet_service_status_response(msg, &res);
91         if (res.set.connection_status &&
92             res.data.connection_status >= 0 &&
93             res.data.connection_status < ARRAY_SIZE(data_status))
94                 s = res.data.connection_status;
95
96         blobmsg_add_string(&status, NULL, data_status[s]);
97 }
98
99 static enum qmi_cmd_result
100 cmd_wds_get_packet_service_status_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
101 {
102         qmi_set_wds_get_packet_service_status_request(msg);
103         return QMI_CMD_REQUEST;
104 }
105
106 #define cmd_wds_reset_cb no_cb
107 static enum qmi_cmd_result
108 cmd_wds_reset_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
109 {
110         qmi_set_wds_reset_request(msg);
111         return QMI_CMD_REQUEST;
112 }