| 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 |