summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEivind Næss <eivnaes@yahoo.com>2023-03-04 22:26:00 +0000
committerThomas Haller <thaller@redhat.com>2023-04-16 21:05:07 +0200
commit8469c09a5006f9189c9b496ffa4c7e6755d56084 (patch)
tree8f8e829dfdfd94647a9d00bf49d49ecf96c96039
parent0324098afaee6e9e72050b2c8a6fb47803c36494 (diff)
downloadNetworkManager-8469c09a5006f9189c9b496ffa4c7e6755d56084.tar.gz
ppp, adding support for compiling against pppd-2.5.0
This change does the following * Adding in nm-pppd-compat.h to mask details regarding different versions of pppd. * Fix the nm-pppd-plugin.c regarding differences in API between 2.4.9 (current) and latet pppd 2.5.0 in master branch * Additional fixes to the configure.ac to appropriately set defines used for compilation
-rw-r--r--Makefile.am1
-rw-r--r--config.h.meson3
-rw-r--r--configure.ac5
-rw-r--r--meson.build4
-rw-r--r--src/core/ppp/nm-pppd-compat.h122
-rw-r--r--src/core/ppp/nm-pppd-plugin.c45
6 files changed, 157 insertions, 23 deletions
diff --git a/Makefile.am b/Makefile.am
index cd30c7201e..4ff3ce2b26 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3302,6 +3302,7 @@ src_core_ppp_nm_pppd_plugin_la_CPPFLAGS = \
src_core_ppp_nm_pppd_plugin_la_SOURCES = \
src/core/ppp/nm-pppd-plugin.c \
src/core/ppp/nm-pppd-plugin.h \
+ src/core/ppp/nm-pppd-compat.h \
src/core/ppp/nm-ppp-status.h
src_core_ppp_nm_pppd_plugin_la_LDFLAGS = \
diff --git a/config.h.meson b/config.h.meson
index 7337165082..a9fd32475a 100644
--- a/config.h.meson
+++ b/config.h.meson
@@ -236,6 +236,9 @@
/* Define if you have PPP support */
#mesondefine WITH_PPP
+/* Define if you have a more recent version of pppd */
+#mesondefine WITH_PPP_VERSION_2_5_OR_NEWER
+
/* Define to path of pppd binary */
#mesondefine PPPD_PATH
diff --git a/configure.ac b/configure.ac
index 1057b4e933..aa68cdc609 100644
--- a/configure.ac
+++ b/configure.ac
@@ -790,6 +790,11 @@ fi
AC_DEFINE_UNQUOTED(PPPD_PATH, "$PPPD_PATH", [Define to path of pppd binary])
AC_SUBST(PPPD_PATH)
+AC_CHECK_HEADERS(pppd/chap.h)
+if test "x$ac_cv_header_pppd_chap_h" = xyes; then
+ AC_DEFINE(WITH_PPP_VERSION_2_5_OR_NEWER, 1, "Defined if one has a recent version of pppd headers installed")
+fi
+
# ModemManager1 with libmm-glib
AC_ARG_WITH(modem-manager-1,
AS_HELP_STRING([--with-modem-manager-1],
diff --git a/meson.build b/meson.build
index bed0702a1c..b967ccae5a 100644
--- a/meson.build
+++ b/meson.build
@@ -583,6 +583,10 @@ if enable_ppp
if pppd_plugin_dir == ''
pppd_plugin_dir = join_paths(nm_libdir, 'pppd', pppd_version)
endif
+
+ if (pppd_dep.found())
+ config_h.set10('WITH_PPP_VERSION_2_5_OR_NEWER', 1)
+ endif
endif
config_h.set10('WITH_PPP', enable_ppp)
diff --git a/src/core/ppp/nm-pppd-compat.h b/src/core/ppp/nm-pppd-compat.h
new file mode 100644
index 0000000000..08bdedfab9
--- /dev/null
+++ b/src/core/ppp/nm-pppd-compat.h
@@ -0,0 +1,122 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) Eivind Næss, eivnaes@yahoo.com
+ */
+
+#ifndef __NM_PPPD_COMPAT_H__
+#define __NM_PPPD_COMPAT_H__
+
+/* Define INET6 to compile with IPv6 support against older pppd headers,
+ pppd >= 2.5.0 use PPP_WITH_IPV6CP and is defined in pppdconf.h */
+#define INET6 1
+
+/* PPP < 2.5.0 defines and exports VERSION which overlaps with current package VERSION define.
+ this silly macro magic is to work around that. */
+#undef VERSION
+#include <pppd/pppd.h>
+
+#ifndef PPPD_VERSION
+#define PPPD_VERSION VERSION
+#endif
+
+#include <pppd/fsm.h>
+#include <pppd/eui64.h>
+#include <pppd/ipcp.h>
+#include <pppd/ipv6cp.h>
+#include <pppd/upap.h>
+
+#ifdef WITH_PPP_VERSION_2_5_OR_NEWER
+#include <pppd/chap.h>
+#else
+#include <pppd/chap-new.h>
+#include <pppd/chap_ms.h>
+#endif
+
+#ifndef PPP_PROTO_CHAP
+#define PPP_PROTO_CHAP 0xc223
+#endif
+
+#ifndef PPP_PROTO_EAP
+#define PPP_PROTO_EAP 0xc227
+#endif
+
+#ifndef WITH_PPP_VERSION_2_5_OR_NEWER
+
+static inline bool
+debug_on(void)
+{
+ return debug;
+}
+
+static inline const char *
+ppp_ipparam(void)
+{
+ return ipparam;
+}
+
+static inline int
+ppp_ifunit(void)
+{
+ return ifunit;
+}
+
+static inline const char *
+ppp_ifname(void)
+{
+ return ifname;
+}
+
+static inline int
+ppp_get_mtu(int idx)
+{
+ return netif_get_mtu(idx);
+}
+
+static inline void
+ppp_set_ifname(const char *new_name)
+{
+ g_strlcpy(ifname, new_name, IF_NAMESIZE);
+}
+
+typedef enum ppp_notify {
+ NF_PID_CHANGE,
+ NF_PHASE_CHANGE,
+ NF_EXIT,
+ NF_SIGNALED,
+ NF_IP_UP,
+ NF_IP_DOWN,
+ NF_IPV6_UP,
+ NF_IPV6_DOWN,
+ NF_AUTH_UP,
+ NF_LINK_DOWN,
+ NF_FORK,
+ NF_MAX_NOTIFY
+} ppp_notify_t;
+
+typedef void(ppp_notify_fn)(void *ctx, int arg);
+
+static inline void
+ppp_add_notify(ppp_notify_t type, ppp_notify_fn *func, void *ctx)
+{
+ static struct notifier **list[NF_MAX_NOTIFY] = {
+ [NF_PID_CHANGE] = &pidchange,
+ [NF_PHASE_CHANGE] = &phasechange,
+ [NF_EXIT] = &exitnotify,
+ [NF_SIGNALED] = &sigreceived,
+ [NF_IP_UP] = &ip_up_notifier,
+ [NF_IP_DOWN] = &ip_down_notifier,
+ [NF_IPV6_UP] = &ipv6_up_notifier,
+ [NF_IPV6_DOWN] = &ipv6_down_notifier,
+ [NF_AUTH_UP] = &auth_up_notifier,
+ [NF_LINK_DOWN] = &link_down_notifier,
+ [NF_FORK] = &fork_notifier,
+ };
+
+ struct notifier **notify = list[type];
+ if (notify) {
+ add_notifier(notify, func, ctx);
+ }
+}
+
+#endif /* #ifndef WITH_PPP_VERSION_2_5_OR_NEWER */
+#endif /* #ifdef __NM_PPPD_COMPAT_H__ */
diff --git a/src/core/ppp/nm-pppd-plugin.c b/src/core/ppp/nm-pppd-plugin.c
index e2e34d2aaf..59a2dcc94b 100644
--- a/src/core/ppp/nm-pppd-plugin.c
+++ b/src/core/ppp/nm-pppd-plugin.c
@@ -7,29 +7,23 @@
#include <config.h>
#define ___CONFIG_H__
-#include <pppd/pppd.h>
-#include <pppd/fsm.h>
-#include <pppd/ipcp.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <dlfcn.h>
+#include <glib.h>
-#define INET6
-#include <pppd/eui64.h>
-#include <pppd/ipv6cp.h>
+#include "nm-pppd-plugin.h"
+#include "nm-pppd-compat.h"
+#include "nm-ppp-status.h"
#include "libnm-glib-aux/nm-default-glib.h"
-
#include "nm-dbus-interface.h"
-#include "nm-pppd-plugin.h"
-#include "nm-ppp-status.h"
-
int plugin_init(void);
-char pppd_version[] = VERSION;
+char pppd_version[] = PPPD_VERSION;
static struct {
GDBusConnection *dbus_connection;
@@ -125,7 +119,7 @@ nm_phasechange(int arg)
char new_name[IF_NAMESIZE];
int ifindex;
- ifindex = if_nametoindex(ifname);
+ ifindex = if_nametoindex(ppp_ifname());
/* Make a sync call to ensure that when the call
* terminates the interface already has its final
@@ -143,9 +137,11 @@ nm_phasechange(int arg)
NULL);
/* Update the name in pppd if NM changed it */
- if (if_indextoname(ifindex, new_name) && !nm_streq0(ifname, new_name)) {
- g_message("nm-ppp-plugin: interface name changed from '%s' to '%s'", ifname, new_name);
- g_strlcpy(ifname, new_name, IF_NAMESIZE);
+ if (if_indextoname(ifindex, new_name) && !nm_streq0(ppp_ifname(), new_name)) {
+ g_message("nm-ppp-plugin: interface name changed from '%s' to '%s'",
+ ppp_ifname(),
+ new_name);
+ ppp_set_ifname(new_name);
}
}
}
@@ -166,7 +162,7 @@ nm_ip_up(void *data, int arg)
ipcp_options opts = ipcp_gotoptions[0];
ipcp_options peer_opts = ipcp_hisoptions[0];
GVariantBuilder builder;
- guint32 pppd_made_up_address = htonl(0x0a404040 + ifunit);
+ guint32 pppd_made_up_address = htonl(0x0a404040 + ppp_ifunit());
g_return_if_fail(G_IS_DBUS_CONNECTION(gl.dbus_connection));
@@ -186,7 +182,7 @@ nm_ip_up(void *data, int arg)
g_variant_builder_add(&builder,
"{sv}",
NM_PPP_IP4_CONFIG_INTERFACE,
- g_variant_new_string(ifname));
+ g_variant_new_string(ppp_ifname()));
g_variant_builder_add(&builder,
"{sv}",
@@ -292,7 +288,7 @@ nm_ip6_up(void *data, int arg)
g_variant_builder_add(&builder,
"{sv}",
NM_PPP_IP6_CONFIG_INTERFACE,
- g_variant_new_string(ifname));
+ g_variant_new_string(ppp_ifname()));
g_variant_builder_add(&builder, "{sv}", NM_PPP_IP6_CONFIG_OUR_IID, eui64_to_variant(go->ourid));
g_variant_builder_add(&builder,
"{sv}",
@@ -393,6 +389,7 @@ nm_exit_notify(void *data, int arg)
static void
add_ip6_notifier(void)
{
+#if WITH_PPP_VERSION < PPP_VERSION(2, 5, 0)
static struct notifier **notifier = NULL;
static gsize load_once = 0;
@@ -409,6 +406,9 @@ add_ip6_notifier(void)
add_notifier(notifier, nm_ip6_up, NULL);
else
g_message("nm-ppp-plugin: no IPV6CP notifier support; IPv6 not available");
+#else
+ ppp_add_notify(NF_IPV6_UP, nm_ip6_up, NULL);
+#endif
}
int
@@ -427,17 +427,16 @@ plugin_init(void)
return -1;
}
- gl.ipparam = g_strdup(ipparam);
+ gl.ipparam = g_strdup(ppp_ipparam());
chap_passwd_hook = get_credentials;
chap_check_hook = get_chap_check;
pap_passwd_hook = get_credentials;
pap_check_hook = get_pap_check;
- add_notifier(&phasechange, nm_phasechange_hook, NULL);
- add_notifier(&ip_up_notifier, nm_ip_up, NULL);
- add_notifier(&exitnotify, nm_exit_notify, NULL);
+ ppp_add_notify(NF_PHASE_CHANGE, nm_phasechange_hook, NULL);
+ ppp_add_notify(NF_IP_UP, nm_ip_up, NULL);
+ ppp_add_notify(NF_EXIT, nm_exit_notify, NULL);
add_ip6_notifier();
-
return 0;
}