2 * uqmi -- tiny QMI support implementation
4 * Copyright (C) 2014-2015 Felix Fietkau <nbd@openwrt.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301 USA.
24 #include "qmi-message.h"
26 static struct qmi_wds_start_network_request wds_sn_req
= {
27 QMI_INIT(authentication_preference
,
28 QMI_WDS_AUTHENTICATION_PAP
| QMI_WDS_AUTHENTICATION_CHAP
),
30 static struct qmi_wds_stop_network_request wds_stn_req
;
32 #define cmd_wds_set_auth_cb no_cb
33 static enum qmi_cmd_result
34 cmd_wds_set_auth_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
38 QmiWdsAuthentication auth
;
40 { "pap", QMI_WDS_AUTHENTICATION_PAP
},
41 { "chap", QMI_WDS_AUTHENTICATION_CHAP
},
42 { "both", QMI_WDS_AUTHENTICATION_PAP
| QMI_WDS_AUTHENTICATION_CHAP
},
43 { "none", QMI_WDS_AUTHENTICATION_NONE
},
47 for (i
= 0; i
< ARRAY_SIZE(modes
); i
++) {
48 if (strcasecmp(modes
[i
].name
, arg
) != 0)
51 qmi_set(&wds_sn_req
, authentication_preference
, modes
[i
].auth
);
55 uqmi_add_error("Invalid auth mode (valid: pap, chap, both, none)");
59 #define cmd_wds_set_username_cb no_cb
60 static enum qmi_cmd_result
61 cmd_wds_set_username_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
63 qmi_set_ptr(&wds_sn_req
, username
, arg
);
67 #define cmd_wds_set_password_cb no_cb
68 static enum qmi_cmd_result
69 cmd_wds_set_password_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
71 qmi_set_ptr(&wds_sn_req
, password
, arg
);
75 #define cmd_wds_set_autoconnect_cb no_cb
76 static enum qmi_cmd_result
77 cmd_wds_set_autoconnect_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
79 qmi_set(&wds_sn_req
, enable_autoconnect
, true);
80 qmi_set(&wds_stn_req
, disable_autoconnect
, true);
85 cmd_wds_start_network_cb(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
)
87 struct qmi_wds_start_network_response res
;
89 qmi_parse_wds_start_network_response(msg
, &res
);
90 if (res
.set
.packet_data_handle
)
91 blobmsg_add_u32(&status
, NULL
, res
.data
.packet_data_handle
);
94 static enum qmi_cmd_result
95 cmd_wds_start_network_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
97 qmi_set_ptr(&wds_sn_req
, apn
, arg
);
98 qmi_set_wds_start_network_request(msg
, &wds_sn_req
);
99 return QMI_CMD_REQUEST
;
102 #define cmd_wds_stop_network_cb no_cb
103 static enum qmi_cmd_result
104 cmd_wds_stop_network_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
106 uint32_t pdh
= strtoul(arg
, NULL
, 0);
108 qmi_set(&wds_stn_req
, packet_data_handle
, pdh
);
109 qmi_set_wds_stop_network_request(msg
, &wds_stn_req
);
110 return QMI_CMD_REQUEST
;
114 cmd_wds_get_packet_service_status_cb(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
)
116 struct qmi_wds_get_packet_service_status_response res
;
117 const char *data_status
[] = {
118 [QMI_WDS_CONNECTION_STATUS_UNKNOWN
] = "unknown",
119 [QMI_WDS_CONNECTION_STATUS_DISCONNECTED
] = "disconnected",
120 [QMI_WDS_CONNECTION_STATUS_CONNECTED
] = "connected",
121 [QMI_WDS_CONNECTION_STATUS_SUSPENDED
] = "suspended",
122 [QMI_WDS_CONNECTION_STATUS_AUTHENTICATING
] = "authenticating",
126 qmi_parse_wds_get_packet_service_status_response(msg
, &res
);
127 if (res
.set
.connection_status
&&
128 res
.data
.connection_status
< ARRAY_SIZE(data_status
))
129 s
= res
.data
.connection_status
;
131 blobmsg_add_string(&status
, NULL
, data_status
[s
]);
134 static enum qmi_cmd_result
135 cmd_wds_get_packet_service_status_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
137 qmi_set_wds_get_packet_service_status_request(msg
);
138 return QMI_CMD_REQUEST
;
141 #define cmd_wds_set_autoconnect_setting_cb no_cb
142 static enum qmi_cmd_result
143 cmd_wds_set_autoconnect_setting_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
145 struct qmi_wds_set_autoconnect_setting_request ac_req
;
146 const char *modes
[] = {
147 [QMI_WDS_AUTOCONNECT_DISABLED
] = "disabled",
148 [QMI_WDS_AUTOCONNECT_ENABLED
] = "enabled",
149 [QMI_WDS_AUTOCONNECT_PAUSED
] = "paused",
153 for (i
= 0; i
< ARRAY_SIZE(modes
); i
++) {
154 if (strcasecmp(modes
[i
], arg
) != 0)
157 qmi_set(&ac_req
, setting
, i
);
158 qmi_set_wds_set_autoconnect_setting_request(msg
, &ac_req
);
162 uqmi_add_error("Invalid value (valid: disabled, enabled, paused)");
166 #define cmd_wds_reset_cb no_cb
167 static enum qmi_cmd_result
168 cmd_wds_reset_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
170 qmi_set_wds_reset_request(msg
);
171 return QMI_CMD_REQUEST
;
174 #define cmd_wds_set_ip_family_cb no_cb
175 static enum qmi_cmd_result
176 cmd_wds_set_ip_family_prepare(struct qmi_dev
*qmi
, struct qmi_request
*req
, struct qmi_msg
*msg
, char *arg
)
178 struct qmi_wds_set_ip_family_request ipf_req
;
179 const struct ip_modes
{
181 const QmiWdsIpFamily mode
;
183 { "ipv4", QMI_WDS_IP_FAMILY_IPV4
},
184 { "ipv6", QMI_WDS_IP_FAMILY_IPV6
},
185 { "unspecified", QMI_WDS_IP_FAMILY_UNSPECIFIED
},
189 for (i
= 0; i
< ARRAY_SIZE(modes
); i
++) {
190 if (strcasecmp(modes
[i
].name
, arg
) != 0)
193 qmi_set(&ipf_req
, preference
, modes
[i
].mode
);
194 qmi_set_wds_set_ip_family_request(msg
, &ipf_req
);
195 return QMI_CMD_REQUEST
;
198 uqmi_add_error("Invalid value (valid: ipv4, ipv6, unspecified)");