summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/ppp/Makefile4
-rw-r--r--usr.sbin/ppp/auth.c42
-rw-r--r--usr.sbin/ppp/auth.h5
-rw-r--r--usr.sbin/ppp/bundle.c5
-rw-r--r--usr.sbin/ppp/bundle.h3
-rw-r--r--usr.sbin/ppp/ccp.c5
-rw-r--r--usr.sbin/ppp/chap.c5
-rw-r--r--usr.sbin/ppp/chat.c11
-rw-r--r--usr.sbin/ppp/command.c61
-rw-r--r--usr.sbin/ppp/datalink.c185
-rw-r--r--usr.sbin/ppp/datalink.h14
-rw-r--r--usr.sbin/ppp/deflate.c3
-rw-r--r--usr.sbin/ppp/defs.h3
-rw-r--r--usr.sbin/ppp/hdlc.c11
-rw-r--r--usr.sbin/ppp/ip.c4
-rw-r--r--usr.sbin/ppp/ipcp.c4
-rw-r--r--usr.sbin/ppp/lcp.c187
-rw-r--r--usr.sbin/ppp/lcp.h24
-rw-r--r--usr.sbin/ppp/lcpproto.h3
-rw-r--r--usr.sbin/ppp/link.c4
-rw-r--r--usr.sbin/ppp/log.c3
-rw-r--r--usr.sbin/ppp/log.h41
-rw-r--r--usr.sbin/ppp/lqr.c3
-rw-r--r--usr.sbin/ppp/main.c3
-rw-r--r--usr.sbin/ppp/mbuf.c10
-rw-r--r--usr.sbin/ppp/mbuf.h19
-rw-r--r--usr.sbin/ppp/modem.c5
-rw-r--r--usr.sbin/ppp/mp.c3
-rw-r--r--usr.sbin/ppp/pap.c4
-rw-r--r--usr.sbin/ppp/physical.c7
-rw-r--r--usr.sbin/ppp/ppp.8137
-rw-r--r--usr.sbin/ppp/ppp.8.m4137
-rw-r--r--usr.sbin/ppp/pred.c3
-rw-r--r--usr.sbin/ppp/prompt.c3
-rw-r--r--usr.sbin/ppp/vjcomp.c3
35 files changed, 841 insertions, 123 deletions
diff --git a/usr.sbin/ppp/Makefile b/usr.sbin/ppp/Makefile
index b33fd79..759feef 100644
--- a/usr.sbin/ppp/Makefile
+++ b/usr.sbin/ppp/Makefile
@@ -1,7 +1,7 @@
-# $Id: Makefile,v 1.43 1998/06/26 18:50:29 brian Exp $
+# $Id: Makefile,v 1.44 1998/06/27 14:17:22 brian Exp $
PROG= ppp
-SRCS= arp.c async.c auth.c bundle.c ccp.c chap.c chat.c command.c \
+SRCS= arp.c async.c auth.c bundle.c cbcp.c ccp.c chap.c chat.c command.c \
datalink.c deflate.c defs.c filter.c fsm.c hdlc.c id.c ip.c \
ipcp.c iplist.c lcp.c link.c log.c lqr.c main.c mbuf.c modem.c \
mp.c pap.c physical.c pred.c probe.c prompt.c route.c server.c \
diff --git a/usr.sbin/ppp/auth.c b/usr.sbin/ppp/auth.c
index 420a32b..811709e 100644
--- a/usr.sbin/ppp/auth.c
+++ b/usr.sbin/ppp/auth.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: auth.c,v 1.30 1998/06/15 19:06:35 brian Exp $
+ * $Id: auth.c,v 1.31 1998/07/19 21:07:24 brian Exp $
*
* TODO:
* o Implement check against with registered IP addresses.
@@ -87,7 +87,40 @@ auth_CheckPasswd(const char *name, const char *data, const char *key)
}
int
-auth_Select(struct bundle *bundle, const char *name, struct physical *physical)
+auth_SetPhoneList(const char *name, char *phone, int phonelen)
+{
+ FILE *fp;
+ int n;
+ char *vector[6];
+ char buff[LINE_LEN];
+
+ fp = OpenSecret(SECRETFILE);
+ if (fp != NULL) {
+ while (fgets(buff, sizeof buff, fp)) {
+ if (buff[0] == '#')
+ continue;
+ buff[strlen(buff) - 1] = '\0';
+ memset(vector, '\0', sizeof vector);
+ n = MakeArgs(buff, vector, VECSIZE(vector));
+ if (n < 5)
+ continue;
+ if (strcmp(vector[0], name) == 0) {
+ CloseSecret(fp);
+ if (*vector[4] == '\0')
+ return 0;
+ strncpy(phone, vector[4], phonelen - 1);
+ phone[phonelen - 1] = '\0';
+ return 1; /* Valid */
+ }
+ }
+ CloseSecret(fp);
+ }
+ *phone = '\0';
+ return 0;
+}
+
+int
+auth_Select(struct bundle *bundle, const char *name)
{
FILE *fp;
int n;
@@ -111,10 +144,11 @@ auth_Select(struct bundle *bundle, const char *name, struct physical *physical)
continue;
if (strcmp(vector[0], name) == 0) {
CloseSecret(fp);
- if (n > 2 && !ipcp_UseHisaddr(bundle, vector[2], 1))
+ if (n > 2 && *vector[2] && strcmp(vector[2], "*") &&
+ !ipcp_UseHisaddr(bundle, vector[2], 1))
return 0;
ipcp_Setup(&bundle->ncp.ipcp);
- if (n > 3)
+ if (n > 3 && *vector[3] && strcmp(vector[3], "*"))
bundle_SetLabel(bundle, vector[3]);
return 1; /* Valid */
}
diff --git a/usr.sbin/ppp/auth.h b/usr.sbin/ppp/auth.h
index 8e751be..3766f03 100644
--- a/usr.sbin/ppp/auth.h
+++ b/usr.sbin/ppp/auth.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: auth.h,v 1.10.2.9 1998/05/01 19:23:54 brian Exp $
+ * $Id: auth.h,v 1.11 1998/05/21 21:44:03 brian Exp $
*
* TODO:
*/
@@ -45,4 +45,5 @@ extern int auth_Validate(struct bundle *, const char *, const char *,
struct physical *);
extern char *auth_GetSecret(struct bundle *, const char *, int,
struct physical *);
-extern int auth_Select(struct bundle *, const char *, struct physical *);
+extern int auth_SetPhoneList(const char *, char *, int);
+extern int auth_Select(struct bundle *, const char *);
diff --git a/usr.sbin/ppp/bundle.c b/usr.sbin/ppp/bundle.c
index c59bad4..217fc40 100644
--- a/usr.sbin/ppp/bundle.c
+++ b/usr.sbin/ppp/bundle.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: bundle.c,v 1.29 1998/07/29 18:21:11 brian Exp $
+ * $Id: bundle.c,v 1.30 1998/08/02 06:56:40 brian Exp $
*/
#include <sys/param.h>
@@ -82,6 +82,7 @@
#include "tun.h"
#include "prompt.h"
#include "chat.h"
+#include "cbcp.h"
#include "datalink.h"
#include "ip.h"
@@ -318,7 +319,7 @@ bundle_LinkAdded(struct bundle *bundle, struct datalink *dl)
bundle_StartIdleTimer(bundle);
}
-static void
+void
bundle_LinksRemoved(struct bundle *bundle)
{
struct datalink *dl;
diff --git a/usr.sbin/ppp/bundle.h b/usr.sbin/ppp/bundle.h
index 9e90ec4..25ce43f 100644
--- a/usr.sbin/ppp/bundle.h
+++ b/usr.sbin/ppp/bundle.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: bundle.h,v 1.10 1998/07/28 21:54:51 brian Exp $
+ * $Id: bundle.h,v 1.11 1998/07/29 18:21:13 brian Exp $
*/
#define PHASE_DEAD 0 /* Link is dead */
@@ -137,6 +137,7 @@ extern void bundle_Destroy(struct bundle *);
extern const char *bundle_PhaseName(struct bundle *);
#define bundle_Phase(b) ((b)->phase)
extern void bundle_NewPhase(struct bundle *, u_int);
+extern void bundle_LinksRemoved(struct bundle *);
extern int bundle_LinkIsUp(const struct bundle *);
extern int bundle_SetRoute(struct bundle *, int, struct in_addr,
struct in_addr, struct in_addr, int, int);
diff --git a/usr.sbin/ppp/ccp.c b/usr.sbin/ppp/ccp.c
index 9141d77..dc33e77 100644
--- a/usr.sbin/ppp/ccp.c
+++ b/usr.sbin/ppp/ccp.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: ccp.c,v 1.36 1998/06/27 23:48:40 brian Exp $
+ * $Id: ccp.c,v 1.37 1998/06/30 23:04:10 brian Exp $
*
* TODO:
* o Support other compression protocols
@@ -30,7 +30,6 @@
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include <termios.h>
#include "defs.h"
@@ -213,7 +212,7 @@ CcpInitRestartCounter(struct fsm *fp)
struct ccp *ccp = fsm2ccp(fp);
fp->FsmTimer.load = ccp->cfg.fsmretry * SECTICKS;
- fp->restart = 5;
+ fp->restart = DEF_REQs;
}
static void
diff --git a/usr.sbin/ppp/chap.c b/usr.sbin/ppp/chap.c
index bc2ed50..66ffe73 100644
--- a/usr.sbin/ppp/chap.c
+++ b/usr.sbin/ppp/chap.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: chap.c,v 1.34 1998/06/27 23:48:41 brian Exp $
+ * $Id: chap.c,v 1.35 1998/07/28 21:54:29 brian Exp $
*
* TODO:
*/
@@ -29,10 +29,10 @@
#ifdef HAVE_DES
#include <md4.h>
+#include <string.h>
#endif
#include <md5.h>
#include <stdlib.h>
-#include <string.h>
#include <termios.h>
#include "mbuf.h"
@@ -59,6 +59,7 @@
#include "mp.h"
#include "bundle.h"
#include "chat.h"
+#include "cbcp.h"
#include "datalink.h"
#ifdef HAVE_DES
#include "chap_ms.h"
diff --git a/usr.sbin/ppp/chat.c b/usr.sbin/ppp/chat.c
index 76699fb..fa81677 100644
--- a/usr.sbin/ppp/chat.c
+++ b/usr.sbin/ppp/chat.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: chat.c,v 1.49 1998/06/24 19:33:31 brian Exp $
+ * $Id: chat.c,v 1.50 1998/06/27 14:18:01 brian Exp $
*/
#include <sys/types.h>
@@ -64,6 +64,7 @@
#include "iplist.h"
#include "ipcp.h"
#include "filter.h"
+#include "cbcp.h"
#include "datalink.h"
#include "bundle.h"
@@ -673,9 +674,11 @@ ExpandString(struct chat *c, const char *str, char *result, int reslen,
result += strlen(result);
break;
case 'T':
- strncpy(result, c->phone, reslen);
- reslen -= strlen(result);
- result += strlen(result);
+ if (c->phone) {
+ strncpy(result, c->phone, reslen);
+ reslen -= strlen(result);
+ result += strlen(result);
+ }
break;
case 'U':
strncpy(result, c->physical->dl->bundle->cfg.auth.name, reslen);
diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c
index 69ca69c..bdd6aaf 100644
--- a/usr.sbin/ppp/command.c
+++ b/usr.sbin/ppp/command.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: command.c,v 1.157 1998/07/29 18:21:13 brian Exp $
+ * $Id: command.c,v 1.158 1998/07/31 19:50:24 brian Exp $
*
*/
#include <sys/types.h>
@@ -76,6 +76,7 @@
#include "prompt.h"
#include "chat.h"
#include "chap.h"
+#include "cbcp.h"
#include "datalink.h"
/* ``set'' values */
@@ -103,6 +104,8 @@
#define VAR_DNS 21
#define VAR_NBNS 22
#define VAR_MODE 23
+#define VAR_CALLBACK 24
+#define VAR_CBCP 25
/* ``accept|deny|disable|enable'' masks */
#define NEG_HISMASK (1)
@@ -122,7 +125,7 @@
#define NEG_DNS 50
const char Version[] = "2.0";
-const char VersionDate[] = "$Date: 1998/07/29 18:21:13 $";
+const char VersionDate[] = "$Date: 1998/07/31 19:50:24 $";
static int ShowCommand(struct cmdargs const *);
static int TerminalCommand(struct cmdargs const *);
@@ -1348,6 +1351,7 @@ SetVariable(struct cmdargs const *arg)
case VAR_PHONE:
strncpy(cx->cfg.phone.list, argp, sizeof cx->cfg.phone.list - 1);
cx->cfg.phone.list[sizeof cx->cfg.phone.list - 1] = '\0';
+ cx->phone.alt = cx->phone.next = NULL;
break;
case VAR_HANGUP:
@@ -1446,6 +1450,53 @@ SetVariable(struct cmdargs const *arg)
addr[0].s_addr = addr[1].s_addr;
}
break;
+
+ case VAR_CALLBACK:
+ cx->cfg.callback.opmask = 0;
+ for (dummyint = arg->argn; dummyint < arg->argc; dummyint++) {
+ if (!strcasecmp(arg->argv[dummyint], "auth"))
+ cx->cfg.callback.opmask |= CALLBACK_BIT(CALLBACK_AUTH);
+ else if (!strcasecmp(arg->argv[dummyint], "cbcp"))
+ cx->cfg.callback.opmask |= CALLBACK_BIT(CALLBACK_CBCP);
+ else if (!strcasecmp(arg->argv[dummyint], "e.164")) {
+ if (dummyint == arg->argc - 1)
+ log_Printf(LogWARN, "No E.164 arg (E.164 ignored) !\n");
+ else {
+ cx->cfg.callback.opmask |= CALLBACK_BIT(CALLBACK_E164);
+ strncpy(cx->cfg.callback.msg, arg->argv[++dummyint],
+ sizeof cx->cfg.callback.msg - 1);
+ cx->cfg.callback.msg[sizeof cx->cfg.callback.msg - 1] = '\0';
+ }
+ } else if (!strcasecmp(arg->argv[dummyint], "none"))
+ cx->cfg.callback.opmask |= CALLBACK_BIT(CALLBACK_NONE);
+ else
+ return -1;
+ }
+ if (cx->cfg.callback.opmask == CALLBACK_BIT(CALLBACK_NONE))
+ cx->cfg.callback.opmask = 0;
+ break;
+
+ case VAR_CBCP:
+ cx->cfg.cbcp.delay = 0;
+ *cx->cfg.cbcp.phone = '\0';
+ cx->cfg.cbcp.fsmretry = DEF_FSMRETRY;
+ if (arg->argc > arg->argn) {
+ strncpy(cx->cfg.cbcp.phone, arg->argv[arg->argn],
+ sizeof cx->cfg.cbcp.phone - 1);
+ cx->cfg.cbcp.phone[sizeof cx->cfg.cbcp.phone - 1] = '\0';
+ if (arg->argc > arg->argn + 1) {
+ cx->cfg.cbcp.delay = atoi(arg->argv[arg->argn + 1]);
+ if (arg->argc > arg->argn + 2) {
+ long_val = atol(arg->argv[arg->argn + 2]);
+ if (long_val < MIN_FSMRETRY)
+ log_Printf(LogWARN, "%ld: Invalid CBCP FSM retry period - min %d\n",
+ long_val, MIN_FSMRETRY);
+ else
+ cx->cfg.cbcp.fsmretry = long_val;
+ }
+ }
+ }
+ break;
}
return err ? 1 : 0;
@@ -1476,6 +1527,12 @@ static struct cmdtab const SetCommands[] = {
{"autoload", NULL, SetVariable, LOCAL_AUTH,
"auto link [de]activation", "set autoload maxtime maxload mintime minload",
(const void *)VAR_AUTOLOAD},
+ {"callback", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX,
+ "callback control", "set callback [none|auth|cbcp|"
+ "E.164 *|number[,number]...]...", (const void *)VAR_CALLBACK},
+ {"cbcp", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX,
+ "CBCP control", "set cbcp [*|phone[,phone...] [delay [timeout]]]",
+ (const void *)VAR_CBCP},
{"ccpretry", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX_OPT,
"FSM retry period", "set ccpretry value", (const void *)VAR_CCPRETRY},
{"chapretry", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX,
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);
}
diff --git a/usr.sbin/ppp/datalink.h b/usr.sbin/ppp/datalink.h
index 6803503..4080199 100644
--- a/usr.sbin/ppp/datalink.h
+++ b/usr.sbin/ppp/datalink.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: datalink.h,v 1.3 1998/05/28 23:15:35 brian Exp $
+ * $Id: datalink.h,v 1.4 1998/06/15 19:05:19 brian Exp $
*/
#define DATALINK_CLOSED (0)
@@ -34,7 +34,8 @@
#define DATALINK_READY (5)
#define DATALINK_LCP (6)
#define DATALINK_AUTH (7)
-#define DATALINK_OPEN (8)
+#define DATALINK_CBCP (8)
+#define DATALINK_OPEN (9)
#define DATALINK_MAXNAME (20) /* Maximum datalink::name length */
@@ -61,7 +62,7 @@ struct datalink {
unsigned packetmode : 1; /* Go into packet mode after login ? */
} script;
- struct pppTimer dial_timer; /* For timing between opens & scripts */
+ struct pppTimer dial_timer; /* For timing between close & open */
struct {
struct {
@@ -81,6 +82,8 @@ struct datalink {
int max; /* initially try again this number of times */
int timeout; /* Timeout before reconnect on carrier loss */
} reconnect;
+ struct callback callback; /* Direction depends on physical type */
+ struct cbcpcfg cbcp; /* Direction depends on phys type & callback */
} cfg; /* All our config data is in here */
struct {
@@ -90,6 +93,8 @@ struct datalink {
const char *chosen; /* Chosen phone number after DIAL */
} phone;
+ struct cbcp cbcp;
+
int dial_tries; /* currently try again this number of times */
unsigned reconnect_tries; /* currently try again this number of times */
@@ -126,6 +131,9 @@ extern void datalink_StayDown(struct datalink *);
extern void datalink_DontHangup(struct datalink *);
extern void datalink_AuthOk(struct datalink *);
extern void datalink_AuthNotOk(struct datalink *);
+extern void datalink_NCPUp(struct datalink *);
+extern void datalink_CBCPComplete(struct datalink *);
+extern void datalink_CBCPFailed(struct datalink *);
extern int datalink_Show(struct cmdargs const *);
extern int datalink_SetRedial(struct cmdargs const *);
extern int datalink_SetReconnect(struct cmdargs const *);
diff --git a/usr.sbin/ppp/deflate.c b/usr.sbin/ppp/deflate.c
index c0d83cf..4b0c930 100644
--- a/usr.sbin/ppp/deflate.c
+++ b/usr.sbin/ppp/deflate.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: deflate.c,v 1.9 1998/06/15 19:06:39 brian Exp $
+ * $Id: deflate.c,v 1.10 1998/06/16 19:40:36 brian Exp $
*/
#include <sys/types.h>
@@ -32,6 +32,7 @@
#include <stdlib.h>
#include <zlib.h>
+#include "defs.h"
#include "mbuf.h"
#include "log.h"
#include "timer.h"
diff --git a/usr.sbin/ppp/defs.h b/usr.sbin/ppp/defs.h
index cf22253..1c1ae88 100644
--- a/usr.sbin/ppp/defs.h
+++ b/usr.sbin/ppp/defs.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: defs.h,v 1.33 1998/06/27 23:48:43 brian Exp $
+ * $Id: defs.h,v 1.34 1998/07/11 02:48:36 brian Exp $
*
* TODO:
*/
@@ -52,6 +52,7 @@
#define DEF_LQRPERIOD 30 /* Default LQR frequency */
#define MIN_FSMRETRY 3 /* Minimum FSM retry frequency */
#define DEF_FSMRETRY 3 /* FSM retry frequency */
+#define DEF_REQs 5 /* This number of REQs in IRC */
#define CONFFILE "ppp.conf"
#define LINKUPFILE "ppp.linkup"
diff --git a/usr.sbin/ppp/hdlc.c b/usr.sbin/ppp/hdlc.c
index 5a2152b..d03c9f3 100644
--- a/usr.sbin/ppp/hdlc.c
+++ b/usr.sbin/ppp/hdlc.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: hdlc.c,v 1.34 1998/06/27 23:48:44 brian Exp $
+ * $Id: hdlc.c,v 1.35 1998/08/01 01:02:12 brian Exp $
*
* TODO:
*/
@@ -58,6 +58,7 @@
#include "prompt.h"
#include "chat.h"
#include "mp.h"
+#include "cbcp.h"
#include "datalink.h"
#include "filter.h"
#include "bundle.h"
@@ -395,6 +396,14 @@ hdlc_DecodePacket(struct bundle *bundle, u_short proto, struct mbuf * bp,
mbuf_Free(bp);
}
break;
+ case PROTO_CBCP:
+ if (p)
+ cbcp_Input(p, bp);
+ else {
+ log_Printf(LogERROR, "DecodePacket: CBCP: Not a physical link !\n");
+ mbuf_Free(bp);
+ }
+ break;
case PROTO_LQR:
if (p) {
p->hdlc.lqm.lqr.SaveInLQRs++;
diff --git a/usr.sbin/ppp/ip.c b/usr.sbin/ppp/ip.c
index 55e0a59..9d80c24 100644
--- a/usr.sbin/ppp/ip.c
+++ b/usr.sbin/ppp/ip.c
@@ -17,14 +17,16 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: ip.c,v 1.48 1998/06/27 23:48:45 brian Exp $
+ * $Id: ip.c,v 1.49 1998/07/11 19:05:24 brian Exp $
*
* TODO:
* o Return ICMP message for filterd packet
* and optionaly record it into log.
*/
#include <sys/types.h>
+#ifdef __OpenBSD__
#include <sys/socket.h>
+#endif
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
diff --git a/usr.sbin/ppp/ipcp.c b/usr.sbin/ppp/ipcp.c
index 7edbd0c..d61016f 100644
--- a/usr.sbin/ppp/ipcp.c
+++ b/usr.sbin/ppp/ipcp.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: ipcp.c,v 1.61 1998/06/27 16:24:52 brian Exp $
+ * $Id: ipcp.c,v 1.62 1998/06/27 23:48:45 brian Exp $
*
* TODO:
* o More RFC1772 backward compatibility
@@ -548,7 +548,7 @@ IpcpInitRestartCounter(struct fsm * fp)
struct ipcp *ipcp = fsm2ipcp(fp);
fp->FsmTimer.load = ipcp->cfg.fsmretry * SECTICKS;
- fp->restart = 5;
+ fp->restart = DEF_REQs;
}
static void
diff --git a/usr.sbin/ppp/lcp.c b/usr.sbin/ppp/lcp.c
index 897eb23..47d2074 100644
--- a/usr.sbin/ppp/lcp.c
+++ b/usr.sbin/ppp/lcp.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: lcp.c,v 1.60 1998/06/25 22:33:28 brian Exp $
+ * $Id: lcp.c,v 1.61 1998/06/27 23:48:47 brian Exp $
*
* TODO:
* o Limit data field length by MRU
@@ -61,6 +61,7 @@
#include "chat.h"
#include "auth.h"
#include "chap.h"
+#include "cbcp.h"
#include "datalink.h"
#include "bundle.h"
@@ -237,6 +238,7 @@ lcp_Setup(struct lcp *lcp, int openmode)
lcp->his_lqrperiod = 0;
lcp->his_acfcomp = 0;
lcp->his_auth = 0;
+ lcp->his_callback.opmask = 0;
lcp->his_shortseq = 0;
lcp->want_mru = lcp->cfg.mru;
@@ -245,6 +247,8 @@ lcp_Setup(struct lcp *lcp, int openmode)
lcp->want_acfcomp = IsEnabled(lcp->cfg.acfcomp) ? 1 : 0;
if (lcp->fsm.parent) {
+ struct physical *p = link2physical(lcp->fsm.link);
+
lcp->his_accmap = 0xffffffff;
lcp->want_accmap = lcp->cfg.accmap;
lcp->his_protocomp = 0;
@@ -252,6 +256,10 @@ lcp_Setup(struct lcp *lcp, int openmode)
lcp->want_magic = GenerateMagic();
lcp->want_auth = IsEnabled(lcp->cfg.chap) ? PROTO_CHAP :
IsEnabled(lcp->cfg.pap) ? PROTO_PAP : 0;
+ if (p->type != PHYS_DIRECT)
+ memcpy(&lcp->want_callback, &p->dl->cfg.callback, sizeof(struct callback));
+ else
+ lcp->want_callback.opmask = 0;
lcp->want_lqrperiod = IsEnabled(lcp->cfg.lqr) ?
lcp->cfg.lqrperiod * 100 : 0;
} else {
@@ -259,6 +267,7 @@ lcp_Setup(struct lcp *lcp, int openmode)
lcp->his_protocomp = lcp->want_protocomp = 1;
lcp->want_magic = 0;
lcp->want_auth = 0;
+ lcp->want_callback.opmask = 0;
lcp->want_lqrperiod = 0;
}
@@ -274,7 +283,7 @@ LcpInitRestartCounter(struct fsm * fp)
struct lcp *lcp = fsm2lcp(fp);
fp->FsmTimer.load = lcp->cfg.fsmretry * SECTICKS;
- fp->restart = 5;
+ fp->restart = DEF_REQs;
}
static void
@@ -336,6 +345,26 @@ LcpSendConfigReq(struct fsm *fp)
break;
}
+ if (!REJECTED(lcp, TY_CALLBACK)) {
+ if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_AUTH)) {
+ *o->data = CALLBACK_AUTH;
+ INC_LCP_OPT(TY_CALLBACK, 3, o);
+ } else if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_CBCP)) {
+ *o->data = CALLBACK_CBCP;
+ INC_LCP_OPT(TY_CALLBACK, 3, o);
+ } else if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_E164)) {
+ int sz = strlen(lcp->want_callback.msg);
+
+ if (sz > sizeof o->data - 1) {
+ sz = sizeof o->data - 1;
+ log_Printf(LogWARN, "Truncating E164 data to %d octets (oops!)\n", sz);
+ }
+ *o->data = CALLBACK_E164;
+ memcpy(o->data + 1, lcp->want_callback.msg, sz);
+ INC_LCP_OPT(TY_CALLBACK, sz + 3, o);
+ }
+ }
+
if (lcp->want_mrru && !REJECTED(lcp, TY_MRRU)) {
*(u_int16_t *)o->data = htons(lcp->want_mrru);
INC_LCP_OPT(TY_MRRU, 4, o);
@@ -371,6 +400,11 @@ static void
LcpSendTerminateAck(struct fsm *fp, u_char id)
{
/* Send Term ACK please */
+ struct physical *p = link2physical(fp->link);
+
+ if (p && p->dl->state == DATALINK_CBCP)
+ cbcp_ReceiveTerminateReq(p);
+
fsm_Output(fp, CODE_TERMACK, id, NULL, 0);
}
@@ -417,13 +451,32 @@ LcpLayerDown(struct fsm *fp)
lcp_Setup(fsm2lcp(fp), 0);
}
+static int
+E164ok(struct callback *cb, char *req, int sz)
+{
+ char list[sizeof cb->msg], *next;
+ int len;
+
+ if (!strcmp(cb->msg, "*"))
+ return 1;
+
+ strncpy(list, cb->msg, sizeof list - 1);
+ list[sizeof list - 1] = '\0';
+ for (next = strtok(list, ","); next; next = strtok(NULL, ",")) {
+ len = strlen(next);
+ if (sz == len && !memcmp(list, req, sz))
+ return 1;
+ }
+ return 0;
+}
+
static void
LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type,
struct fsm_decode *dec)
{
/* Deal with incoming PROTO_LCP */
struct lcp *lcp = fsm2lcp(fp);
- int type, length, sz, pos;
+ int type, length, sz, pos, op, callback_req;
u_int32_t magic, accmap;
u_short mtu, mru, proto;
u_int16_t *sp;
@@ -432,20 +485,22 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type,
struct mp *mp;
struct physical *p = link2physical(fp->link);
+ callback_req = 0;
+
while (plen >= sizeof(struct fsmconfig)) {
type = *cp;
length = cp[1];
- if (length == 0) {
- log_Printf(LogLCP, "%s: LCP size zero\n", fp->link->name);
- break;
- }
-
if (type < 0 || type >= NCFTYPES)
snprintf(request, sizeof request, " <%d>[%d]", type, length);
else
snprintf(request, sizeof request, " %s[%d]", cftypes[type], length);
+ if (length < 2) {
+ log_Printf(LogLCP, "%s:%s: Bad LCP length\n", fp->link->name, request);
+ break;
+ }
+
switch (type) {
case TY_MRRU:
mp = &lcp->fsm.bundle->ncp.mp;
@@ -782,6 +837,103 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type,
}
break;
+ case TY_CALLBACK:
+ if (length == 2)
+ op = CALLBACK_NONE;
+ else
+ op = (int)cp[2];
+ sz = length - 3;
+ switch (op) {
+ case CALLBACK_AUTH:
+ log_Printf(LogLCP, "%s Auth\n", request);
+ break;
+ case CALLBACK_DIALSTRING:
+ log_Printf(LogLCP, "%s Dialstring %.*s\n", request, sz, cp + 3);
+ break;
+ case CALLBACK_LOCATION:
+ log_Printf(LogLCP, "%s Location %.*s\n", request, sz, cp + 3);
+ break;
+ case CALLBACK_E164:
+ log_Printf(LogLCP, "%s E.164 (%.*s)\n", request, sz, cp + 3);
+ break;
+ case CALLBACK_NAME:
+ log_Printf(LogLCP, "%s Name %.*s\n", request, sz, cp + 3);
+ break;
+ case CALLBACK_CBCP:
+ log_Printf(LogLCP, "%s CBCP\n", request);
+ break;
+ default:
+ log_Printf(LogLCP, "%s ???\n", request);
+ break;
+ }
+
+ switch (mode_type) {
+ case MODE_REQ:
+ callback_req = 1;
+ if (p->type != PHYS_DIRECT)
+ goto reqreject;
+ if ((p->dl->cfg.callback.opmask & CALLBACK_BIT(op)) &&
+ (op != CALLBACK_AUTH || p->link.lcp.auth_ineed) &&
+ (op != CALLBACK_E164 ||
+ E164ok(&p->dl->cfg.callback, cp + 3, sz))) {
+ lcp->his_callback.opmask = CALLBACK_BIT(op);
+ if (sz > sizeof lcp->his_callback.msg - 1) {
+ sz = sizeof lcp->his_callback.msg - 1;
+ log_Printf(LogWARN, "Truncating option arg to %d octets\n", sz);
+ }
+ memcpy(lcp->his_callback.msg, cp + 3, sz);
+ lcp->his_callback.msg[sz] = '\0';
+ memcpy(dec->ackend, cp, sz + 3);
+ dec->ackend += sz + 3;
+ } else if ((p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_AUTH)) &&
+ p->link.lcp.auth_ineed) {
+ *dec->nakend++ = *cp;
+ *dec->nakend++ = 3;
+ *dec->nakend++ = CALLBACK_AUTH;
+ } else if (p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_CBCP)) {
+ *dec->nakend++ = *cp;
+ *dec->nakend++ = 3;
+ *dec->nakend++ = CALLBACK_CBCP;
+ } else if (p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_E164)) {
+ *dec->nakend++ = *cp;
+ *dec->nakend++ = 3;
+ *dec->nakend++ = CALLBACK_E164;
+ } else if (p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_AUTH)) {
+ log_Printf(LogWARN, "Cannot insist on auth callback without"
+ " PAP or CHAP enabled !\n");
+ *dec->nakend++ = *cp;
+ *dec->nakend++ = 2;
+ } else
+ goto reqreject;
+ break;
+ case MODE_NAK:
+ /* We don't do what he NAKs want, we do things in our preferred order */
+ if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_AUTH))
+ lcp->want_callback.opmask &= ~CALLBACK_BIT(CALLBACK_AUTH);
+ else if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_CBCP))
+ lcp->want_callback.opmask &= ~CALLBACK_BIT(CALLBACK_CBCP);
+ else if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_E164))
+ lcp->want_callback.opmask &= ~CALLBACK_BIT(CALLBACK_E164);
+ if (lcp->want_callback.opmask == CALLBACK_BIT(CALLBACK_NONE)) {
+ log_Printf(LogPHASE, "Peer NAKd all callbacks, trying none\n");
+ lcp->want_callback.opmask = 0;
+ } else if (!lcp->want_callback.opmask) {
+ log_Printf(LogPHASE, "Peer NAKd last configured callback\n");
+ fsm_Close(&lcp->fsm);
+ }
+ break;
+ case MODE_REJ:
+ if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_NONE)) {
+ lcp->his_reject |= (1 << type);
+ lcp->want_callback.opmask = 0;
+ } else {
+ log_Printf(LogPHASE, "Peer rejected *required* callback\n");
+ fsm_Close(&lcp->fsm);
+ }
+ break;
+ }
+ break;
+
case TY_SHORTSEQ:
mp = &lcp->fsm.bundle->ncp.mp;
log_Printf(LogLCP, "%s\n", request);
@@ -874,6 +1026,25 @@ reqreject:
}
if (mode_type != MODE_NOP) {
+ if (mode_type == MODE_REQ && p && p->type == PHYS_DIRECT &&
+ p->dl->cfg.callback.opmask && !callback_req &&
+ !(p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_NONE))) {
+ /* We *REQUIRE* that the peer requests callback */
+ *dec->nakend++ = TY_CALLBACK;
+ *dec->nakend++ = 3;
+ if ((p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_AUTH)) &&
+ p->link.lcp.auth_ineed)
+ *dec->nakend++ = CALLBACK_AUTH;
+ else if (p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_CBCP))
+ *dec->nakend++ = CALLBACK_CBCP;
+ else if (p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_E164))
+ *dec->nakend++ = CALLBACK_E164;
+ else {
+ log_Printf(LogWARN, "Cannot insist on auth callback without"
+ " PAP or CHAP enabled !\n");
+ dec->nakend[-1] = 2; /* XXX: Silly ! */
+ }
+ }
if (dec->rejend != dec->rej) {
/* rejects are preferred */
dec->ackend = dec->ack;
diff --git a/usr.sbin/ppp/lcp.h b/usr.sbin/ppp/lcp.h
index 03e87a4..62dce12 100644
--- a/usr.sbin/ppp/lcp.h
+++ b/usr.sbin/ppp/lcp.h
@@ -15,11 +15,27 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: lcp.h,v 1.17 1998/05/21 21:46:03 brian Exp $
+ * $Id: lcp.h,v 1.18 1998/06/27 23:48:48 brian Exp $
*
* TODO:
*/
+/* callback::opmask values */
+#define CALLBACK_AUTH (0)
+#define CALLBACK_DIALSTRING (1) /* Don't do this */
+#define CALLBACK_LOCATION (2) /* Don't do this */
+#define CALLBACK_E164 (3)
+#define CALLBACK_NAME (4) /* Don't do this */
+#define CALLBACK_CBCP (6)
+#define CALLBACK_NONE (14) /* No callback is ok */
+
+#define CALLBACK_BIT(n) ((n) < 0 ? 0 : 1 << (n))
+
+struct callback {
+ int opmask; /* want these types of callback */
+ char msg[SCRIPT_LEN]; /* with this data (E.164) */
+};
+
#define REJECTED(p, x) ((p)->his_reject & (1<<(x)))
struct lcp {
@@ -30,6 +46,7 @@ struct lcp {
u_int32_t his_magic; /* Peers magic number */
u_int32_t his_lqrperiod; /* Peers LQR frequency (100ths of seconds) */
u_short his_auth; /* Peer wants this type of authentication */
+ struct callback his_callback; /* Peer wants callback ? */
unsigned his_shortseq : 1; /* Peer would like only 12bit seqs (MP) */
unsigned his_protocomp : 1; /* Does peer do Protocol field compression */
unsigned his_acfcomp : 1; /* Does peer do addr & cntrl fld compression */
@@ -40,6 +57,7 @@ struct lcp {
u_int32_t want_magic; /* Our magic number */
u_int32_t want_lqrperiod; /* Our LQR frequency (100ths of seconds) */
u_short want_auth; /* We want this type of authentication */
+ struct callback want_callback;/* We want callback ? */
unsigned want_shortseq : 1; /* I'd like only 12bit seqs (MP) */
unsigned want_protocomp : 1; /* Do we do protocol field compression */
unsigned want_acfcomp : 1; /* Do we do addr & cntrl fld compression */
@@ -80,11 +98,13 @@ struct lcp {
#define TY_ACFCOMP 8 /* Address-and-Control-Field-Compression */
#define TY_FCSALT 9 /* FCS-Alternatives */
#define TY_SDP 10 /* Self-Describing-Padding */
+#define TY_CALLBACK 13 /* Callback */
+#define TY_CFRAMES 15 /* Compound-frames */
#define TY_MRRU 17 /* Max Reconstructed Receive Unit (MP) */
#define TY_SHORTSEQ 18 /* Want short seqs (12bit) please (see mp.h) */
#define TY_ENDDISC 19 /* Endpoint discriminator */
-#define MAX_LCP_OPT_LEN 10
+#define MAX_LCP_OPT_LEN 20
struct lcp_opt {
u_char id;
u_char len;
diff --git a/usr.sbin/ppp/lcpproto.h b/usr.sbin/ppp/lcpproto.h
index 8f15fe6..8434822 100644
--- a/usr.sbin/ppp/lcpproto.h
+++ b/usr.sbin/ppp/lcpproto.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: lcpproto.h,v 1.10.2.2 1998/05/15 18:21:07 brian Exp $
+ * $Id: lcpproto.h,v 1.11 1998/05/21 21:46:05 brian Exp $
*
* TODO:
*/
@@ -38,5 +38,6 @@
#define PROTO_LCP 0xc021
#define PROTO_PAP 0xc023
+#define PROTO_CBCP 0xc029
#define PROTO_LQR 0xc025
#define PROTO_CHAP 0xc223
diff --git a/usr.sbin/ppp/link.c b/usr.sbin/ppp/link.c
index 21be939..88a9010 100644
--- a/usr.sbin/ppp/link.c
+++ b/usr.sbin/ppp/link.c
@@ -23,16 +23,16 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: link.c,v 1.2 1998/05/21 21:46:10 brian Exp $
+ * $Id: link.c,v 1.3 1998/06/27 23:48:49 brian Exp $
*
*/
#include <sys/types.h>
#include <stdio.h>
-#include <string.h>
#include <termios.h>
+#include "defs.h"
#include "mbuf.h"
#include "log.h"
#include "timer.h"
diff --git a/usr.sbin/ppp/log.c b/usr.sbin/ppp/log.c
index acc76f5..afb336f 100644
--- a/usr.sbin/ppp/log.c
+++ b/usr.sbin/ppp/log.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: log.c,v 1.31 1998/06/15 19:06:48 brian Exp $
+ * $Id: log.c,v 1.32 1998/08/02 13:01:15 brian Exp $
*/
#include <sys/types.h>
@@ -43,6 +43,7 @@
static const char *LogNames[] = {
"Async",
+ "CBCP",
"CCP",
"Chat",
"Command",
diff --git a/usr.sbin/ppp/log.h b/usr.sbin/ppp/log.h
index 399cde9..87c9618 100644
--- a/usr.sbin/ppp/log.h
+++ b/usr.sbin/ppp/log.h
@@ -23,30 +23,31 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: log.h,v 1.20 1998/05/23 22:24:41 brian Exp $
+ * $Id: log.h,v 1.21 1998/08/02 13:01:16 brian Exp $
*/
#define LogMIN (1)
#define LogASYNC (1) /* syslog(LOG_INFO, ....) */
-#define LogCCP (2)
-#define LogCHAT (3)
-#define LogCOMMAND (4)
-#define LogCONNECT (5)
-#define LogDEBUG (6) /* syslog(LOG_DEBUG, ....) */
-#define LogHDLC (7)
-#define LogID0 (8)
-#define LogIPCP (9)
-#define LogLCP (10)
-#define LogLQM (11)
-#define LogPHASE (12)
-#define LogTCPIP (13)
-#define LogTIMER (14) /* syslog(LOG_DEBUG, ....) */
-#define LogTUN (15) /* If set, tun%d is output with each message */
-#define LogMAXCONF (15)
-#define LogWARN (16) /* Sent to VarTerm else syslog(LOG_WARNING, ) */
-#define LogERROR (17) /* syslog(LOG_ERR, ....), + sent to VarTerm */
-#define LogALERT (18) /* syslog(LOG_ALERT, ....) */
-#define LogMAX (18)
+#define LogCBCP (2)
+#define LogCCP (3)
+#define LogCHAT (4)
+#define LogCOMMAND (5)
+#define LogCONNECT (6)
+#define LogDEBUG (7) /* syslog(LOG_DEBUG, ....) */
+#define LogHDLC (8)
+#define LogID0 (9)
+#define LogIPCP (10)
+#define LogLCP (11)
+#define LogLQM (12)
+#define LogPHASE (13)
+#define LogTCPIP (14)
+#define LogTIMER (15) /* syslog(LOG_DEBUG, ....) */
+#define LogTUN (16) /* If set, tun%d is output with each message */
+#define LogMAXCONF (16)
+#define LogWARN (17) /* Sent to VarTerm else syslog(LOG_WARNING, ) */
+#define LogERROR (18) /* syslog(LOG_ERR, ....), + sent to VarTerm */
+#define LogALERT (19) /* syslog(LOG_ALERT, ....) */
+#define LogMAX (19)
struct mbuf;
struct cmdargs;
diff --git a/usr.sbin/ppp/lqr.c b/usr.sbin/ppp/lqr.c
index 4970672..a54af41 100644
--- a/usr.sbin/ppp/lqr.c
+++ b/usr.sbin/ppp/lqr.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: lqr.c,v 1.28 1998/06/26 19:02:40 brian Exp $
+ * $Id: lqr.c,v 1.29 1998/06/27 23:48:49 brian Exp $
*
* o LQR based on RFC1333
*
@@ -52,6 +52,7 @@
#include "auth.h"
#include "chap.h"
#include "command.h"
+#include "cbcp.h"
#include "datalink.h"
struct echolqr {
diff --git a/usr.sbin/ppp/main.c b/usr.sbin/ppp/main.c
index 0ac4785..408e5e9 100644
--- a/usr.sbin/ppp/main.c
+++ b/usr.sbin/ppp/main.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: main.c,v 1.139 1998/06/27 14:18:07 brian Exp $
+ * $Id: main.c,v 1.140 1998/08/02 06:56:40 brian Exp $
*
* TODO:
*/
@@ -66,6 +66,7 @@
#include "prompt.h"
#include "chat.h"
#include "chap.h"
+#include "cbcp.h"
#include "datalink.h"
#ifndef O_NONBLOCK
diff --git a/usr.sbin/ppp/mbuf.c b/usr.sbin/ppp/mbuf.c
index 2f5df24..5b44348 100644
--- a/usr.sbin/ppp/mbuf.c
+++ b/usr.sbin/ppp/mbuf.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: mbuf.c,v 1.17 1998/06/16 19:40:20 brian Exp $
+ * $Id: mbuf.c,v 1.18 1998/06/27 23:48:50 brian Exp $
*
*/
#include <sys/types.h>
@@ -154,8 +154,8 @@ mbuf_Show(struct cmdargs const *arg)
{
int i;
static const char *mbuftype[] = {
- "async", "fsm", "hdlcout", "ipin", "echo", "lqr", "link", "vjcomp",
- "ipq", "mp" };
+ "async", "fsm", "cbcp", "hdlcout", "ipin", "echo", "lqr", "link",
+ "vjcomp", "ipq", "mp" };
for (i = 1; i < MB_MAX; i += 2)
prompt_Printf(arg->prompt, "%10.10s: %04d\t%10.10s: %04d\n",
@@ -176,8 +176,8 @@ mbuf_Log()
MemMap[1].count, MemMap[2].count, MemMap[3].count, MemMap[4].count);
log_Printf(LogDEBUG, "mbuf_Log: 5: %d 6: %d 7: %d 8: %d\n",
MemMap[5].count, MemMap[6].count, MemMap[7].count, MemMap[8].count);
- log_Printf(LogDEBUG, "mbuf_Log: 9: %d 10: %d\n",
- MemMap[9].count, MemMap[10].count);
+ log_Printf(LogDEBUG, "mbuf_Log: 9: %d 10: %d 11: %d\n",
+ MemMap[9].count, MemMap[10].count, MemMap[11].count);
}
struct mbuf *
diff --git a/usr.sbin/ppp/mbuf.h b/usr.sbin/ppp/mbuf.h
index 4c7612f..4ee8e40 100644
--- a/usr.sbin/ppp/mbuf.h
+++ b/usr.sbin/ppp/mbuf.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: mbuf.h,v 1.11.2.5 1998/05/01 19:25:24 brian Exp $
+ * $Id: mbuf.h,v 1.12 1998/05/21 21:46:49 brian Exp $
*
* TODO:
*/
@@ -40,14 +40,15 @@ struct mqueue {
#define MB_ASYNC 1
#define MB_FSM 2
-#define MB_HDLCOUT 3
-#define MB_IPIN 4
-#define MB_ECHO 5
-#define MB_LQR 6
-#define MB_LINK 7
-#define MB_VJCOMP 8
-#define MB_IPQ 9
-#define MB_MP 10
+#define MB_CBCP 3
+#define MB_HDLCOUT 4
+#define MB_IPIN 5
+#define MB_ECHO 6
+#define MB_LQR 7
+#define MB_LINK 8
+#define MB_VJCOMP 9
+#define MB_IPQ 10
+#define MB_MP 11
#define MB_MAX MB_MP
struct cmdargs;
diff --git a/usr.sbin/ppp/modem.c b/usr.sbin/ppp/modem.c
index 4041d93..94da68e 100644
--- a/usr.sbin/ppp/modem.c
+++ b/usr.sbin/ppp/modem.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: modem.c,v 1.95 1998/07/03 17:24:38 brian Exp $
+ * $Id: modem.c,v 1.96 1998/07/29 18:20:53 brian Exp $
*
* TODO:
*/
@@ -36,12 +36,12 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sys/ioctl.h>
#include <sys/tty.h>
#include <sys/uio.h>
#include <sys/wait.h>
#include <unistd.h>
#ifdef __OpenBSD__
+#include <sys/ioctl.h>
#include <util.h>
#else
#include <libutil.h>
@@ -74,6 +74,7 @@
#include "chat.h"
#include "auth.h"
#include "chap.h"
+#include "cbcp.h"
#include "datalink.h"
diff --git a/usr.sbin/ppp/mp.c b/usr.sbin/ppp/mp.c
index 46a686e..b4223cd 100644
--- a/usr.sbin/ppp/mp.c
+++ b/usr.sbin/ppp/mp.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: mp.c,v 1.11 1998/06/24 19:33:34 brian Exp $
+ * $Id: mp.c,v 1.12 1998/06/30 23:04:17 brian Exp $
*/
#include <sys/types.h>
@@ -68,6 +68,7 @@
#include "filter.h"
#include "mp.h"
#include "chap.h"
+#include "cbcp.h"
#include "datalink.h"
#include "bundle.h"
#include "ip.h"
diff --git a/usr.sbin/ppp/pap.c b/usr.sbin/ppp/pap.c
index afbc3a2..cc14300 100644
--- a/usr.sbin/ppp/pap.c
+++ b/usr.sbin/ppp/pap.c
@@ -18,7 +18,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: pap.c,v 1.24 1998/06/27 23:48:51 brian Exp $
+ * $Id: pap.c,v 1.25 1998/07/28 21:54:30 brian Exp $
*
* TODO:
*/
@@ -28,7 +28,6 @@
#include <netinet/ip.h>
#include <sys/un.h>
-#include <string.h>
#include <termios.h>
#include "mbuf.h"
@@ -56,6 +55,7 @@
#include "bundle.h"
#include "chat.h"
#include "chap.h"
+#include "cbcp.h"
#include "datalink.h"
static const char *papcodes[] = { "???", "REQUEST", "SUCCESS", "FAILURE" };
diff --git a/usr.sbin/ppp/physical.c b/usr.sbin/ppp/physical.c
index 952d2e6..578a7de 100644
--- a/usr.sbin/ppp/physical.c
+++ b/usr.sbin/ppp/physical.c
@@ -16,7 +16,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: physical.c,v 1.3 1998/05/23 22:24:47 brian Exp $
+ * $Id: physical.c,v 1.4 1998/06/27 14:18:09 brian Exp $
*
*/
@@ -217,8 +217,9 @@ physical_Logout(struct physical *phys)
int
physical_SetMode(struct physical *p, int mode)
{
- if (p->type & (PHYS_DIRECT|PHYS_DEDICATED)
- || mode & (PHYS_DIRECT|PHYS_DEDICATED)) {
+ if ((p->type & (PHYS_DIRECT|PHYS_DEDICATED) ||
+ mode & (PHYS_DIRECT|PHYS_DEDICATED)) &&
+ (!(p->type & PHYS_DIRECT) || !(mode & PHYS_BACKGROUND))) {
log_Printf(LogWARN, "%s: Cannot change mode %s to %s\n", p->link.name,
mode2Nam(p->type), mode2Nam(mode));
return 0;
diff --git a/usr.sbin/ppp/ppp.8 b/usr.sbin/ppp/ppp.8
index 2b09f56..15c7031 100644
--- a/usr.sbin/ppp/ppp.8
+++ b/usr.sbin/ppp/ppp.8
@@ -1,4 +1,4 @@
-.\" $Id: ppp.8,v 1.112 1998/07/29 18:21:17 brian Exp $
+.\" $Id: ppp.8,v 1.113 1998/07/31 19:50:24 brian Exp $
.Dd 20 September 1995
.Os FreeBSD
.Dt PPP 8
@@ -74,6 +74,10 @@ command via its diagnostic socket. A
will force an LCP renegotiation, and a
.Dv SIGTERM
will force it to exit.
+.It Supports client callback.
+.Nm Ppp
+can use either the standard LCP callback protocol or the Microsoft
+CallBack Control Protocol (ftp://ftp.microsoft.com/developr/rfc/cbcp.txt).
.It Supports packet aliasing.
Packet aliasing (a.k.a. IP masquerading) allows computers on a
private, unregistered network to access the Internet. The
@@ -161,7 +165,7 @@ is installed as user
and group
.Dv network ,
with permissions
-.Dv 4550 .
+.Dv 4554 .
By default,
.Nm
will not run if the invoking user id is not zero. This may be overridden
@@ -278,6 +282,15 @@ lines to the file
Refer to the
.Xr resolv.conf 5
manual page for details.
+.Pp
+Alternatively, if the peer supports it,
+.Nm
+can be configured to ask the peer for the nameserver address(es) and to
+update
+.Pa /etc/resolv.conf
+automatically. Refer to the
+.Dq enable dns
+command below for details.
.El
.Sh MANUAL DIALING
In the following examples, we assume that your machine name is
@@ -477,11 +490,20 @@ portion of the prompt will change to
# ppp MyISP
...
ppp ON awfulhak> dial
-dial OK!
-login OK!
+Ppp ON awfulhak>
+PPp ON awfulhak>
PPP ON awfulhak>
.Ed
.Pp
+The Ppp prompt indicates that
+.Nm
+has entered the authentication phase. The PPp prompt indicates that
+.Nm
+has entered the network phase. The PPP prompt indicates that
+.Nm
+has successfully negotiated a network layer protocol and is in
+a usable state.
+.Pp
If the
.Pa /etc/ppp/ppp.linkup
file is available, its contents are executed
@@ -905,7 +927,9 @@ Instead of running
over a serial link, it is possible to
use a TCP connection instead by specifying a host and port as the
device:
+.Pp
.Dl set device ui-gate:6669
+.Pp
Instead of opening a serial device,
.Nm
will open a TCP connection to the given machine on the given
@@ -918,13 +942,17 @@ connection on the receiving machine (ui-gate). This is
done by first updating
.Pa /etc/services
to name the service:
+.Pp
.Dl ppp-in 6669/tcp # Incoming PPP connections over TCP
+.Pp
and updating
.Pa /etc/inetd.conf
to tell
.Xr inetd 8
how to deal with incoming connections on that port:
+.Pp
.Dl ppp-in stream tcp nowait root /usr/sbin/ppp ppp -direct ppp-in
+.Pp
Don't forget to send a
.Dv HUP
signal to
@@ -986,7 +1014,9 @@ Again, if you're enabling PAP, you'll also need:
We're assigning the address of 10.0.4.1 to ui-gate, and the address
10.0.4.2 to awfulhak.
To open the connection, just type
+.Pp
.Dl awfulhak # ppp -background ui-gate
+.Pp
The result will be an additional "route" on awfulhak to the
10.0.2.0/24 network via the TCP connection, and an additional
"route" on ui-gate to the 10.0.1.0/24 network.
@@ -1442,7 +1472,10 @@ logging) so that the actual password is not compromised
.Ar chat
logging is active rather than the actual password.
.Pp
-Login scripts vary greatly between ISPs.
+Login scripts vary greatly between ISPs. If you're setting one up
+for the first time,
+.Em ENABLE CHAT LOGGING
+so that you can see if your script is behaving as you expect.
.It
Use
.Dq set line
@@ -1531,6 +1564,20 @@ set authkey MyPassword
Both are accepted by default, so
.Nm
will provide whatever your ISP requires.
+.Pp
+It should be noted that a login script is rarely (if ever) required
+when PAP or CHAP are in use.
+.It
+Ask your ISP to authenticate your nameserver address(es) with the line
+.Bd -literal -offset indent
+enable dns
+.Ed
+Do
+.Em NOT
+do this if you are running an local DNS, as
+.Nm
+will simply circumvent its use by entering some nameserver lines in
+.Pa /etc/resolv.conf .
.El
.Pp
Please refer to
@@ -1540,12 +1587,13 @@ and
for some real examples. The pmdemand label should be appropriate for most
ISPs.
.Sh LOGGING FACILITY
-.Nm
+.Nm Ppp
is able to generate the following log info either via
.Xr syslog 3
or directly to the screen:
.Bl -column SMMMMMM -offset indent
.It Li Async Dump async level packet in hex
+.It Li CBCP Generate CBCP (CallBack Control Protocol) logs
.It Li CCP Generate a CCP packet trace
.It Li Chat Generate Chat script trace log
.It Li Command Log commands executed
@@ -2571,6 +2619,83 @@ If
is zero, this timer is disabled. Because both values default to zero,
.Ar demand-dial
links will stay active until the bundle idle timer expires.
+.It set callback [none|auth|cbcp|E.164 *|number[,number]...]...
+If no arguments are given, callback is disabled, otherwise,
+.Nm
+will request (or in
+.Ar direct
+mode, will accept) one of the given protocols. If a request is NAK'd
+.Nm
+will request another, until no options remain at which point
+.Nm
+will terminate negotiations.
+The options are as follows (in this order of preference):
+.Pp
+.Bl -tag
+.It auth
+The callee is expected to decide the callback number based on
+authentication. If
+.Nm
+is the callee, the number should be specified as the fifth field of
+the peers entry in
+.Pa /etc/ppp/ppp.secret .
+.It cbcp
+Microsofts callback control protocol is used. See
+.Dq set cbcp
+below.
+.It E.164 *|number[,number]...
+The caller specifies the
+.Ar number .
+If
+.Nm
+is the callee,
+.Ar number
+should be either a comma seperated list of allowable numbers or a
+.Dq \&* ,
+meaning any number is permitted. If
+.Nm
+is the caller, only a single number should be specified.
+.Pp
+Note, this option is very unsafe when used with a
+.Dq \&*
+as a malicious caller can tell
+.Nm
+to call any (possibly international) number without first authenticating
+themselves.
+.It none
+If the peer does not wish to do callback at all,
+.Nm
+will accept the fact and continue without callback rather than terminating
+the connection.
+.El
+.Pp
+.It set cbcp Op *|number[,number]... Op delay Op retry
+If no arguments are given, CBCP (Microsofts CallBack Control Protocol)
+is disabled - ie, configuring CBCP in the
+.Dq set callback
+command will result in
+.Nm
+requesting no callback in the CBCP phase.
+Otherwise,
+.Nm
+attempts to use the given phone
+.Ar number Ns No (s).
+.Pp
+In server mode
+.Pq Fl direct ,
+.Nm
+will insist that the client uses one of these numbers, unless
+.Dq \&*
+is used in which case the client is expected to specify the number.
+.Pp
+In client mode,
+.Nm
+will attempt to use one of the given numbers (whichever it finds to
+be agreeable with the peer), or if
+.Dq \&*
+is specified,
+.Nm
+will expect the peer to specify the number.
.It set ctsrts|crtscts on|off
This sets hardware flow control. Hardware flow control is
.Ar on
diff --git a/usr.sbin/ppp/ppp.8.m4 b/usr.sbin/ppp/ppp.8.m4
index 2b09f56..15c7031 100644
--- a/usr.sbin/ppp/ppp.8.m4
+++ b/usr.sbin/ppp/ppp.8.m4
@@ -1,4 +1,4 @@
-.\" $Id: ppp.8,v 1.112 1998/07/29 18:21:17 brian Exp $
+.\" $Id: ppp.8,v 1.113 1998/07/31 19:50:24 brian Exp $
.Dd 20 September 1995
.Os FreeBSD
.Dt PPP 8
@@ -74,6 +74,10 @@ command via its diagnostic socket. A
will force an LCP renegotiation, and a
.Dv SIGTERM
will force it to exit.
+.It Supports client callback.
+.Nm Ppp
+can use either the standard LCP callback protocol or the Microsoft
+CallBack Control Protocol (ftp://ftp.microsoft.com/developr/rfc/cbcp.txt).
.It Supports packet aliasing.
Packet aliasing (a.k.a. IP masquerading) allows computers on a
private, unregistered network to access the Internet. The
@@ -161,7 +165,7 @@ is installed as user
and group
.Dv network ,
with permissions
-.Dv 4550 .
+.Dv 4554 .
By default,
.Nm
will not run if the invoking user id is not zero. This may be overridden
@@ -278,6 +282,15 @@ lines to the file
Refer to the
.Xr resolv.conf 5
manual page for details.
+.Pp
+Alternatively, if the peer supports it,
+.Nm
+can be configured to ask the peer for the nameserver address(es) and to
+update
+.Pa /etc/resolv.conf
+automatically. Refer to the
+.Dq enable dns
+command below for details.
.El
.Sh MANUAL DIALING
In the following examples, we assume that your machine name is
@@ -477,11 +490,20 @@ portion of the prompt will change to
# ppp MyISP
...
ppp ON awfulhak> dial
-dial OK!
-login OK!
+Ppp ON awfulhak>
+PPp ON awfulhak>
PPP ON awfulhak>
.Ed
.Pp
+The Ppp prompt indicates that
+.Nm
+has entered the authentication phase. The PPp prompt indicates that
+.Nm
+has entered the network phase. The PPP prompt indicates that
+.Nm
+has successfully negotiated a network layer protocol and is in
+a usable state.
+.Pp
If the
.Pa /etc/ppp/ppp.linkup
file is available, its contents are executed
@@ -905,7 +927,9 @@ Instead of running
over a serial link, it is possible to
use a TCP connection instead by specifying a host and port as the
device:
+.Pp
.Dl set device ui-gate:6669
+.Pp
Instead of opening a serial device,
.Nm
will open a TCP connection to the given machine on the given
@@ -918,13 +942,17 @@ connection on the receiving machine (ui-gate). This is
done by first updating
.Pa /etc/services
to name the service:
+.Pp
.Dl ppp-in 6669/tcp # Incoming PPP connections over TCP
+.Pp
and updating
.Pa /etc/inetd.conf
to tell
.Xr inetd 8
how to deal with incoming connections on that port:
+.Pp
.Dl ppp-in stream tcp nowait root /usr/sbin/ppp ppp -direct ppp-in
+.Pp
Don't forget to send a
.Dv HUP
signal to
@@ -986,7 +1014,9 @@ Again, if you're enabling PAP, you'll also need:
We're assigning the address of 10.0.4.1 to ui-gate, and the address
10.0.4.2 to awfulhak.
To open the connection, just type
+.Pp
.Dl awfulhak # ppp -background ui-gate
+.Pp
The result will be an additional "route" on awfulhak to the
10.0.2.0/24 network via the TCP connection, and an additional
"route" on ui-gate to the 10.0.1.0/24 network.
@@ -1442,7 +1472,10 @@ logging) so that the actual password is not compromised
.Ar chat
logging is active rather than the actual password.
.Pp
-Login scripts vary greatly between ISPs.
+Login scripts vary greatly between ISPs. If you're setting one up
+for the first time,
+.Em ENABLE CHAT LOGGING
+so that you can see if your script is behaving as you expect.
.It
Use
.Dq set line
@@ -1531,6 +1564,20 @@ set authkey MyPassword
Both are accepted by default, so
.Nm
will provide whatever your ISP requires.
+.Pp
+It should be noted that a login script is rarely (if ever) required
+when PAP or CHAP are in use.
+.It
+Ask your ISP to authenticate your nameserver address(es) with the line
+.Bd -literal -offset indent
+enable dns
+.Ed
+Do
+.Em NOT
+do this if you are running an local DNS, as
+.Nm
+will simply circumvent its use by entering some nameserver lines in
+.Pa /etc/resolv.conf .
.El
.Pp
Please refer to
@@ -1540,12 +1587,13 @@ and
for some real examples. The pmdemand label should be appropriate for most
ISPs.
.Sh LOGGING FACILITY
-.Nm
+.Nm Ppp
is able to generate the following log info either via
.Xr syslog 3
or directly to the screen:
.Bl -column SMMMMMM -offset indent
.It Li Async Dump async level packet in hex
+.It Li CBCP Generate CBCP (CallBack Control Protocol) logs
.It Li CCP Generate a CCP packet trace
.It Li Chat Generate Chat script trace log
.It Li Command Log commands executed
@@ -2571,6 +2619,83 @@ If
is zero, this timer is disabled. Because both values default to zero,
.Ar demand-dial
links will stay active until the bundle idle timer expires.
+.It set callback [none|auth|cbcp|E.164 *|number[,number]...]...
+If no arguments are given, callback is disabled, otherwise,
+.Nm
+will request (or in
+.Ar direct
+mode, will accept) one of the given protocols. If a request is NAK'd
+.Nm
+will request another, until no options remain at which point
+.Nm
+will terminate negotiations.
+The options are as follows (in this order of preference):
+.Pp
+.Bl -tag
+.It auth
+The callee is expected to decide the callback number based on
+authentication. If
+.Nm
+is the callee, the number should be specified as the fifth field of
+the peers entry in
+.Pa /etc/ppp/ppp.secret .
+.It cbcp
+Microsofts callback control protocol is used. See
+.Dq set cbcp
+below.
+.It E.164 *|number[,number]...
+The caller specifies the
+.Ar number .
+If
+.Nm
+is the callee,
+.Ar number
+should be either a comma seperated list of allowable numbers or a
+.Dq \&* ,
+meaning any number is permitted. If
+.Nm
+is the caller, only a single number should be specified.
+.Pp
+Note, this option is very unsafe when used with a
+.Dq \&*
+as a malicious caller can tell
+.Nm
+to call any (possibly international) number without first authenticating
+themselves.
+.It none
+If the peer does not wish to do callback at all,
+.Nm
+will accept the fact and continue without callback rather than terminating
+the connection.
+.El
+.Pp
+.It set cbcp Op *|number[,number]... Op delay Op retry
+If no arguments are given, CBCP (Microsofts CallBack Control Protocol)
+is disabled - ie, configuring CBCP in the
+.Dq set callback
+command will result in
+.Nm
+requesting no callback in the CBCP phase.
+Otherwise,
+.Nm
+attempts to use the given phone
+.Ar number Ns No (s).
+.Pp
+In server mode
+.Pq Fl direct ,
+.Nm
+will insist that the client uses one of these numbers, unless
+.Dq \&*
+is used in which case the client is expected to specify the number.
+.Pp
+In client mode,
+.Nm
+will attempt to use one of the given numbers (whichever it finds to
+be agreeable with the peer), or if
+.Dq \&*
+is specified,
+.Nm
+will expect the peer to specify the number.
.It set ctsrts|crtscts on|off
This sets hardware flow control. Hardware flow control is
.Ar on
diff --git a/usr.sbin/ppp/pred.c b/usr.sbin/ppp/pred.c
index ccbf073..dcf8b8b 100644
--- a/usr.sbin/ppp/pred.c
+++ b/usr.sbin/ppp/pred.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: pred.c,v 1.20.2.12 1998/05/01 19:25:40 brian Exp $
+ * $Id: pred.c,v 1.21 1998/05/21 21:47:53 brian Exp $
*/
#include <sys/types.h>
@@ -34,6 +34,7 @@
#include <stdlib.h>
#include <string.h>
+#include "defs.h"
#include "mbuf.h"
#include "log.h"
#include "timer.h"
diff --git a/usr.sbin/ppp/prompt.c b/usr.sbin/ppp/prompt.c
index af01a0d..5c5e1e0 100644
--- a/usr.sbin/ppp/prompt.c
+++ b/usr.sbin/ppp/prompt.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: prompt.c,v 1.8 1998/06/24 19:33:35 brian Exp $
+ * $Id: prompt.c,v 1.9 1998/07/04 22:04:12 brian Exp $
*/
#include <sys/param.h>
@@ -66,6 +66,7 @@
#include "bundle.h"
#include "chat.h"
#include "chap.h"
+#include "cbcp.h"
#include "datalink.h"
#include "server.h"
#include "main.h"
diff --git a/usr.sbin/ppp/vjcomp.c b/usr.sbin/ppp/vjcomp.c
index 79dca09..ba1ef1b 100644
--- a/usr.sbin/ppp/vjcomp.c
+++ b/usr.sbin/ppp/vjcomp.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: vjcomp.c,v 1.20 1998/06/16 19:40:42 brian Exp $
+ * $Id: vjcomp.c,v 1.21 1998/06/27 23:48:54 brian Exp $
*
* TODO:
*/
@@ -28,7 +28,6 @@
#include <sys/un.h>
#include <stdio.h>
-#include <string.h>
#include "mbuf.h"
#include "log.h"
OpenPOWER on IntegriCloud