summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2016-11-03 18:38:27 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2016-12-06 11:08:11 +0100
commit025235e00fda3daa826570a4a12df679a821f4b6 (patch)
tree37c950116bb647a32c235cc8be77b2b8ea9ba54a
parent2e21d78494cc5507479ebc8f920c81140e76c040 (diff)
downloadNetworkManager-025235e00fda3daa826570a4a12df679a821f4b6.tar.gz
ppp: split ppp manager into a plugin
Moving the PPP manager to a separate plugin that is loaded when needed has the advantage of slightly reducing memory footprint and makes it possible to install the PPP support only where needed. https://bugzilla.gnome.org/show_bug.cgi?id=773482
-rw-r--r--Makefile.am36
-rw-r--r--libnm-core/nm-errors.h3
-rw-r--r--src/NetworkManager.ver-orig35
-rw-r--r--src/devices/adsl/nm-device-adsl.c14
-rw-r--r--src/devices/nm-device-ethernet.c16
-rw-r--r--src/devices/wwan/nm-modem.c19
-rw-r--r--src/nm-core-utils.c1
-rw-r--r--src/ppp/nm-ppp-manager-call.c142
-rw-r--r--src/ppp/nm-ppp-manager-call.h43
-rw-r--r--src/ppp/nm-ppp-manager.c82
-rw-r--r--src/ppp/nm-ppp-manager.h36
-rw-r--r--src/ppp/nm-ppp-plugin-api.h46
-rw-r--r--src/ppp/nm-ppp-plugin.ver6
-rw-r--r--src/ppp/nm-ppp-status.h8
-rwxr-xr-xtools/create-exports-NetworkManager.sh4
15 files changed, 408 insertions, 83 deletions
diff --git a/Makefile.am b/Makefile.am
index e207d373f9..1daf7287dd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -989,7 +989,6 @@ src_cppflags = \
\
-DDHCLIENT_PATH=\"$(DHCLIENT_PATH)\" \
-DDHCPCD_PATH=\"$(DHCPCD_PATH)\" \
- -DPPPD_PLUGIN_DIR=\"$(PPPD_PLUGIN_DIR)\" \
\
$(GUDEV_CFLAGS) \
$(LIBNL_CFLAGS) \
@@ -1318,7 +1317,8 @@ src_libNetworkManager_la_SOURCES = \
src/dnsmasq/nm-dnsmasq-utils.c \
src/dnsmasq/nm-dnsmasq-utils.h \
\
- src/ppp/nm-ppp-manager.c \
+ src/ppp/nm-ppp-manager-call.c \
+ src/ppp/nm-ppp-manager-call.h \
src/ppp/nm-ppp-manager.h \
src/ppp/nm-ppp-status.h \
\
@@ -1566,6 +1566,7 @@ EXTRA_DIST += \
if WITH_PPP
pppd_plugin_LTLIBRARIES += src/ppp/nm-pppd-plugin.la
+pkglib_LTLIBRARIES += src/ppp/libnm-ppp-plugin.la
src_ppp_nm_pppd_plugin_la_CPPFLAGS = \
-I$(srcdir)/shared \
@@ -1589,6 +1590,36 @@ src_ppp_nm_pppd_plugin_la_LIBADD = \
$(GLIB_LIBS) \
$(DL_LIBS)
+src_ppp_libnm_ppp_plugin_la_SOURCES = \
+ src/ppp/nm-pppd-plugin.h \
+ src/ppp/nm-ppp-manager.c \
+ src/ppp/nm-ppp-manager.h \
+ src/ppp/nm-ppp-plugin-api.h \
+ src/ppp/nm-ppp-status.h
+
+EXTRA_src_ppp_libnm_ppp_plugin_la_DEPENDENCIES = \
+ src/ppp/nm-ppp-plugin.ver
+
+src_ppp_libnm_ppp_plugin_la_CPPFLAGS = \
+ -I${top_srcdir}/src \
+ -I${top_builddir}/src \
+ -I${top_srcdir}/shared \
+ -I$(top_builddir)/shared \
+ -I${top_builddir}/libnm-core \
+ -I${top_srcdir}/libnm-core \
+ -DPPPD_PLUGIN_DIR=\"$(PPPD_PLUGIN_DIR)\" \
+ -DG_LOG_DOMAIN=\""NetworkManager"\" \
+ -DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_INSIDE_DAEMON \
+ $(GLIB_CFLAGS)
+
+src_ppp_libnm_ppp_plugin_la_LDFLAGS = \
+ -module -avoid-version \
+ -Wl,--version-script="$(top_srcdir)/src/ppp/nm-ppp-plugin.ver"
+
+src_ppp_libnm_ppp_plugin_la_LIBADD = \
+ introspection/libnmdbus.la \
+ $(GLIB_LIBS)
+
endif
###############################################################################
@@ -4067,6 +4098,7 @@ EXTRA_DIST += \
linker-script-binary.ver \
linker-script-devices.ver \
linker-script-settings.ver \
+ src/ppp/nm-ppp-plugin.ver \
Makefile.glib \
autogen.sh \
valgrind.suppressions \
diff --git a/libnm-core/nm-errors.h b/libnm-core/nm-errors.h
index 2a572f4e35..35f7dc2f34 100644
--- a/libnm-core/nm-errors.h
+++ b/libnm-core/nm-errors.h
@@ -186,6 +186,8 @@ GQuark nm_device_error_quark (void);
* @NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL: Unknown log level in SetLogging
* @NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN: Unknown log domain in SetLogging
* @NM_MANAGER_ERROR_INVALID_ARGUMENTS: Invalid arguments for D-Bus request
+ * @NM_MANAGER_ERROR_MISSING_PLUGIN: A plug-in was needed to complete the
+ * activation but is not available.
*
* Errors related to the main "network management" interface of NetworkManager.
* These may be returned from #NMClient methods that invoke D-Bus operations on
@@ -206,6 +208,7 @@ typedef enum {
NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL, /*< nick=UnknownLogLevel >*/
NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN, /*< nick=UnknownLogDomain >*/
NM_MANAGER_ERROR_INVALID_ARGUMENTS, /*< nick=InvalidArguments >*/
+ NM_MANAGER_ERROR_MISSING_PLUGIN, /*< nick=MissingPlugin >*/
} NMManagerError;
GQuark nm_manager_error_quark (void);
diff --git a/src/NetworkManager.ver-orig b/src/NetworkManager.ver-orig
index 5b62f41b08..b377620c72 100644
--- a/src/NetworkManager.ver-orig
+++ b/src/NetworkManager.ver-orig
@@ -5,7 +5,6 @@ global:
_nm_dbus_error_has_name;
_nm_dbus_proxy_call_finish;
_nm_dbus_signal_connect_data;
- _nm_exported_object_clear_and_unexport;
_nm_log_impl;
_nm_logging_enabled_state;
_nm_platform_error_to_string;
@@ -21,6 +20,7 @@ global:
nm_act_request_get_secrets;
nm_act_request_get_settings_connection;
nm_act_request_get_type;
+ nm_active_connection_clear_secrets;
nm_active_connection_get_specific_object;
nm_active_connection_get_type;
nm_active_connection_set_specific_object;
@@ -39,12 +39,14 @@ global:
nm_connection_get_id;
nm_connection_get_interface_name;
nm_connection_get_path;
+ nm_connection_get_setting;
nm_connection_get_setting_802_1x;
nm_connection_get_setting_adsl;
nm_connection_get_setting_bluetooth;
nm_connection_get_setting_bond;
nm_connection_get_setting_bridge;
nm_connection_get_setting_bridge_port;
+ nm_connection_get_setting_by_name;
nm_connection_get_setting_cdma;
nm_connection_get_setting_connection;
nm_connection_get_setting_dcb;
@@ -144,6 +146,7 @@ global:
nm_ip4_config_add_address;
nm_ip4_config_add_nameserver;
nm_ip4_config_add_route;
+ nm_ip4_config_add_wins;
nm_ip4_config_get_address;
nm_ip4_config_get_nameserver;
nm_ip4_config_get_num_nameservers;
@@ -169,8 +172,14 @@ global:
nm_ip_route_get_prefix;
nm_ip_route_new;
nm_ip_route_unref;
+ nm_manager_error_quark;
nm_manager_get;
nm_manager_get_devices;
+ nm_manager_ppp_create;
+ nm_manager_ppp_start;
+ nm_manager_ppp_stop_async;
+ nm_manager_ppp_stop_finish;
+ nm_manager_ppp_stop_sync;
nm_manager_set_capability;
nm_platform_address_flush;
nm_platform_get;
@@ -198,10 +207,6 @@ global:
nm_platform_wifi_indicate_addressing_running;
nm_platform_wifi_set_mode;
nm_platform_wifi_set_powersave;
- nm_ppp_manager_new;
- nm_ppp_manager_start;
- nm_ppp_manager_stop;
- nm_ppp_manager_stop_finish;
nm_route_manager_get;
nm_route_manager_route_flush;
nm_setting_802_1x_add_eap_method;
@@ -257,6 +262,7 @@ global:
nm_setting_802_1x_set_phase2_private_key;
nm_setting_802_1x_set_private_key;
nm_setting_adsl_get_encapsulation;
+ nm_setting_adsl_get_password;
nm_setting_adsl_get_protocol;
nm_setting_adsl_get_type;
nm_setting_adsl_get_username;
@@ -286,6 +292,7 @@ global:
nm_setting_bridge_port_new;
nm_setting_cdma_get_number;
nm_setting_cdma_get_password;
+ nm_setting_cdma_get_type;
nm_setting_cdma_get_username;
nm_setting_cdma_new;
nm_setting_connection_add_permission;
@@ -333,6 +340,7 @@ global:
nm_setting_dcb_set_priority_group_id;
nm_setting_dcb_set_priority_strict_bandwidth;
nm_setting_dcb_set_priority_traffic_class;
+ nm_setting_duplicate;
nm_setting_generic_new;
nm_setting_get_secret_flags;
nm_setting_get_type;
@@ -345,6 +353,7 @@ global:
nm_setting_gsm_get_pin;
nm_setting_gsm_get_sim_id;
nm_setting_gsm_get_sim_operator_id;
+ nm_setting_gsm_get_type;
nm_setting_gsm_get_username;
nm_setting_infiniband_get_mac_address;
nm_setting_infiniband_get_mtu;
@@ -397,14 +406,28 @@ global:
nm_setting_olpc_mesh_get_dhcp_anycast_address;
nm_setting_olpc_mesh_get_ssid;
nm_setting_olpc_mesh_new;
+ nm_setting_ppp_get_baud;
+ nm_setting_ppp_get_crtscts;
+ nm_setting_ppp_get_lcp_echo_failure;
+ nm_setting_ppp_get_lcp_echo_interval;
+ nm_setting_ppp_get_mppe_stateful;
+ nm_setting_ppp_get_mru;
+ nm_setting_ppp_get_mtu;
+ nm_setting_ppp_get_no_vj_comp;
nm_setting_ppp_get_noauth;
+ nm_setting_ppp_get_nobsdcomp;
+ nm_setting_ppp_get_nodeflate;
nm_setting_ppp_get_refuse_chap;
nm_setting_ppp_get_refuse_eap;
nm_setting_ppp_get_refuse_mschap;
nm_setting_ppp_get_refuse_mschapv2;
nm_setting_ppp_get_refuse_pap;
+ nm_setting_ppp_get_require_mppe;
+ nm_setting_ppp_get_require_mppe_128;
+ nm_setting_ppp_get_type;
nm_setting_ppp_new;
nm_setting_pppoe_get_password;
+ nm_setting_pppoe_get_service;
nm_setting_pppoe_get_type;
nm_setting_pppoe_get_username;
nm_setting_pppoe_new;
@@ -542,9 +565,11 @@ global:
nm_utils_ip4_netmask_to_prefix;
nm_utils_ip4_prefix_to_netmask;
nm_utils_ipaddr_valid;
+ nm_utils_ipv6_interface_identifier_get_from_addr;
nm_utils_is_empty_ssid;
nm_utils_is_json_object;
nm_utils_kill_child_async;
+ nm_utils_modprobe;
nm_utils_monotonic_timestamp_as_boottime;
nm_utils_rsa_key_encrypt;
nm_utils_same_ssid;
diff --git a/src/devices/adsl/nm-device-adsl.c b/src/devices/adsl/nm-device-adsl.c
index 8783589ebf..6cf808e687 100644
--- a/src/devices/adsl/nm-device-adsl.c
+++ b/src/devices/adsl/nm-device-adsl.c
@@ -34,7 +34,7 @@
#include "devices/nm-device-private.h"
#include "platform/nm-platform.h"
-#include "ppp/nm-ppp-manager.h"
+#include "ppp/nm-ppp-manager-call.h"
#include "ppp/nm-ppp-status.h"
#include "nm-setting-adsl.h"
#include "nm-utils.h"
@@ -477,8 +477,11 @@ act_stage3_ip4_config_start (NMDevice *device,
_LOGD (LOGD_ADSL, "starting PPPoA");
}
- priv->ppp_manager = nm_ppp_manager_new (ppp_iface);
- if (nm_ppp_manager_start (priv->ppp_manager, req, nm_setting_adsl_get_username (s_adsl), 30, 0, &err)) {
+ priv->ppp_manager = nm_ppp_manager_create (ppp_iface, &err);
+ if ( priv->ppp_manager
+ && nm_ppp_manager_start (priv->ppp_manager, req,
+ nm_setting_adsl_get_username (s_adsl),
+ 30, 0, &err)) {
g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_STATE_CHANGED,
G_CALLBACK (ppp_state_changed),
self);
@@ -490,7 +493,7 @@ act_stage3_ip4_config_start (NMDevice *device,
_LOGW (LOGD_ADSL, "PPP failed to start: %s", err->message);
g_error_free (err);
- nm_exported_object_clear_and_unexport (&priv->ppp_manager);
+ g_clear_object (&priv->ppp_manager);
*reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED;
}
@@ -506,7 +509,8 @@ adsl_cleanup (NMDeviceAdsl *self)
if (priv->ppp_manager) {
g_signal_handlers_disconnect_by_func (priv->ppp_manager, G_CALLBACK (ppp_state_changed), self);
g_signal_handlers_disconnect_by_func (priv->ppp_manager, G_CALLBACK (ppp_ip4_config), self);
- nm_exported_object_clear_and_unexport (&priv->ppp_manager);
+ nm_ppp_manager_stop_sync (priv->ppp_manager);
+ g_clear_object (&priv->ppp_manager);
}
g_signal_handlers_disconnect_by_func (NM_PLATFORM_GET, G_CALLBACK (link_changed_cb), self);
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c
index d617e10735..43084d49b9 100644
--- a/src/devices/nm-device-ethernet.c
+++ b/src/devices/nm-device-ethernet.c
@@ -39,6 +39,7 @@
#include "supplicant/nm-supplicant-interface.h"
#include "supplicant/nm-supplicant-config.h"
#include "ppp/nm-ppp-manager.h"
+#include "ppp/nm-ppp-manager-call.h"
#include "ppp/nm-ppp-status.h"
#include "platform/nm-platform.h"
#include "platform/nm-platform-utils.h"
@@ -1011,8 +1012,12 @@ pppoe_stage3_ip4_config_start (NMDeviceEthernet *self, NMDeviceStateReason *reas
s_pppoe = (NMSettingPppoe *) nm_device_get_applied_setting ((NMDevice *) self, NM_TYPE_SETTING_PPPOE);
g_assert (s_pppoe);
- priv->ppp_manager = nm_ppp_manager_new (nm_device_get_iface (NM_DEVICE (self)));
- if (nm_ppp_manager_start (priv->ppp_manager, req, nm_setting_pppoe_get_username (s_pppoe), 30, 0, &err)) {
+ priv->ppp_manager = nm_ppp_manager_create (nm_device_get_iface (NM_DEVICE (self)),
+ &err);
+ if ( priv->ppp_manager
+ && nm_ppp_manager_start (priv->ppp_manager, req,
+ nm_setting_pppoe_get_username (s_pppoe),
+ 30, 0, &err)) {
g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_STATE_CHANGED,
G_CALLBACK (ppp_state_changed),
self);
@@ -1024,7 +1029,7 @@ pppoe_stage3_ip4_config_start (NMDeviceEthernet *self, NMDeviceStateReason *reas
_LOGW (LOGD_DEVICE, "PPPoE failed to start: %s", err->message);
g_error_free (err);
- nm_exported_object_clear_and_unexport (&priv->ppp_manager);
+ g_clear_object (&priv->ppp_manager);
*reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED;
}
@@ -1389,7 +1394,10 @@ deactivate (NMDevice *device)
priv->pending_ip4_config = NULL;
}
- nm_exported_object_clear_and_unexport (&priv->ppp_manager);
+ if (priv->ppp_manager) {
+ nm_ppp_manager_stop_sync (priv->ppp_manager);
+ g_clear_object (&priv->ppp_manager);
+ }
supplicant_interface_release (self);
diff --git a/src/devices/wwan/nm-modem.c b/src/devices/wwan/nm-modem.c
index 6c137c0cd1..df71017745 100644
--- a/src/devices/wwan/nm-modem.c
+++ b/src/devices/wwan/nm-modem.c
@@ -36,6 +36,7 @@
#include "nm-act-request.h"
#include "nm-ip4-config.h"
#include "nm-ip6-config.h"
+#include "ppp/nm-ppp-manager-call.h"
#include "ppp/nm-ppp-status.h"
/*****************************************************************************/
@@ -558,8 +559,10 @@ ppp_stage3_ip_config_start (NMModem *self,
if (port_speed_is_zero (priv->data_port))
baud_override = 57600;
- priv->ppp_manager = nm_ppp_manager_new (priv->data_port);
- if (nm_ppp_manager_start (priv->ppp_manager, req, ppp_name, ip_timeout, baud_override, &error)) {
+ priv->ppp_manager = nm_ppp_manager_create (priv->data_port, &error);
+ if ( priv->ppp_manager
+ && nm_ppp_manager_start (priv->ppp_manager, req, ppp_name,
+ ip_timeout, baud_override, &error)) {
g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_STATE_CHANGED,
G_CALLBACK (ppp_state_changed),
self);
@@ -580,7 +583,7 @@ ppp_stage3_ip_config_start (NMModem *self,
error->message);
g_error_free (error);
- nm_exported_object_clear_and_unexport (&priv->ppp_manager);
+ g_clear_object (&priv->ppp_manager);
*reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED;
ret = NM_ACT_STAGE_RETURN_FAILURE;
@@ -1000,7 +1003,7 @@ deactivate_cleanup (NMModem *self, NMDevice *device)
priv->in_bytes = priv->out_bytes = 0;
- nm_exported_object_clear_and_unexport (&priv->ppp_manager);
+ g_clear_object (&priv->ppp_manager);
if (device) {
g_return_if_fail (NM_IS_DEVICE (device));
@@ -1136,10 +1139,10 @@ deactivate_step (DeactivateContext *ctx)
case DEACTIVATE_CONTEXT_STEP_PPP_MANAGER_STOP:
/* If we have a PPP manager, stop it */
if (ctx->ppp_manager) {
- nm_ppp_manager_stop (ctx->ppp_manager,
- ctx->cancellable,
- (GAsyncReadyCallback) ppp_manager_stop_ready,
- ctx);
+ nm_ppp_manager_stop_async (ctx->ppp_manager,
+ ctx->cancellable,
+ (GAsyncReadyCallback) ppp_manager_stop_ready,
+ ctx);
return;
}
ctx->step++;
diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c
index 2927acd375..a0067aafc1 100644
--- a/src/nm-core-utils.c
+++ b/src/nm-core-utils.c
@@ -3904,3 +3904,4 @@ skip:
g_array_free (paths, TRUE);
return result;
}
+
diff --git a/src/ppp/nm-ppp-manager-call.c b/src/ppp/nm-ppp-manager-call.c
new file mode 100644
index 0000000000..d67c0a99ce
--- /dev/null
+++ b/src/ppp/nm-ppp-manager-call.c
@@ -0,0 +1,142 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2016 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+
+#include "nm-ppp-manager-call.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#include "nm-manager.h"
+#include "nm-core-utils.h"
+#include "nm-ppp-plugin-api.h"
+
+#define PPP_PLUGIN_PATH NMPLUGINDIR "/libnm-ppp-plugin.so"
+
+/*****************************************************************************/
+
+static NMPPPOps *ppp_ops = NULL;
+
+NMPPPManager *
+nm_ppp_manager_create (const char *iface, GError **error)
+{
+ NMPPPManager *ret;
+ GModule *plugin;
+ GError *error_local = NULL;
+ NMPPPOps *ops;
+ struct stat st;
+ int errsv;
+
+ if (G_UNLIKELY (!ppp_ops)) {
+ if (stat (PPP_PLUGIN_PATH, &st) != 0) {
+ errsv = errno;
+ g_set_error_literal (error,
+ NM_MANAGER_ERROR, NM_MANAGER_ERROR_MISSING_PLUGIN,
+ "the PPP plugin " PPP_PLUGIN_PATH " is not installed");
+ return NULL;
+ }
+
+ if (!nm_utils_validate_plugin (PPP_PLUGIN_PATH, &st, &error_local)) {
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_MISSING_PLUGIN,
+ "could not load the PPP plugin " PPP_PLUGIN_PATH ": %s",
+ error_local->message);
+ g_clear_error (&error_local);
+ return NULL;
+ }
+
+ plugin = g_module_open (PPP_PLUGIN_PATH, G_MODULE_BIND_LOCAL);
+ if (!plugin) {
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_MISSING_PLUGIN,
+ "could not load the PPP plugin " PPP_PLUGIN_PATH ": %s",
+ g_module_error ());
+ return NULL;
+ }
+
+ if (!g_module_symbol (plugin, "ppp_ops", (gpointer) &ops)) {
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_MISSING_PLUGIN,
+ "error loading the PPP plugin: %s", g_module_error ());
+ return NULL;
+ }
+
+ /* after loading glib types from the plugin, we cannot unload the library anymore.
+ * Make it resident. */
+ g_module_make_resident (plugin);
+
+ nm_assert (ops);
+ nm_assert (ops->create);
+ nm_assert (ops->start);
+ nm_assert (ops->stop_async);
+ nm_assert (ops->stop_finish);
+ nm_assert (ops->stop_sync);
+
+ ppp_ops = ops;
+
+ nm_log_info (LOGD_CORE | LOGD_PPP, "loaded PPP plugin " PPP_PLUGIN_PATH);
+ }
+
+ ret = ppp_ops->create (iface);
+ g_return_val_if_fail (ret, NULL);
+ return ret;
+}
+
+gboolean
+nm_ppp_manager_start (NMPPPManager *self,
+ NMActRequest *req,
+ const char *ppp_name,
+ guint32 timeout_secs,
+ guint baud_override,
+ GError **err)
+{
+ g_return_val_if_fail (ppp_ops, FALSE);
+
+ return ppp_ops->start (self, req, ppp_name, timeout_secs, baud_override, err);
+}
+
+void
+nm_ppp_manager_stop_async (NMPPPManager *self,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_return_if_fail (ppp_ops);
+
+ ppp_ops->stop_async (self, cancellable, callback, user_data);
+}
+
+gboolean
+nm_ppp_manager_stop_finish (NMPPPManager *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ g_return_val_if_fail (ppp_ops, FALSE);
+
+ return ppp_ops->stop_finish (self, res, error);
+}
+
+void
+nm_ppp_manager_stop_sync (NMPPPManager *self)
+{
+ g_return_if_fail (ppp_ops);
+
+ ppp_ops->stop_sync (self);
+}
+
diff --git a/src/ppp/nm-ppp-manager-call.h b/src/ppp/nm-ppp-manager-call.h
new file mode 100644
index 0000000000..f21005f0fd
--- /dev/null
+++ b/src/ppp/nm-ppp-manager-call.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2016 Red Hat, Inc.
+ */
+
+#ifndef __NM_PPP_MANAGER_CALL_H__
+#define __NM_PPP_MANAGER_CALL_H__
+
+#include "nm-ppp-manager.h"
+
+NMPPPManager * nm_ppp_manager_create (const char *iface,
+ GError **error);
+gboolean nm_ppp_manager_start (NMPPPManager *self,
+ NMActRequest *req,
+ const char *ppp_name,
+ guint32 timeout_secs,
+ guint baud_override,
+ GError **error);
+void nm_ppp_manager_stop_async (NMPPPManager *self,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean nm_ppp_manager_stop_finish (NMPPPManager *self,
+ GAsyncResult *res,
+ GError **error);
+void nm_ppp_manager_stop_sync (NMPPPManager *self);
+
+#endif /* __NM_PPP_MANAGER_CALL_H__ */
diff --git a/src/ppp/nm-ppp-manager.c b/src/ppp/nm-ppp-manager.c
index bee757d373..c8d43299d9 100644
--- a/src/ppp/nm-ppp-manager.c
+++ b/src/ppp/nm-ppp-manager.c
@@ -49,7 +49,9 @@
#include "nm-act-request.h"
#include "nm-ip4-config.h"
#include "nm-ip6-config.h"
+
#include "nm-pppd-plugin.h"
+#include "nm-ppp-plugin-api.h"
#include "nm-ppp-status.h"
#include "introspection/org.freedesktop.NetworkManager.PPP.h"
@@ -59,6 +61,17 @@
/*****************************************************************************/
+#define NM_TYPE_PPP_MANAGER (nm_ppp_manager_get_type ())
+#define NM_PPP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PPP_MANAGER, NMPPPManager))
+#define NM_PPP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_PPP_MANAGER, NMPPPManagerClass))
+#define NM_IS_PPP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_PPP_MANAGER))
+#define NM_IS_PPP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_PPP_MANAGER))
+#define NM_PPP_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_PPP_MANAGER, NMPPPManagerClass))
+
+GType nm_ppp_manager_get_type (void);
+
+/*****************************************************************************/
+
enum {
STATE_CHANGED,
IP4_CONFIG,
@@ -98,9 +111,9 @@ struct _NMPPPManager {
NMPPPManagerPrivate _priv;
};
-struct _NMPPPManagerClass {
+typedef struct {
NMExportedObjectClass parent;
-};
+} NMPPPManagerClass;
G_DEFINE_TYPE (NMPPPManager, nm_ppp_manager, NM_TYPE_EXPORTED_OBJECT)
@@ -887,13 +900,13 @@ pppoe_fill_defaults (NMSettingPpp *setting)
#endif
}
-gboolean
-nm_ppp_manager_start (NMPPPManager *manager,
- NMActRequest *req,
- const char *ppp_name,
- guint32 timeout_secs,
- guint baud_override,
- GError **err)
+static gboolean
+_ppp_manager_start (NMPPPManager *manager,
+ NMActRequest *req,
+ const char *ppp_name,
+ guint32 timeout_secs,
+ guint baud_override,
+ GError **err)
{
NMPPPManagerPrivate *priv;
NMConnection *connection;
@@ -919,6 +932,8 @@ nm_ppp_manager_start (NMPPPManager *manager,
return FALSE;
#endif
+ nm_exported_object_export (NM_EXPORTED_OBJECT (manager));
+
priv->pid = 0;
/* Make sure /dev/ppp exists (bgo #533064) */
@@ -976,6 +991,9 @@ out:
if (ppp_cmd)
nm_cmd_line_destroy (ppp_cmd);
+ if (priv->pid <= 0)
+ nm_exported_object_unexport (NM_EXPORTED_OBJECT (manager));
+
return priv->pid > 0;
}
@@ -1050,10 +1068,10 @@ stop_context_complete_if_cancelled (StopContext *ctx)
return FALSE;
}
-gboolean
-nm_ppp_manager_stop_finish (NMPPPManager *manager,
- GAsyncResult *res,
- GError **error)
+static gboolean
+_ppp_manager_stop_finish (NMPPPManager *manager,
+ GAsyncResult *res,
+ GError **error)
{
return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
}
@@ -1069,21 +1087,23 @@ kill_child_ready (pid_t pid,
stop_context_complete (ctx);
}
-void
-nm_ppp_manager_stop (NMPPPManager *manager,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+static void
+_ppp_manager_stop_async (NMPPPManager *manager,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager);
StopContext *ctx;
+ nm_exported_object_unexport (NM_EXPORTED_OBJECT (manager));
+
ctx = g_slice_new0 (StopContext);
ctx->manager = g_object_ref (manager);
ctx->result = g_simple_async_result_new (G_OBJECT (manager),
callback,
user_data,
- nm_ppp_manager_stop);
+ _ppp_manager_stop_async);
/* Setup cancellable */
ctx->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
@@ -1110,6 +1130,18 @@ nm_ppp_manager_stop (NMPPPManager *manager,
priv->pid = 0;
}
+static void
+_ppp_manager_stop_sync (NMPPPManager *manager)
+{
+ NMExportedObject *exported = NM_EXPORTED_OBJECT (manager);
+
+ if (nm_exported_object_is_exported (exported))
+ nm_exported_object_unexport (exported);
+
+ _ppp_cleanup (manager);
+ _ppp_kill (manager);
+}
+
/*****************************************************************************/
static void
@@ -1153,8 +1185,8 @@ nm_ppp_manager_init (NMPPPManager *manager)
NM_PPP_MANAGER_GET_PRIVATE (manager)->monitor_fd = -1;
}
-NMPPPManager *
-nm_ppp_manager_new (const char *iface)
+static NMPPPManager *
+_ppp_manager_new (const char *iface)
{
g_return_val_if_fail (iface != NULL, NULL);
@@ -1200,7 +1232,6 @@ nm_ppp_manager_class_init (NMPPPManagerClass *manager_class)
object_class->set_property = set_property;
exported_object_class->export_path = NM_DBUS_PATH "/PPP/%u";
- exported_object_class->export_on_construction = TRUE;
obj_properties[PROP_PARENT_IFACE] =
g_param_spec_string (NM_PPP_MANAGER_PARENT_IFACE, "", "",
@@ -1255,3 +1286,10 @@ nm_ppp_manager_class_init (NMPPPManagerClass *manager_class)
NULL);
}
+NMPPPOps ppp_ops = {
+ .create = _ppp_manager_new,
+ .start = _ppp_manager_start,
+ .stop_async = _ppp_manager_stop_async,
+ .stop_finish = _ppp_manager_stop_finish,
+ .stop_sync = _ppp_manager_stop_sync,
+};
diff --git a/src/ppp/nm-ppp-manager.h b/src/ppp/nm-ppp-manager.h
index 12748176a3..a86fe26ae5 100644
--- a/src/ppp/nm-ppp-manager.h
+++ b/src/ppp/nm-ppp-manager.h
@@ -16,43 +16,15 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Copyright (C) 2008 Novell, Inc.
- * Copyright (C) 2008 - 2010 Red Hat, Inc.
+ * Copyright (C) 2008 - 2016 Red Hat, Inc.
*/
-#ifndef __NETWORKMANAGER_PPP_MANAGER_H__
-#define __NETWORKMANAGER_PPP_MANAGER_H__
-
-#define NM_TYPE_PPP_MANAGER (nm_ppp_manager_get_type ())
-#define NM_PPP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PPP_MANAGER, NMPPPManager))
-#define NM_PPP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_PPP_MANAGER, NMPPPManagerClass))
-#define NM_IS_PPP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_PPP_MANAGER))
-#define NM_IS_PPP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_PPP_MANAGER))
-#define NM_PPP_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_PPP_MANAGER, NMPPPManagerClass))
+#ifndef __NM_PPP_MANAGER_H__
+#define __NM_PPP_MANAGER_H__
#define NM_PPP_MANAGER_PARENT_IFACE "parent-iface"
-
#define NM_PPP_MANAGER_STATE_CHANGED "state-changed"
typedef struct _NMPPPManager NMPPPManager;
-typedef struct _NMPPPManagerClass NMPPPManagerClass;
-
-GType nm_ppp_manager_get_type (void);
-
-NMPPPManager *nm_ppp_manager_new (const char *iface);
-
-gboolean nm_ppp_manager_start (NMPPPManager *manager,
- NMActRequest *req,
- const char *ppp_name,
- guint32 timeout_secs,
- guint baud_override,
- GError **err);
-
-void nm_ppp_manager_stop (NMPPPManager *manager,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-gboolean nm_ppp_manager_stop_finish (NMPPPManager *manager,
- GAsyncResult *res,
- GError **error);
-#endif /* __NETWORKMANAGER_PPP_MANAGER_H__ */
+#endif /* __NM_PPP_MANAGER_H__ */
diff --git a/src/ppp/nm-ppp-plugin-api.h b/src/ppp/nm-ppp-plugin-api.h
new file mode 100644
index 0000000000..0a38fe0551
--- /dev/null
+++ b/src/ppp/nm-ppp-plugin-api.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2016 Red Hat, Inc.
+ */
+
+#ifndef __NM_PPP_PLUGIN_API_H__
+#define __NM_PPP_PLUGIN_API_H__
+
+typedef const struct {
+ NMPPPManager *(*create) (const char *iface);
+
+ gboolean (*start) (NMPPPManager *manager,
+ NMActRequest *req,
+ const char *ppp_name,
+ guint32 timeout_secs,
+ guint baud_override,
+ GError **err);
+
+ void (*stop_async) (NMPPPManager *manager,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+ gboolean (*stop_finish) (NMPPPManager *manager,
+ GAsyncResult *res,
+ GError **error);
+
+ void (*stop_sync) (NMPPPManager *manager);
+} NMPPPOps;
+
+#endif /* __NM_PPP_PLUGIN_API_H__ */
diff --git a/src/ppp/nm-ppp-plugin.ver b/src/ppp/nm-ppp-plugin.ver
new file mode 100644
index 0000000000..fee5578753
--- /dev/null
+++ b/src/ppp/nm-ppp-plugin.ver
@@ -0,0 +1,6 @@
+{
+global:
+ ppp_ops;
+local:
+ *;
+};
diff --git a/src/ppp/nm-ppp-status.h b/src/ppp/nm-ppp-status.h
index 391b5aa986..d785cc2cc6 100644
--- a/src/ppp/nm-ppp-status.h
+++ b/src/ppp/nm-ppp-status.h
@@ -16,11 +16,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Copyright (C) 2008 Novell, Inc.
- * Copyright (C) 2008 Red Hat, Inc.
+ * Copyright (C) 2008-2016 Red Hat, Inc.
*/
-#ifndef __NETWORKMANAGER_PPP_STATUS_H__
-#define __NETWORKMANAGER_PPP_STATUS_H__
+#ifndef __NM_PPP_STATUS_H__
+#define __NM_PPP_STATUS_H__
typedef enum {
NM_PPP_STATUS_UNKNOWN,
@@ -40,4 +40,4 @@ typedef enum {
NM_PPP_STATUS_MASTER
} NMPPPStatus;
-#endif /* __NETWORKMANAGER_PPP_STATUS_H__ */
+#endif /* __NM_PPP_STATUS_H__ */
diff --git a/tools/create-exports-NetworkManager.sh b/tools/create-exports-NetworkManager.sh
index dc0dc03625..c53d7cb5b9 100755
--- a/tools/create-exports-NetworkManager.sh
+++ b/tools/create-exports-NetworkManager.sh
@@ -46,7 +46,9 @@ EOF
}
get_symbols_missing() {
- (for f in ./src/settings/plugins/*/.libs/*.so ./src/devices/*/.libs/*.so; do
+ (for f in ./src/settings/plugins/*/.libs/*.so \
+ ./src/devices/*/.libs/*.so \
+ ./src/ppp/.libs/libnm-ppp-plugin.so; do
call_nm "$f" |
sed -n 's/^\([U]\) \(\(nm_\|nmp_\|_nm\|NM\|_NM\).*\)$/\2/p'
done) |