On 7/14/20 10:08 AM, Mark Deneen wrote: > pppd is patched in most Linux distributions to allow arbitrary naming > of ppp interfaces, allowing users to create consistent firewall rules > rather than having interfaces named "ppp0", "ppp1", etc. Yocto is > missing this option. > > This patch, originally from SUSE, adds this option to pppd. It is not > included upstream because there are some pppd-supported platforms which > lack the ability to rename interfaces. >
are you aware of any of these platforms being supported by OE ? > This is the same as the previous patch, but I messed up the subject line. > > Upstream-Status: Inappropriate [not all platforms supported by pppd can > rename interfaces] > > Signed-off-by: Mark Deneen <mden...@saucontech.com> > --- > .../ppp/ppp/0002-pppd-add-ifname-option.patch | 214 ++++++++++++++++++ > meta/recipes-connectivity/ppp/ppp_2.4.8.bb | 1 + > 2 files changed, 215 insertions(+) > create mode 100644 > meta/recipes-connectivity/ppp/ppp/0002-pppd-add-ifname-option.patch > > diff --git > a/meta/recipes-connectivity/ppp/ppp/0002-pppd-add-ifname-option.patch > b/meta/recipes-connectivity/ppp/ppp/0002-pppd-add-ifname-option.patch > new file mode 100644 > index 0000000000..8e54024d15 > --- /dev/null > +++ b/meta/recipes-connectivity/ppp/ppp/0002-pppd-add-ifname-option.patch > @@ -0,0 +1,214 @@ > +From bbcdc4366bbee6c3f4e1ddda31e4eec8c1b3ccc2 Mon Sep 17 00:00:00 2001 > +From: Paul Mackerras <pau...@samba.org> > +Date: Tue, 23 Aug 2016 16:10:21 +1000 > +Subject: [PATCH 13/16] pppd: allow use of arbitrary interface names > + > +This is a modified version of a patch from openSUSE that enables PPP > interfaces > +to be called arbitrary names, rather than simply pppX where X is the unit > +number. > + > +The modifications from the stock openSUSE patch are: > +- refresh patch on top of 018_ip-up_option.diff > +- fix a printf format-string vulnerability in pppd/main.c:set_ifunit() > +- clarify the pppd.8 manpage additions > +- patch pppstats/pppstats.c to query renamed interfaces without complaint > + > +Origin: SUSE > +Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=458646 > +Forwarded: no > +Reviewed-by: Chris Boot <bo...@debian.org> > +Signed-off-by: Paul Mackerras <pau...@ozlabs.org> > +--- > + pppd/main.c | 16 ++++++---------- > + pppd/options.c | 5 +++++ > + pppd/pppd.8 | 8 +++++++- > + pppd/pppd.h | 11 +++++++++++ > + pppd/sys-linux.c | 15 +++++++++++++++ > + pppstats/pppstats.c | 12 ++++++------ > + 6 files changed, 50 insertions(+), 17 deletions(-) > + > +diff --git a/pppd/main.c b/pppd/main.c > +index 6d50d1bac1d9..f1986ed68d0b 100644 > +--- a/pppd/main.c > ++++ b/pppd/main.c > +@@ -124,7 +124,7 @@ > + static const char rcsid[] = RCSID; > + > + /* interface vars */ > +-char ifname[32]; /* Interface name */ > ++char ifname[MAXIFNAMELEN]; /* Interface name */ > + int ifunit; /* Interface unit number */ > + > + struct channel *the_channel; > +@@ -298,13 +298,6 @@ struct protent *protocols[] = { > + NULL > + }; > + > +-/* > +- * If PPP_DRV_NAME is not defined, use the default "ppp" as the device name. > +- */ > +-#if !defined(PPP_DRV_NAME) > +-#define PPP_DRV_NAME "ppp" > +-#endif /* !defined(PPP_DRV_NAME) */ > +- > + int > + main(argc, argv) > + int argc; > +@@ -737,8 +730,11 @@ void > + set_ifunit(iskey) > + int iskey; > + { > +- info("Using interface %s%d", PPP_DRV_NAME, ifunit); > +- slprintf(ifname, sizeof(ifname), "%s%d", PPP_DRV_NAME, ifunit); > ++ if (req_ifname[0] != '\0') > ++ slprintf(ifname, sizeof(ifname), "%s", req_ifname); > ++ else > ++ slprintf(ifname, sizeof(ifname), "%s%d", PPP_DRV_NAME, ifunit); > ++ info("Using interface %s", ifname); > + script_setenv("IFNAME", ifname, iskey); > + if (iskey) { > + create_pidfile(getpid()); /* write pid to file */ > +diff --git a/pppd/options.c b/pppd/options.c > +index c06a2b4ad8ed..177488ca6813 100644 > +--- a/pppd/options.c > ++++ b/pppd/options.c > +@@ -114,6 +114,7 @@ char linkname[MAXPATHLEN]; /* logical name for > link */ > + bool tune_kernel; /* may alter kernel settings */ > + int connect_delay = 1000; /* wait this many ms after connect script */ > + int req_unit = -1; /* requested interface unit */ > ++char req_ifname[MAXIFNAMELEN]; /* requested interface name */ > + bool multilink = 0; /* Enable multilink operation */ > + char *bundle_name = NULL; /* bundle name for multilink */ > + bool dump_options; /* print out option values */ > +@@ -284,6 +285,10 @@ option_t general_options[] = { > + "PPP interface unit number to use if possible", > + OPT_PRIO | OPT_LLIMIT, 0, 0 }, > + > ++ { "ifname", o_string, req_ifname, > ++ "Set PPP interface name", > ++ OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXIFNAMELEN }, > ++ > + { "dump", o_bool, &dump_options, > + "Print out option values after parsing all options", 1 }, > + { "dryrun", o_bool, &dryrun, > +diff --git a/pppd/pppd.8 b/pppd/pppd.8 > +index c508d277df3a..06e945fce998 100644 > +--- a/pppd/pppd.8 > ++++ b/pppd/pppd.8 > +@@ -1079,7 +1079,13 @@ under Linux and FreeBSD 2.2.8 and later. > + .TP > + .B unit \fInum > + Sets the ppp unit number (for a ppp0 or ppp1 etc interface name) for > outbound > +-connections. > ++connections. If the unit is already in use a dynamically allocated number > will > ++be used. > ++.TP > ++.B ifname \fIstring > ++Set the ppp interface name for outbound connections. If the interface name > is > ++already in use, or if the name cannot be used for any other reason, pppd > will > ++terminate. > + .TP > + .B unset \fIname > + Remove a variable from the environment variable for scripts that are > +diff --git a/pppd/pppd.h b/pppd/pppd.h > +index 247fa153739b..1a1bf0b99582 100644 > +--- a/pppd/pppd.h > ++++ b/pppd/pppd.h > +@@ -80,6 +80,16 @@ > + #define MAXARGS 1 /* max # args to a command */ > + #define MAXNAMELEN 256 /* max length of hostname or name for auth */ > + #define MAXSECRETLEN 256 /* max length of password or secret */ > ++#define MAXIFNAMELEN 32 /* max length of interface name; or use > IFNAMSIZ, can we > ++ always include net/if.h? */ > ++ > ++/* > ++ * If PPP_DRV_NAME is not defined, use the default "ppp" as the device name. > ++ * Where should PPP_DRV_NAME come from? Do we include it here? > ++ */ > ++#if !defined(PPP_DRV_NAME) > ++#define PPP_DRV_NAME "ppp" > ++#endif /* !defined(PPP_DRV_NAME) */ > + > + /* > + * Option descriptor structure. > +@@ -318,6 +328,7 @@ extern bool tune_kernel; /* May alter kernel > settings as necessary */ > + extern int connect_delay; /* Time to delay after connect script */ > + extern int max_data_rate; /* max bytes/sec through charshunt */ > + extern int req_unit; /* interface unit number to use */ > ++extern char req_ifname[MAXIFNAMELEN]; /* interface name to use */ > + extern bool multilink; /* enable multilink operation */ > + extern bool noendpoint; /* don't send or accept endpt. discrim. */ > + extern char *bundle_name; /* bundle name for multilink */ > +diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c > +index b4a435d2a993..b832031f7e26 100644 > +--- a/pppd/sys-linux.c > ++++ b/pppd/sys-linux.c > +@@ -643,6 +643,21 @@ static int make_ppp_unit() > + } > + if (x < 0) > + error("Couldn't create new ppp unit: %m"); > ++ > ++ if (x == 0 && req_ifname[0] != '\0') { > ++ struct ifreq ifr; > ++ char t[MAXIFNAMELEN]; > ++ memset(&ifr, 0, sizeof(struct ifreq)); > ++ slprintf(t, sizeof(t), "%s%d", PPP_DRV_NAME, ifunit); > ++ strncpy(ifr.ifr_name, t, IF_NAMESIZE); > ++ strncpy(ifr.ifr_newname, req_ifname, IF_NAMESIZE); > ++ x = ioctl(sock_fd, SIOCSIFNAME, &ifr); > ++ if (x < 0) > ++ error("Couldn't rename interface %s to %s: %m", t, > req_ifname); > ++ else > ++ info("Renamed interface %s to %s", t, req_ifname); > ++ } > ++ > + return x; > + } > + > +diff --git a/pppstats/pppstats.c b/pppstats/pppstats.c > +index 6367988eb96b..46cb9c24942b 100644 > +--- a/pppstats/pppstats.c > ++++ b/pppstats/pppstats.c > +@@ -88,7 +88,6 @@ int aflag; /* print absolute > values, not deltas */ > + int dflag; /* print data rates, not bytes */ > + int interval, count; > + int infinite; > +-int unit; > + int s; /* socket or /dev/ppp file descriptor */ > + int signalled; /* set if alarm goes off "early" */ > + char *progname; > +@@ -449,6 +448,7 @@ main(argc, argv) > + { > + int c; > + #ifdef STREAMS > ++ int unit; > + char *dev; > + #endif > + > +@@ -506,11 +506,6 @@ main(argc, argv) > + if (argc > 0) > + interface = argv[0]; > + > +- if (sscanf(interface, PPP_DRV_NAME "%d", &unit) != 1) { > +- fprintf(stderr, "%s: invalid interface '%s' specified\n", > +- progname, interface); > +- } > +- > + #ifndef STREAMS > + { > + struct ifreq ifr; > +@@ -535,6 +530,11 @@ main(argc, argv) > + } > + > + #else /* STREAMS */ > ++ if (sscanf(interface, PPP_DRV_NAME "%d", &unit) != 1) { > ++ fprintf(stderr, "%s: invalid interface '%s' specified\n", > ++ progname, interface); > ++ } > ++ > + #ifdef __osf__ > + dev = "/dev/streams/ppp"; > + #else > +-- > +2.15.1 > + > diff --git a/meta/recipes-connectivity/ppp/ppp_2.4.8.bb > b/meta/recipes-connectivity/ppp/ppp_2.4.8.bb > index f9c60d6bad..231c40f6ca 100644 > --- a/meta/recipes-connectivity/ppp/ppp_2.4.8.bb > +++ b/meta/recipes-connectivity/ppp/ppp_2.4.8.bb > @@ -30,6 +30,7 @@ SRC_URI = > "https://download.samba.org/pub/${BPN}/${BP}.tar.gz \ > file://fix-CVE-2015-3310.patch \ > file://0001-ppp-Remove-unneeded-include.patch \ > file://0001-pppd-Fix-bounds-check-in-EAP-code.patch \ > + file://0002-pppd-add-ifname-option.patch \ > " > > SRC_URI_append_libc-musl = "\ > > > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#140627): https://lists.openembedded.org/g/openembedded-core/message/140627 Mute This Topic: https://lists.openembedded.org/mt/75503520/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-