summaryrefslogtreecommitdiff
path: root/client/ins.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/ins.c')
-rwxr-xr-xclient/ins.c301
1 files changed, 301 insertions, 0 deletions
diff --git a/client/ins.c b/client/ins.c
new file mode 100755
index 00000000..f62f8379
--- /dev/null
+++ b/client/ins.c
@@ -0,0 +1,301 @@
+/*
+ *
+ * Connection Manager
+ *
+ * Copyright (C) 2020 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include "ins.h"
+
+struct bssid_info_s {
+ char *bssid;
+ unsigned int strength;
+ unsigned int frequency;
+ int score_ins;
+ int score_last_connected;
+ int score_assoc_reject;
+ int score_frequency;
+ int score_strength;
+};
+
+static void print_bssid_info(gpointer value, gpointer user_data)
+{
+ struct bssid_info_s *bssid_info = value;
+ int *bssid_rank = user_data;
+
+ fprintf(stdout, " %2d) %-20s total[%2d] last_conn[%2d] "
+ "assoc_reject[%2d] freq[%2d(%4d)] strength[%2d(%2d)]\n",
+ *bssid_rank, bssid_info->bssid, bssid_info->score_ins,
+ bssid_info->score_last_connected, bssid_info->score_assoc_reject,
+ bssid_info->score_frequency, bssid_info->frequency,
+ bssid_info->score_strength, bssid_info->strength);
+
+ (*bssid_rank)++;
+}
+
+static GSList *get_bssid_list(DBusMessageIter *iter)
+{
+ char *property;
+ DBusMessageIter entry, val;
+ GSList *bssid_list = NULL;
+ struct bssid_info_s *bssid_info = NULL;
+
+ while (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
+ dbus_message_iter_recurse(iter, &entry);
+ dbus_message_iter_get_basic(&entry, &property);
+
+ if (strcmp(property, "BSSID") == 0) {
+ bssid_info = g_try_new0(struct bssid_info_s, 1);
+ if (!bssid_info)
+ continue;
+
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &(bssid_info->bssid));
+
+ } else if (strcmp(property, "ScoreINS") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &(bssid_info->score_ins));
+
+ } else if (strcmp(property, "ScoreLastConnected") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &(bssid_info->score_last_connected));
+
+ } else if (strcmp(property, "ScoreAssocReject") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &(bssid_info->score_assoc_reject));
+
+ } else if (strcmp(property, "Frequency") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &(bssid_info->frequency));
+
+ } else if (strcmp(property, "ScoreFrequency") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &(bssid_info->score_frequency));
+
+ } else if (strcmp(property, "Strength") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &(bssid_info->strength));
+
+ } else if (strcmp(property, "ScoreStrength") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &(bssid_info->score_strength));
+
+ bssid_list = g_slist_append(bssid_list, bssid_info);
+ }
+
+ dbus_message_iter_next(iter);
+ }
+
+ return bssid_list;
+}
+
+static void print_ins_info(int *rank, char *path, char *filter, DBusMessageIter *iter)
+{
+ char *name = "";
+ char *security;
+ char *str = NULL;
+ int count = 0;
+ char *property;
+ unsigned char strength;
+ unsigned int frequency;
+ int score_INS;
+ int score_last_user_selection;
+ int score_last_connected;
+ int score_frequency;
+ int score_security_priority;
+ int score_internet_connection;
+ int score_strength;
+ GSList *bssid_list = NULL;
+ DBusMessageIter entry, val, dict;
+
+ while (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
+ dbus_message_iter_recurse(iter, &entry);
+ dbus_message_iter_get_basic(&entry, &property);
+
+ if (strcmp(property, "Name") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &name);
+
+ } else if (strcmp(property, "ScoreINS") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &score_INS);
+
+ } else if (strcmp(property, "ScoreLastUserSelection") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &score_last_user_selection);
+
+ } else if (strcmp(property, "ScoreLastConnected") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &score_last_connected);
+
+ } else if (strcmp(property, "Security") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &security);
+
+ } else if (strcmp(property, "ScoreSecurityPriority") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &score_security_priority);
+
+ } else if (strcmp(property, "Strength") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &strength);
+
+ } else if (strcmp(property, "ScoreStrength") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &score_strength);
+
+ } else if (strcmp(property, "ScoreInternetConnection") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &score_internet_connection);
+
+ } else if (strcmp(property, "Frequency") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &frequency);
+
+ } else if (strcmp(property, "ScoreFrequency") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ dbus_message_iter_get_basic(&val, &score_frequency);
+
+ } else if (strcmp(property, "BSSID.List") == 0) {
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &val);
+ if (dbus_message_iter_get_arg_type(&val)
+ == DBUS_TYPE_ARRAY) {
+ dbus_message_iter_recurse(&val, &dict);
+ bssid_list = get_bssid_list(&dict);
+ }
+
+ }
+
+ count++;
+ dbus_message_iter_next(iter);
+ }
+
+ str = strrchr(path, '/');
+ if (str)
+ str++;
+ else
+ str = path;
+
+ if (count > 0) {
+ if (!filter || strcmp(filter, name) == 0 || strcmp(filter, "ssid") == 0) {
+ fprintf(stdout, " [%2d] %-20s total[%2d] last_usr[%2d] last_conn[%2d] "
+ "internet[%2d] sec[%2d(%9s)] freq[%2d(%4d)] strength[%2d(%2d)]\n %s\n",
+ *rank, name, score_INS, score_last_user_selection, score_last_connected,
+ score_internet_connection, score_security_priority, security,
+ score_frequency, frequency, score_strength, strength, str);
+
+ if (!filter || strcmp(filter, "ssid") != 0) {
+ int bssid_rank = 1;
+ g_slist_foreach(bssid_list, print_bssid_info, &bssid_rank);
+ }
+
+ (*rank)++;
+ }
+
+ } else {
+ fprintf(stdout, "%-24s %s", "unchanged\n", str);
+ }
+
+}
+
+static void list_ins_array(DBusMessageIter *iter, char *filter)
+{
+ DBusMessageIter array, dict;
+ char *path = NULL;
+ int rank = 1;
+
+ while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
+
+ dbus_message_iter_recurse(iter, &array);
+ if (dbus_message_iter_get_arg_type(&array)
+ != DBUS_TYPE_OBJECT_PATH)
+ return;
+
+ dbus_message_iter_get_basic(&array, &path);
+
+ dbus_message_iter_next(&array);
+ if (dbus_message_iter_get_arg_type(&array)
+ == DBUS_TYPE_ARRAY) {
+ dbus_message_iter_recurse(&array, &dict);
+ print_ins_info(&rank, path, filter, &dict);
+ }
+
+ dbus_message_iter_next(iter);
+ }
+}
+
+void __connmanctl_ins_list(DBusMessageIter *iter, char *filter)
+{
+ DBusMessageIter array;
+ char *path;
+
+ if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+ return;
+
+ dbus_message_iter_recurse(iter, &array);
+ list_ins_array(&array, filter);
+
+ dbus_message_iter_next(iter);
+ if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+ return;
+
+ fprintf(stdout, "\n}, {");
+
+ dbus_message_iter_recurse(iter, &array);
+ while (dbus_message_iter_get_arg_type(&array)
+ == DBUS_TYPE_OBJECT_PATH) {
+ dbus_message_iter_get_basic(&array, &path);
+ fprintf(stdout, "\n%-24s %s", "removed", path);
+
+ dbus_message_iter_next(&array);
+ }
+
+}