From 5f373f373f5baccc282dce257b7b16c8bb4a82c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eivind=20N=C3=A6ss?= Date: Sat, 25 Mar 2023 20:51:52 +0000 Subject: [PATCH] vpn: Adding support for latest pppd 2.5.0 release The API has gone through a significant overhaul, and this change fixes any compile issues. 1) Fixes to configure.ac itself 2) Cleanup in pppd plugin itself Adding a libppp-compat.h file to mask for any differences in the version. Upstream-Status: Backport [https://git.kernel.org/pub/scm/network/connman/connman.git/commit/?id=a48864a2e5d2a725dfc6eef567108bc13b43857f] Signed-off-by: Martin Jansa --- configure.ac | 42 ++++++++----- scripts/libppp-compat.h | 127 ++++++++++++++++++++++++++++++++++++++++ scripts/libppp-plugin.c | 15 +++-- 3 files changed, 161 insertions(+), 23 deletions(-) create mode 100644 scripts/libppp-compat.h diff --git a/configure.ac b/configure.ac index a573cef..f34bb38 100644 --- a/configure.ac +++ b/configure.ac @@ -135,14 +135,6 @@ AC_ARG_ENABLE(l2tp, AC_HELP_STRING([--enable-l2tp], [enable l2tp support]), [enable_l2tp=${enableval}], [enable_l2tp="no"]) if (test "${enable_l2tp}" != "no"); then - if (test -z "${path_pppd}"); then - AC_PATH_PROG(PPPD, [pppd], [/usr/sbin/pppd], $PATH:/sbin:/usr/sbin) - else - PPPD="${path_pppd}" - AC_SUBST(PPPD) - fi - AC_CHECK_HEADERS(pppd/pppd.h, dummy=yes, - AC_MSG_ERROR(ppp header files are required)) if (test -z "${path_l2tp}"); then AC_PATH_PROG(L2TP, [xl2tpd], [/usr/sbin/xl2tpd], $PATH:/sbin:/usr/sbin) else @@ -160,6 +152,18 @@ AC_ARG_ENABLE(pptp, AC_HELP_STRING([--enable-pptp], [enable pptp support]), [enable_pptp=${enableval}], [enable_pptp="no"]) if (test "${enable_pptp}" != "no"); then + if (test -z "${path_pptp}"); then + AC_PATH_PROG(PPTP, [pptp], [/usr/sbin/pptp], $PATH:/sbin:/usr/sbin) + else + PPTP="${path_pptp}" + AC_SUBST(PPTP) + fi +fi +AM_CONDITIONAL(PPTP, test "${enable_pptp}" != "no") +AM_CONDITIONAL(PPTP_BUILTIN, test "${enable_pptp}" = "builtin") + +if (test "${enable_pptp}" != "no" || test "${enable_l2tp}" != "no"); then + if (test -z "${path_pppd}"); then AC_PATH_PROG(PPPD, [pppd], [/usr/sbin/pppd], $PATH:/sbin:/usr/sbin) else @@ -168,15 +172,23 @@ if (test "${enable_pptp}" != "no"); then fi AC_CHECK_HEADERS(pppd/pppd.h, dummy=yes, AC_MSG_ERROR(ppp header files are required)) - if (test -z "${path_pptp}"); then - AC_PATH_PROG(PPTP, [pptp], [/usr/sbin/pptp], $PATH:/sbin:/usr/sbin) - else - PPTP="${path_pptp}" - AC_SUBST(PPTP) + AC_CHECK_HEADERS([pppd/chap.h pppd/chap-new.h pppd/chap_ms.h]) + + PKG_CHECK_EXISTS([pppd], + [AS_VAR_SET([pppd_pkgconfig_support],[yes])]) + + PPPD_VERSION=2.4.9 + if test x"$pppd_pkgconfig_support" = xyes; then + PPPD_VERSION=`$PKG_CONFIG --modversion pppd` fi + + AC_DEFINE_UNQUOTED([PPP_VERSION(x,y,z)], + [((x & 0xFF) << 16 | (y & 0xFF) << 8 | (z & 0xFF) << 0)], + [Macro to help determine the particular version of pppd]) + PPP_VERSION=$(echo $PPPD_VERSION | sed -e "s/\./\,/g") + AC_DEFINE_UNQUOTED(WITH_PPP_VERSION, PPP_VERSION($PPP_VERSION), + [The real version of pppd represented as an int]) fi -AM_CONDITIONAL(PPTP, test "${enable_pptp}" != "no") -AM_CONDITIONAL(PPTP_BUILTIN, test "${enable_pptp}" = "builtin") AC_CHECK_HEADERS(resolv.h, dummy=yes, AC_MSG_ERROR(resolver header files are required)) diff --git a/scripts/libppp-compat.h b/scripts/libppp-compat.h new file mode 100644 index 0000000..eee1d09 --- /dev/null +++ b/scripts/libppp-compat.h @@ -0,0 +1,127 @@ +/* Copyright (C) Eivind Naess, eivnaes@yahoo.com */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#ifndef __LIBPPP_COMPAT_H__ +#define __LIBPPP_COMPAT_H__ + +/* Define USE_EAPTLS compile with EAP TLS support against older pppd headers, + * pppd >= 2.5.0 use PPP_WITH_EAPTLS and is defined in pppdconf.h */ +#define USE_EAPTLS 1 + +/* 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 + +#ifndef PPPD_VERSION +#define PPPD_VERSION VERSION +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_PPPD_CHAP_H +#include +#endif + +#ifdef HAVE_PPPD_CHAP_NEW_H +#include +#endif + +#ifdef HAVE_PPPD_CHAP_MS_H +#include +#endif + +#ifndef PPP_PROTO_CHAP +#define PPP_PROTO_CHAP 0xc223 +#endif + +#ifndef PPP_PROTO_EAP +#define PPP_PROTO_EAP 0xc227 +#endif + + +#if WITH_PPP_VERSION < PPP_VERSION(2,5,0) + +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); +} + +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) +{ + 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 /* #if WITH_PPP_VERSION < PPP_VERSION(2,5,0) */ +#endif /* #if__LIBPPP_COMPAT_H__ */ diff --git a/scripts/libppp-plugin.c b/scripts/libppp-plugin.c index 0dd8b47..61641b5 100644 --- a/scripts/libppp-plugin.c +++ b/scripts/libppp-plugin.c @@ -29,14 +29,13 @@ #include #include #include -#include -#include -#include #include #include #include +#include "libppp-compat.h" + #define INET_ADDRES_LEN (INET_ADDRSTRLEN + 5) #define INET_DNS_LEN (2*INET_ADDRSTRLEN + 9) @@ -47,7 +46,7 @@ static char *path; static DBusConnection *connection; static int prev_phase; -char pppd_version[] = VERSION; +char pppd_version[] = PPPD_VERSION; int plugin_init(void); @@ -170,7 +169,7 @@ static void ppp_up(void *data, int arg) DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); - append(&dict, "INTERNAL_IFNAME", ifname); + append(&dict, "INTERNAL_IFNAME", ppp_ifname()); inet_ntop(AF_INET, &ipcp_gotoptions[0].ouraddr, buf, INET_ADDRSTRLEN); append(&dict, "INTERNAL_IP4_ADDRESS", buf); @@ -309,9 +308,9 @@ int plugin_init(void) chap_check_hook = ppp_have_secret; pap_check_hook = ppp_have_secret; - add_notifier(&ip_up_notifier, ppp_up, NULL); - add_notifier(&phasechange, ppp_phase_change, NULL); - add_notifier(&exitnotify, ppp_exit, connection); + ppp_add_notify(NF_IP_UP, ppp_up, NULL); + ppp_add_notify(NF_PHASE_CHANGE, ppp_phase_change, NULL); + ppp_add_notify(NF_EXIT, ppp_exit, connection); return 0; }