Fix printing of service versions
[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 >= 0 &&
108 res.data.connection_status < ARRAY_SIZE(data_status))
109 s = res.data.connection_status;
110
111 blobmsg_add_string(&status, NULL, data_status[s]);
112 }
113
114 static enum qmi_cmd_result
115 cmd_wds_get_packet_service_status_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
116 {
117 qmi_set_wds_get_packet_service_status_request(msg);
118 return QMI_CMD_REQUEST;
119 }
120
121 #define cmd_wds_reset_cb no_cb
122 static enum qmi_cmd_result
123 cmd_wds_reset_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
124 {
125 qmi_set_wds_reset_request(msg);
126 return QMI_CMD_REQUEST;
127 }