From: Paul Mackerras Date: Sat, 18 Mar 2017 11:24:25 +0000 (+1100) Subject: Merge branch 'master' of https://github.com/gburgessiv/ppp X-Git-Tag: v2.4.8~39 X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=commitdiff_plain;h=a3f379befd11934466271aaca76b2809ae8595d0;hp=66ae569f1c6fb12df8a463c8beb9afc0c7e5f7f0 Merge branch 'master' of https://github.com/gburgessiv/ppp Signed-off-by: Paul Mackerras --- diff --git a/pppd/fsm.c b/pppd/fsm.c index c200cc3..e9bd34f 100644 --- a/pppd/fsm.c +++ b/pppd/fsm.c @@ -468,7 +468,7 @@ fsm_rconfreq(f, id, inp, len) f->nakloops = 0; } else { - /* we sent CONFACK or CONFREJ */ + /* we sent CONFNAK or CONFREJ */ if (f->state != ACKRCVD) f->state = REQSENT; if( code == CONFNAK ) diff --git a/pppd/main.c b/pppd/main.c index aef9e84..76b67d2 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; @@ -297,13 +297,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; @@ -736,8 +729,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 c06a2b4..177488c 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/plugins/rp-pppoe/pppoe-discovery.c b/pppd/plugins/rp-pppoe/pppoe-discovery.c index 3d3bf4e..55037df 100644 --- a/pppd/plugins/rp-pppoe/pppoe-discovery.c +++ b/pppd/plugins/rp-pppoe/pppoe-discovery.c @@ -9,6 +9,7 @@ * */ +#include #include #include #include @@ -55,6 +56,14 @@ void die(int status) exit(status); } +void error(char *fmt, ...) +{ + va_list pvar; + va_start(pvar, fmt); + vfprintf(stderr, fmt, pvar); + va_end(pvar); +} + /* Initialize frame types to RFC 2516 values. Some broken peers apparently use different frame types... sigh... */ diff --git a/pppd/plugins/rp-pppoe/pppoe.h b/pppd/plugins/rp-pppoe/pppoe.h index 9ab2eee..c4aaa6e 100644 --- a/pppd/plugins/rp-pppoe/pppoe.h +++ b/pppd/plugins/rp-pppoe/pppoe.h @@ -47,6 +47,10 @@ #include #endif +/* This has to be included before Linux 4.8's linux/in.h + * gets dragged in. */ +#include + /* Ugly header files on some Linux boxes... */ #if defined(HAVE_LINUX_IF_H) #include @@ -84,8 +88,6 @@ typedef unsigned long UINT32_t; #include #endif -#include - #ifdef HAVE_NETINET_IF_ETHER_H #include @@ -98,7 +100,6 @@ typedef unsigned long UINT32_t; #endif - /* Ethernet frame types according to RFC 2516 */ #define ETH_PPPOE_DISCOVERY 0x8863 #define ETH_PPPOE_SESSION 0x8864 diff --git a/pppd/pppd.8 b/pppd/pppd.8 index c508d27..06e945f 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 247fa15..1a1bf0b 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 b4a435d..46e1ed4 100644 --- a/pppd/sys-linux.c +++ b/pppd/sys-linux.c @@ -73,12 +73,12 @@ #include #include #include -#include #include #include #include #include +#include #include #include #include @@ -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 6367988..46cb9c2 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 diff --git a/scripts/plog b/scripts/plog index 84d2c73..7cb5334 100644 --- a/scripts/plog +++ b/scripts/plog @@ -3,5 +3,5 @@ if [ -s /var/log/ppp.log ]; then exec tail "$@" /var/log/ppp.log else - exec tail "$@" /var/log/syslog | grep ' \(pppd\|chat\)\[' + exec grep ' \(pppd\|chat\)\[' /var/log/syslog | tail "$@" fi