summary refs log tree commit diff
path: root/src/core/nm-dispatcher.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/nm-dispatcher.c')
-rw-r--r--src/core/nm-dispatcher.c263
1 files changed, 108 insertions, 155 deletions
diff --git a/src/core/nm-dispatcher.c b/src/core/nm-dispatcher.c
index b7719786..b6ff25ca 100644
--- a/src/core/nm-dispatcher.c
+++ b/src/core/nm-dispatcher.c
@@ -15,9 +15,7 @@
 #include "nm-act-request.h"
 #include "devices/nm-device.h"
 #include "nm-dhcp-config.h"
-#include "nm-proxy-config.h"
-#include "nm-ip4-config.h"
-#include "nm-ip6-config.h"
+#include "nm-l3-config-data.h"
 #include "nm-manager.h"
 #include "settings/nm-settings-connection.h"
 #include "libnm-platform/nm-platform.h"
@@ -56,8 +54,8 @@
 struct NMDispatcherCallId {
     NMDispatcherFunc   callback;
     gpointer           user_data;
-    const char *       log_ifname;
-    const char *       log_con_uuid;
+    const char        *log_ifname;
+    const char        *log_con_uuid;
     NMDispatcherAction action;
     guint              idle_id;
     guint32            request_id;
@@ -76,7 +74,7 @@ struct NMDispatcherCallId {
  *   Finally, cleanup the global structures. */
 static struct {
     GDBusConnection *dbus_connection;
-    GHashTable *     requests;
+    GHashTable      *requests;
     guint            request_id_counter;
 } gl;
 
@@ -87,13 +85,13 @@ dispatcher_call_id_new(guint32            request_id,
                        NMDispatcherAction action,
                        NMDispatcherFunc   callback,
                        gpointer           user_data,
-                       const char *       log_ifname,
-                       const char *       log_con_uuid)
+                       const char        *log_ifname,
+                       const char        *log_con_uuid)
 {
     NMDispatcherCallId *call_id;
     gsize               l_log_ifname;
     gsize               l_log_con_uuid;
-    char *              extra_strings;
+    char               *extra_strings;
 
     l_log_ifname   = log_ifname ? (strlen(log_ifname) + 1) : 0u;
     l_log_con_uuid = log_con_uuid ? (strlen(log_con_uuid) + 1) : 0u;
@@ -148,50 +146,47 @@ _init_dispatcher(void)
 /*****************************************************************************/
 
 static void
-dump_proxy_to_props(NMProxyConfig *proxy, GVariantBuilder *builder)
+dump_proxy_to_props(const NML3ConfigData *l3cd, GVariantBuilder *builder)
 {
-    const char *pac_url = NULL, *pac_script = NULL;
+    const char *s;
 
-    if (nm_proxy_config_get_method(proxy) == NM_PROXY_CONFIG_METHOD_NONE)
+    if (nm_l3_config_data_get_proxy_method(l3cd) != NM_PROXY_CONFIG_METHOD_AUTO)
         return;
 
-    pac_url = nm_proxy_config_get_pac_url(proxy);
-    if (pac_url) {
-        g_variant_builder_add(builder, "{sv}", "pac-url", g_variant_new_string(pac_url));
-    }
+    s = nm_l3_config_data_get_proxy_pac_url(l3cd);
+    if (s)
+        g_variant_builder_add(builder, "{sv}", "pac-url", g_variant_new_string(s));
 
-    pac_script = nm_proxy_config_get_pac_script(proxy);
-    if (pac_script) {
-        g_variant_builder_add(builder, "{sv}", "pac-script", g_variant_new_string(pac_script));
-    }
+    s = nm_l3_config_data_get_proxy_pac_script(l3cd);
+    if (s)
+        g_variant_builder_add(builder, "{sv}", "pac-script", g_variant_new_string(s));
 }
 
 static void
-dump_ip_to_props(NMIPConfig *ip, GVariantBuilder *builder)
+dump_ip_to_props(const NML3ConfigData *l3cd, int addr_family, GVariantBuilder *builder)
 {
-    const int        addr_family = nm_ip_config_get_addr_family(ip);
-    const int        IS_IPv4     = NM_IS_IPv4(addr_family);
-    const NMPObject *obj;
-    GVariantBuilder  int_builder;
-    NMDedupMultiIter ipconf_iter;
-    GVariant *       var1;
-    GVariant *       var2;
-    guint            n;
-    guint            i;
-    const NMPObject *default_route;
+    const int          IS_IPv4 = NM_IS_IPv4(addr_family);
+    const NMPObject   *obj;
+    GVariantBuilder    int_builder;
+    NMDedupMultiIter   ipconf_iter;
+    GVariant          *var1;
+    GVariant          *var2;
+    guint              n;
+    guint              i;
+    const NMPObject   *default_route;
+    const char *const *strarr;
+    const in_addr_t   *ip4arr;
+    gconstpointer      iparr;
 
     if (IS_IPv4)
         g_variant_builder_init(&int_builder, G_VARIANT_TYPE("aau"));
     else
         g_variant_builder_init(&int_builder, G_VARIANT_TYPE("a(ayuay)"));
-    default_route = nm_ip_config_best_default_route_get(ip);
-    if (IS_IPv4)
-        nm_ip_config_iter_ip4_address_init(&ipconf_iter, NM_IP4_CONFIG(ip));
-    else
-        nm_ip_config_iter_ip6_address_init(&ipconf_iter, NM_IP6_CONFIG(ip));
-    while (nm_platform_dedup_multi_iter_next_obj(&ipconf_iter,
-                                                 &obj,
-                                                 NMP_OBJECT_TYPE_IP_ADDRESS(IS_IPv4))) {
+    default_route = nm_l3_config_data_get_best_default_route(l3cd, addr_family);
+    nm_l3_config_data_iter_obj_for_each (&ipconf_iter,
+                                         l3cd,
+                                         &obj,
+                                         NMP_OBJECT_TYPE_IP_ADDRESS(IS_IPv4)) {
         const NMPlatformIPXAddress *addr = NMP_OBJECT_CAST_IPX_ADDRESS(obj);
 
         if (IS_IPv4) {
@@ -225,30 +220,28 @@ dump_ip_to_props(NMIPConfig *ip, GVariantBuilder *builder)
         g_variant_builder_init(&int_builder, G_VARIANT_TYPE("au"));
     else
         g_variant_builder_init(&int_builder, G_VARIANT_TYPE("aay"));
-    n = nm_ip_config_get_num_nameservers(ip);
+    iparr = nm_l3_config_data_get_nameservers(l3cd, addr_family, &n);
     for (i = 0; i < n; i++) {
-        if (IS_IPv4) {
-            g_variant_builder_add(&int_builder,
-                                  "u",
-                                  nm_ip4_config_get_nameserver(NM_IP4_CONFIG(ip), i));
-        } else {
-            var1 = nm_g_variant_new_ay_in6addr(nm_ip6_config_get_nameserver(NM_IP6_CONFIG(ip), i));
+        if (IS_IPv4)
+            g_variant_builder_add(&int_builder, "u", ((const in_addr_t *) iparr)[i]);
+        else {
+            var1 = nm_g_variant_new_ay_in6addr(&(((const struct in6_addr *) iparr)[i]));
             g_variant_builder_add(&int_builder, "@ay", var1);
         }
     }
     g_variant_builder_add(builder, "{sv}", "nameservers", g_variant_builder_end(&int_builder));
 
     g_variant_builder_init(&int_builder, G_VARIANT_TYPE("as"));
-    n = nm_ip_config_get_num_domains(ip);
+    strarr = nm_l3_config_data_get_domains(l3cd, addr_family, &n);
     for (i = 0; i < n; i++)
-        g_variant_builder_add(&int_builder, "s", nm_ip_config_get_domain(ip, i));
+        g_variant_builder_add(&int_builder, "s", strarr[i]);
     g_variant_builder_add(builder, "{sv}", "domains", g_variant_builder_end(&int_builder));
 
     if (IS_IPv4) {
         g_variant_builder_init(&int_builder, G_VARIANT_TYPE("au"));
-        n = nm_ip4_config_get_num_wins(NM_IP4_CONFIG(ip));
+        ip4arr = nm_l3_config_data_get_wins(l3cd, &n);
         for (i = 0; i < n; i++)
-            g_variant_builder_add(&int_builder, "u", nm_ip4_config_get_wins(NM_IP4_CONFIG(ip), i));
+            g_variant_builder_add(&int_builder, "u", ip4arr[i]);
         g_variant_builder_add(builder, "{sv}", "wins-servers", g_variant_builder_end(&int_builder));
     }
 
@@ -256,13 +249,10 @@ dump_ip_to_props(NMIPConfig *ip, GVariantBuilder *builder)
         g_variant_builder_init(&int_builder, G_VARIANT_TYPE("aau"));
     else
         g_variant_builder_init(&int_builder, G_VARIANT_TYPE("a(ayuayu)"));
-    if (IS_IPv4)
-        nm_ip_config_iter_ip4_route_init(&ipconf_iter, NM_IP4_CONFIG(ip));
-    else
-        nm_ip_config_iter_ip6_route_init(&ipconf_iter, NM_IP6_CONFIG(ip));
-    while (nm_platform_dedup_multi_iter_next_obj(&ipconf_iter,
-                                                 &obj,
-                                                 NMP_OBJECT_TYPE_IP_ROUTE(IS_IPv4))) {
+    nm_l3_config_data_iter_obj_for_each (&ipconf_iter,
+                                         l3cd,
+                                         &obj,
+                                         NMP_OBJECT_TYPE_IP_ROUTE(IS_IPv4)) {
         const NMPlatformIPXRoute *route = NMP_OBJECT_CAST_IPX_ROUTE(obj);
 
         if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT(route))
@@ -291,18 +281,16 @@ dump_ip_to_props(NMIPConfig *ip, GVariantBuilder *builder)
 }
 
 static void
-fill_device_props(NMDevice *       device,
+fill_device_props(NMDevice        *device,
                   GVariantBuilder *dev_builder,
                   GVariantBuilder *proxy_builder,
                   GVariantBuilder *ip4_builder,
                   GVariantBuilder *ip6_builder,
-                  GVariant **      dhcp4_props,
-                  GVariant **      dhcp6_props)
+                  GVariant       **dhcp4_props,
+                  GVariant       **dhcp6_props)
 {
-    NMProxyConfig *proxy_config;
-    NMIP4Config *  ip4_config;
-    NMIP6Config *  ip6_config;
-    NMDhcpConfig * dhcp_config;
+    const NML3ConfigData *l3cd;
+    NMDhcpConfig         *dhcp_config;
 
     /* If the action is for a VPN, send the VPN's IP interface instead of the device's */
     g_variant_builder_add(dev_builder,
@@ -329,17 +317,12 @@ fill_device_props(NMDevice *       device,
             g_variant_new_object_path(nm_dbus_object_get_path(NM_DBUS_OBJECT(device))));
     }
 
-    proxy_config = nm_device_get_proxy_config(device);
-    if (proxy_config)
-        dump_proxy_to_props(proxy_config, proxy_builder);
-
-    ip4_config = nm_device_get_ip4_config(device);
-    if (ip4_config)
-        dump_ip_to_props(NM_IP_CONFIG(ip4_config), ip4_builder);
-
-    ip6_config = nm_device_get_ip6_config(device);
-    if (ip6_config)
-        dump_ip_to_props(NM_IP_CONFIG(ip6_config), ip6_builder);
+    l3cd = nm_device_get_l3cd(device, TRUE);
+    if (l3cd) {
+        dump_ip_to_props(l3cd, AF_INET, ip4_builder);
+        dump_ip_to_props(l3cd, AF_INET6, ip6_builder);
+        dump_proxy_to_props(l3cd, proxy_builder);
+    }
 
     dhcp_config = nm_device_get_dhcp_config(device, AF_INET);
     if (dhcp_config)
@@ -351,19 +334,16 @@ fill_device_props(NMDevice *       device,
 }
 
 static void
-fill_vpn_props(NMProxyConfig *  proxy_config,
-               NMIP4Config *    ip4_config,
-               NMIP6Config *    ip6_config,
-               GVariantBuilder *proxy_builder,
-               GVariantBuilder *ip4_builder,
-               GVariantBuilder *ip6_builder)
+fill_vpn_props(const NML3ConfigData *l3cd,
+               GVariantBuilder      *proxy_builder,
+               GVariantBuilder      *ip4_builder,
+               GVariantBuilder      *ip6_builder)
 {
-    if (proxy_config)
-        dump_proxy_to_props(proxy_config, proxy_builder);
-    if (ip4_config)
-        dump_ip_to_props(NM_IP_CONFIG(ip4_config), ip4_builder);
-    if (ip6_config)
-        dump_ip_to_props(NM_IP_CONFIG(ip6_config), ip6_builder);
+    if (l3cd) {
+        dump_ip_to_props(l3cd, AF_INET, ip4_builder);
+        dump_ip_to_props(l3cd, AF_INET6, ip6_builder);
+        dump_proxy_to_props(l3cd, proxy_builder);
+    }
 }
 
 static const char *
@@ -388,10 +368,10 @@ static void
 dispatcher_results_process(guint32     request_id,
                            const char *log_ifname,
                            const char *log_con_uuid,
-                           GVariant *  v_results)
+                           GVariant   *v_results)
 {
     nm_auto_free_variant_iter GVariantIter *results = NULL;
-    const char *                            script, *err;
+    const char                             *script, *err;
     guint32                                 result;
 
     g_variant_get(v_results, "(a(sus))", &results);
@@ -419,9 +399,9 @@ dispatcher_results_process(guint32     request_id,
 static void
 dispatcher_done_cb(GObject *source, GAsyncResult *result, gpointer user_data)
 {
-    gs_unref_variant GVariant *ret = NULL;
-    gs_free_error GError *error    = NULL;
-    NMDispatcherCallId *  call_id  = user_data;
+    gs_unref_variant GVariant *ret     = NULL;
+    gs_free_error GError      *error   = NULL;
+    NMDispatcherCallId        *call_id = user_data;
 
     nm_assert((gpointer) source == gl.dbus_connection);
 
@@ -473,36 +453,34 @@ action_to_string(NMDispatcherAction action)
 static gboolean
 _dispatcher_call(NMDispatcherAction    action,
                  gboolean              blocking,
-                 NMDevice *            device,
+                 NMDevice             *device,
                  NMSettingsConnection *settings_connection,
-                 NMConnection *        applied_connection,
+                 NMConnection         *applied_connection,
                  gboolean              activation_type_external,
                  NMConnectivityState   connectivity_state,
-                 const char *          vpn_iface,
-                 NMProxyConfig *       vpn_proxy_config,
-                 NMIP4Config *         vpn_ip4_config,
-                 NMIP6Config *         vpn_ip6_config,
+                 const char           *vpn_iface,
+                 const NML3ConfigData *l3cd,
                  NMDispatcherFunc      callback,
                  gpointer              user_data,
-                 NMDispatcherCallId ** out_call_id)
+                 NMDispatcherCallId  **out_call_id)
 {
-    GVariant *       connection_dict;
-    GVariantBuilder  connection_props;
-    GVariantBuilder  device_props;
-    GVariantBuilder  device_proxy_props;
-    GVariantBuilder  device_ip4_props;
-    GVariantBuilder  device_ip6_props;
+    GVariant                  *connection_dict;
+    GVariantBuilder            connection_props;
+    GVariantBuilder            device_props;
+    GVariantBuilder            device_proxy_props;
+    GVariantBuilder            device_ip4_props;
+    GVariantBuilder            device_ip6_props;
     gs_unref_variant GVariant *parameters_floating = NULL;
     gs_unref_variant GVariant *device_dhcp4_props  = NULL;
     gs_unref_variant GVariant *device_dhcp6_props  = NULL;
     GVariantBuilder            vpn_proxy_props;
     GVariantBuilder            vpn_ip4_props;
     GVariantBuilder            vpn_ip6_props;
-    NMDispatcherCallId *       call_id;
+    NMDispatcherCallId        *call_id;
     guint                      request_id;
-    const char *               connectivity_state_string = "UNKNOWN";
-    const char *               log_ifname;
-    const char *               log_con_uuid;
+    const char                *connectivity_state_string = "UNKNOWN";
+    const char                *log_ifname;
+    const char                *log_con_uuid;
 
     g_return_val_if_fail(!blocking || (!callback && !user_data), FALSE);
 
@@ -593,13 +571,8 @@ _dispatcher_call(NMDispatcherAction    action,
                           &device_ip6_props,
                           &device_dhcp4_props,
                           &device_dhcp6_props);
-        if (vpn_ip4_config || vpn_ip6_config) {
-            fill_vpn_props(vpn_proxy_config,
-                           vpn_ip4_config,
-                           vpn_ip6_config,
-                           &vpn_proxy_props,
-                           &vpn_ip4_props,
-                           &vpn_ip6_props);
+        if (l3cd) {
+            fill_vpn_props(l3cd, &vpn_proxy_props, &vpn_ip4_props, &vpn_ip6_props);
         }
     }
 
@@ -625,8 +598,8 @@ _dispatcher_call(NMDispatcherAction    action,
 
     /* Send the action to the dispatcher */
     if (blocking) {
-        gs_unref_variant GVariant *ret = NULL;
-        gs_free_error GError *error    = NULL;
+        gs_unref_variant GVariant *ret   = NULL;
+        gs_free_error GError      *error = NULL;
 
         ret = g_dbus_connection_call_sync(gl.dbus_connection,
                                           NM_DISPATCHER_DBUS_SERVICE,
@@ -693,8 +666,6 @@ nm_dispatcher_call_hostname(NMDispatcherFunc     callback,
                             NM_CONNECTIVITY_UNKNOWN,
                             NULL,
                             NULL,
-                            NULL,
-                            NULL,
                             callback,
                             user_data,
                             out_call_id);
@@ -718,8 +689,8 @@ nm_dispatcher_call_hostname(NMDispatcherFunc     callback,
  */
 gboolean
 nm_dispatcher_call_device(NMDispatcherAction   action,
-                          NMDevice *           device,
-                          NMActRequest *       act_request,
+                          NMDevice            *device,
+                          NMActRequest        *act_request,
                           NMDispatcherFunc     callback,
                           gpointer             user_data,
                           NMDispatcherCallId **out_call_id)
@@ -744,8 +715,6 @@ nm_dispatcher_call_device(NMDispatcherAction   action,
         NM_CONNECTIVITY_UNKNOWN,
         NULL,
         NULL,
-        NULL,
-        NULL,
         callback,
         user_data,
         out_call_id);
@@ -765,8 +734,8 @@ nm_dispatcher_call_device(NMDispatcherAction   action,
  */
 gboolean
 nm_dispatcher_call_device_sync(NMDispatcherAction action,
-                               NMDevice *         device,
-                               NMActRequest *     act_request)
+                               NMDevice          *device,
+                               NMActRequest      *act_request)
 {
     nm_assert(NM_IS_DEVICE(device));
     if (!act_request) {
@@ -790,8 +759,6 @@ nm_dispatcher_call_device_sync(NMDispatcherAction action,
         NULL,
         NULL,
         NULL,
-        NULL,
-        NULL,
         NULL);
 }
 
@@ -802,9 +769,7 @@ nm_dispatcher_call_device_sync(NMDispatcherAction action,
  * @applied_connection: the currently applied connection
  * @parent_device: the parent #NMDevice of the VPN connection
  * @vpn_iface: the IP interface of the VPN tunnel, if any
- * @vpn_proxy_config: the #NMProxyConfig of the VPN connection
- * @vpn_ip4_config: the #NMIP4Config of the VPN connection
- * @vpn_ip6_config: the #NMIP6Config of the VPN connection
+ * @vpn_l3cd: the #NML3ConfigData of the VPN connection
  * @callback: a caller-supplied callback to execute when done
  * @user_data: caller-supplied pointer passed to @callback
  * @out_call_id: on success, a call identifier which can be passed to
@@ -818,15 +783,13 @@ nm_dispatcher_call_device_sync(NMDispatcherAction action,
 gboolean
 nm_dispatcher_call_vpn(NMDispatcherAction    action,
                        NMSettingsConnection *settings_connection,
-                       NMConnection *        applied_connection,
-                       NMDevice *            parent_device,
-                       const char *          vpn_iface,
-                       NMProxyConfig *       vpn_proxy_config,
-                       NMIP4Config *         vpn_ip4_config,
-                       NMIP6Config *         vpn_ip6_config,
+                       NMConnection         *applied_connection,
+                       NMDevice             *parent_device,
+                       const char           *vpn_iface,
+                       const NML3ConfigData *l3cd,
                        NMDispatcherFunc      callback,
                        gpointer              user_data,
-                       NMDispatcherCallId ** out_call_id)
+                       NMDispatcherCallId  **out_call_id)
 {
     return _dispatcher_call(action,
                             FALSE,
@@ -836,9 +799,7 @@ nm_dispatcher_call_vpn(NMDispatcherAction    action,
                             FALSE,
                             NM_CONNECTIVITY_UNKNOWN,
                             vpn_iface,
-                            vpn_proxy_config,
-                            vpn_ip4_config,
-                            vpn_ip6_config,
+                            l3cd,
                             callback,
                             user_data,
                             out_call_id);
@@ -851,9 +812,7 @@ nm_dispatcher_call_vpn(NMDispatcherAction    action,
  * @applied_connection: the currently applied connection
  * @parent_device: the parent #NMDevice of the VPN connection
  * @vpn_iface: the IP interface of the VPN tunnel, if any
- * @vpn_proxy_config: the #NMProxyConfig of the VPN connection
- * @vpn_ip4_config: the #NMIP4Config of the VPN connection
- * @vpn_ip6_config: the #NMIP6Config of the VPN connection
+ * @vpn_l3cd: the #NML3ConfigData of the VPN connection
  *
  * This method always invokes the dispatcher action synchronously and it may
  * take a long time to return.
@@ -863,12 +822,10 @@ nm_dispatcher_call_vpn(NMDispatcherAction    action,
 gboolean
 nm_dispatcher_call_vpn_sync(NMDispatcherAction    action,
                             NMSettingsConnection *settings_connection,
-                            NMConnection *        applied_connection,
-                            NMDevice *            parent_device,
-                            const char *          vpn_iface,
-                            NMProxyConfig *       vpn_proxy_config,
-                            NMIP4Config *         vpn_ip4_config,
-                            NMIP6Config *         vpn_ip6_config)
+                            NMConnection         *applied_connection,
+                            NMDevice             *parent_device,
+                            const char           *vpn_iface,
+                            const NML3ConfigData *l3cd)
 {
     return _dispatcher_call(action,
                             TRUE,
@@ -878,9 +835,7 @@ nm_dispatcher_call_vpn_sync(NMDispatcherAction    action,
                             FALSE,
                             NM_CONNECTIVITY_UNKNOWN,
                             vpn_iface,
-                            vpn_proxy_config,
-                            vpn_ip4_config,
-                            vpn_ip6_config,
+                            l3cd,
                             NULL,
                             NULL,
                             NULL);
@@ -913,8 +868,6 @@ nm_dispatcher_call_connectivity(NMConnectivityState  connectivity_state,
                             connectivity_state,
                             NULL,
                             NULL,
-                            NULL,
-                            NULL,
                             callback,
                             user_data,
                             out_call_id);