diff options
author | Eivind Næss <eivnaes@yahoo.com> | 2023-03-04 22:26:00 +0000 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2023-04-16 21:05:07 +0200 |
commit | 8469c09a5006f9189c9b496ffa4c7e6755d56084 (patch) | |
tree | 8f8e829dfdfd94647a9d00bf49d49ecf96c96039 | |
parent | 0324098afaee6e9e72050b2c8a6fb47803c36494 (diff) | |
download | NetworkManager-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.am | 1 | ||||
-rw-r--r-- | config.h.meson | 3 | ||||
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | meson.build | 4 | ||||
-rw-r--r-- | src/core/ppp/nm-pppd-compat.h | 122 | ||||
-rw-r--r-- | src/core/ppp/nm-pppd-plugin.c | 45 |
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; } |