Modify

Opened 20 months ago

Last modified 20 months ago

#22661 new defect

broken /include/pppd/pppd.h affects compilation for some network apps

Reported by: hojuruku Owned by: developers
Priority: high Milestone: Designated Driver (Trunk)
Component: base system Version: Trunk
Keywords: pppd headers ppp_defs.h pppd.h Cc: nbd@…

Description

On my latest trunk build:
staging_dir/target-mips_24kc_musl-1.1.14/usr/include/pppd/pppd.h
has
#include net/ppp_defs.h
that doesn't exist in musl and breaks some apps like rp-pppoe server (unsupported - patching in progress) as well as others.

pppd.h:57:26: fatal error: net/ppp_defs.h: No such file or directory
compilation terminated.

I compared it to linux/ppp_defs.h and the net/pppd source version that wasn't installed.
/build_dir/target-mips_24kc_musl-1.1.14/ppp-default/ppp-2.4.7/include/net/ppp_defs.h
There isn't a lot of different to the musl packaged pppd_defs.h

A Chinese fork of openwrt just came to the same conclusion, patch the include/pppd.h to include linux/ppp_defs.h instead as there isn't a lot of difference.
https://github.com/miao1007/Openwrt-NetKeeper/issues/79

已解决……
将 pppd.h 中第57行 #include <net/ppp_defs.h> 改为 #include <linux/ppp_defs.h> 即可

The patch for this is too small to bother contributing it :)

diff -Nau ./build_dir/target-mips_24kc_musl-1.1.14/ppp-default/ppp-2.4.7/include/net/ppp_defs.h ./staging_dir/toolchain-mips_24kc_gcc-5.3.0_musl-1.1.14/include/linux/ppp_defs.h
--- ./build_dir/target-mips_24kc_musl-1.1.14/ppp-default/ppp-2.4.7/include/net/ppp_defs.h	2014-08-09 19:31:39.000000000 +0700
+++ ./staging_dir/toolchain-mips_24kc_gcc-5.3.0_musl-1.1.14/include/linux/ppp_defs.h	2016-06-24 00:37:32.000000000 +0700
@@ -1,39 +1,13 @@
-/*	$Id: ppp_defs.h,v 1.17 2002/12/06 09:49:15 paulus Exp $	*/
-
 /*
  * ppp_defs.h - PPP definitions.
  *
- * Copyright (c) 1984 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
+ * Copyright 1994-2000 Paul Mackerras.
  *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  version 2 as published by the Free Software Foundation.
  */
+#include <linux/types.h>
 
 #ifndef _PPP_DEFS_H_
 #define _PPP_DEFS_H_
@@ -43,25 +17,11 @@
  */
 #define PPP_HDRLEN	4	/* octets for standard ppp header */
 #define PPP_FCSLEN	2	/* octets for FCS */
-
-/*
- * Packet sizes
- *
- * Note - lcp shouldn't be allowed to negotiate stuff outside these
- *	  limits.  See lcp.h in the pppd directory.
- * (XXX - these constants should simply be shared by lcp.c instead
- *	  of living in lcp.h)
- */
-#define	PPP_MTU		1500	/* Default MTU (size of Info field) */
-#define PPP_MAXMTU	65535 - (PPP_HDRLEN + PPP_FCSLEN)
-#define PPP_MINMTU	64
 #define PPP_MRU		1500	/* default MRU = max length of info field */
-#define PPP_MAXMRU	65000	/* Largest MRU we allow */
-#define PPP_MINMRU	128
 
-#define PPP_ADDRESS(p)	(((u_char *)(p))[0])
-#define PPP_CONTROL(p)	(((u_char *)(p))[1])
-#define PPP_PROTOCOL(p)	((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3])
+#define PPP_ADDRESS(p)	(((__u8 *)(p))[0])
+#define PPP_CONTROL(p)	(((__u8 *)(p))[1])
+#define PPP_PROTOCOL(p)	((((__u8 *)(p))[2] << 8) + ((__u8 *)(p))[3])
 
 /*
  * Significant octet values.
@@ -80,46 +40,38 @@
 #define PPP_IPX		0x2b	/* IPX protocol */
 #define	PPP_VJC_COMP	0x2d	/* VJ compressed TCP */
 #define	PPP_VJC_UNCOMP	0x2f	/* VJ uncompressed TCP */
+#define PPP_MP		0x3d	/* Multilink protocol */
 #define PPP_IPV6	0x57	/* Internet Protocol Version 6 */
+#define PPP_COMPFRAG	0xfb	/* fragment compressed below bundle */
 #define PPP_COMP	0xfd	/* compressed packet */
+#define PPP_MPLS_UC	0x0281	/* Multi Protocol Label Switching - Unicast */
+#define PPP_MPLS_MC	0x0283	/* Multi Protocol Label Switching - Multicast */
 #define PPP_IPCP	0x8021	/* IP Control Protocol */
 #define PPP_ATCP	0x8029	/* AppleTalk Control Protocol */
 #define PPP_IPXCP	0x802b	/* IPX Control Protocol */
 #define PPP_IPV6CP	0x8057	/* IPv6 Control Protocol */
+#define PPP_CCPFRAG	0x80fb	/* CCP at link level (below MP bundle) */
 #define PPP_CCP		0x80fd	/* Compression Control Protocol */
-#define PPP_ECP		0x8053	/* Encryption Control Protocol */
+#define PPP_MPLSCP	0x80fd	/* MPLS Control Protocol */
 #define PPP_LCP		0xc021	/* Link Control Protocol */
 #define PPP_PAP		0xc023	/* Password Authentication Protocol */
 #define PPP_LQR		0xc025	/* Link Quality Report protocol */
 #define PPP_CHAP	0xc223	/* Cryptographic Handshake Auth. Protocol */
 #define PPP_CBCP	0xc029	/* Callback Control Protocol */
-#define PPP_EAP		0xc227	/* Extensible Authentication Protocol */
 
 /*
  * Values for FCS calculations.
  */
+
 #define PPP_INITFCS	0xffff	/* Initial FCS value */
 #define PPP_GOODFCS	0xf0b8	/* Good final FCS value */
-#define PPP_FCS(fcs, c)	(((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
 
-/*
- * A 32-bit unsigned integral type.
- */
-
-#if !defined(__BIT_TYPES_DEFINED__) && !defined(_BITYPES) \
- && !defined(__FreeBSD__) && (NS_TARGET < 40)
-#ifdef	UINT32_T
-typedef UINT32_T	u_int32_t;
-#else
-typedef unsigned int	u_int32_t;
-typedef unsigned short  u_int16_t;
-#endif
-#endif
 
 /*
  * Extended asyncmap - allows any character to be escaped.
  */
-typedef u_int32_t	ext_accm[8];
+
+typedef __u32		ext_accm[8];
 
 /*
  * What to do with network protocol (NP) packets.
@@ -132,46 +84,58 @@
 };
 
 /*
- * Statistics.
+ * Statistics for LQRP and pppstats
  */
 struct pppstat	{
-    unsigned int ppp_ibytes;	/* bytes received */
-    unsigned int ppp_ipackets;	/* packets received */
-    unsigned int ppp_ierrors;	/* receive errors */
-    unsigned int ppp_obytes;	/* bytes sent */
-    unsigned int ppp_opackets;	/* packets sent */
-    unsigned int ppp_oerrors;	/* transmit errors */
+    __u32	ppp_discards;	/* # frames discarded */
+
+    __u32	ppp_ibytes;	/* bytes received */
+    __u32	ppp_ioctects;	/* bytes received not in error */
+    __u32	ppp_ipackets;	/* packets received */
+    __u32	ppp_ierrors;	/* receive errors */
+    __u32	ppp_ilqrs;	/* # LQR frames received */
+
+    __u32	ppp_obytes;	/* raw bytes sent */
+    __u32	ppp_ooctects;	/* frame bytes sent */
+    __u32	ppp_opackets;	/* packets sent */
+    __u32	ppp_oerrors;	/* transmit errors */ 
+    __u32	ppp_olqrs;	/* # LQR frames sent */
 };
 
 struct vjstat {
-    unsigned int vjs_packets;	/* outbound packets */
-    unsigned int vjs_compressed; /* outbound compressed packets */
-    unsigned int vjs_searches;	/* searches for connection state */
-    unsigned int vjs_misses;	/* times couldn't find conn. state */
-    unsigned int vjs_uncompressedin; /* inbound uncompressed packets */
-    unsigned int vjs_compressedin; /* inbound compressed packets */
-    unsigned int vjs_errorin;	/* inbound unknown type packets */
-    unsigned int vjs_tossed;	/* inbound packets tossed because of error */
+    __u32	vjs_packets;	/* outbound packets */
+    __u32	vjs_compressed;	/* outbound compressed packets */
+    __u32	vjs_searches;	/* searches for connection state */
+    __u32	vjs_misses;	/* times couldn't find conn. state */
+    __u32	vjs_uncompressedin; /* inbound uncompressed packets */
+    __u32	vjs_compressedin;   /* inbound compressed packets */
+    __u32	vjs_errorin;	/* inbound unknown type packets */
+    __u32	vjs_tossed;	/* inbound packets tossed because of error */
 };
 
-struct ppp_stats {
-    struct pppstat p;		/* basic PPP statistics */
-    struct vjstat vj;		/* VJ header compression statistics */
+struct compstat {
+    __u32	unc_bytes;	/* total uncompressed bytes */
+    __u32	unc_packets;	/* total uncompressed packets */
+    __u32	comp_bytes;	/* compressed bytes */
+    __u32	comp_packets;	/* compressed packets */
+    __u32	inc_bytes;	/* incompressible bytes */
+    __u32	inc_packets;	/* incompressible packets */
+
+    /* the compression ratio is defined as in_count / bytes_out */
+    __u32       in_count;	/* Bytes received */
+    __u32       bytes_out;	/* Bytes transmitted */
+
+    double	ratio;		/* not computed in kernel. */
 };
 
-struct compstat {
-    unsigned int unc_bytes;	/* total uncompressed bytes */
-    unsigned int unc_packets;	/* total uncompressed packets */
-    unsigned int comp_bytes;	/* compressed bytes */
-    unsigned int comp_packets;	/* compressed packets */
-    unsigned int inc_bytes;	/* incompressible bytes */
-    unsigned int inc_packets;	/* incompressible packets */
-    unsigned int ratio;		/* recent compression ratio << 8 */
+struct ppp_stats {
+    struct pppstat	p;	/* basic PPP statistics */
+    struct vjstat	vj;	/* VJ header compression statistics */
 };
 
 struct ppp_comp_stats {
-    struct compstat c;		/* packet compression statistics */
-    struct compstat d;		/* packet decompression statistics */
+    struct compstat	c;	/* packet compression statistics */
+    struct compstat	d;	/* packet decompression statistics */
 };
 
 /*
@@ -179,16 +143,8 @@
  * the last NP packet was sent or received.
  */
 struct ppp_idle {
-    time_t xmit_idle;		/* time since last NP packet sent */
-    time_t recv_idle;		/* time since last NP packet received */
+    __kernel_time_t xmit_idle;	/* time since last NP packet sent */
+    __kernel_time_t recv_idle;	/* time since last NP packet received */
 };
 
-#ifndef __P
-#ifdef __STDC__
-#define __P(x)	x
-#else
-#define __P(x)	()
-#endif
-#endif
-
 #endif /* _PPP_DEFS_H_ */

Attachments (3)

273-uapi-ppp_defs.h-for_pppd_header.patch (2.3 KB) - added by hojuruku 20 months ago.
target/linux/generic/patches-4.1/273-uapi-ppp_defs.h-for_pppd_header.patch (v2)
406-use_linux_ppp_defs_h.patch (712 bytes) - added by hojuruku 20 months ago.
deleted patch - we need to use net/ppp_defs.h
273-uapi-ppp_defs.h-add-eap-ecp.patch (314 bytes) - added by hojuruku 20 months ago.
this patch file was replaced 273-xxx renamed

Download all attachments as: .zip

Change History (7)

comment:1 Changed 20 months ago by hojuruku

Attached a Linux Kernel 4.1 include patch & One pppd patch. you may need to up-port to 4.4 before committing.

If you change the header bundled with pppd you have to fix pppd compile breakage as it needs to ppp_defs.h defines for EAP.
Patches attached to make pppd use linux's ppp_defs.h
This is because net/ppp_defs.h isn't found in musl builds.

An example of broken by this is rp-pppoe (unmaintained)

https://dev.openwrt.org/ticket/21350#comment:4

comment:2 Changed 20 months ago by hojuruku

Patch still work in progress....
Ooops got to get the new ppp_defs.h to be loaded by pppd/main.c
also there is an old version of linux/ppp_defs.h loaded in by -I../include
This file needs to be loaded up by the Makefile.
staging_dir/toolchain-mips_24kc_gcc-5.3.0_musl-1.1.14/include/linux/ppp_defs.h

make[5]: Entering directory '/mnt/staging3/openwrt/build_dir/target-mips_24kc_musl-1.1.14/ppp-default/ppp-2.4.7/pppd'
mips-openwrt-linux-musl-gcc -Os -pipe -mno-branch-likely -mips32r2 -mtune=24kc -fno-caller-saves -fno-plt -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result -msoft-float -mips16 -minterlink-mips16 -iremap /mnt/staging3/openwrt/build_dir/target-mips_24kc_musl-1.1.14/ppp-default/ppp-2.4.7:ppp-2.4.7 -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro -DHAVE_PATHS_H -DHAVE_MMAP -I../include '-DDESTDIR="/usr"' -DCHAPMS=1 -DMPPE=1 -DHAS_SHADOW -DHAVE_CRYPT_H=1 -DUSE_CRYPT=1 -DPLUGIN -DPPP_FILTER -DPPP_PRECOMPILED_FILTER -I/mnt/staging3/openwrt/staging_dir/target-mips_24kc_musl-1.1.14/usr/include -DINET6=1 -DMAXOCTETS   -c -o main.o main.c
main.c: In function 'get_input':
main.c:1116:15: error: 'PPP_EAP' undeclared (first use in this function)
   protocol == PPP_EAP)) {

Changed 20 months ago by hojuruku

target/linux/generic/patches-4.1/273-uapi-ppp_defs.h-for_pppd_header.patch (v2)

comment:3 Changed 20 months ago by hojuruku

Did I screw up? I did like the Chinese....

I'll try to patch patch pppd's include/net/pppd_defs.h instead of modify kernel and pppd make it install this header.

I'm not a kernel developer. Kernel headers and have different typedefs.

Changed 20 months ago by hojuruku

deleted patch - we need to use net/ppp_defs.h

Changed 20 months ago by hojuruku

this patch file was replaced 273-xxx renamed

comment:4 Changed 20 months ago by hojuruku

https://github.com/openwrt/openwrt/pull/15

"I gave up trying to patch the source to update the include/linux & include/net headers for now
My patch broke pppd plugins. net/ppp_defs.h is needed to build any project that includes pppd.h"

Don't use the patch files here, they don't work. I might have another crack at it later if necessary to build rp-pppoe.
That Makefile patch will install the bundled pppd bundled net/ppp_defs.h into the staging_dir

Add Comment

Modify Ticket

Action
as new .
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.