summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ppp/datalink.c
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1998-08-07 18:42:51 +0000
committerbrian <brian@FreeBSD.org>1998-08-07 18:42:51 +0000
commitf9ee8808e7fd6798eb442188b9b4b8e23c461f07 (patch)
tree4a1f01689ab26830c419f0100830cd94b3e03a62 /usr.sbin/ppp/datalink.c
parentda1fbd5e2562a9182735d47266f718c37ce51225 (diff)
downloadFreeBSD-src-f9ee8808e7fd6798eb442188b9b4b8e23c461f07.zip
FreeBSD-src-f9ee8808e7fd6798eb442188b9b4b8e23c461f07.tar.gz
o Support callback types NONE, E.164, AUTH and CBCP.
(see the new ``set callback'' and ``set cbcp'' commands) o Add a ``cbcp'' log level and mbuf type. o Don't dump core when \T is given in ``set login'' or ``set hangup''. o Allow ``*'' and blanks as placeholders in ppp.secret and allow a fifth field for specifying auth/cbcp dialback parameters. o Remove a few extraneous #includes o Define the default number of REQs (restart counter) in defs.h rather than hardcoding ``5'' all over the place. o Fix a few man page inconsistencies.
Diffstat (limited to 'usr.sbin/ppp/datalink.c')
-rw-r--r--usr.sbin/ppp/datalink.c185
1 files changed, 167 insertions, 18 deletions
diff --git a/usr.sbin/ppp/datalink.c b/usr.sbin/ppp/datalink.c
index 5ab9794..92264f4 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.15 1998/06/30 23:04:14 brian Exp $
+ * $Id: datalink.c,v 1.16 1998/07/03 17:24:37 brian Exp $
*/
#include <sys/types.h>
@@ -67,6 +67,7 @@
#include "pap.h"
#include "chap.h"
#include "command.h"
+#include "cbcp.h"
#include "datalink.h"
static void datalink_LoginDone(struct datalink *);
@@ -87,7 +88,7 @@ datalink_StartDialTimer(struct datalink *dl, int Timeout)
{
timer_Stop(&dl->dial_timer);
- if (Timeout) {
+ if (Timeout) {
if (Timeout > 0)
dl->dial_timer.load = Timeout * SECTICKS;
else
@@ -115,7 +116,26 @@ datalink_HangupDone(struct datalink *dl)
modem_Close(dl->physical);
dl->phone.chosen = "N/A";
- if (dl->bundle->CleaningUp ||
+ if (dl->cbcp.required) {
+ log_Printf(LogPHASE, "Call peer back on %s\n", dl->cbcp.fsm.phone);
+ dl->cfg.callback.opmask = 0;
+ strncpy(dl->cfg.phone.list, dl->cbcp.fsm.phone,
+ sizeof dl->cfg.phone.list - 1);
+ 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->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 (dl->cbcp.fsm.delay < dl->cfg.dial.timeout)
+ dl->cbcp.fsm.delay = dl->cfg.dial.timeout;
+ datalink_StartDialTimer(dl, dl->cbcp.fsm.delay);
+ cbcp_Down(&dl->cbcp);
+ 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->physical->type & (PHYS_DDIAL|PHYS_DEDICATED)))) {
@@ -301,6 +321,7 @@ datalink_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e,
case DATALINK_READY:
case DATALINK_LCP:
case DATALINK_AUTH:
+ case DATALINK_CBCP:
case DATALINK_OPEN:
result = descriptor_UpdateSet(&dl->physical->desc, r, w, e, n);
break;
@@ -332,6 +353,7 @@ datalink_IsSet(struct descriptor *d, const fd_set *fdset)
case DATALINK_READY:
case DATALINK_LCP:
case DATALINK_AUTH:
+ case DATALINK_CBCP:
case DATALINK_OPEN:
return descriptor_IsSet(&dl->physical->desc, fdset);
}
@@ -357,6 +379,7 @@ datalink_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
case DATALINK_READY:
case DATALINK_LCP:
case DATALINK_AUTH:
+ case DATALINK_CBCP:
case DATALINK_OPEN:
descriptor_Read(&dl->physical->desc, bundle, fdset);
break;
@@ -383,6 +406,7 @@ datalink_Write(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
case DATALINK_READY:
case DATALINK_LCP:
case DATALINK_AUTH:
+ case DATALINK_CBCP:
case DATALINK_OPEN:
result = descriptor_Write(&dl->physical->desc, bundle, fdset);
break;
@@ -460,7 +484,7 @@ datalink_GotAuthname(struct datalink *dl, const char *name, int len)
}
void
-datalink_AuthOk(struct datalink *dl)
+datalink_NCPUp(struct datalink *dl)
{
int ccpok = ccp_SetOpenMode(&dl->physical->link.ccp);
@@ -472,7 +496,7 @@ datalink_AuthOk(struct datalink *dl)
return;
case MP_UP:
/* First link in the bundle */
- auth_Select(dl->bundle, dl->peer.authname, dl->physical);
+ auth_Select(dl->bundle, dl->peer.authname);
/* fall through */
case MP_ADDED:
/* We're in multilink mode ! */
@@ -490,7 +514,7 @@ datalink_AuthOk(struct datalink *dl)
} else {
dl->bundle->ncp.mp.peer = dl->peer;
ipcp_SetLink(&dl->bundle->ncp.ipcp, &dl->physical->link);
- auth_Select(dl->bundle, dl->peer.authname, dl->physical);
+ auth_Select(dl->bundle, dl->peer.authname);
}
if (ccpok) {
@@ -503,6 +527,80 @@ datalink_AuthOk(struct datalink *dl)
}
void
+datalink_CBCPComplete(struct datalink *dl)
+{
+ datalink_NewState(dl, DATALINK_LCP);
+ fsm_Close(&dl->physical->link.lcp.fsm);
+}
+
+void
+datalink_CBCPFailed(struct datalink *dl)
+{
+ cbcp_Down(&dl->cbcp);
+ datalink_CBCPComplete(dl);
+}
+
+void
+datalink_AuthOk(struct datalink *dl)
+{
+ if (dl->physical->link.lcp.his_callback.opmask ==
+ CALLBACK_BIT(CALLBACK_CBCP) ||
+ dl->physical->link.lcp.want_callback.opmask ==
+ CALLBACK_BIT(CALLBACK_CBCP)) {
+ datalink_NewState(dl, DATALINK_CBCP);
+ cbcp_Up(&dl->cbcp);
+ } else if (dl->physical->link.lcp.want_callback.opmask) {
+ log_Printf(LogPHASE, "%s: Shutdown and await peer callback\n", dl->name);
+ datalink_NewState(dl, DATALINK_LCP);
+ fsm_Close(&dl->physical->link.lcp.fsm);
+ } else
+ switch (dl->physical->link.lcp.his_callback.opmask) {
+ case 0:
+ datalink_NCPUp(dl);
+ break;
+
+ case CALLBACK_BIT(CALLBACK_AUTH):
+ auth_SetPhoneList(dl->peer.authname, dl->cbcp.fsm.phone,
+ sizeof dl->cbcp.fsm.phone);
+ if (*dl->cbcp.fsm.phone == '\0' || !strcmp(dl->cbcp.fsm.phone, "*")) {
+ log_Printf(LogPHASE, "%s: %s cannot be called back\n", dl->name,
+ dl->peer.authname);
+ *dl->cbcp.fsm.phone = '\0';
+ } else {
+ char *ptr = strchr(dl->cbcp.fsm.phone, ',');
+ if (ptr)
+ *ptr = '\0'; /* Call back on the first number */
+ log_Printf(LogPHASE, "%s: Calling peer back on %s\n", dl->name,
+ dl->cbcp.fsm.phone);
+ dl->cbcp.required = 1;
+ }
+ dl->cbcp.fsm.delay = 0;
+ datalink_NewState(dl, DATALINK_LCP);
+ fsm_Close(&dl->physical->link.lcp.fsm);
+ break;
+
+ case CALLBACK_BIT(CALLBACK_E164):
+ strncpy(dl->cbcp.fsm.phone, dl->physical->link.lcp.his_callback.msg,
+ sizeof dl->cbcp.fsm.phone - 1);
+ dl->cbcp.fsm.phone[sizeof dl->cbcp.fsm.phone - 1] = '\0';
+ log_Printf(LogPHASE, "%s: Calling peer back on %s\n", dl->name,
+ dl->cbcp.fsm.phone);
+ dl->cbcp.required = 1;
+ dl->cbcp.fsm.delay = 0;
+ datalink_NewState(dl, DATALINK_LCP);
+ fsm_Close(&dl->physical->link.lcp.fsm);
+ break;
+
+ default:
+ log_Printf(LogPHASE, "%s: Oops - Should have NAK'd peer callback !\n",
+ dl->name);
+ datalink_NewState(dl, DATALINK_LCP);
+ fsm_Close(&dl->physical->link.lcp.fsm);
+ break;
+ }
+}
+
+void
datalink_AuthNotOk(struct datalink *dl)
{
datalink_NewState(dl, DATALINK_LCP);
@@ -522,7 +620,12 @@ datalink_LayerDown(void *v, struct fsm *fp)
fsm2initial(&dl->physical->link.ccp.fsm);
datalink_NewState(dl, DATALINK_LCP); /* before parent TLD */
(*dl->parent->LayerDown)(dl->parent->object, fp);
- /* fall through */
+ /* fall through (just in case) */
+
+ case DATALINK_CBCP:
+ if (!dl->cbcp.required)
+ cbcp_Down(&dl->cbcp);
+ /* fall through (just in case) */
case DATALINK_AUTH:
timer_Stop(&dl->pap.authtimer);
@@ -590,6 +693,11 @@ datalink_Create(const char *name, struct bundle *bundle, int type)
dl->cfg.reconnect.max = 0;
dl->cfg.reconnect.timeout = RECONNECT_TIMEOUT;
+ dl->cfg.callback.opmask = 0;
+ dl->cfg.cbcp.delay = 0;
+ *dl->cfg.cbcp.phone = '\0';
+ dl->cfg.cbcp.fsmretry = DEF_FSMRETRY;
+
dl->name = strdup(name);
peerid_Init(&dl->peer);
dl->parent = &bundle->fsm;
@@ -607,6 +715,7 @@ datalink_Create(const char *name, struct bundle *bundle, int type)
free(dl);
return NULL;
}
+ cbcp_Init(&dl->cbcp, dl->physical);
chat_Init(&dl->chat, dl->physical, NULL, 1, NULL);
log_Printf(LogPHASE, "%s: Created in %s state\n",
@@ -667,6 +776,7 @@ datalink_Clone(struct datalink *odl, const char *name)
memcpy(&dl->physical->async.cfg, &odl->physical->async.cfg,
sizeof dl->physical->async.cfg);
+ cbcp_Init(&dl->cbcp, dl->physical);
chat_Init(&dl->chat, dl->physical, NULL, 1, NULL);
log_Printf(LogPHASE, "%s: Cloned in %s state\n",
@@ -747,6 +857,7 @@ datalink_Close(struct datalink *dl, int how)
fsm2initial(&dl->physical->link.ccp.fsm);
/* fall through */
+ case DATALINK_CBCP:
case DATALINK_AUTH:
case DATALINK_LCP:
fsm_Close(&dl->physical->link.lcp.fsm);
@@ -773,6 +884,7 @@ datalink_Down(struct datalink *dl, int how)
fsm2initial(&dl->physical->link.ccp.fsm);
/* fall through */
+ case DATALINK_CBCP:
case DATALINK_AUTH:
case DATALINK_LCP:
fsm2initial(&dl->physical->link.lcp.fsm);
@@ -800,30 +912,30 @@ int
datalink_Show(struct cmdargs const *arg)
{
prompt_Printf(arg->prompt, "Name: %s\n", arg->cx->name);
- prompt_Printf(arg->prompt, " State: %s\n",
+ prompt_Printf(arg->prompt, " State: %s\n",
datalink_State(arg->cx));
- prompt_Printf(arg->prompt, " CHAP Encryption: %s\n",
+ prompt_Printf(arg->prompt, " CHAP Encryption: %s\n",
arg->cx->chap.using_MSChap ? "MSChap" : "MD5" );
- prompt_Printf(arg->prompt, " Peer name: ");
+ prompt_Printf(arg->prompt, " Peer name: ");
if (*arg->cx->peer.authname)
prompt_Printf(arg->prompt, "%s\n", arg->cx->peer.authname);
else if (arg->cx->state == DATALINK_OPEN)
prompt_Printf(arg->prompt, "None requested\n");
else
prompt_Printf(arg->prompt, "N/A\n");
- prompt_Printf(arg->prompt, " Discriminator: %s\n",
+ prompt_Printf(arg->prompt, " Discriminator: %s\n",
mp_Enddisc(arg->cx->peer.enddisc.class,
arg->cx->peer.enddisc.address,
arg->cx->peer.enddisc.len));
prompt_Printf(arg->prompt, "\nDefaults:\n");
- prompt_Printf(arg->prompt, " Phone List: %s\n",
+ prompt_Printf(arg->prompt, " Phone List: %s\n",
arg->cx->cfg.phone.list);
if (arg->cx->cfg.dial.max)
- prompt_Printf(arg->prompt, " Dial tries: %d, delay ",
+ prompt_Printf(arg->prompt, " Dial tries: %d, delay ",
arg->cx->cfg.dial.max);
else
- prompt_Printf(arg->prompt, " Dial tries: infinite, delay ");
+ prompt_Printf(arg->prompt, " Dial tries: infinite, delay ");
if (arg->cx->cfg.dial.next_timeout > 0)
prompt_Printf(arg->prompt, "%ds/", arg->cx->cfg.dial.next_timeout);
else
@@ -832,17 +944,50 @@ datalink_Show(struct cmdargs const *arg)
prompt_Printf(arg->prompt, "%ds\n", arg->cx->cfg.dial.timeout);
else
prompt_Printf(arg->prompt, "random\n");
- prompt_Printf(arg->prompt, " Reconnect tries: %d, delay ",
+ prompt_Printf(arg->prompt, " Reconnect tries: %d, delay ",
arg->cx->cfg.reconnect.max);
if (arg->cx->cfg.reconnect.timeout > 0)
prompt_Printf(arg->prompt, "%ds\n", arg->cx->cfg.reconnect.timeout);
else
prompt_Printf(arg->prompt, "random\n");
- prompt_Printf(arg->prompt, " Dial Script: %s\n",
+ prompt_Printf(arg->prompt, " Callback %s ", arg->cx->physical->type ==
+ PHYS_DIRECT ? "accepted: " : "requested:");
+ if (!arg->cx->cfg.callback.opmask)
+ prompt_Printf(arg->prompt, "none\n");
+ else {
+ int comma = 0;
+
+ if (arg->cx->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_NONE)) {
+ prompt_Printf(arg->prompt, "none");
+ comma = 1;
+ }
+ if (arg->cx->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_AUTH)) {
+ prompt_Printf(arg->prompt, "%sauth", comma ? ", " : "");
+ comma = 1;
+ }
+ if (arg->cx->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_E164)) {
+ prompt_Printf(arg->prompt, "%sE.164", comma ? ", " : "");
+ if (arg->cx->physical->type != PHYS_DIRECT)
+ prompt_Printf(arg->prompt, " (%s)", arg->cx->cfg.callback.msg);
+ comma = 1;
+ }
+ if (arg->cx->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_CBCP)) {
+ prompt_Printf(arg->prompt, "%scbcp\n", comma ? ", " : "");
+ prompt_Printf(arg->prompt, " CBCP: delay: %ds\n",
+ arg->cx->cfg.cbcp.delay);
+ prompt_Printf(arg->prompt, " phone: %s\n",
+ arg->cx->cfg.cbcp.phone);
+ prompt_Printf(arg->prompt, " timeout: %lds\n",
+ arg->cx->cfg.cbcp.fsmretry);
+ } else
+ prompt_Printf(arg->prompt, "\n");
+ }
+
+ prompt_Printf(arg->prompt, " Dial Script: %s\n",
arg->cx->cfg.script.dial);
- prompt_Printf(arg->prompt, " Login Script: %s\n",
+ prompt_Printf(arg->prompt, " Login Script: %s\n",
arg->cx->cfg.script.login);
- prompt_Printf(arg->prompt, " Hangup Script: %s\n",
+ prompt_Printf(arg->prompt, " Hangup Script: %s\n",
arg->cx->cfg.script.hangup);
return 0;
}
@@ -923,6 +1068,7 @@ static const char *states[] = {
"ready",
"lcp",
"auth",
+ "cbcp",
"open"
};
@@ -1025,6 +1171,7 @@ iov2datalink(struct bundle *bundle, struct iovec *iov, int *niov, int maxiov,
free(dl);
dl = NULL;
} else {
+ cbcp_Init(&dl->cbcp, dl->physical);
chat_Init(&dl->chat, dl->physical, NULL, 1, NULL);
log_Printf(LogPHASE, "%s: Transferred in %s state\n",
@@ -1043,6 +1190,8 @@ datalink2iov(struct datalink *dl, struct iovec *iov, int *niov, int maxiov,
if (dl) {
timer_Stop(&dl->dial_timer);
+ /* The following is purely for the sake of paranoia */
+ cbcp_Down(&dl->cbcp);
timer_Stop(&dl->pap.authtimer);
timer_Stop(&dl->chap.auth.authtimer);
}
OpenPOWER on IntegriCloud