summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1997-12-13 02:37:33 +0000
committerbrian <brian@FreeBSD.org>1997-12-13 02:37:33 +0000
commitb51dc6a0ad3ce435d5255b72124d2220a345c748 (patch)
tree01ae43c4ae528f7d4f3a9b7aaad7063e4c34bc05 /usr.sbin
parent982ed8caa2c928574b4adcc4149fb11f323b0f46 (diff)
downloadFreeBSD-src-b51dc6a0ad3ce435d5255b72124d2220a345c748.zip
FreeBSD-src-b51dc6a0ad3ce435d5255b72124d2220a345c748.tar.gz
Allow random IP number allocation to peer.
Validate the peers suggested IP by attempting to make a routing table entry. Give up IPCP negotiation if the peer NAKs us with an unusable IP. Always SIOCDIFADDR then SIOCAIFADDR when configuring the tun device. Using SIOCSIFDSTADDR allows duplicate dst addresses (which we don't want)!!! Allow up to 200 interface names (was 50) (now that ppp can play server properly). Up the version number (1.5 -> 1.6). Cosmetic: Log unexpected CCP packets in the CCP log rather than the ERROR log. Log unexpected Config Reqs in the appropriate LCP/IPCP/CCP log rather than the ERROR log. Log failed route additions and deletions with WARN, not TCPIP. Log the option id and length for unrecognised IPCP options. Change some .Sq to .Ar in the man page.
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/ppp/Makefile4
-rw-r--r--usr.sbin/ppp/ccp.c4
-rw-r--r--usr.sbin/ppp/command.c38
-rw-r--r--usr.sbin/ppp/filter.c15
-rw-r--r--usr.sbin/ppp/fsm.c5
-rw-r--r--usr.sbin/ppp/ipcp.c39
-rw-r--r--usr.sbin/ppp/ipcp.h3
-rw-r--r--usr.sbin/ppp/iplist.c200
-rw-r--r--usr.sbin/ppp/iplist.h24
-rw-r--r--usr.sbin/ppp/main.c4
-rw-r--r--usr.sbin/ppp/os.c79
-rw-r--r--usr.sbin/ppp/os.h5
-rw-r--r--usr.sbin/ppp/phase.c4
-rw-r--r--usr.sbin/ppp/ppp.886
-rw-r--r--usr.sbin/ppp/ppp.8.m486
-rw-r--r--usr.sbin/ppp/route.c42
-rw-r--r--usr.sbin/ppp/route.h3
-rw-r--r--usr.sbin/ppp/vars.c6
18 files changed, 504 insertions, 143 deletions
diff --git a/usr.sbin/ppp/Makefile b/usr.sbin/ppp/Makefile
index 67cff18..40ecd39 100644
--- a/usr.sbin/ppp/Makefile
+++ b/usr.sbin/ppp/Makefile
@@ -1,8 +1,8 @@
-# $Id: Makefile,v 1.32 1997/11/22 03:37:21 brian Exp $
+# $Id: Makefile,v 1.33 1997/12/03 10:23:44 brian Exp $
PROG= ppp
SRCS= arp.c async.c auth.c ccp.c chap.c chat.c command.c deflate.c \
- defs.c filter.c fsm.c hdlc.c id.c ip.c ipcp.c lcp.c \
+ defs.c filter.c fsm.c hdlc.c id.c ip.c ipcp.c iplist.c lcp.c \
log.c lqr.c main.c mbuf.c modem.c os.c pap.c phase.c \
pred.c route.c server.c sig.c slcompress.c systems.c throughput.c \
timer.c tun.c vars.c vjcomp.c
diff --git a/usr.sbin/ppp/ccp.c b/usr.sbin/ppp/ccp.c
index 4891135..b9c8d90 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.22 1997/12/03 23:27:53 brian Exp $
+ * $Id: ccp.c,v 1.23 1997/12/04 18:49:32 brian Exp $
*
* TODO:
* o Support other compression protocols
@@ -372,7 +372,7 @@ CcpInput(struct mbuf *bp)
FsmInput(&CcpFsm, bp);
else {
if (phase > PHASE_NETWORK)
- LogPrintf(LogERROR, "Unexpected CCP in phase %d\n", phase);
+ LogPrintf(LogCCP, "Error: Unexpected CCP in phase %d\n", phase);
pfree(bp);
}
}
diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c
index 71366fd..4268241 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.107 1997/12/07 04:09:10 brian Exp $
+ * $Id: command.c,v 1.108 1997/12/08 20:09:10 brian Exp $
*
*/
#include <sys/param.h>
@@ -53,6 +53,7 @@
#include "fsm.h"
#include "phase.h"
#include "lcp.h"
+#include "iplist.h"
#include "ipcp.h"
#include "modem.h"
#include "filter.h"
@@ -1187,18 +1188,17 @@ SetInterfaceAddr(struct cmdargs const *arg)
HaveTriggerAddress = 0;
ifnetmask.s_addr = 0;
+ iplist_reset(&DefHisChoice);
if (arg->argc > 0) {
- if (ParseAddr(arg->argc, arg->argv,
- &DefMyAddress.ipaddr,
- &DefMyAddress.mask,
- &DefMyAddress.width) == 0)
+ if (!ParseAddr(arg->argc, arg->argv, &DefMyAddress.ipaddr,
+ &DefMyAddress.mask, &DefMyAddress.width))
return 1;
if (arg->argc > 1) {
- if (ParseAddr(arg->argc, arg->argv+1,
- &DefHisAddress.ipaddr,
- &DefHisAddress.mask,
- &DefHisAddress.width) == 0)
+ if (strpbrk(arg->argv[1], ",-"))
+ iplist_setsrc(&DefHisChoice, arg->argv[1]);
+ else if (!ParseAddr(arg->argc, arg->argv+1, &DefHisAddress.ipaddr,
+ &DefHisAddress.mask, &DefHisAddress.width))
return 2;
if (arg->argc > 2) {
ifnetmask = GetIpAddr(arg->argv[2]);
@@ -1222,11 +1222,23 @@ SetInterfaceAddr(struct cmdargs const *arg)
DefHisAddress.width = 0;
}
IpcpInfo.want_ipaddr.s_addr = DefMyAddress.ipaddr.s_addr;
- IpcpInfo.his_ipaddr.s_addr = DefHisAddress.ipaddr.s_addr;
+ if (iplist_isvalid(&DefHisChoice)) {
+ iplist_setrandpos(&DefHisChoice);
+ IpcpInfo.his_ipaddr = ChooseHisAddr(IpcpInfo.want_ipaddr);
+ if (IpcpInfo.his_ipaddr.s_addr == INADDR_ANY) {
+ LogPrintf(LogWARN, "%s: None available !\n", DefHisChoice.src);
+ return 3;
+ }
+ DefHisAddress.ipaddr.s_addr = IpcpInfo.his_ipaddr.s_addr;
+ DefHisAddress.mask.s_addr = 0xffffffff;
+ DefHisAddress.width = 32;
+ } else {
+ IpcpInfo.his_ipaddr.s_addr = DefHisAddress.ipaddr.s_addr;
- if ((mode & MODE_AUTO) &&
- OsSetIpaddress(DefMyAddress.ipaddr, DefHisAddress.ipaddr, ifnetmask) < 0)
- return 4;
+ if ((mode & MODE_AUTO) &&
+ OsSetIpaddress(DefMyAddress.ipaddr, DefHisAddress.ipaddr) < 0)
+ return 4;
+ }
return 0;
}
diff --git a/usr.sbin/ppp/filter.c b/usr.sbin/ppp/filter.c
index b154e1a..d152799 100644
--- a/usr.sbin/ppp/filter.c
+++ b/usr.sbin/ppp/filter.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: filter.c,v 1.18 1997/11/12 18:47:30 brian Exp $
+ * $Id: filter.c,v 1.19 1997/11/22 03:37:30 brian Exp $
*
* TODO: Shoud send ICMP error message when we discard packets.
*/
@@ -75,9 +75,11 @@ ParseAddr(int argc,
LogPrintf(LogWARN, "ParseAddr: address/mask is expected.\n");
return (0);
}
- pmask->s_addr = 0xffffffff; /* Assume 255.255.255.255 as default */
- cp = strchr(*argv, '/');
+ if (pmask)
+ pmask->s_addr = 0xffffffff; /* Assume 255.255.255.255 as default */
+
+ cp = pmask || pwidth ? strchr(*argv, '/') : NULL;
len = cp ? cp - *argv : strlen(*argv);
if (strncasecmp(*argv, "HISADDR", len) == 0)
@@ -106,8 +108,11 @@ ParseAddr(int argc,
bits = 32;
}
- *pwidth = bits;
- pmask->s_addr = htonl(netmasks[bits]);
+ if (pwidth)
+ *pwidth = bits;
+
+ if (pmask)
+ pmask->s_addr = htonl(netmasks[bits]);
return (1);
}
diff --git a/usr.sbin/ppp/fsm.c b/usr.sbin/ppp/fsm.c
index 48f9d07..6ad03e2 100644
--- a/usr.sbin/ppp/fsm.c
+++ b/usr.sbin/ppp/fsm.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: fsm.c,v 1.22 1997/11/22 03:37:31 brian Exp $
+ * $Id: fsm.c,v 1.23 1997/12/03 10:23:46 brian Exp $
*
* TODO:
* o Refer loglevel for log output
@@ -367,7 +367,8 @@ FsmRecvConfigReq(struct fsm * fp, struct fsmheader * lhp, struct mbuf * bp)
pfree(bp);
return;
case ST_CLOSING:
- LogPrintf(LogERROR, "Got ConfigReq while state = %d\n", fp->state);
+ LogPrintf(fp->LogLevel, "Error: Got ConfigReq while state = %d\n",
+ fp->state);
case ST_STOPPING:
pfree(bp);
return;
diff --git a/usr.sbin/ppp/ipcp.c b/usr.sbin/ppp/ipcp.c
index dc91900..624ea88 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.40 1997/12/04 18:49:35 brian Exp $
+ * $Id: ipcp.c,v 1.41 1997/12/06 22:43:58 brian Exp $
*
* TODO:
* o More RFC1772 backwoard compatibility
@@ -44,6 +44,7 @@
#include "fsm.h"
#include "lcpproto.h"
#include "lcp.h"
+#include "iplist.h"
#include "ipcp.h"
#include "slcompress.h"
#include "os.h"
@@ -53,6 +54,7 @@
#include "vjcomp.h"
#include "ip.h"
#include "throughput.h"
+#include "route.h"
#ifndef NOMSEXT
struct in_addr ns_entries[2];
@@ -62,6 +64,7 @@ struct in_addr nbns_entries[2];
struct ipcpstate IpcpInfo;
struct in_range DefMyAddress;
struct in_range DefHisAddress;
+struct iplist DefHisChoice;
struct in_addr TriggerAddress;
int HaveTriggerAddress;
@@ -184,6 +187,8 @@ IpcpDefAddress()
void
IpcpInit()
{
+ if (iplist_isvalid(&DefHisChoice))
+ iplist_setrandpos(&DefHisChoice);
FsmInit(&IpcpFsm);
memset(&IpcpInfo, '\0', sizeof(struct ipcpstate));
if ((mode & MODE_DEDICATED) && !GetLabel()) {
@@ -305,7 +310,7 @@ IpcpLayerUp(struct fsm * fp)
LogPrintf(LogIsKept(LogIPCP) ? LogIPCP : LogLINK, " %s hisaddr = %s\n",
tbuff, inet_ntoa(IpcpInfo.his_ipaddr));
- if (OsSetIpaddress(IpcpInfo.want_ipaddr, IpcpInfo.his_ipaddr, ifnetmask) < 0) {
+ if (OsSetIpaddress(IpcpInfo.want_ipaddr, IpcpInfo.his_ipaddr) < 0) {
if (VarTerm)
LogPrintf(LogERROR, "IpcpLayerUp: unable to set ip address\n");
return;
@@ -366,7 +371,7 @@ IpcpDecodeConfig(u_char * cp, int plen, int mode_type)
else if (type > 128 && type < 128 + NCFTYPES128)
snprintf(tbuff, sizeof(tbuff), " %s[%d] ", cftypes128[type-128], length);
else
- snprintf(tbuff, sizeof(tbuff), " ??? ");
+ snprintf(tbuff, sizeof(tbuff), " <%d>[%d] ", type, length);
switch (type) {
case TY_IPADDR: /* RFC1332 */
@@ -376,13 +381,29 @@ IpcpDecodeConfig(u_char * cp, int plen, int mode_type)
switch (mode_type) {
case MODE_REQ:
- if (!AcceptableAddr(&DefHisAddress, ipaddr)) {
+ if (iplist_isvalid(&DefHisChoice)) {
+ if (iplist_ip2pos(&DefHisChoice, ipaddr) < 0 ||
+ OsTrySetIpaddress(DefMyAddress.ipaddr, ipaddr) != 0) {
+ LogPrintf(LogIPCP, "%s: Address invalid or already in use\n",
+ inet_ntoa(ipaddr));
+ IpcpInfo.his_ipaddr = ChooseHisAddr(DefMyAddress.ipaddr);
+ if (IpcpInfo.his_ipaddr.s_addr == INADDR_ANY) {
+ memcpy(rejp, cp, length);
+ rejp += length;
+ } else {
+ memcpy(nakp, cp, 2);
+ memcpy(nakp+2, &IpcpInfo.his_ipaddr.s_addr, length - 2);
+ nakp += length;
+ }
+ break;
+ }
+ } else if (!AcceptableAddr(&DefHisAddress, ipaddr)) {
/*
* If destination address is not acceptable, insist to use what we
* want to use.
*/
memcpy(nakp, cp, 2);
- memcpy(nakp+2, &IpcpInfo.his_ipaddr.s_addr, length);
+ memcpy(nakp+2, &IpcpInfo.his_ipaddr.s_addr, length - 2);
nakp += length;
break;
}
@@ -392,14 +413,14 @@ IpcpDecodeConfig(u_char * cp, int plen, int mode_type)
break;
case MODE_NAK:
if (AcceptableAddr(&DefMyAddress, ipaddr)) {
-
- /*
- * Use address suggested by peer.
- */
+ /* Use address suggested by peer */
snprintf(tbuff2, sizeof(tbuff2), "%s changing address: %s ", tbuff,
inet_ntoa(IpcpInfo.want_ipaddr));
LogPrintf(LogIPCP, "%s --> %s\n", tbuff2, inet_ntoa(ipaddr));
IpcpInfo.want_ipaddr = ipaddr;
+ } else {
+ LogPrintf(LogIPCP, "%s: Unacceptable address!\n", inet_ntoa(ipaddr));
+ FsmClose(&IpcpFsm);
}
break;
case MODE_REJ:
diff --git a/usr.sbin/ppp/ipcp.h b/usr.sbin/ppp/ipcp.h
index 9d65e8e..f4aa9bd 100644
--- a/usr.sbin/ppp/ipcp.h
+++ b/usr.sbin/ppp/ipcp.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: ipcp.h,v 1.13 1997/11/18 14:52:05 brian Exp $
+ * $Id: ipcp.h,v 1.14 1997/11/22 03:37:35 brian Exp $
*
* TODO:
*/
@@ -65,6 +65,7 @@ struct in_range {
extern struct ipcpstate IpcpInfo;
extern struct in_range DefMyAddress;
extern struct in_range DefHisAddress;
+extern struct iplist DefHisChoice;
extern struct in_addr TriggerAddress;
extern int HaveTriggerAddress;
extern struct fsm IpcpFsm;
diff --git a/usr.sbin/ppp/iplist.c b/usr.sbin/ppp/iplist.c
new file mode 100644
index 0000000..dce202a
--- /dev/null
+++ b/usr.sbin/ppp/iplist.c
@@ -0,0 +1,200 @@
+/*
+ * $Id:$
+ */
+
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "command.h"
+#include "mbuf.h"
+#include "log.h"
+#include "defs.h"
+#include "iplist.h"
+
+static int
+do_inet_aton(const char *start, const char *end, struct in_addr *ip)
+{
+ static char ipstr[16];
+
+ if (end - start > 15) {
+ LogPrintf(LogWARN, "%.*s: Invalid IP address\n", end-start, start);
+ return 0;
+ }
+ strncpy(ipstr, start, end-start);
+ ipstr[end-start] = '\0';
+ return inet_aton(ipstr, ip);
+}
+
+static void
+iplist_first(struct iplist *list)
+{
+ list->cur.pos = -1;
+}
+
+static int
+iplist_setrange(struct iplist *list, char *range)
+{
+ char *ptr, *to;
+
+ if ((ptr = strpbrk(range, ",-")) == NULL) {
+ if (!inet_aton(range, &list->cur.ip))
+ return 0;
+ list->cur.lstart = ntohl(list->cur.ip.s_addr);
+ list->cur.nItems = 1;
+ } else {
+ if (!do_inet_aton(range, ptr, &list->cur.ip))
+ return 0;
+ if (*ptr == ',') {
+ list->cur.lstart = ntohl(list->cur.ip.s_addr);
+ list->cur.nItems = 1;
+ } else {
+ struct in_addr endip;
+
+ to = ptr+1;
+ if ((ptr = strpbrk(to, ",-")) == NULL)
+ ptr = to + strlen(to);
+ if (*to == '-')
+ return 0;
+ if (!do_inet_aton(to, ptr, &endip))
+ return 0;
+ list->cur.lstart = ntohl(list->cur.ip.s_addr);
+ list->cur.nItems = ntohl(endip.s_addr) - list->cur.lstart + 1;
+ if (list->cur.nItems < 1)
+ return 0;
+ }
+ }
+ list->cur.srcitem = 0;
+ list->cur.srcptr = range;
+ return 1;
+}
+
+static int
+iplist_nextrange(struct iplist *list)
+{
+ char *ptr, *to, *end;
+
+ ptr = list->cur.srcptr;
+ if (ptr != NULL && (ptr = strchr(ptr, ',')) != NULL)
+ ptr++;
+ else
+ ptr = list->src;
+
+ while (*ptr != '\0' && !iplist_setrange(list, ptr)) {
+ if ((end = strchr(ptr, ',')) == NULL)
+ end = ptr + strlen(ptr);
+ if (end == ptr)
+ return 0;
+ LogPrintf(LogWARN, "%.*s: Invalid IP range (skipping)\n", end - ptr, ptr);
+ to = ptr;
+ do
+ *to = *end++;
+ while (*to++ != '\0');
+ if (*ptr == '\0')
+ ptr = list->src;
+ }
+
+ return 1;
+}
+
+struct in_addr
+iplist_next(struct iplist *list)
+{
+ if (list->cur.pos == -1) {
+ list->cur.srcptr = NULL;
+ if (!iplist_nextrange(list)) {
+ list->cur.ip.s_addr = INADDR_ANY;
+ return list->cur.ip;
+ }
+ } else if (++list->cur.srcitem == list->cur.nItems) {
+ if (!iplist_nextrange(list)) {
+ list->cur.ip.s_addr = INADDR_ANY;
+ list->cur.pos = -1;
+ return list->cur.ip;
+ }
+ } else
+ list->cur.ip.s_addr = htonl(list->cur.lstart + list->cur.srcitem);
+ list->cur.pos++;
+
+ return list->cur.ip;
+}
+
+int
+iplist_setsrc(struct iplist *list, const char *src)
+{
+ strncpy(list->src, src, sizeof(list->src));
+ list->src[sizeof(list->src)-1] = '\0';
+ list->cur.srcptr = list->src;
+ do {
+ if (iplist_nextrange(list))
+ list->nItems += list->cur.nItems;
+ else
+ return 0;
+ } while (list->cur.srcptr != list->src);
+ return 1;
+}
+
+void
+iplist_reset(struct iplist *list)
+{
+ list->src[0] = '\0';
+ list->nItems = 0;
+ list->cur.pos = -1;
+}
+
+struct in_addr
+iplist_setcurpos(struct iplist *list, int pos)
+{
+ if (pos < 0 || pos >= list->nItems) {
+ list->cur.pos = -1;
+ list->cur.ip.s_addr = INADDR_ANY;
+ return list->cur.ip;
+ }
+
+ list->cur.srcptr = NULL;
+ list->cur.pos = 0;
+ while (1) {
+ iplist_nextrange(list);
+ if (pos < list->cur.nItems) {
+ if (pos) {
+ list->cur.srcitem = pos;
+ list->cur.pos += pos;
+ list->cur.ip.s_addr = htonl(list->cur.lstart + list->cur.srcitem);
+ }
+ break;
+ }
+ pos -= list->cur.nItems;
+ list->cur.pos += list->cur.nItems;
+ }
+
+ return list->cur.ip;
+}
+
+struct in_addr
+iplist_setrandpos(struct iplist *list)
+{
+ randinit();
+ return iplist_setcurpos(list, random() % list->nItems);
+}
+
+int
+iplist_ip2pos(struct iplist *list, struct in_addr ip)
+{
+ struct iplist_cur cur;
+ int f, result;
+
+ result = -1;
+ memcpy(&cur, &list->cur, sizeof(cur));
+
+ for (iplist_first(list), f = 0; f < list->nItems; f++)
+ if (iplist_next(list).s_addr == ip.s_addr) {
+ result = list->cur.pos;
+ break;
+ }
+
+ memcpy(&list->cur, &cur, sizeof(list->cur));
+ return result;
+}
diff --git a/usr.sbin/ppp/iplist.h b/usr.sbin/ppp/iplist.h
new file mode 100644
index 0000000..cee4deb
--- /dev/null
+++ b/usr.sbin/ppp/iplist.h
@@ -0,0 +1,24 @@
+/*
+ * $Id:$
+ */
+
+struct iplist {
+ struct iplist_cur {
+ struct in_addr ip;
+ int pos;
+ char *srcptr;
+ int srcitem;
+ u_long lstart, nItems;
+ } cur;
+ int nItems;
+ char src[LINE_LEN];
+};
+
+extern int iplist_setsrc(struct iplist *, const char *);
+extern void iplist_reset(struct iplist *);
+extern struct in_addr iplist_setcurpos(struct iplist *, int);
+extern struct in_addr iplist_setrandpos(struct iplist *);
+extern int iplist_ip2pos(struct iplist *, struct in_addr);
+extern struct in_addr iplist_next(struct iplist *);
+
+#define iplist_isvalid(x) ((x)->src[0] != '\0')
diff --git a/usr.sbin/ppp/main.c b/usr.sbin/ppp/main.c
index c7baf09..4d64a69 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.105 1997/11/22 03:37:39 brian Exp $
+ * $Id: main.c,v 1.106 1997/12/03 10:23:50 brian Exp $
*
* TODO:
* o Add commands for traffic summary, version display, etc.
@@ -413,7 +413,7 @@ main(int argc, char **argv)
fprintf(VarTerm, "Warning: No default entry is given in config file.\n");
if (OpenTunnel(&tunno) < 0) {
- LogPrintf(LogWARN, "open_tun: %s\n", strerror(errno));
+ LogPrintf(LogWARN, "OpenTunnel: %s\n", strerror(errno));
return EX_START;
}
if (mode & MODE_INTER) {
diff --git a/usr.sbin/ppp/os.c b/usr.sbin/ppp/os.c
index 1f13b34..05dbf81 100644
--- a/usr.sbin/ppp/os.c
+++ b/usr.sbin/ppp/os.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: os.c,v 1.35 1997/11/22 03:37:42 brian Exp $
+ * $Id: os.c,v 1.36 1997/12/03 10:23:51 brian Exp $
*
*/
#include <sys/param.h>
@@ -66,15 +66,16 @@ static struct ifreq ifrq;
static struct in_addr oldmine, oldhis;
static int linkup;
+enum set_method { SET_UP, SET_DOWN, SET_TRY };
+
static int
SetIpDevice(struct in_addr myaddr,
struct in_addr hisaddr,
struct in_addr netmask,
- int updown)
+ enum set_method how)
{
struct sockaddr_in *sock_in;
int s;
- int changeaddr = 0;
u_long mask, addr;
s = ID0socket(AF_INET, SOCK_DGRAM, 0);
@@ -82,7 +83,7 @@ SetIpDevice(struct in_addr myaddr,
LogPrintf(LogERROR, "SetIpDevice: socket(): %s\n", strerror(errno));
return (-1);
}
- if (updown == 0) {
+ if (how == SET_DOWN) {
if (Enabled(ConfProxy))
cifproxyarp(s, oldhis.s_addr);
if (oldmine.s_addr == 0 && oldhis.s_addr == 0) {
@@ -100,10 +101,7 @@ SetIpDevice(struct in_addr myaddr,
}
oldmine.s_addr = oldhis.s_addr = 0;
} else {
-
- /*
- * If given addresses are alreay set, then ignore this request.
- */
+ /* If given addresses are alreay set, then ignore this request */
if (oldmine.s_addr == myaddr.s_addr && oldhis.s_addr == hisaddr.s_addr) {
close(s);
return (0);
@@ -113,27 +111,29 @@ SetIpDevice(struct in_addr myaddr,
* If different address has been set, then delete it first.
*/
if (oldmine.s_addr || oldhis.s_addr) {
- changeaddr = 1;
+ memset(&ifra.ifra_addr, '\0', sizeof(ifra.ifra_addr));
+ memset(&ifra.ifra_broadaddr, '\0', sizeof(ifra.ifra_addr));
+ memset(&ifra.ifra_mask, '\0', sizeof(ifra.ifra_addr));
+ if (ID0ioctl(s, SIOCDIFADDR, &ifra) < 0) {
+ LogPrintf(LogERROR, "SetIpDevice: ioctl(SIOCDIFADDR): %s\n",
+ strerror(errno));
+ close(s);
+ return (-1);
+ }
}
- /*
- * Set interface address
- */
+ /* Set interface address */
sock_in = (struct sockaddr_in *) & (ifra.ifra_addr);
sock_in->sin_family = AF_INET;
- sock_in->sin_addr = oldmine = myaddr;
+ sock_in->sin_addr = myaddr;
sock_in->sin_len = sizeof(*sock_in);
- /*
- * Set destination address
- */
+ /* Set destination address */
sock_in = (struct sockaddr_in *) & (ifra.ifra_broadaddr);
sock_in->sin_family = AF_INET;
- sock_in->sin_addr = oldhis = hisaddr;
+ sock_in->sin_addr = hisaddr;
sock_in->sin_len = sizeof(*sock_in);
- /*
- * */
addr = ntohl(myaddr.s_addr);
if (IN_CLASSA(addr))
mask = IN_CLASSA_NET;
@@ -153,31 +153,16 @@ SetIpDevice(struct in_addr myaddr,
sock_in->sin_addr.s_addr = htonl(mask);
sock_in->sin_len = sizeof(*sock_in);
- if (changeaddr) {
-
- /*
- * Interface already exists. Just change the address.
- */
- memcpy(&ifrq.ifr_addr, &ifra.ifra_addr, sizeof(struct sockaddr));
- if (ID0ioctl(s, SIOCSIFADDR, &ifra) < 0)
- LogPrintf(LogERROR, "SetIpDevice: ioctl(SIFADDR): %s\n",
- strerror(errno));
- memcpy(&ifrq.ifr_dstaddr, &ifra.ifra_broadaddr, sizeof(struct sockaddr));
- if (ID0ioctl(s, SIOCSIFDSTADDR, &ifrq) < 0)
- LogPrintf(LogERROR, "SetIpDevice: ioctl(SIFDSTADDR): %s\n",
- strerror(errno));
-#ifdef notdef
- memcpy(&ifrq.ifr_broadaddr, &ifra.ifra_mask, sizeof(struct sockaddr));
- if (ID0ioctl(s, SIOCSIFBRDADDR, &ifrq) < 0)
- LogPrintf(LogERROR, "SetIpDevice: ioctl(SIFBRDADDR): %s\n",
+ if (ID0ioctl(s, SIOCAIFADDR, &ifra) < 0) {
+ if (how != SET_TRY)
+ LogPrintf(LogERROR, "SetIpDevice: ioctl(SIOCAIFADDR): %s\n",
strerror(errno));
-#endif
- } else if (ID0ioctl(s, SIOCAIFADDR, &ifra) < 0) {
- LogPrintf(LogERROR, "SetIpDevice: ioctl(SIOCAIFADDR): %s\n",
- strerror(errno));
close(s);
return (-1);
}
+
+ oldhis.s_addr = hisaddr.s_addr;
+ oldmine.s_addr = myaddr.s_addr;
if (Enabled(ConfProxy))
sifproxyarp(s, hisaddr.s_addr);
}
@@ -186,11 +171,15 @@ SetIpDevice(struct in_addr myaddr,
}
int
-OsSetIpaddress(struct in_addr myaddr,
- struct in_addr hisaddr,
- struct in_addr netmask)
+OsTrySetIpaddress(struct in_addr myaddr, struct in_addr hisaddr)
+{
+ return (SetIpDevice(myaddr, hisaddr, ifnetmask, SET_TRY));
+}
+
+int
+OsSetIpaddress(struct in_addr myaddr, struct in_addr hisaddr)
{
- return (SetIpDevice(myaddr, hisaddr, netmask, 1));
+ return (SetIpDevice(myaddr, hisaddr, ifnetmask, SET_UP));
}
static struct in_addr peer_addr;
@@ -284,7 +273,7 @@ OsInterfaceDown(int final)
return (-1);
}
zeroaddr.s_addr = 0;
- SetIpDevice(zeroaddr, zeroaddr, zeroaddr, 0);
+ SetIpDevice(zeroaddr, zeroaddr, zeroaddr, SET_DOWN);
close(s);
return (0);
diff --git a/usr.sbin/ppp/os.h b/usr.sbin/ppp/os.h
index 0c19f2e..7d6cc5e 100644
--- a/usr.sbin/ppp/os.h
+++ b/usr.sbin/ppp/os.h
@@ -15,14 +15,15 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: os.h,v 1.11 1997/11/16 22:15:09 brian Exp $
+ * $Id: os.h,v 1.12 1997/11/22 03:37:42 brian Exp $
*
* TODO:
*/
extern char *IfDevName;
-extern int OsSetIpaddress(struct in_addr, struct in_addr, struct in_addr);
+extern int OsSetIpaddress(struct in_addr, struct in_addr);
+extern int OsTrySetIpaddress(struct in_addr, struct in_addr);
extern int OsInterfaceDown(int);
extern int OpenTunnel(int *);
extern void OsLinkup(void);
diff --git a/usr.sbin/ppp/phase.c b/usr.sbin/ppp/phase.c
index 4b6d175..219b764 100644
--- a/usr.sbin/ppp/phase.c
+++ b/usr.sbin/ppp/phase.c
@@ -1,5 +1,5 @@
/*
- * $Id: phase.c,v 1.3 1997/11/22 03:37:43 brian Exp $
+ * $Id: phase.c,v 1.4 1997/12/07 23:55:29 brian Exp $
*/
#include <sys/param.h>
@@ -16,9 +16,9 @@
#include "auth.h"
#include "pap.h"
#include "chap.h"
+#include "defs.h"
#include "ipcp.h"
#include "ccp.h"
-#include "defs.h"
#include "main.h"
#include "loadalias.h"
#include "vars.h"
diff --git a/usr.sbin/ppp/ppp.8 b/usr.sbin/ppp/ppp.8
index 8f64191..caef2d0 100644
--- a/usr.sbin/ppp/ppp.8
+++ b/usr.sbin/ppp/ppp.8
@@ -1,4 +1,4 @@
-.\" $Id: ppp.8,v 1.82 1997/12/03 23:27:59 brian Exp $
+.\" $Id: ppp.8,v 1.83 1997/12/07 04:09:12 brian Exp $
.Dd 20 September 1995
.Os FreeBSD
.Dt PPP 8
@@ -2117,24 +2117,52 @@ of the address we will insist on. If the /n bit is omitted, it
defaults to /32 unless the IP address is 0.0.0.0 in which case
the mask defaults to /0.
+.Pp
+.Ar Hisaddr
+may also be specified as a range of IP numbers in the format
+
+.Dl a.b.c.d[-d.e.f.g][,h.i.j.k[-l,m,n,o]]...
+
+for example:
+
+.Dl set ifaddr 10.0.0.1 10.0.1.2-10.0.1.10,10.0.1.20
+
+will only negotiate
+.Ar 10.0.0.1
+as the local IP number, but will assign any of the given 10 IP
+numbers to the peer. If the peer requests one of these numbers,
+and that number is not already in use,
+.Nm
+will grant the peers request. This is useful if the peer wants
+to re-establish a link using the same IP number as was previously
+allocated. If the peer requests an IP number that's either outside
+of this range or is already in use,
+.Nm
+will start by suggesting a random unused IP number from the range.
+If the peer doesn't subsequently agree,
+.Nm
+will suggest each of the other numbers in succession until a number
+is chosen or until too many IPCP Configure Requests have been sent.
+
+.Pp
If
-.Dq triggeraddr
+.Ar triggeraddr
is specified, it is used in place of
-.Dq myaddr
+.Ar myaddr
in the initial IPCP negotiation. However, only an address in the
-.Dq myaddr
+.Ar myaddr
range will be accepted.
.It set loopback on|off
When set to
-.Dq on
+.Ar on
(the default),
.Nm
will automatically loop back packets being sent
out with a destination address equal to that of the
.Em PPP
interface. If set to
-.Dq off ,
+.Ar off ,
.Nm
will send the packet, probably resulting in an ICMP redirect from
the other end.
@@ -2144,9 +2172,11 @@ This command allows the adjustment of the current log level. Refer
to the Logging Facility section for further details.
.It set login chat-script
-This chat-script compliments the dial-script. If both are specified,
-the login script will be executed after the dial script. Escape
-sequences available in the dial script are also available here.
+This
+.Ar chat-script
+compliments the dial-script. If both are specified, the login
+script will be executed after the dial script. Escape sequences
+available in the dial script are also available here.
.It set mru value
The default MRU is 1500. If it is increased, the other side *may*
@@ -2163,14 +2193,19 @@ Increasing it is not valid as the peer is not necessarily able to
receive the increased packet size.
.It set openmode active|passive
-By default, openmode is always active. That is,
+By default,
+.Ar openmode
+is always
+.Ar active .
+That is,
.Nm
-will always initiate LCP/IPCP/CCP negotiation. If you want to wait for the
-peer to initiate negotiations, you may use the value
-.Dq passive .
+will always initiate LCP/IPCP/CCP negotiation. If you want to wait
+for the peer to initiate negotiations, you may use the value
+.Ar passive .
.It set parity odd|even|none|mark
-This allows the line parity to be set. The default value is none.
+This allows the line parity to be set. The default value is
+.Ar none .
.It set phone telno[|telno]...[:telno[|telno]...]...
This allows the specification of the phone number to be used in
@@ -2191,29 +2226,29 @@ mode, each number is attempted at most once.
.It set reconnect timeout ntries
Should the line drop unexpectedly (due to loss of CD or LQR
failure), a connection will be re-established after the given
-.Dq timeout .
+.Ar timeout .
The line will be re-connected at most
-.Dq ntries
+.Ar ntries
times.
-.Dq Ntries
+.Ar Ntries
defaults to zero. A value of
-.Dq random
+.Ar random
for
-.Dq timeout
+.Ar timeout
will result in a variable pause, somewhere between 0 and 30 seconds.
.It set redial seconds[.nseconds] [attempts]
.Nm Ppp
can be instructed to attempt to redial
-.Dq attempts
+.Ar attempts
times. If more than one number is specified (see
.Dq set phone
above), a pause of
-.Dq nseconds
+.Ar nseconds
is taken before dialing each number. A pause of
-.Dq seconds
+.Ar seconds
is taken before starting at the first number again. A value of
-.Dq random
+.Ar random
may be used here too.
.It set stopped [LCPseconds [IPCPseconds [CCPseconds]]]
@@ -2224,7 +2259,10 @@ the stopped state for the given number of
.Dq seconds .
This option may be useful if you see
.Nm
-failing to respond in the stopped state. Use
+failing to respond in the stopped state, or if you wish to
+.Dq set openmode passive
+and time out if the peer doesn't send a Configure Request within the
+given time. Use
.Dq set log +lcp +ipcp +ccp
to make
.Nm
diff --git a/usr.sbin/ppp/ppp.8.m4 b/usr.sbin/ppp/ppp.8.m4
index 8f64191..caef2d0 100644
--- a/usr.sbin/ppp/ppp.8.m4
+++ b/usr.sbin/ppp/ppp.8.m4
@@ -1,4 +1,4 @@
-.\" $Id: ppp.8,v 1.82 1997/12/03 23:27:59 brian Exp $
+.\" $Id: ppp.8,v 1.83 1997/12/07 04:09:12 brian Exp $
.Dd 20 September 1995
.Os FreeBSD
.Dt PPP 8
@@ -2117,24 +2117,52 @@ of the address we will insist on. If the /n bit is omitted, it
defaults to /32 unless the IP address is 0.0.0.0 in which case
the mask defaults to /0.
+.Pp
+.Ar Hisaddr
+may also be specified as a range of IP numbers in the format
+
+.Dl a.b.c.d[-d.e.f.g][,h.i.j.k[-l,m,n,o]]...
+
+for example:
+
+.Dl set ifaddr 10.0.0.1 10.0.1.2-10.0.1.10,10.0.1.20
+
+will only negotiate
+.Ar 10.0.0.1
+as the local IP number, but will assign any of the given 10 IP
+numbers to the peer. If the peer requests one of these numbers,
+and that number is not already in use,
+.Nm
+will grant the peers request. This is useful if the peer wants
+to re-establish a link using the same IP number as was previously
+allocated. If the peer requests an IP number that's either outside
+of this range or is already in use,
+.Nm
+will start by suggesting a random unused IP number from the range.
+If the peer doesn't subsequently agree,
+.Nm
+will suggest each of the other numbers in succession until a number
+is chosen or until too many IPCP Configure Requests have been sent.
+
+.Pp
If
-.Dq triggeraddr
+.Ar triggeraddr
is specified, it is used in place of
-.Dq myaddr
+.Ar myaddr
in the initial IPCP negotiation. However, only an address in the
-.Dq myaddr
+.Ar myaddr
range will be accepted.
.It set loopback on|off
When set to
-.Dq on
+.Ar on
(the default),
.Nm
will automatically loop back packets being sent
out with a destination address equal to that of the
.Em PPP
interface. If set to
-.Dq off ,
+.Ar off ,
.Nm
will send the packet, probably resulting in an ICMP redirect from
the other end.
@@ -2144,9 +2172,11 @@ This command allows the adjustment of the current log level. Refer
to the Logging Facility section for further details.
.It set login chat-script
-This chat-script compliments the dial-script. If both are specified,
-the login script will be executed after the dial script. Escape
-sequences available in the dial script are also available here.
+This
+.Ar chat-script
+compliments the dial-script. If both are specified, the login
+script will be executed after the dial script. Escape sequences
+available in the dial script are also available here.
.It set mru value
The default MRU is 1500. If it is increased, the other side *may*
@@ -2163,14 +2193,19 @@ Increasing it is not valid as the peer is not necessarily able to
receive the increased packet size.
.It set openmode active|passive
-By default, openmode is always active. That is,
+By default,
+.Ar openmode
+is always
+.Ar active .
+That is,
.Nm
-will always initiate LCP/IPCP/CCP negotiation. If you want to wait for the
-peer to initiate negotiations, you may use the value
-.Dq passive .
+will always initiate LCP/IPCP/CCP negotiation. If you want to wait
+for the peer to initiate negotiations, you may use the value
+.Ar passive .
.It set parity odd|even|none|mark
-This allows the line parity to be set. The default value is none.
+This allows the line parity to be set. The default value is
+.Ar none .
.It set phone telno[|telno]...[:telno[|telno]...]...
This allows the specification of the phone number to be used in
@@ -2191,29 +2226,29 @@ mode, each number is attempted at most once.
.It set reconnect timeout ntries
Should the line drop unexpectedly (due to loss of CD or LQR
failure), a connection will be re-established after the given
-.Dq timeout .
+.Ar timeout .
The line will be re-connected at most
-.Dq ntries
+.Ar ntries
times.
-.Dq Ntries
+.Ar Ntries
defaults to zero. A value of
-.Dq random
+.Ar random
for
-.Dq timeout
+.Ar timeout
will result in a variable pause, somewhere between 0 and 30 seconds.
.It set redial seconds[.nseconds] [attempts]
.Nm Ppp
can be instructed to attempt to redial
-.Dq attempts
+.Ar attempts
times. If more than one number is specified (see
.Dq set phone
above), a pause of
-.Dq nseconds
+.Ar nseconds
is taken before dialing each number. A pause of
-.Dq seconds
+.Ar seconds
is taken before starting at the first number again. A value of
-.Dq random
+.Ar random
may be used here too.
.It set stopped [LCPseconds [IPCPseconds [CCPseconds]]]
@@ -2224,7 +2259,10 @@ the stopped state for the given number of
.Dq seconds .
This option may be useful if you see
.Nm
-failing to respond in the stopped state. Use
+failing to respond in the stopped state, or if you wish to
+.Dq set openmode passive
+and time out if the peer doesn't send a Configure Request within the
+given time. Use
.Dq set log +lcp +ipcp +ccp
to make
.Nm
diff --git a/usr.sbin/ppp/route.c b/usr.sbin/ppp/route.c
index c1c0b33..3132937 100644
--- a/usr.sbin/ppp/route.c
+++ b/usr.sbin/ppp/route.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: route.c,v 1.29 1997/12/04 18:49:39 brian Exp $
+ * $Id: route.c,v 1.30 1997/12/07 04:09:15 brian Exp $
*
*/
@@ -48,6 +48,9 @@
#include "defs.h"
#include "vars.h"
#include "id.h"
+#include "os.h"
+#include "ipcp.h"
+#include "iplist.h"
#include "route.h"
static int IfIndex;
@@ -142,17 +145,19 @@ OsSetRoute(int cmd,
LogPrintf(LogTCPIP, "OsSetRoute: Mask = %s\n", inet_ntoa(mask));
switch (rtmes.m_rtm.rtm_errno) {
case EEXIST:
- LogPrintf(LogTCPIP, "Add route failed: Already exists\n");
+ LogPrintf(LogWARN, "Add route failed: %s already exists\n",
+ inet_ntoa(dst));
break;
case ESRCH:
- LogPrintf(LogTCPIP, "Del route failed: Non-existent\n");
+ LogPrintf(LogWARN, "Del route failed: %s: Non-existent\n",
+ inet_ntoa(dst));
break;
case 0:
- LogPrintf(LogTCPIP, "%s route failed: %s\n", cmdstr, strerror(errno));
+ LogPrintf(LogWARN, "%s route failed: %s\n", cmdstr, strerror(errno));
break;
case ENOBUFS:
default:
- LogPrintf(LogTCPIP, "%s route failed: %s\n",
+ LogPrintf(LogWARN, "%s route failed: %s\n",
cmdstr, strerror(rtmes.m_rtm.rtm_errno));
break;
}
@@ -283,7 +288,7 @@ p_flags(u_long f, const char *format)
static const char *
Index2Nam(int idx)
{
- static char ifs[50][6];
+ static char ifs[200][6]; /* We could have 256 tun devices ! */
static int nifs, debug_done;
if (!nifs) {
@@ -493,3 +498,28 @@ GetIfIndex(char *name)
idx++;
return -1;
}
+
+struct in_addr
+ChooseHisAddr(const struct in_addr gw)
+{
+ struct in_addr try;
+ int f;
+
+ for (f = 0; f < DefHisChoice.nItems; f++) {
+ try = iplist_next(&DefHisChoice);
+ LogPrintf(LogDEBUG, "ChooseHisAddr: Check item %d (%s)\n",
+ f, inet_ntoa(try));
+ if (OsTrySetIpaddress(gw, try) == 0) {
+ LogPrintf(LogIPCP, "ChooseHisAddr: Selected IP address %s\n",
+ inet_ntoa(try));
+ break;
+ }
+ }
+
+ if (f == DefHisChoice.nItems) {
+ LogPrintf(LogDEBUG, "ChooseHisAddr: All addresses in use !\n");
+ try.s_addr = INADDR_ANY;
+ }
+
+ return try;
+}
diff --git a/usr.sbin/ppp/route.h b/usr.sbin/ppp/route.h
index 23b56ef..fddf0f7 100644
--- a/usr.sbin/ppp/route.h
+++ b/usr.sbin/ppp/route.h
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: route.h,v 1.6 1997/10/26 01:03:38 brian Exp $
+ * $Id: route.h,v 1.7 1997/11/22 03:37:45 brian Exp $
*
*/
@@ -25,3 +25,4 @@ extern int GetIfIndex(char *);
extern int ShowRoute(struct cmdargs const *);
extern void OsSetRoute(int, struct in_addr, struct in_addr, struct in_addr);
extern void DeleteIfRoutes(int);
+extern struct in_addr ChooseHisAddr(const struct in_addr);
diff --git a/usr.sbin/ppp/vars.c b/usr.sbin/ppp/vars.c
index a6429a2..281e168 100644
--- a/usr.sbin/ppp/vars.c
+++ b/usr.sbin/ppp/vars.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: vars.c,v 1.38 1997/12/03 10:23:53 brian Exp $
+ * $Id: vars.c,v 1.39 1997/12/03 23:28:01 brian Exp $
*
*/
#include <sys/param.h>
@@ -38,8 +38,8 @@
#include "vars.h"
#include "auth.h"
-char VarVersion[] = "PPP Version 1.5";
-char VarLocalVersion[] = "$Date: 1997/12/03 10:23:53 $";
+char VarVersion[] = "PPP Version 1.6";
+char VarLocalVersion[] = "$Date: 1997/12/03 23:28:01 $";
int Utmp = 0;
int ipInOctets = 0;
int ipOutOctets = 0;
OpenPOWER on IntegriCloud