wireguard: Add routes for allowedIPs
[platform/upstream/connman.git] / src / config.c
index 11f0bd8..993f4f6 100644 (file)
@@ -72,10 +72,17 @@ struct connman_config_service {
        char *ipv6_gateway;
        char *ipv6_privacy;
        char *mac;
+       char *devname;
+       bool mdns;
        char **nameservers;
        char **search_domains;
        char **timeservers;
        char *domain_name;
+#if defined TIZEN_EXT
+       char *connector;
+       char *c_sign_key;
+       char *net_access_key;
+#endif
 };
 
 struct connman_config {
@@ -112,15 +119,22 @@ static bool cleanup = false;
 #define SERVICE_KEY_PASSPHRASE         "Passphrase"
 #define SERVICE_KEY_SECURITY           "Security"
 #define SERVICE_KEY_HIDDEN             "Hidden"
+#define SERVICE_KEY_MDNS               "mDNS"
 
 #define SERVICE_KEY_IPv4               "IPv4"
 #define SERVICE_KEY_IPv6               "IPv6"
 #define SERVICE_KEY_IPv6_PRIVACY       "IPv6.Privacy"
 #define SERVICE_KEY_MAC                "MAC"
+#define SERVICE_KEY_DEVICE_NAME               "DeviceName"
 #define SERVICE_KEY_NAMESERVERS        "Nameservers"
 #define SERVICE_KEY_SEARCH_DOMAINS     "SearchDomains"
 #define SERVICE_KEY_TIMESERVERS        "Timeservers"
 #define SERVICE_KEY_DOMAIN             "Domain"
+#if defined TIZEN_EXT
+#define SERVICE_KEY_CONNECTOR          "Connector"
+#define SERVICE_KEY_C_SIGN_KEY         "CSignKey"
+#define SERVICE_KEY_NET_ACCESS_KEY     "NetAccessKey"
+#endif
 
 static const char *config_possible_keys[] = {
        CONFIG_KEY_NAME,
@@ -152,10 +166,17 @@ static const char *service_possible_keys[] = {
        SERVICE_KEY_IPv6,
        SERVICE_KEY_IPv6_PRIVACY,
        SERVICE_KEY_MAC,
+       SERVICE_KEY_DEVICE_NAME,
+       SERVICE_KEY_MDNS,
        SERVICE_KEY_NAMESERVERS,
        SERVICE_KEY_SEARCH_DOMAINS,
        SERVICE_KEY_TIMESERVERS,
        SERVICE_KEY_DOMAIN,
+#if defined TIZEN_EXT
+       SERVICE_KEY_CONNECTOR,
+       SERVICE_KEY_C_SIGN_KEY,
+       SERVICE_KEY_NET_ACCESS_KEY,
+#endif
        NULL,
 };
 
@@ -193,7 +214,7 @@ static void unregister_service(gpointer data)
                                                        list = list->next) {
                service_id = list->data;
 
-               service = __connman_service_lookup_from_ident(service_id);
+               service = connman_service_lookup_from_identifier(service_id);
                if (service) {
                        __connman_service_set_immutable(service, false);
                        __connman_service_set_config(service, NULL, NULL);
@@ -254,6 +275,7 @@ free_only:
        g_free(config_service->ipv6_gateway);
        g_free(config_service->ipv6_privacy);
        g_free(config_service->mac);
+       g_free(config_service->devname);
        g_strfreev(config_service->nameservers);
        g_strfreev(config_service->search_domains);
        g_strfreev(config_service->timeservers);
@@ -262,6 +284,11 @@ free_only:
        g_free(config_service->config_ident);
        g_free(config_service->config_entry);
        g_free(config_service->virtual_file);
+#if defined TIZEN_EXT
+       g_free(config_service->connector);
+       g_free(config_service->c_sign_key);
+       g_free(config_service->net_access_key);
+#endif
        g_free(config_service);
 }
 
@@ -475,6 +502,12 @@ static bool load_service_generic(GKeyFile *keyfile,
                service->mac = str;
        }
 
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_DEVICE_NAME, NULL);
+       if (str) {
+               g_free(service->devname);
+               service->devname = str;
+       }
+
        str = __connman_config_get_string(keyfile, group, SERVICE_KEY_DOMAIN, NULL);
        if (str) {
                g_free(service->domain_name);
@@ -514,6 +547,9 @@ static bool load_service_generic(GKeyFile *keyfile,
                        g_strfreev(strlist);
        }
 
+       service->mdns = __connman_config_get_bool(keyfile, group,
+                                               SERVICE_KEY_MDNS, NULL);
+
        return true;
 
 err:
@@ -525,6 +561,7 @@ err:
        g_free(service->ipv6_address);
        g_free(service->ipv6_gateway);
        g_free(service->mac);
+       g_free(service->devname);
        g_free(service);
 
        return false;
@@ -564,8 +601,8 @@ static bool load_service(GKeyFile *keyfile, const char *group,
                g_free(service->type);
                service->type = str;
        } else {
-               DBG("Type of the configured service is missing for group %s",
-                                                                       group);
+               connman_warn("Type of the configured service is missing "
+                       "for group %s", group);
                goto err;
        }
 
@@ -621,7 +658,11 @@ static bool load_service(GKeyFile *keyfile, const char *group,
                unsigned int ssid_len;
 
                ssid_len = strlen(service->name);
+#if defined TIZEN_EXT
+               ssid = g_try_malloc0(ssid_len + 1);
+#else
                ssid = g_try_malloc0(ssid_len);
+#endif
                if (!ssid)
                        goto err;
 
@@ -722,6 +763,29 @@ static bool load_service(GKeyFile *keyfile, const char *group,
                g_free(service->passphrase);
                service->passphrase = str;
        }
+#if defined TIZEN_EXT
+
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_CONNECTOR,
+                                       NULL);
+       if (str) {
+               g_free(service->connector);
+               service->connector = str;
+       }
+
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_C_SIGN_KEY,
+                                       NULL);
+       if (str) {
+               g_free(service->c_sign_key);
+               service->c_sign_key = str;
+       }
+
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_NET_ACCESS_KEY,
+                                       NULL);
+       if (str) {
+               g_free(service->net_access_key);
+               service->net_access_key = str;
+       }
+#endif
 
        str = __connman_config_get_string(keyfile, group, SERVICE_KEY_SECURITY,
                        NULL);
@@ -742,6 +806,7 @@ static bool load_service(GKeyFile *keyfile, const char *group,
                        if (security == CONNMAN_SERVICE_SECURITY_PSK ||
 #if defined TIZEN_EXT
                            security == CONNMAN_SERVICE_SECURITY_RSN ||
+                           security == CONNMAN_SERVICE_SECURITY_SAE ||
 #endif
                                        security == CONNMAN_SERVICE_SECURITY_WEP) {
                                service->security = security;
@@ -756,16 +821,26 @@ static bool load_service(GKeyFile *keyfile, const char *group,
 
                } else
                        service->security = CONNMAN_SERVICE_SECURITY_PSK;
+#if defined TIZEN_EXT
+       } else if (service->connector) {
+
+               if (str && security != CONNMAN_SERVICE_SECURITY_DPP)
+                       connman_info("Mismatch between DPP configuration and "
+                                       "setting %s = %s",
+                                       SERVICE_KEY_SECURITY, str);
+
+               service->security = CONNMAN_SERVICE_SECURITY_DPP;
+#endif
        } else if (str) {
 
-               if (security != CONNMAN_SERVICE_SECURITY_NONE) {
+               if (security != CONNMAN_SERVICE_SECURITY_NONE)
                        connman_info("Mismatch no security and "
                                        "setting %s = %s",
                                        SERVICE_KEY_SECURITY, str);
-               }
-                       service->security = CONNMAN_SERVICE_SECURITY_NONE;
+
+               service->security = CONNMAN_SERVICE_SECURITY_NONE;
        } else
-                       service->security = CONNMAN_SERVICE_SECURITY_NONE;
+               service->security = CONNMAN_SERVICE_SECURITY_NONE;
 
        g_free(str);
 
@@ -805,8 +880,11 @@ static bool load_service_from_keyfile(GKeyFile *keyfile,
        groups = g_key_file_get_groups(keyfile, NULL);
 
        for (i = 0; groups[i]; i++) {
-               if (!g_str_has_prefix(groups[i], "service_"))
+               if (!g_str_has_prefix(groups[i], "service_")) {
+                       connman_warn("Ignore group named '%s' because prefix "
+                               "is not 'service_'", groups[i]);
                        continue;
+               }
                if (load_service(keyfile, groups[i], config))
                        found = true;
        }
@@ -1168,6 +1246,18 @@ static void provision_service_wifi(struct connman_config_service *config,
 
        if (config->hidden)
                __connman_service_set_hidden(service);
+
+#if defined TIZEN_EXT
+       if (config->connector)
+               __connman_service_set_string(service, "Connector",
+                                               config->connector);
+       if (config->c_sign_key)
+               __connman_service_set_string(service, "CSignKey",
+                                               config->c_sign_key);
+       if (config->net_access_key)
+               __connman_service_set_string(service, "NetAccessKey",
+                                               config->net_access_key);
+#endif
 }
 
 struct connect_virtual {
@@ -1210,6 +1300,7 @@ static int try_provision_service(struct connman_config_service *config,
        enum connman_service_type type;
        const void *ssid;
        unsigned int ssid_len;
+       const char *str;
 
        network = __connman_service_get_network(service);
        if (!network) {
@@ -1229,10 +1320,8 @@ static int try_provision_service(struct connman_config_service *config,
 
                ssid = connman_network_get_blob(network, "WiFi.SSID",
                                                &ssid_len);
-               if (!ssid) {
-                       connman_error("Network SSID not set");
-                       return -EINVAL;
-               }
+               if (!ssid)
+                       return -ENOENT;
 
                if (!config->ssid || ssid_len != config->ssid_len)
                        return -ENOENT;
@@ -1240,6 +1329,10 @@ static int try_provision_service(struct connman_config_service *config,
                if (memcmp(config->ssid, ssid, ssid_len))
                        return -ENOENT;
 
+               str = connman_network_get_string(network, "WiFi.Security");
+               if (config->security != __connman_service_string2security(str))
+                       return -ENOENT;
+
                break;
 
        case CONNMAN_SERVICE_TYPE_ETHERNET:
@@ -1265,7 +1358,7 @@ static int try_provision_service(struct connman_config_service *config,
        }
 
        DBG("service %p ident %s", service,
-                                       __connman_service_get_ident(service));
+                               connman_service_get_identifier(service));
 
        if (config->mac) {
                struct connman_device *device;
@@ -1283,6 +1376,22 @@ static int try_provision_service(struct connman_config_service *config,
 
                if (g_ascii_strcasecmp(device_addr, config->mac) != 0)
                        return -ENOENT;
+       } else if (config->devname) {
+               struct connman_device *device;
+               const char *devname;
+
+               device = connman_network_get_device(network);
+               if (!device) {
+                       connman_error("Network device is missing");
+                       return -ENODEV;
+               }
+
+               devname = connman_device_get_string(device, "Interface");
+
+               DBG("wants %s has %s", config->devname, devname);
+
+               if (g_ascii_strcasecmp(devname, config->devname) != 0)
+                       return -ENOENT;
        }
 
 #if defined TIZEN_EXT
@@ -1386,7 +1495,7 @@ ipv4_out:
 #endif
        __connman_service_disconnect(service);
 
-       service_id = __connman_service_get_ident(service);
+       service_id = connman_service_get_identifier(service);
        config->service_identifiers =
                g_slist_prepend(config->service_identifiers,
                                g_strdup(service_id));
@@ -1425,6 +1534,8 @@ ipv4_out:
                __connman_service_set_search_domains(service,
                                                config->search_domains);
 
+       __connman_service_set_mdns(service, config->mdns);
+
        if (config->timeservers)
                __connman_service_set_timeservers(service,
                                                config->timeservers);
@@ -1507,7 +1618,9 @@ int __connman_config_provision_service(struct connman_service *service)
 
        /* For now only WiFi, Gadget and Ethernet services are supported */
        type = connman_service_get_type(service);
-
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("service %p type %d", service, type);
 
        if (type != CONNMAN_SERVICE_TYPE_WIFI &&
@@ -1751,7 +1864,6 @@ void connman_config_free_entries(struct connman_config_entry **entries)
        }
 
        g_free(entries);
-       return;
 }
 
 bool __connman_config_address_provisioned(const char *address,