add a command for changing the autoconnect setting
[project/uqmi.git] / commands-wds.c
1 #include <stdlib.h>
2
3 #include "qmi-message.h"
4
5 static struct qmi_wds_start_network_request wds_sn_req = {
6         QMI_INIT(authentication_preference,
7                  QMI_WDS_AUTHENTICATION_PAP | QMI_WDS_AUTHENTICATION_CHAP),
8 };
9 static struct qmi_wds_stop_network_request wds_stn_req;
10
11 #define cmd_wds_set_auth_cb no_cb
12 static enum qmi_cmd_result
13 cmd_wds_set_auth_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
14 {
15         static const struct {
16                 const char *name;
17                 QmiWdsAuthentication auth;
18         } modes[] = {
19                 { "pap", QMI_WDS_AUTHENTICATION_PAP },
20                 { "chap", QMI_WDS_AUTHENTICATION_CHAP },
21                 { "both", QMI_WDS_AUTHENTICATION_PAP | QMI_WDS_AUTHENTICATION_CHAP },
22                 { "none", QMI_WDS_AUTHENTICATION_NONE },
23         };
24         int i;
25
26         for (i = 0; i < ARRAY_SIZE(modes); i++) {
27                 if (strcasecmp(modes[i].name, arg) != 0)
28                         continue;
29
30                 qmi_set(&wds_sn_req, authentication_preference, modes[i].auth);
31                 return QMI_CMD_DONE;
32         }
33
34         uqmi_add_error("Invalid auth mode (valid: pap, chap, both, none)");
35         return QMI_CMD_EXIT;
36 }
37
38 #define cmd_wds_set_username_cb no_cb
39 static enum qmi_cmd_result
40 cmd_wds_set_username_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
41 {
42         qmi_set_ptr(&wds_sn_req, username, arg);
43         return QMI_CMD_DONE;
44 }
45
46 #define cmd_wds_set_password_cb no_cb
47 static enum qmi_cmd_result
48 cmd_wds_set_password_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
49 {
50         qmi_set_ptr(&wds_sn_req, password, arg);
51         return QMI_CMD_DONE;
52 }
53
54 #define cmd_wds_set_autoconnect_cb no_cb
55 static enum qmi_cmd_result
56 cmd_wds_set_autoconnect_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
57 {
58         qmi_set(&wds_sn_req, enable_autoconnect, true);
59         qmi_set(&wds_stn_req, disable_autoconnect, true);
60         return QMI_CMD_DONE;
61 }
62
63 static void
64 cmd_wds_start_network_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
65 {
66         struct qmi_wds_start_network_response res;
67
68         qmi_parse_wds_start_network_response(msg, &res);
69         if (res.set.packet_data_handle)
70                 blobmsg_add_u32(&status, NULL, res.data.packet_data_handle);
71 }
72
73 static enum qmi_cmd_result
74 cmd_wds_start_network_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
75 {
76         qmi_set_ptr(&wds_sn_req, apn, arg);
77         qmi_set_wds_start_network_request(msg, &wds_sn_req);
78         return QMI_CMD_REQUEST;
79 }
80
81 #define cmd_wds_stop_network_cb no_cb
82 static enum qmi_cmd_result
83 cmd_wds_stop_network_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
84 {
85         uint32_t pdh = strtoul(arg, NULL, 0);
86
87         qmi_set(&wds_stn_req, packet_data_handle, pdh);
88         qmi_set_wds_stop_network_request(msg, &wds_stn_req);
89         return QMI_CMD_REQUEST;
90 }
91
92 static void
93 cmd_wds_get_packet_service_status_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
94 {
95         struct qmi_wds_get_packet_service_status_response res;
96         const char *data_status[] = {
97                 [QMI_WDS_CONNECTION_STATUS_UNKNOWN] = "unknown",
98                 [QMI_WDS_CONNECTION_STATUS_DISCONNECTED] = "disconnected",
99                 [QMI_WDS_CONNECTION_STATUS_CONNECTED] = "connected",
100                 [QMI_WDS_CONNECTION_STATUS_SUSPENDED] = "suspended",
101                 [QMI_WDS_CONNECTION_STATUS_AUTHENTICATING] = "authenticating",
102         };
103         int s = 0;
104
105         qmi_parse_wds_get_packet_service_status_response(msg, &res);
106         if (res.set.connection_status &&
107             res.data.connection_status < ARRAY_SIZE(data_status))
108                 s = res.data.connection_status;
109
110         blobmsg_add_string(&status, NULL, data_status[s]);
111 }
112
113 static enum qmi_cmd_result
114 cmd_wds_get_packet_service_status_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
115 {
116         qmi_set_wds_get_packet_service_status_request(msg);
117         return QMI_CMD_REQUEST;
118 }
119
120 #define cmd_wds_set_autoconnect_setting_cb no_cb
121 static enum qmi_cmd_result
122 cmd_wds_set_autoconnect_setting_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
123 {
124         struct qmi_wds_set_autoconnect_setting_request ac_req;
125         const char *modes[] = {
126                 [QMI_WDS_AUTOCONNECT_DISABLED] = "disabled",
127                 [QMI_WDS_AUTOCONNECT_ENABLED] = "enabled",
128                 [QMI_WDS_AUTOCONNECT_PAUSED] = "paused",
129         };
130         int i;
131
132         for (i = 0; i < ARRAY_SIZE(modes); i++) {
133                 if (strcasecmp(modes[i], arg) != 0)
134                         continue;
135
136                 qmi_set(&ac_req, setting, i);
137                 qmi_set_wds_set_autoconnect_setting_request(msg, &ac_req);
138                 return QMI_CMD_DONE;
139         }
140
141         uqmi_add_error("Invalid value (valid: disabled, enabled, paused)");
142         return QMI_CMD_EXIT;
143 }
144
145 #define cmd_wds_reset_cb no_cb
146 static enum qmi_cmd_result
147 cmd_wds_reset_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
148 {
149         qmi_set_wds_reset_request(msg);
150         return QMI_CMD_REQUEST;
151 }