summaryrefslogtreecommitdiffstats
path: root/meta/recipes-connectivity/connman/connman/0001-vpn-Adding-support-for-latest-pppd-2.5.0-release.patch
blob: 83343fdda50b2d73622ccb0cbac0d5a672d26055 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
From 5f373f373f5baccc282dce257b7b16c8bb4a82c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eivind=20N=C3=A6ss?= <eivnaes@yahoo.com>
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 <Martin.Jansa@gmail.com>
---
 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 <pppd/pppd.h>
+
+#ifndef PPPD_VERSION
+#define PPPD_VERSION VERSION
+#endif
+
+#include <pppd/fsm.h>
+#include <pppd/ccp.h>
+#include <pppd/eui64.h>
+#include <pppd/ipcp.h>
+#include <pppd/ipv6cp.h>
+#include <pppd/eap.h>
+#include <pppd/upap.h>
+
+#ifdef HAVE_PPPD_CHAP_H
+#include <pppd/chap.h>
+#endif
+
+#ifdef HAVE_PPPD_CHAP_NEW_H
+#include <pppd/chap-new.h>
+#endif
+
+#ifdef HAVE_PPPD_CHAP_MS_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
+
+
+#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 <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <pppd/pppd.h>
-#include <pppd/fsm.h>
-#include <pppd/ipcp.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
 #include <dbus/dbus.h>
 
+#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;
 }