Added option for enabling and disabling protection of simcard by PIN
[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 }