| OLD | NEW |
| 1 /* | 1 /* |
| 2 * New WiFi - communicate with wpa_supplicant using the "new D-Bus api" | 2 * New WiFi - communicate with wpa_supplicant using the "new D-Bus api" |
| 3 * | 3 * |
| 4 * This file initially created by Google, Inc. | 4 * This file initially created by Google, Inc. |
| 5 * | 5 * |
| 6 * This program is free software; you can redistribute it and/or modify | 6 * This program is free software; you can redistribute it and/or modify |
| 7 * it under the terms of the GNU General Public License version 2 as | 7 * it under the terms of the GNU General Public License version 2 as |
| 8 * published by the Free Software Foundation. | 8 * published by the Free Software Foundation. |
| 9 * | 9 * |
| 10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
| (...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 | 803 |
| 804 if (use_pkcs11) { | 804 if (use_pkcs11) { |
| 805 append_from_network(dict, network, CONNMAN_WIFI_EAP_PIN, "pin"); | 805 append_from_network(dict, network, CONNMAN_WIFI_EAP_PIN, "pin"); |
| 806 connman_dbus_dict_append_variant(dict, "engine", | 806 connman_dbus_dict_append_variant(dict, "engine", |
| 807 DBUS_TYPE_INT32, &engine); | 807 DBUS_TYPE_INT32, &engine); |
| 808 connman_dbus_dict_append_variant(dict, "engine_id", | 808 connman_dbus_dict_append_variant(dict, "engine_id", |
| 809 DBUS_TYPE_STRING, &engine_id); | 809 DBUS_TYPE_STRING, &engine_id); |
| 810 } | 810 } |
| 811 } | 811 } |
| 812 | 812 |
| 813 static int check_wpa(struct connman_network *network) | 813 static int check_psk(struct connman_network *network) |
| 814 { | 814 { |
| 815 const char *passphrase = | 815 const char *passphrase = |
| 816 connman_network_get_string(network, "WiFi.Passphrase"); | 816 connman_network_get_string(network, "WiFi.Passphrase"); |
| 817 return (passphrase == NULL || strlen(passphrase) == 0 ? -EINVAL : 0); | 817 return (passphrase == NULL || strlen(passphrase) == 0 ? -EINVAL : 0); |
| 818 } | 818 } |
| 819 | 819 |
| 820 static void append_wpa(DBusMessageIter *dict, | 820 static void append_psk(DBusMessageIter *dict, |
| 821 » struct connman_network *network) | 821 » struct connman_network *network, const char *proto) |
| 822 { | 822 { |
| 823 const char *key_mgmt = "WPA-PSK"; | 823 const char *key_mgmt = "WPA-PSK"; |
| 824 const char *passphrase; | 824 const char *passphrase; |
| 825 | 825 |
| 826 connman_dbus_dict_append_variant(dict, "key_mgmt", | 826 connman_dbus_dict_append_variant(dict, "key_mgmt", |
| 827 DBUS_TYPE_STRING, &key_mgmt); | 827 DBUS_TYPE_STRING, &key_mgmt); |
| 828 connman_dbus_dict_append_variant(dict, "proto", |
| 829 DBUS_TYPE_STRING, &proto); |
| 828 | 830 |
| 829 passphrase = connman_network_get_string(network, "WiFi.Passphrase"); | 831 passphrase = connman_network_get_string(network, "WiFi.Passphrase"); |
| 830 connman_dbus_dict_append_variant(dict, "psk", | 832 connman_dbus_dict_append_variant(dict, "psk", |
| 831 DBUS_TYPE_STRING, &passphrase); | 833 DBUS_TYPE_STRING, &passphrase); |
| 832 } | 834 } |
| 833 | 835 |
| 834 static int check_wep(struct connman_network *network) | 836 static int check_wep(struct connman_network *network) |
| 835 { | 837 { |
| 836 const char *passphrase = | 838 const char *passphrase = |
| 837 connman_network_get_string(network, "WiFi.Passphrase"); | 839 connman_network_get_string(network, "WiFi.Passphrase"); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 ssid = connman_network_get_blob(network, "WiFi.SSID", &ssid_len); | 894 ssid = connman_network_get_blob(network, "WiFi.SSID", &ssid_len); |
| 893 append_byte_array(&dict, "ssid", ssid, ssid_len); | 895 append_byte_array(&dict, "ssid", ssid, ssid_len); |
| 894 /* NB: do not set the bssid; this allows wpa_supplicant to roam */ | 896 /* NB: do not set the bssid; this allows wpa_supplicant to roam */ |
| 895 | 897 |
| 896 /* must configure background scanning for each netblock */ | 898 /* must configure background scanning for each netblock */ |
| 897 append_bgscan(&dict, network); | 899 append_bgscan(&dict, network); |
| 898 | 900 |
| 899 security = connman_network_get_string(network, "WiFi.Security"); | 901 security = connman_network_get_string(network, "WiFi.Security"); |
| 900 if (g_ascii_strcasecmp(security, "802_1x") == 0) { | 902 if (g_ascii_strcasecmp(security, "802_1x") == 0) { |
| 901 append_8021x(&dict, network); | 903 append_8021x(&dict, network); |
| 902 } else if (g_ascii_strcasecmp(security, "wpa") == 0 || | 904 } else if (g_ascii_strcasecmp(security, "psk") == 0) { |
| 903 » g_ascii_strcasecmp(security, "rsn") == 0) { | 905 » » append_psk(&dict, network, "WPA RSN"); |
| 904 » » append_wpa(&dict, network); | 906 » } else if (g_ascii_strcasecmp(security, "wpa") == 0) { |
| 907 » » append_psk(&dict, network, "WPA"); |
| 908 » } else if (g_ascii_strcasecmp(security, "rsn") == 0) { |
| 909 » » append_psk(&dict, network, "RSN"); |
| 905 } else if (g_ascii_strcasecmp(security, "wep") == 0) { | 910 } else if (g_ascii_strcasecmp(security, "wep") == 0) { |
| 906 append_wep(&dict, network); | 911 append_wep(&dict, network); |
| 907 } else { | 912 } else { |
| 908 const char *key_mgmt = "NONE"; | 913 const char *key_mgmt = "NONE"; |
| 909 connman_dbus_dict_append_variant(&dict, "key_mgmt", | 914 connman_dbus_dict_append_variant(&dict, "key_mgmt", |
| 910 DBUS_TYPE_STRING, &key_mgmt); | 915 DBUS_TYPE_STRING, &key_mgmt); |
| 911 } | 916 } |
| 912 | 917 |
| 913 dbus_message_iter_close_container(array, &dict); | 918 dbus_message_iter_close_container(array, &dict); |
| 914 } | 919 } |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1342 | 1347 |
| 1343 free_scan_request(&request); | 1348 free_scan_request(&request); |
| 1344 | 1349 |
| 1345 /* NB: do here, the reply is slow and we want the ui to update asap */ | 1350 /* NB: do here, the reply is slow and we want the ui to update asap */ |
| 1346 connman_device_set_scanning_state(task->device, TRUE); | 1351 connman_device_set_scanning_state(task->device, TRUE); |
| 1347 | 1352 |
| 1348 return send_call2(task, message, scan_reply, &task->scan_call, | 1353 return send_call2(task, message, scan_reply, &task->scan_call, |
| 1349 __func__, "interface scan"); | 1354 __func__, "interface scan"); |
| 1350 } | 1355 } |
| 1351 | 1356 |
| 1352 static struct { | |
| 1353 char *name; | |
| 1354 char *value; | |
| 1355 } special_ssid[] = { | |
| 1356 { "<hidden>", "hidden" }, | |
| 1357 { "default", "linksys" }, | |
| 1358 { "wireless" }, | |
| 1359 { "linksys" }, | |
| 1360 { "netgear" }, | |
| 1361 { "dlink" }, | |
| 1362 { "2wire" }, | |
| 1363 { "compaq" }, | |
| 1364 { "tsunami" }, | |
| 1365 { "comcomcom", "3com" }, | |
| 1366 { "3Com", "3com" }, | |
| 1367 { "Symbol", "symbol" }, | |
| 1368 { "Motorola", "motorola" }, | |
| 1369 { "Wireless" , "wireless" }, | |
| 1370 { "WLAN", "wlan" }, | |
| 1371 { } | |
| 1372 }; | |
| 1373 | |
| 1374 static char *build_group(const char *addr, const char *name, | |
| 1375 const unsigned char *ssid, unsigned int ssid_len, | |
| 1376 const char *mode, const char *security) | |
| 1377 { | |
| 1378 GString *str; | |
| 1379 unsigned int i; | |
| 1380 | |
| 1381 if (addr == NULL) | |
| 1382 return NULL; | |
| 1383 | |
| 1384 str = g_string_sized_new((ssid_len * 2) + 24); | |
| 1385 if (str == NULL) | |
| 1386 return NULL; | |
| 1387 | |
| 1388 if (ssid == NULL) { | |
| 1389 g_string_append_printf(str, "hidden_%s", addr); | |
| 1390 goto done; | |
| 1391 } | |
| 1392 | |
| 1393 for (i = 0; special_ssid[i].name; i++) { | |
| 1394 if (g_strcmp0(special_ssid[i].name, name) == 0) { | |
| 1395 if (special_ssid[i].value == NULL) | |
| 1396 g_string_append_printf(str, "%s_%.*s", | |
| 1397 name, 2*ETH_ALEN, addr); | |
| 1398 else | |
| 1399 g_string_append_printf(str, "%s_%.*s", | |
| 1400 special_ssid[i].value, 2*ETH_ALEN, addr); | |
| 1401 goto done; | |
| 1402 } | |
| 1403 } | |
| 1404 | |
| 1405 if (ssid_len > 0 && ssid[0] != '\0') { | |
| 1406 for (i = 0; i < ssid_len; i++) | |
| 1407 g_string_append_printf(str, "%02x", ssid[i]); | |
| 1408 } else | |
| 1409 g_string_append_printf(str, "hidden_%.*s", 2*ETH_ALEN, addr); | |
| 1410 | |
| 1411 done: | |
| 1412 g_string_append_printf(str, "_%s_%s", mode, security); | |
| 1413 | |
| 1414 return g_string_free(str, FALSE); | |
| 1415 } | |
| 1416 | |
| 1417 /* | 1357 /* |
| 1418 * Construct the identifier for a network from the bssid and ssid. | 1358 * Construct the identifier for a network from the bssid and ssid. |
| 1419 * We intentionally construct a valid d-bus object path because | 1359 * We intentionally construct a valid d-bus object path because |
| 1420 * the constructed string is eventually used this way. | 1360 * the constructed string is eventually used this way. |
| 1421 */ | 1361 */ |
| 1422 static void make_objpath(struct supplicant_result *result) | 1362 static void make_objpath(struct supplicant_result *result) |
| 1423 { | 1363 { |
| 1424 int i, off; | 1364 int i, off; |
| 1425 | 1365 |
| 1426 CONNMAN_ASSERT(2*(ETH_ALEN + result->ssid_len) < sizeof(result->path)); | 1366 CONNMAN_ASSERT(2*(ETH_ALEN + result->ssid_len) < sizeof(result->path)); |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1827 * Add/update a BSS entry based on the supplied scan result. | 1767 * Add/update a BSS entry based on the supplied scan result. |
| 1828 * We construct a network object (or use an existing one) | 1768 * We construct a network object (or use an existing one) |
| 1829 * and record relevant state. | 1769 * and record relevant state. |
| 1830 */ | 1770 */ |
| 1831 static struct connman_network *add_bss(struct supplicant_task *task, | 1771 static struct connman_network *add_bss(struct supplicant_task *task, |
| 1832 struct supplicant_result *bss) | 1772 struct supplicant_result *bss) |
| 1833 { | 1773 { |
| 1834 struct connman_network *network; | 1774 struct connman_network *network; |
| 1835 char *group; | 1775 char *group; |
| 1836 | 1776 |
| 1837 » group = build_group(bss->path, bss->name, | 1777 » group = connman_wifi_build_group(bss->path, bss->name, |
| 1838 bss->ssid, bss->ssid_len, bss->mode, bss->security); | 1778 bss->ssid, bss->ssid_len, bss->mode, bss->security); |
| 1839 | 1779 |
| 1840 network = connman_device_get_network(task->device, bss->path); | 1780 network = connman_device_get_network(task->device, bss->path); |
| 1841 | 1781 |
| 1842 _DBG_WIFI("%s %s \"%s\" (%s %s%s) signal %d strength %u freq %u", | 1782 _DBG_WIFI("%s %s \"%s\" (%s %s%s) signal %d strength %u freq %u", |
| 1843 network == NULL ? "add" : "update", bss->path, bss->name, | 1783 network == NULL ? "add" : "update", bss->path, bss->name, |
| 1844 bss->mode, bss->security, (bss->has_wps == TRUE) ? " WPS" : "", | 1784 bss->mode, bss->security, (bss->has_wps == TRUE) ? " WPS" : "", |
| 1845 bss->signal, bss->strength, bss->frequency); | 1785 bss->signal, bss->strength, bss->frequency); |
| 1846 | 1786 |
| 1847 if (network == NULL) { | 1787 if (network == NULL) { |
| (...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2660 /* | 2600 /* |
| 2661 * Validate security credentials here; doing it later when | 2601 * Validate security credentials here; doing it later when |
| 2662 * constructing netblock contents results in side effects | 2602 * constructing netblock contents results in side effects |
| 2663 * or requires complicated back out of state. | 2603 * or requires complicated back out of state. |
| 2664 */ | 2604 */ |
| 2665 err = 0; | 2605 err = 0; |
| 2666 if (security == NULL) | 2606 if (security == NULL) |
| 2667 err = -EINVAL; | 2607 err = -EINVAL; |
| 2668 else if (g_ascii_strcasecmp(security, "802_1x") == 0) | 2608 else if (g_ascii_strcasecmp(security, "802_1x") == 0) |
| 2669 err = check_8021x(network); | 2609 err = check_8021x(network); |
| 2670 else if (g_ascii_strcasecmp(security, "wpa") == 0 || | 2610 else if (g_ascii_strcasecmp(security, "psk") == 0 || |
| 2611 » g_ascii_strcasecmp(security, "wpa") == 0 || |
| 2671 g_ascii_strcasecmp(security, "rsn") == 0) | 2612 g_ascii_strcasecmp(security, "rsn") == 0) |
| 2672 » » err = check_wpa(network); | 2613 » » err = check_psk(network); |
| 2673 else if (g_ascii_strcasecmp(security, "wep") == 0) | 2614 else if (g_ascii_strcasecmp(security, "wep") == 0) |
| 2674 err = check_wep(network); | 2615 err = check_wep(network); |
| 2675 if (err != 0) { | 2616 if (err != 0) { |
| 2676 _DBG_WIFI("security failed, network %p security %s err %d", | 2617 _DBG_WIFI("security failed, network %p security %s err %d", |
| 2677 network, security, err); | 2618 network, security, err); |
| 2678 return err; | 2619 return err; |
| 2679 } | 2620 } |
| 2680 | 2621 |
| 2681 handle = network_get_handle(task, network, &service_path); | 2622 handle = network_get_handle(task, network, &service_path); |
| 2682 if (handle != NULL) { | 2623 if (handle != NULL) { |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2966 dbus_bus_remove_match(connection, bss_rule, NULL); | 2907 dbus_bus_remove_match(connection, bss_rule, NULL); |
| 2967 dbus_bus_remove_match(connection, interface_rule, NULL); | 2908 dbus_bus_remove_match(connection, interface_rule, NULL); |
| 2968 dbus_connection_flush(connection); | 2909 dbus_connection_flush(connection); |
| 2969 dbus_connection_remove_filter(connection, supplicant_filter, NULL); | 2910 dbus_connection_remove_filter(connection, supplicant_filter, NULL); |
| 2970 dbus_connection_unref(connection); | 2911 dbus_connection_unref(connection); |
| 2971 connection = NULL; | 2912 connection = NULL; |
| 2972 } | 2913 } |
| 2973 | 2914 |
| 2974 CONNMAN_PLUGIN_DEFINE(newwifi, "New WiFi interface", VERSION, | 2915 CONNMAN_PLUGIN_DEFINE(newwifi, "New WiFi interface", VERSION, |
| 2975 CONNMAN_PLUGIN_PRIORITY_DEFAULT, new_wifi_init, new_wifi_finis) | 2916 CONNMAN_PLUGIN_PRIORITY_DEFAULT, new_wifi_init, new_wifi_finis) |
| OLD | NEW |