5 * Copyright (C) 2020 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
39 #define BOOLSTR(s) (((s) == true) ? "TRUE" : "FALSE")
43 bool last_user_selection;
45 bool security_priority;
46 bool internet_connection;
60 unsigned int strength;
61 unsigned int frequency;
63 int score_last_connected;
64 int score_assoc_reject;
69 static void print_bssid_info(gpointer value, gpointer user_data)
71 struct bssid_info_s *bssid_info = value;
72 int *bssid_rank = user_data;
74 fprintf(stdout, " %2d) %-20s total[%2d] last_conn[%2d] "
75 "assoc_reject[%2d] freq[%2d(%4d)] strength[%2d(%2d)]\n",
76 *bssid_rank, bssid_info->bssid, bssid_info->score_ins,
77 bssid_info->score_last_connected, bssid_info->score_assoc_reject,
78 bssid_info->score_frequency, bssid_info->frequency,
79 bssid_info->score_strength, bssid_info->strength);
84 static GSList *get_bssid_list(DBusMessageIter *iter, struct ins_info_s *ins_info)
87 DBusMessageIter entry, val;
88 GSList *bssid_list = NULL;
89 struct bssid_info_s *bssid_info = NULL;
91 while (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
92 dbus_message_iter_recurse(iter, &entry);
93 dbus_message_iter_get_basic(&entry, &property);
95 if (strcmp(property, "BSSID") == 0) {
96 bssid_info = g_try_new0(struct bssid_info_s, 1);
100 dbus_message_iter_next(&entry);
101 dbus_message_iter_recurse(&entry, &val);
102 dbus_message_iter_get_basic(&val, &(bssid_info->bssid));
104 } else if (strcmp(property, "ScoreINS") == 0) {
105 dbus_message_iter_next(&entry);
106 dbus_message_iter_recurse(&entry, &val);
107 dbus_message_iter_get_basic(&val, &(bssid_info->score_ins));
109 } else if (strcmp(property, "ScoreLastConnected") == 0) {
110 dbus_message_iter_next(&entry);
111 dbus_message_iter_recurse(&entry, &val);
112 dbus_message_iter_get_basic(&val, &(bssid_info->score_last_connected));
113 if (bssid_info->score_last_connected)
114 ins_info->bssid.last_connected = true;
116 } else if (strcmp(property, "ScoreAssocReject") == 0) {
117 dbus_message_iter_next(&entry);
118 dbus_message_iter_recurse(&entry, &val);
119 dbus_message_iter_get_basic(&val, &(bssid_info->score_assoc_reject));
120 if (bssid_info->score_assoc_reject)
121 ins_info->bssid.assoc_reject = true;
123 } else if (strcmp(property, "Frequency") == 0) {
124 dbus_message_iter_next(&entry);
125 dbus_message_iter_recurse(&entry, &val);
126 dbus_message_iter_get_basic(&val, &(bssid_info->frequency));
128 } else if (strcmp(property, "ScoreFrequency") == 0) {
129 dbus_message_iter_next(&entry);
130 dbus_message_iter_recurse(&entry, &val);
131 dbus_message_iter_get_basic(&val, &(bssid_info->score_frequency));
132 if (bssid_info->score_frequency)
133 ins_info->bssid.frequency = true;
135 } else if (strcmp(property, "Strength") == 0) {
136 dbus_message_iter_next(&entry);
137 dbus_message_iter_recurse(&entry, &val);
138 dbus_message_iter_get_basic(&val, &(bssid_info->strength));
140 } else if (strcmp(property, "ScoreStrength") == 0) {
141 dbus_message_iter_next(&entry);
142 dbus_message_iter_recurse(&entry, &val);
143 dbus_message_iter_get_basic(&val, &(bssid_info->score_strength));
144 if (bssid_info->score_strength)
145 ins_info->bssid.strength = true;
147 bssid_list = g_slist_append(bssid_list, bssid_info);
150 dbus_message_iter_next(iter);
156 static void print_ins_info(int *rank, struct ins_info_s *ins_info,
157 char *path, char *filter, DBusMessageIter *iter)
164 unsigned char strength;
165 unsigned int frequency;
167 int score_last_user_selection;
168 int score_last_connected;
170 int score_security_priority;
171 int score_internet_connection;
173 GSList *bssid_list = NULL;
174 DBusMessageIter entry, val, dict;
176 while (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
177 dbus_message_iter_recurse(iter, &entry);
178 dbus_message_iter_get_basic(&entry, &property);
180 if (strcmp(property, "Name") == 0) {
181 dbus_message_iter_next(&entry);
182 dbus_message_iter_recurse(&entry, &val);
183 dbus_message_iter_get_basic(&val, &name);
185 } else if (strcmp(property, "ScoreINS") == 0) {
186 dbus_message_iter_next(&entry);
187 dbus_message_iter_recurse(&entry, &val);
188 dbus_message_iter_get_basic(&val, &score_INS);
190 } else if (strcmp(property, "ScoreLastUserSelection") == 0) {
191 dbus_message_iter_next(&entry);
192 dbus_message_iter_recurse(&entry, &val);
193 dbus_message_iter_get_basic(&val, &score_last_user_selection);
194 if (score_last_user_selection)
195 ins_info->ssid.last_user_selection = true;
197 } else if (strcmp(property, "ScoreLastConnected") == 0) {
198 dbus_message_iter_next(&entry);
199 dbus_message_iter_recurse(&entry, &val);
200 dbus_message_iter_get_basic(&val, &score_last_connected);
201 if (score_last_connected)
202 ins_info->ssid.last_connected = true;
204 } else if (strcmp(property, "Security") == 0) {
205 dbus_message_iter_next(&entry);
206 dbus_message_iter_recurse(&entry, &val);
207 dbus_message_iter_get_basic(&val, &security);
209 } else if (strcmp(property, "ScoreSecurityPriority") == 0) {
210 dbus_message_iter_next(&entry);
211 dbus_message_iter_recurse(&entry, &val);
212 dbus_message_iter_get_basic(&val, &score_security_priority);
213 if (score_security_priority)
214 ins_info->ssid.security_priority = true;
216 } else if (strcmp(property, "Strength") == 0) {
217 dbus_message_iter_next(&entry);
218 dbus_message_iter_recurse(&entry, &val);
219 dbus_message_iter_get_basic(&val, &strength);
221 } else if (strcmp(property, "ScoreStrength") == 0) {
222 dbus_message_iter_next(&entry);
223 dbus_message_iter_recurse(&entry, &val);
224 dbus_message_iter_get_basic(&val, &score_strength);
226 ins_info->ssid.strength = true;
228 } else if (strcmp(property, "ScoreInternetConnection") == 0) {
229 dbus_message_iter_next(&entry);
230 dbus_message_iter_recurse(&entry, &val);
231 dbus_message_iter_get_basic(&val, &score_internet_connection);
232 if (score_internet_connection)
233 ins_info->ssid.internet_connection = true;
235 } else if (strcmp(property, "Frequency") == 0) {
236 dbus_message_iter_next(&entry);
237 dbus_message_iter_recurse(&entry, &val);
238 dbus_message_iter_get_basic(&val, &frequency);
240 } else if (strcmp(property, "ScoreFrequency") == 0) {
241 dbus_message_iter_next(&entry);
242 dbus_message_iter_recurse(&entry, &val);
243 dbus_message_iter_get_basic(&val, &score_frequency);
245 ins_info->ssid.frequency = true;
247 } else if (strcmp(property, "BSSID.List") == 0) {
248 dbus_message_iter_next(&entry);
249 dbus_message_iter_recurse(&entry, &val);
250 if (dbus_message_iter_get_arg_type(&val)
251 == DBUS_TYPE_ARRAY) {
252 dbus_message_iter_recurse(&val, &dict);
253 bssid_list = get_bssid_list(&dict, ins_info);
259 dbus_message_iter_next(iter);
262 str = strrchr(path, '/');
269 if (!filter || strcmp(filter, name) == 0 || strcmp(filter, "ssid") == 0) {
270 fprintf(stdout, " [%2d] %-20s total[%2d] last_usr[%2d] last_conn[%2d] "
271 "internet[%2d] sec[%2d(%9s)] freq[%2d(%4d)] strength[%2d(%2d)]\n %s\n",
272 *rank, name, score_INS, score_last_user_selection, score_last_connected,
273 score_internet_connection, score_security_priority, security,
274 score_frequency, frequency, score_strength, strength, str);
276 if (!filter || strcmp(filter, "ssid") != 0) {
278 g_slist_foreach(bssid_list, print_bssid_info, &bssid_rank);
285 fprintf(stdout, "%-24s %s", "unchanged\n", str);
290 static void list_ins_array(DBusMessageIter *iter, char *filter)
292 DBusMessageIter array, dict;
295 struct ins_info_s ins_info;
297 memset(&ins_info, 0, sizeof(ins_info));
299 while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
301 dbus_message_iter_recurse(iter, &array);
302 if (dbus_message_iter_get_arg_type(&array)
303 != DBUS_TYPE_OBJECT_PATH)
306 dbus_message_iter_get_basic(&array, &path);
308 dbus_message_iter_next(&array);
309 if (dbus_message_iter_get_arg_type(&array)
310 == DBUS_TYPE_ARRAY) {
311 dbus_message_iter_recurse(&array, &dict);
312 print_ins_info(&rank, &ins_info, path, filter, &dict);
315 dbus_message_iter_next(iter);
318 fprintf(stdout, "\n");
319 fprintf(stdout, " [SSID] last_usr[%s] last_conn[%s] "
320 "sec_priority[%s] internet[%s] freq[%s] strength[%s]\n",
321 BOOLSTR(ins_info.ssid.last_user_selection), BOOLSTR(ins_info.ssid.last_connected),
322 BOOLSTR(ins_info.ssid.security_priority), BOOLSTR(ins_info.ssid.internet_connection),
323 BOOLSTR(ins_info.ssid.frequency), BOOLSTR(ins_info.ssid.strength));
325 fprintf(stdout, " [BSSID] last_conn[%s] assoc_reject[%s] freq[%s] strength[%s]\n",
326 BOOLSTR(ins_info.bssid.last_connected), BOOLSTR(ins_info.bssid.assoc_reject),
327 BOOLSTR(ins_info.bssid.frequency), BOOLSTR(ins_info.bssid.strength));
330 void __connmanctl_ins_list(DBusMessageIter *iter, char *filter)
332 DBusMessageIter array;
335 if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
338 dbus_message_iter_recurse(iter, &array);
339 list_ins_array(&array, filter);
341 dbus_message_iter_next(iter);
342 if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
345 fprintf(stdout, "\n}, {");
347 dbus_message_iter_recurse(iter, &array);
348 while (dbus_message_iter_get_arg_type(&array)
349 == DBUS_TYPE_OBJECT_PATH) {
350 dbus_message_iter_get_basic(&array, &path);
351 fprintf(stdout, "\n%-24s %s", "removed", path);
353 dbus_message_iter_next(&array);