Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pppd: implement net-init, net-pre-up and net-down. #367

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions pppd/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ static void holdoff_end(void *);
static void forget_child(int pid, int status);
static int reap_kids(void);
static void childwait_end(void *);
static void run_net_script(char* script, int wait);

#ifdef PPP_WITH_TDB
static void update_db_entry(void);
Expand Down Expand Up @@ -799,6 +800,26 @@ setup_signals(void)
signal(SIGPIPE, SIG_IGN);
}

/*
* net-* scripts to be run come through here.
*/
void run_net_script(char* script, int wait)
{
char strspeed[32];
char *argv[6];

slprintf(strspeed, sizeof(strspeed), "%d", baud_rate);

argv[0] = script;
argv[1] = ifname;
argv[2] = devnam;
argv[3] = strspeed;
argv[4] = ipparam;
argv[5] = NULL;

run_program(script, argv, 0, NULL, NULL, wait);
}

/*
* set_ifunit - do things we need to do once we know which ppp
* unit we are using.
Expand All @@ -820,6 +841,7 @@ set_ifunit(int iskey)
create_pidfile(getpid()); /* write pid to file */
create_linkpidfile(getpid());
}
run_net_script(PPP_PATH_NET_INIT, 1);
}

/*
Expand Down Expand Up @@ -1222,6 +1244,23 @@ ppp_recv_config(int unit, int mru, u_int32_t accm, int pcomp, int accomp)
void
new_phase(ppp_phase_t p)
{
switch (p) {
case PHASE_NETWORK:
if (phase <= PHASE_NETWORK) {
char iftmpname[IFNAMSIZ];
int ifindex = if_nametoindex(ifname);
run_net_script(PPP_PATH_NET_PREUP, 1);
if (if_indextoname(ifindex, iftmpname) && strcmp(iftmpname, ifname)) {
info("Detected interface name change from %s to %s.", ifname, iftmpname);
strcpy(ifname, iftmpname);
}
}
break;
case PHASE_DISCONNECT:
run_net_script(PPP_PATH_NET_DOWN, 0);
break;
}

phase = p;
if (new_phase_hook)
(*new_phase_hook)(p);
Expand Down
4 changes: 4 additions & 0 deletions pppd/pathnames.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@
#define PPP_PATH_PEERFILES PPP_PATH_CONFDIR "/peers/"
#define PPP_PATH_RESOLV PPP_PATH_CONFDIR "/resolv.conf"

#define PPP_PATH_NET_INIT PPP_PATH_CONFDIR "/net-init"
#define PPP_PATH_NET_PREUP PPP_PATH_CONFDIR "/net-pre-up"
#define PPP_PATH_NET_DOWN PPP_PATH_CONFDIR "/net-down"

#define PPP_PATH_CONNERRS PPP_PATH_VARLOG "/connect-errors"

#define PPP_PATH_USEROPT ".ppprc"
Expand Down
33 changes: 31 additions & 2 deletions pppd/pppd.8
Original file line number Diff line number Diff line change
Expand Up @@ -1729,8 +1729,8 @@ We failed to authenticate ourselves to the peer.
Pppd invokes scripts at various stages in its processing which can be
used to perform site-specific ancillary processing. These scripts are
usually shell scripts, but could be executable code files instead.
Pppd does not wait for the scripts to finish (except for the ip-pre-up
script). The scripts are
Pppd does not wait for the scripts to finish (except for the net-init,
net-pre-up and ip-pre-up scripts). The scripts are
executed as root (with the real and effective user-id set to 0), so
that they can do things such as update routing tables or run
privileged daemons. Be careful that the contents of these scripts do
Expand Down Expand Up @@ -1840,6 +1840,14 @@ IP addresses assigned but is still down. This can be used to
add firewall rules before any IP traffic can pass through the
interface. Pppd will wait for this script to finish before bringing
the interface up, so this script should run quickly.
.PP
WARNING: Please note that on systems where a single interface carries multiple
protocols (Linux) ip-pre-up is NOT actually guaranteed to execute prior to the
interface moving into an up state, although IP information won't be known you
should consider using net-pre-up instead, alternatively, disable other NCPs
such that IPv4 is the only negotiated protocol - which will also result in a
guarantee that ip-pre-up is called prior to the interface going into an UP
state.
.TP
.B /etc/ppp/ip\-up
A program or script which is executed when the link is available for
Expand Down Expand Up @@ -1869,6 +1877,27 @@ Similar to /etc/ppp/ip\-down, but it is executed when IPv6 packets can no
longer be transmitted on the link. It is executed with the same parameters
as the ipv6\-up script.
.TP
.B /etc/ppp/net\-init
This script will be executed the moment the ppp unit number is known. This
script will be waited for and should not cause significant delays. This can be
used to update book-keeping type systems external to ppp and provides the only
guaranteed point where a script can be executed knowing the ppp unit number
prior to LCP being initiated. It is executed with the parameters
.IP
\fIinterface\-name tty\-device speed ipparam
.TP
.B /etc/ppp/net\-pre\-up
This script will be executed just prior to NCP negotiations initiating, and is
guaranteed to be executed whilst the interface (Linux) and/or sub-interfaces
(Solaris) as the case may be is/are still down. ppp will block waiting for
this script to complete, and the interface may be safely renamed in this script
(using for example "ip li set dev $1 name ppp-foobar". The parameters are the
same as for net\-init.
.TP
.B /etc/ppp/net\-down
This script will be executed just prior to ppp terminating and will not be
waited for. The parameters are the same as for net\-init.
.TP
.B /var/run/ppp\fIn\fB.pid \fR(BSD or Linux), \fB/etc/ppp/ppp\fIn\fB.pid \fR(others)
Process-ID for pppd process on ppp interface unit \fIn\fR.
.TP
Expand Down