summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ppp/datalink.c
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1999-03-04 17:42:15 +0000
committerbrian <brian@FreeBSD.org>1999-03-04 17:42:15 +0000
commitfe992c122ec68c1830ec9832e9f3bf7b23a92ac2 (patch)
tree25cf953120c74383ddd886c2252439cb3c4f839d /usr.sbin/ppp/datalink.c
parentf14d10621ff9cf650f3ece66fe29e29a0102da0d (diff)
downloadFreeBSD-src-fe992c122ec68c1830ec9832e9f3bf7b23a92ac2.zip
FreeBSD-src-fe992c122ec68c1830ec9832e9f3bf7b23a92ac2.tar.gz
Extend the ``set redial'' command to allow incremental
redial timeouts.
Diffstat (limited to 'usr.sbin/ppp/datalink.c')
-rw-r--r--usr.sbin/ppp/datalink.c143
1 files changed, 97 insertions, 46 deletions
diff --git a/usr.sbin/ppp/datalink.c b/usr.sbin/ppp/datalink.c
index 8f0ed49..b13635e 100644
--- a/usr.sbin/ppp/datalink.c
+++ b/usr.sbin/ppp/datalink.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: datalink.c,v 1.33 1999/02/25 12:00:04 brian Exp $
+ * $Id: datalink.c,v 1.34 1999/02/26 21:28:10 brian Exp $
*/
#include <sys/param.h>
@@ -81,7 +81,7 @@ datalink_OpenTimeout(void *v)
{
struct datalink *dl = (struct datalink *)v;
- timer_Stop(&dl->dial_timer);
+ timer_Stop(&dl->dial.timer);
if (dl->state == DATALINK_OPENING)
log_Printf(LogPHASE, "%s: Redial timer expired.\n", dl->name);
}
@@ -91,18 +91,18 @@ datalink_StartDialTimer(struct datalink *dl, int Timeout)
{
int result = Timeout;
- timer_Stop(&dl->dial_timer);
+ timer_Stop(&dl->dial.timer);
if (Timeout) {
if (Timeout > 0)
- dl->dial_timer.load = Timeout * SECTICKS;
+ dl->dial.timer.load = Timeout * SECTICKS;
else {
result = (random() % DIAL_TIMEOUT) + 1;
- dl->dial_timer.load = result * SECTICKS;
+ dl->dial.timer.load = result * SECTICKS;
}
- dl->dial_timer.func = datalink_OpenTimeout;
- dl->dial_timer.name = "dial";
- dl->dial_timer.arg = dl;
- timer_Start(&dl->dial_timer);
+ dl->dial.timer.func = datalink_OpenTimeout;
+ dl->dial.timer.name = "dial";
+ dl->dial.timer.arg = dl;
+ timer_Start(&dl->dial.timer);
if (dl->state == DATALINK_OPENING)
log_Printf(LogPHASE, "%s: Enter pause (%d) for redialing.\n",
dl->name, Timeout);
@@ -131,13 +131,14 @@ datalink_HangupDone(struct datalink *dl)
dl->cfg.phone.list[sizeof dl->cfg.phone.list - 1] = '\0';
dl->phone.alt = dl->phone.next = NULL;
dl->reconnect_tries = dl->cfg.reconnect.max;
- dl->dial_tries = dl->cfg.dial.max;
+ dl->dial.tries = dl->cfg.dial.max;
+ dl->dial.incs = 0;
dl->script.run = 1;
dl->script.packetmode = 1;
if (!physical_SetMode(dl->physical, PHYS_BACKGROUND))
log_Printf(LogERROR, "Oops - can't change mode to BACKGROUND (gulp) !\n");
bundle_LinksRemoved(dl->bundle);
- /* if dial.timeout is < 0 (random), don't override fsm.delay */
+ /* if dial.timeout is < 0 (random), we don't override fsm.delay */
if (dl->cbcp.fsm.delay < dl->cfg.dial.timeout)
dl->cbcp.fsm.delay = dl->cfg.dial.timeout;
datalink_StartDialTimer(dl, dl->cbcp.fsm.delay);
@@ -145,23 +146,25 @@ datalink_HangupDone(struct datalink *dl)
datalink_NewState(dl, DATALINK_OPENING);
} else if (dl->bundle->CleaningUp ||
(dl->physical->type == PHYS_DIRECT) ||
- ((!dl->dial_tries || (dl->dial_tries < 0 && !dl->reconnect_tries)) &&
+ ((!dl->dial.tries || (dl->dial.tries < 0 && !dl->reconnect_tries)) &&
!(dl->physical->type & (PHYS_DDIAL|PHYS_DEDICATED)))) {
datalink_NewState(dl, DATALINK_CLOSED);
- dl->dial_tries = -1;
+ dl->dial.tries = -1;
+ dl->dial.incs = 0;
dl->reconnect_tries = 0;
bundle_LinkClosed(dl->bundle, dl);
if (!dl->bundle->CleaningUp)
- datalink_StartDialTimer(dl, dl->cfg.dial.timeout);
+ datalink_StartDialTimer(dl, datalink_GetDialTimeout(dl));
} else {
datalink_NewState(dl, DATALINK_OPENING);
- if (dl->dial_tries < 0) {
+ if (dl->dial.tries < 0) {
datalink_StartDialTimer(dl, dl->cfg.reconnect.timeout);
- dl->dial_tries = dl->cfg.dial.max;
+ dl->dial.tries = dl->cfg.dial.max;
+ dl->dial.incs = 0;
dl->reconnect_tries--;
} else {
if (dl->phone.next == NULL)
- datalink_StartDialTimer(dl, dl->cfg.dial.timeout);
+ datalink_StartDialTimer(dl, datalink_GetDialTimeout(dl));
else
datalink_StartDialTimer(dl, dl->cfg.dial.next_timeout);
}
@@ -192,10 +195,11 @@ static void
datalink_LoginDone(struct datalink *dl)
{
if (!dl->script.packetmode) {
- dl->dial_tries = -1;
+ dl->dial.tries = -1;
+ dl->dial.incs = 0;
datalink_NewState(dl, DATALINK_READY);
} else if (modem_Raw(dl->physical, dl->bundle) < 0) {
- dl->dial_tries = 0;
+ dl->dial.tries = 0;
log_Printf(LogWARN, "datalink_LoginDone: Not connected.\n");
if (dl->script.run) {
datalink_NewState(dl, DATALINK_HANGUP);
@@ -209,7 +213,8 @@ datalink_LoginDone(struct datalink *dl)
datalink_HangupDone(dl);
}
} else {
- dl->dial_tries = -1;
+ dl->dial.tries = -1;
+ dl->dial.incs = 0;
hdlc_Init(&dl->physical->hdlc, &dl->physical->link.lcp);
async_Init(&dl->physical->async);
@@ -248,9 +253,9 @@ datalink_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e,
/* fall through */
case DATALINK_OPENING:
- if (dl->dial_timer.state != TIMER_RUNNING) {
- if (--dl->dial_tries < 0)
- dl->dial_tries = 0;
+ if (dl->dial.timer.state != TIMER_RUNNING) {
+ if (--dl->dial.tries < 0)
+ dl->dial.tries = 0;
if (modem_Open(dl->physical, dl->bundle) >= 0) {
log_WritePrompts(dl, "%s: Entering terminal mode on %s\r\n"
"Type `~?' for help\r\n", dl->name,
@@ -262,7 +267,7 @@ datalink_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e,
if (!(dl->physical->type & (PHYS_DDIAL|PHYS_DEDICATED)) &&
dl->cfg.dial.max)
log_Printf(LogCHAT, "%s: Dial attempt %u of %d\n",
- dl->name, dl->cfg.dial.max - dl->dial_tries,
+ dl->name, dl->cfg.dial.max - dl->dial.tries,
dl->cfg.dial.max);
} else
datalink_LoginDone(dl);
@@ -271,22 +276,24 @@ datalink_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e,
if (!(dl->physical->type & (PHYS_DDIAL|PHYS_DEDICATED)) &&
dl->cfg.dial.max)
log_Printf(LogCHAT, "Failed to open modem (attempt %u of %d)\n",
- dl->cfg.dial.max - dl->dial_tries, dl->cfg.dial.max);
+ dl->cfg.dial.max - dl->dial.tries, dl->cfg.dial.max);
else
log_Printf(LogCHAT, "Failed to open modem\n");
if (dl->bundle->CleaningUp ||
(!(dl->physical->type & (PHYS_DDIAL|PHYS_DEDICATED)) &&
- dl->cfg.dial.max && dl->dial_tries == 0)) {
+ dl->cfg.dial.max && dl->dial.tries == 0)) {
datalink_NewState(dl, DATALINK_CLOSED);
dl->reconnect_tries = 0;
- dl->dial_tries = -1;
+ dl->dial.tries = -1;
log_WritePrompts(dl, "Failed to open %s\n",
dl->physical->name.full);
bundle_LinkClosed(dl->bundle, dl);
}
if (!dl->bundle->CleaningUp) {
- int timeout = datalink_StartDialTimer(dl, dl->cfg.dial.timeout);
+ int timeout;
+
+ timeout = datalink_StartDialTimer(dl, datalink_GetDialTimeout(dl));
log_WritePrompts(dl, "Failed to open %s, pause %d seconds\n",
dl->physical->name.full, timeout);
}
@@ -444,7 +451,7 @@ static void
datalink_ComeDown(struct datalink *dl, int how)
{
if (how != CLOSE_NORMAL) {
- dl->dial_tries = -1;
+ dl->dial.tries = -1;
dl->reconnect_tries = 0;
if (dl->state >= DATALINK_READY && how == CLOSE_LCP)
dl->stayonline = 1;
@@ -726,12 +733,14 @@ datalink_Create(const char *name, struct bundle *bundle, int type)
dl->bundle = bundle;
dl->next = NULL;
- memset(&dl->dial_timer, '\0', sizeof dl->dial_timer);
+ memset(&dl->dial.timer, '\0', sizeof dl->dial.timer);
- dl->dial_tries = 0;
+ dl->dial.tries = 0;
dl->cfg.dial.max = 1;
dl->cfg.dial.next_timeout = DIAL_NEXT_TIMEOUT;
dl->cfg.dial.timeout = DIAL_TIMEOUT;
+ dl->cfg.dial.inc = 0;
+ dl->cfg.dial.maxinc = 10;
dl->reconnect_tries = 0;
dl->cfg.reconnect.max = 0;
@@ -793,8 +802,8 @@ datalink_Clone(struct datalink *odl, const char *name)
dl->phone.chosen = "N/A";
dl->bundle = odl->bundle;
dl->next = NULL;
- memset(&dl->dial_timer, '\0', sizeof dl->dial_timer);
- dl->dial_tries = 0;
+ memset(&dl->dial.timer, '\0', sizeof dl->dial.timer);
+ dl->dial.tries = 0;
dl->reconnect_tries = 0;
dl->name = strdup(name);
peerid_Init(&dl->peer);
@@ -847,7 +856,7 @@ datalink_Destroy(struct datalink *dl)
}
}
- timer_Stop(&dl->dial_timer);
+ timer_Stop(&dl->dial.timer);
result = dl->next;
modem_Destroy(dl->physical);
free(dl->name);
@@ -871,7 +880,7 @@ datalink_Up(struct datalink *dl, int runscripts, int packetmode)
datalink_NewState(dl, DATALINK_OPENING);
dl->reconnect_tries =
dl->physical->type == PHYS_DIRECT ? 0 : dl->cfg.reconnect.max;
- dl->dial_tries = dl->cfg.dial.max;
+ dl->dial.tries = dl->cfg.dial.max;
dl->script.run = runscripts;
dl->script.packetmode = packetmode;
break;
@@ -909,7 +918,7 @@ datalink_Close(struct datalink *dl, int how)
datalink_AuthReInit(dl);
fsm_Close(&dl->physical->link.lcp.fsm);
if (how != CLOSE_NORMAL) {
- dl->dial_tries = -1;
+ dl->dial.tries = -1;
dl->reconnect_tries = 0;
if (how == CLOSE_LCP)
dl->stayonline = 1;
@@ -1057,9 +1066,8 @@ datalink_SetReconnect(struct cmdargs const *arg)
int
datalink_SetRedial(struct cmdargs const *arg)
{
- int timeout;
- int tries;
- char *dot;
+ const char *sep, *osep;
+ int timeout, inc, maxinc, tries;
if (arg->argc == arg->argn+1 || arg->argc == arg->argn+2) {
if (strncasecmp(arg->argv[arg->argn], "random", 6) == 0 &&
@@ -1077,13 +1085,44 @@ datalink_SetRedial(struct cmdargs const *arg)
}
}
- dot = strchr(arg->argv[arg->argn], '.');
- if (dot) {
- if (strcasecmp(++dot, "random") == 0) {
+ sep = strchr(arg->argv[arg->argn], '+');
+ if (sep) {
+ inc = atoi(++sep);
+ osep = sep;
+ if (inc >= 0)
+ arg->cx->cfg.dial.inc = inc;
+ else {
+ log_Printf(LogWARN, "Invalid timeout increment\n");
+ return -1;
+ }
+ sep = strchr(sep, '-');
+ if (sep) {
+ maxinc = atoi(++sep);
+ if (maxinc >= 0)
+ arg->cx->cfg.dial.maxinc = maxinc;
+ else {
+ log_Printf(LogWARN, "Invalid maximum timeout increments\n");
+ return -1;
+ }
+ } else {
+ /* Default timeout increment */
+ arg->cx->cfg.dial.maxinc = 10;
+ sep = osep;
+ }
+ } else {
+ /* Default timeout increment & max increment */
+ arg->cx->cfg.dial.inc = 0;
+ arg->cx->cfg.dial.maxinc = 10;
+ sep = arg->argv[arg->argn];
+ }
+
+ sep = strchr(sep, '.');
+ if (sep) {
+ if (strcasecmp(++sep, "random") == 0) {
arg->cx->cfg.dial.next_timeout = -1;
randinit();
} else {
- timeout = atoi(dot);
+ timeout = atoi(sep);
if (timeout >= 0)
arg->cx->cfg.dial.next_timeout = timeout;
else {
@@ -1107,6 +1146,7 @@ datalink_SetRedial(struct cmdargs const *arg)
}
return 0;
}
+
return -1;
}
@@ -1197,8 +1237,8 @@ iov2datalink(struct bundle *bundle, struct iovec *iov, int *niov, int maxiov,
dl->bundle = bundle;
dl->next = NULL;
- memset(&dl->dial_timer, '\0', sizeof dl->dial_timer);
- dl->dial_tries = 0;
+ memset(&dl->dial.timer, '\0', sizeof dl->dial.timer);
+ dl->dial.tries = 0;
dl->reconnect_tries = 0;
dl->parent = &bundle->fsm;
dl->fsmp.LayerStart = datalink_LayerStart;
@@ -1240,7 +1280,7 @@ datalink2iov(struct datalink *dl, struct iovec *iov, int *niov, int maxiov,
int link_fd;
if (dl) {
- timer_Stop(&dl->dial_timer);
+ timer_Stop(&dl->dial.timer);
/* The following is purely for the sake of paranoia */
cbcp_Down(&dl->cbcp);
timer_Stop(&dl->pap.authtimer);
@@ -1311,3 +1351,14 @@ datalink_SetMode(struct datalink *dl, int mode)
datalink_Up(dl, 1, 1);
return 1;
}
+
+int
+datalink_GetDialTimeout(struct datalink *dl)
+{
+ int result = dl->cfg.dial.timeout + dl->dial.incs * dl->cfg.dial.inc;
+
+ if (dl->dial.incs < dl->cfg.dial.maxinc)
+ dl->dial.incs++;
+
+ return result;
+}
OpenPOWER on IntegriCloud