From e757ee80f724cfb1906b3649f4545c1680397de0 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sat, 1 May 2010 17:54:37 +0000 Subject: [PATCH] ppp: - patch pppd to support named interfaces (e.g. "pppoe-wan") - use named interfaces when bringing up 3g, pptp, ppp or pppoe connections - get rid of unit count logic - shutdown pppd when ifdown is invoked - bump package revision SVN-Revision: 21283 --- package/ppp/Makefile | 2 +- package/ppp/files/etc/ppp/ip-up | 3 +- package/ppp/files/ppp.sh | 84 ++++-------- package/ppp/files/pppoe.sh | 4 +- .../ppp/patches/320-custom_iface_names.patch | 128 ++++++++++++++++++ 5 files changed, 158 insertions(+), 63 deletions(-) create mode 100644 package/ppp/patches/320-custom_iface_names.patch diff --git a/package/ppp/Makefile b/package/ppp/Makefile index f8bfa48b6b..90e4590efe 100644 --- a/package/ppp/Makefile +++ b/package/ppp/Makefile @@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=ppp PKG_VERSION:=2.4.4 -PKG_RELEASE:=5 +PKG_RELEASE:=6 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=ftp://ftp.samba.org/pub/ppp/ diff --git a/package/ppp/files/etc/ppp/ip-up b/package/ppp/files/etc/ppp/ip-up index 376c87e569..4b44b25d0b 100755 --- a/package/ppp/files/etc/ppp/ip-up +++ b/package/ppp/files/etc/ppp/ip-up @@ -6,11 +6,10 @@ PPP_SPEED="$3" PPP_LOCAL="$4" PPP_REMOTE="$5" PPP_IPPARAM="$(echo $6 | sed 's/\./_/g')" -PPP_UNIT="${PPP_IFACE##ppp}" export PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM [ -z "$PPP_IPPARAM" -o -z "$PPP_LOCAL" ] || { - uci_set_state network "$PPP_IPPARAM" unit "$PPP_UNIT" + uci_set_state network "$PPP_IPPARAM" ifname "$PPP_IFACE" uci_set_state network "$PPP_IPPARAM" ipaddr "$PPP_LOCAL" uci_set_state network "$PPP_IPPARAM" gateway "$PPP_REMOTE" diff --git a/package/ppp/files/ppp.sh b/package/ppp/files/ppp.sh index c6440025be..69051132ed 100644 --- a/package/ppp/files/ppp.sh +++ b/package/ppp/files/ppp.sh @@ -1,63 +1,33 @@ -scan_ppp() { - config_get ifname "$1" ifname - pppdev="${pppdev:-0}" - config_get devunit "$1" unit - { - unit= - pppif= - if [ ! -d /tmp/.ppp-counter ]; then - mkdir -p /tmp/.ppp-counter - fi - local maxunit - maxunit="$(cat /tmp/.ppp-counter/max-unit 2>/dev/null)" - if [ -z "$maxunit" ]; then - maxunit=-1 - fi - local i - i=0 - while [ $i -le $maxunit ]; do - local unitdev - unitdev="$(cat /tmp/.ppp-counter/ppp${i} 2>/dev/null)" - if [ "$unitdev" = "$1" ]; then - unit="$i" - pppif="ppp${i}" - break - fi - i="$(($i + 1))" - done - if [ -z "$unit" ] || [ -z "$pppif" ]; then - maxunit="$(($maxunit + 1))" - if [ -n "$devunit" ]; then - unit="$devunit" - elif [ "${ifname%%[0-9]*}" = ppp ]; then - unit="${ifname##ppp}" - else - unit="$maxunit" - fi - [ "$maxunit" -lt "$unit" ] && maxunit="$unit" - pppif="ppp${unit}" - echo "$1" >/tmp/.ppp-counter/$pppif 2>/dev/null - echo "$maxunit" >/tmp/.ppp-counter/max-unit 2>/dev/null - fi - config_set "$1" ifname "ppp$unit" - config_set "$1" unit "$unit" +stop_interface_ppp() { + local cfg="$1" + + local proto + config_get proto "$cfg" proto + + local ifname + config_get ifname "$cfg" ifname + + local link="${proto:-ppp}-$ifname" + [ -f "/var/run/ppp-${link}.pid" ] && { + local pid="$(head -n1 /var/run/ppp-${link}.pid 2>/dev/null)" + grep -qs pppd "/proc/$pid/cmdline" && kill -TERM $pid } } start_pppd() { local cfg="$1"; shift - local ifname - # make sure the network state references the correct ifname - scan_ppp "$cfg" - config_get ifname "$cfg" ifname - set_interface_ifname "$cfg" "$ifname" + local proto + config_get proto "$cfg" proto + + # unique link identifier + local link="${proto:-ppp}-$cfg" # make sure only one pppd process is started - lock "/var/lock/ppp-${cfg}" - local pid="$(head -n1 /var/run/ppp-${cfg}.pid 2>/dev/null)" + lock "/var/lock/ppp-${link}" + local pid="$(head -n1 /var/run/ppp-${link}.pid 2>/dev/null)" [ -d "/proc/$pid" ] && grep pppd "/proc/$pid/cmdline" 2>/dev/null >/dev/null && { - lock -u "/var/lock/ppp-${cfg}" + lock -u "/var/lock/ppp-${link}" return 0 } @@ -68,9 +38,6 @@ start_pppd() { local device config_get device "$cfg" device - local unit - config_get unit "$cfg" unit - local username config_get username "$cfg" username @@ -91,7 +58,8 @@ start_pppd() { local defaultroute config_get_bool defaultroute "$cfg" defaultroute 1 - [ "$defaultroute" -eq 1 ] && defaultroute="defaultroute replacedefaultroute" || defaultroute="" + [ "$defaultroute" -eq 1 ] && \ + defaultroute="defaultroute replacedefaultroute" || defaultroute="" local interval="${keepalive##*[, ]}" [ "$interval" != "$keepalive" ] || interval=5 @@ -142,15 +110,15 @@ start_pppd() { $peerdns \ $defaultroute \ ${username:+user "$username" password "$password"} \ - unit "$unit" \ - linkname "$cfg" \ + linkname "$link" \ ipparam "$cfg" \ + ifname "$link" \ ${connect:+connect "$connect"} \ ${disconnect:+disconnect "$disconnect"} \ ${ipv6} \ ${pppd_options} - lock -u "/var/lock/ppp-${cfg}" + lock -u "/var/lock/ppp-${link}" } setup_interface_ppp() { diff --git a/package/ppp/files/pppoe.sh b/package/ppp/files/pppoe.sh index 74f1a8579c..bbd36a11ab 100644 --- a/package/ppp/files/pppoe.sh +++ b/package/ppp/files/pppoe.sh @@ -1,5 +1,5 @@ -scan_pppoe() { - scan_ppp "$@" +stop_interface_pppoe() { + stop_interface_ppp "$1" } setup_interface_pppoe() { diff --git a/package/ppp/patches/320-custom_iface_names.patch b/package/ppp/patches/320-custom_iface_names.patch new file mode 100644 index 0000000000..16d90c4d7a --- /dev/null +++ b/package/ppp/patches/320-custom_iface_names.patch @@ -0,0 +1,128 @@ +--- a/pppd/main.c ++++ b/pppd/main.c +@@ -742,8 +742,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 (use_ifname[0] == 0) ++ slprintf(ifname, sizeof(ifname), "%s%d", PPP_DRV_NAME, ifunit); ++ else ++ slprintf(ifname, sizeof(ifname), "%s", use_ifname); ++ info("Using interface %s", ifname); + script_setenv("IFNAME", ifname, iskey); + if (iskey) { + create_pidfile(getpid()); /* write pid to file */ +--- a/pppd/options.c ++++ b/pppd/options.c +@@ -111,6 +111,7 @@ int log_to_fd = 1; /* send log messages + bool log_default = 1; /* log_to_fd is default (stdout) */ + int maxfail = 10; /* max # of unsuccessful connection attempts */ + char linkname[MAXPATHLEN]; /* logical name for link */ ++char use_ifname[IFNAMSIZ]; /* physical name for PPP 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 */ +@@ -264,6 +265,9 @@ option_t general_options[] = { + { "linkname", o_string, linkname, + "Set logical name for link", + OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXPATHLEN }, ++ { "ifname", o_string, use_ifname, ++ "Set physical name for PPP interface", ++ OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, IFNAMSIZ }, + + { "maxfail", o_int, &maxfail, + "Maximum number of unsuccessful connection attempts to allow", +--- a/pppd/pppd.h ++++ b/pppd/pppd.h +@@ -71,6 +71,10 @@ + #include "eui64.h" + #endif + ++#ifndef IFNAMSIZ ++#define IFNAMSIZ 16 ++#endif ++ + /* + * Limits. + */ +@@ -308,6 +312,7 @@ extern char *record_file; /* File to rec + extern bool sync_serial; /* Device is synchronous serial device */ + extern int maxfail; /* Max # of unsuccessful connection attempts */ + extern char linkname[MAXPATHLEN]; /* logical name for link */ ++extern char use_ifname[IFNAMSIZ]; /* physical name for PPP interface */ + 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 */ +--- a/pppd/sys-linux.c ++++ b/pppd/sys-linux.c +@@ -168,6 +168,10 @@ struct in6_ifreq { + /* We can get an EIO error on an ioctl if the modem has hung up */ + #define ok_error(num) ((num)==EIO) + ++#if !defined(PPP_DRV_NAME) ++#define PPP_DRV_NAME "ppp" ++#endif /* !defined(PPP_DRV_NAME) */ ++ + static int tty_disc = N_TTY; /* The TTY discipline */ + static int ppp_disc = N_PPP; /* The PPP discpline */ + static int initfdflags = -1; /* Initial file descriptor flags for fd */ +@@ -622,7 +626,8 @@ void generic_disestablish_ppp(int dev_fd + */ + static int make_ppp_unit() + { +- int x, flags; ++ struct ifreq ifr; ++ int x, flags, s; + + if (ppp_dev_fd >= 0) { + dbglog("in make_ppp_unit, already had /dev/ppp open?"); +@@ -645,6 +650,32 @@ static int make_ppp_unit() + } + if (x < 0) + error("Couldn't create new ppp unit: %m"); ++ ++ if (use_ifname[0] != 0) { ++ s = socket(PF_INET, SOCK_DGRAM, 0); ++ if (s < 0) ++ s = socket(PF_PACKET, SOCK_DGRAM, 0); ++ if (s < 0) ++ s = socket(PF_INET6, SOCK_DGRAM, 0); ++ if (s < 0) ++ s = socket(PF_UNIX, SOCK_DGRAM, 0); ++ if (s >= 0) { ++ slprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s%d", PPP_DRV_NAME, ifunit); ++ slprintf(ifr.ifr_newname, sizeof(ifr.ifr_newname), "%s", use_ifname); ++ x = ioctl(s, SIOCSIFNAME, &ifr); ++ close(s); ++ } else { ++ x = s; ++ } ++ if (x < 0) { ++ error("Couldn't rename %s to %s", ifr.ifr_name, ifr.ifr_newname); ++ close(ppp_dev_fd); ++ ppp_dev_fd = -1; ++ } else { ++ info("Renamed %s to %s", ifr.ifr_name, ifr.ifr_newname); ++ } ++ } ++ + return x; + } + +--- a/pppstats/pppstats.c ++++ b/pppstats/pppstats.c +@@ -506,10 +506,12 @@ 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 + {