summaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorBrian Somers <brian@FreeBSD.org>1998-01-30 19:46:07 +0000
committerBrian Somers <brian@FreeBSD.org>1998-01-30 19:46:07 +0000
commit8c07a7b2e0d7046e042a0c38fb62f75013bcf072 (patch)
tree59710c84158fc1016e7402b09ab15f150e34f0aa /usr.sbin
parentc8ee0d78b635b119034cc1d40d949fc37f28c19d (diff)
Notes
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/ppp/Makefile4
-rw-r--r--usr.sbin/ppp/async.c13
-rw-r--r--usr.sbin/ppp/async.h4
-rw-r--r--usr.sbin/ppp/auth.c9
-rw-r--r--usr.sbin/ppp/ccp.c10
-rw-r--r--usr.sbin/ppp/ccp.h8
-rw-r--r--usr.sbin/ppp/chap.c4
-rw-r--r--usr.sbin/ppp/command.c9
-rw-r--r--usr.sbin/ppp/deflate.c9
-rw-r--r--usr.sbin/ppp/filter.c4
-rw-r--r--usr.sbin/ppp/fsm.c22
-rw-r--r--usr.sbin/ppp/fsm.h8
-rw-r--r--usr.sbin/ppp/hdlc.c118
-rw-r--r--usr.sbin/ppp/hdlc.h6
-rw-r--r--usr.sbin/ppp/ip.c6
-rw-r--r--usr.sbin/ppp/ip.h6
-rw-r--r--usr.sbin/ppp/ipcp.c14
-rw-r--r--usr.sbin/ppp/ipcp.h4
-rw-r--r--usr.sbin/ppp/lcp.c61
-rw-r--r--usr.sbin/ppp/link.c196
-rw-r--r--usr.sbin/ppp/link.h70
-rw-r--r--usr.sbin/ppp/lqr.c7
-rw-r--r--usr.sbin/ppp/main.c26
-rw-r--r--usr.sbin/ppp/mbuf.c34
-rw-r--r--usr.sbin/ppp/mbuf.h6
-rw-r--r--usr.sbin/ppp/modem.c203
-rw-r--r--usr.sbin/ppp/modem.h14
-rw-r--r--usr.sbin/ppp/pap.c6
-rw-r--r--usr.sbin/ppp/phase.c10
-rw-r--r--usr.sbin/ppp/physical.c8
-rw-r--r--usr.sbin/ppp/physical.h51
-rw-r--r--usr.sbin/ppp/pred.c9
-rw-r--r--usr.sbin/ppp/route.c4
-rw-r--r--usr.sbin/ppp/vjcomp.c6
-rw-r--r--usr.sbin/ppp/vjcomp.h6
35 files changed, 606 insertions, 369 deletions
diff --git a/usr.sbin/ppp/Makefile b/usr.sbin/ppp/Makefile
index 6a4bdf6f9133..df312e056055 100644
--- a/usr.sbin/ppp/Makefile
+++ b/usr.sbin/ppp/Makefile
@@ -1,9 +1,9 @@
-# $Id: Makefile,v 1.36 1998/01/29 00:42:04 brian Exp $
+# $Id: Makefile,v 1.36.2.1 1998/01/29 00:49:10 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 iplist.c lcp.c \
- log.c lqr.c main.c mbuf.c modem.c os.c pap.c phase.c physical.c \
+ link.c log.c lqr.c main.c mbuf.c modem.c os.c pap.c phase.c physical.c \
pred.c route.c server.c sig.c slcompress.c systems.c throughput.c \
timer.c tun.c vars.c vjcomp.c
CFLAGS+=-Wall -Wpointer-arith
diff --git a/usr.sbin/ppp/async.c b/usr.sbin/ppp/async.c
index 5c6b123007b5..dbf64d374960 100644
--- a/usr.sbin/ppp/async.c
+++ b/usr.sbin/ppp/async.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: async.c,v 1.15 1998/01/21 02:15:08 brian Exp $
+ * $Id: async.c,v 1.15.2.1 1998/01/29 00:49:10 brian Exp $
*
*/
#include <sys/param.h>
@@ -40,6 +40,8 @@
#include "loadalias.h"
#include "vars.h"
#include "async.h"
+#include "throughput.h"
+#include "link.h"
#include "physical.h"
#define HDLCSIZE (MAX_MRU*2+6)
@@ -98,7 +100,7 @@ HdlcPutByte(u_char **cp, u_char c, int proto)
}
void
-AsyncOutput(int pri, struct mbuf *bp, int proto, struct physical *physical)
+AsyncOutput(int pri, struct mbuf *bp, int proto, struct link *l)
{
struct async_state *hs = &AsyncState;
u_char *cp, *sp, *ep;
@@ -128,8 +130,8 @@ AsyncOutput(int pri, struct mbuf *bp, int proto, struct physical *physical)
cnt = cp - hs->xbuff;
LogDumpBuff(LogASYNC, "WriteModem", hs->xbuff, cnt);
- WriteModem(physical, pri, (char *) hs->xbuff, cnt);
- ModemAddOutOctets(physical, cnt);
+ link_Write(l, pri, (char *)hs->xbuff, cnt);
+ link_AddOutOctets(l, cnt);
pfree(bp);
}
@@ -181,7 +183,8 @@ AsyncInput(u_char *buff, int cnt, struct physical *physical)
{
struct mbuf *bp;
- ModemAddInOctets(physical, cnt);
+ link_AddInOctets(physical2link(physical), cnt);
+
if (Physical_IsSync(physical)) {
bp = mballoc(cnt, MB_ASYNC);
memcpy(MBUF_CTOP(bp), buff, cnt);
diff --git a/usr.sbin/ppp/async.h b/usr.sbin/ppp/async.h
index 2680776321cd..3aa6707bed70 100644
--- a/usr.sbin/ppp/async.h
+++ b/usr.sbin/ppp/async.h
@@ -23,10 +23,10 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: async.h,v 1.2 1997/12/21 12:11:04 brian Exp $
+ * $Id: async.h,v 1.2.4.1 1998/01/29 00:49:11 brian Exp $
*/
extern void AsyncInit(void);
extern void SetLinkParams(struct lcpstate *);
-extern void AsyncOutput(int, struct mbuf *, int, struct physical *);
+extern void AsyncOutput(int, struct mbuf *, int, struct link *);
extern void AsyncInput(u_char *, int, struct physical *);
diff --git a/usr.sbin/ppp/auth.c b/usr.sbin/ppp/auth.c
index e487437e6fe1..1a1e4fe8223d 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.27.2.1 1998/01/29 00:49:11 brian Exp $
+ * $Id: auth.c,v 1.27.2.2 1998/01/29 23:11:31 brian Exp $
*
* TODO:
* o Implement check against with registered IP addresses.
@@ -43,6 +43,7 @@
#include "auth.h"
#include "chat.h"
#include "systems.h"
+#include "physical.h"
void
LocalAuthInit()
@@ -128,7 +129,8 @@ AuthValidate(const char *fname, const char *system, const char *key,
CloseSecret(fp);
if (n > 2 && !UseHisaddr(vector[2], 1))
return (0);
- IpcpInit(physical);
+ IpcpInit(physical2link(physical)); /* XXX defer this - we may join an
+ * existing bundle ! */
if (n > 3)
SetLabel(vector[3]);
return (1); /* Valid */
@@ -166,7 +168,8 @@ AuthGetSecret(const char *fname, const char *system, int len, int setaddr,
memset(&IpcpInfo.DefHisAddress, '\0', sizeof IpcpInfo.DefHisAddress);
if (n > 2 && setaddr)
if (UseHisaddr(vector[2], 1))
- IpcpInit(physical);
+ IpcpInit(physical2link(physical)); /* XXX defer this - we may join
+ * an existing bundle ! */
else
return NULL;
if (n > 3)
diff --git a/usr.sbin/ppp/ccp.c b/usr.sbin/ppp/ccp.c
index fbb23f91f1b9..3e47385c549f 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.30.2.1 1998/01/29 00:49:13 brian Exp $
+ * $Id: ccp.c,v 1.30.2.2 1998/01/29 20:45:13 brian Exp $
*
* TODO:
* o Support other compression protocols
@@ -149,9 +149,9 @@ ccpstateInit(void)
}
void
-CcpInit(struct physical *physical)
+CcpInit(struct link *l)
{
- FsmInit(&CcpFsm, physical);
+ FsmInit(&CcpFsm, l);
ccpstateInit();
CcpFsm.maxconfig = 10;
}
@@ -417,10 +417,10 @@ CcpResetInput(u_char id)
}
int
-CcpOutput(struct physical *physical, int pri, u_short proto, struct mbuf *m)
+CcpOutput(struct link *l, int pri, u_short proto, struct mbuf *m)
{
if (CcpInfo.out_init)
- return (*algorithm[CcpInfo.out_algorithm]->o.Write)(physical, pri, proto, m);
+ return (*algorithm[CcpInfo.out_algorithm]->o.Write)(l, pri, proto, m);
return 0;
}
diff --git a/usr.sbin/ppp/ccp.h b/usr.sbin/ppp/ccp.h
index c03158144bc5..8f838ff12b3f 100644
--- a/usr.sbin/ppp/ccp.h
+++ b/usr.sbin/ppp/ccp.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: ccp.h,v 1.14.2.1 1998/01/29 00:49:13 brian Exp $
+ * $Id: ccp.h,v 1.14.2.2 1998/01/29 20:45:14 brian Exp $
*
* TODO:
*/
@@ -76,7 +76,7 @@ struct ccp_algorithm {
int (*Init)(void);
void (*Term)(void);
void (*Reset)(void);
- int (*Write)(struct physical *, int, u_short, struct mbuf *);
+ int (*Write)(struct link *, int, u_short, struct mbuf *);
} o;
};
@@ -87,9 +87,9 @@ extern void CcpSendResetReq(struct fsm *);
extern void CcpInput(struct mbuf *);
extern void CcpUp(void);
extern void CcpOpen(void);
-extern void CcpInit(struct physical *physical);
+extern void CcpInit(struct link *);
extern int ReportCcpStatus(struct cmdargs const *);
extern void CcpResetInput(u_char);
-extern int CcpOutput(struct physical *, int, u_short, struct mbuf *);
+extern int CcpOutput(struct link *, int, u_short, struct mbuf *);
extern struct mbuf *CompdInput(u_short *, struct mbuf *);
extern void CcpDictSetup(u_short, struct mbuf *);
diff --git a/usr.sbin/ppp/chap.c b/usr.sbin/ppp/chap.c
index 758fe0d60927..a87a0aa83845 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.28.2.1 1998/01/29 00:49:13 brian Exp $
+ * $Id: chap.c,v 1.28.2.2 1998/01/30 01:33:44 brian Exp $
*
* TODO:
*/
@@ -80,7 +80,7 @@ ChapOutput(struct physical *physical, u_int code, u_int id,
memcpy(MBUF_CTOP(bp) + sizeof(struct fsmheader), ptr, count);
LogDumpBp(LogDEBUG, "ChapOutput", bp);
LogPrintf(LogLCP, "ChapOutput: %s\n", chapcodes[code]);
- HdlcOutput(physical, PRI_LINK, PROTO_CHAP, bp);
+ HdlcOutput(physical2link(physical), PRI_LINK, PROTO_CHAP, bp);
}
diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c
index ccc02dd650cc..efdefbf99ca0 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.131.2.1 1998/01/29 00:49:15 brian Exp $
+ * $Id: command.c,v 1.131.2.2 1998/01/29 23:11:33 brian Exp $
*
*/
#include <sys/param.h>
@@ -74,6 +74,7 @@
#include "ip.h"
#include "slcompress.h"
#include "auth.h"
+#include "link.h"
#include "physical.h"
struct in_addr ifnetmask;
@@ -640,7 +641,7 @@ static struct cmdtab const ShowCommands[] = {
"Show Preferred MTU", "show mtu"},
{"ofilter", NULL, ShowOfilter, LOCAL_AUTH,
"Show Output filters", "show ofilter option .."},
- {"proto", NULL, ReportProtStatus, LOCAL_AUTH,
+ {"proto", NULL, ReportProtocolStatus, LOCAL_AUTH,
"Show protocol summary", "show proto"},
{"reconnect", NULL, ShowReconnect, LOCAL_AUTH,
"Show reconnect timer", "show reconnect"},
@@ -1372,8 +1373,8 @@ SetVariable(struct cmdargs const *arg)
break;
case VAR_DEVICE:
if (mode & MODE_INTER)
- HangupModem(pppVars.physical, 0);
- if (Physical_IsActive(pppVars.physical))
+ link_Close(physical2link(pppVars.physical), 0);
+ if (link_IsActive(physical2link(pppVars.physical)))
LogPrintf(LogWARN,
"Cannot change device to \"%s\" when \"%s\" is open\n",
argp, Physical_GetDevice(pppVars.physical));
diff --git a/usr.sbin/ppp/deflate.c b/usr.sbin/ppp/deflate.c
index 93ff3aa0b165..dcc3f07e9aad 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.6.4.1 1998/01/29 00:49:16 brian Exp $
+ * $Id: deflate.c,v 1.6.4.2 1998/01/30 01:33:45 brian Exp $
*/
#include <sys/param.h>
@@ -45,6 +45,8 @@
#include "ccp.h"
#include "lcpproto.h"
#include "fsm.h"
+#include "throughput.h"
+#include "link.h"
#include "deflate.h"
/* Our state */
@@ -72,8 +74,7 @@ DeflateResetOutput(void)
}
static int
-DeflateOutput(struct physical *physical, int pri, u_short proto,
- struct mbuf *mp)
+DeflateOutput(struct link *l, int pri, u_short proto, struct mbuf *mp)
{
u_char *wp, *rp;
int olen, ilen, len, res, flush;
@@ -185,7 +186,7 @@ DeflateOutput(struct physical *physical, int pri, u_short proto,
LogPrintf(LogDEBUG, "DeflateOutput: %d => %d bytes, proto 0x%04x\n",
ilen, olen, proto);
- HdlcOutput(physical, PRI_NORMAL, PROTO_COMPD, mo_head);
+ HdlcOutput(l, PRI_NORMAL, PROTO_COMPD, mo_head);
return 1;
}
diff --git a/usr.sbin/ppp/filter.c b/usr.sbin/ppp/filter.c
index b3f2588f7ce7..a9ea18c0f3af 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.22 1998/01/21 02:15:14 brian Exp $
+ * $Id: filter.c,v 1.22.2.1 1998/01/29 23:11:33 brian Exp $
*
* TODO: Shoud send ICMP error message when we discard packets.
*/
@@ -40,6 +40,8 @@
#include "iplist.h"
#include "timer.h"
#include "throughput.h"
+#include "hdlc.h"
+#include "link.h"
#include "ipcp.h"
#include "filter.h"
diff --git a/usr.sbin/ppp/fsm.c b/usr.sbin/ppp/fsm.c
index 4cbc6ae338e6..095a4eb5b4f3 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.27 1998/01/20 22:47:36 brian Exp $
+ * $Id: fsm.c,v 1.27.2.1 1998/01/29 00:49:19 brian Exp $
*
* TODO:
* o Refer loglevel for log output
@@ -44,6 +44,8 @@
#include "modem.h"
#include "loadalias.h"
#include "vars.h"
+#include "throughput.h"
+#include "link.h"
#include "physical.h"
u_char AckBuff[200];
@@ -74,21 +76,21 @@ StoppedTimeout(void *v)
fp->name);
StopTimer(&fp->OpenTimer);
}
- if (Physical_IsActive(fp->physical))
+ if (link_IsActive(fp->link))
DownConnection();
else
FsmDown(fp);
}
void
-FsmInit(struct fsm * fp, struct physical *physical)
+FsmInit(struct fsm * fp, struct link *l)
{
LogPrintf(LogDEBUG, "FsmInit\n");
fp->state = ST_INITIAL;
fp->reqid = 1;
fp->restart = 1;
fp->maxconfig = 3;
- fp->physical = physical;
+ fp->link = l;
}
static void
@@ -126,7 +128,7 @@ FsmOutput(struct fsm * fp, u_int code, u_int id, u_char * ptr, int count)
if (count)
memcpy(MBUF_CTOP(bp) + sizeof(struct fsmheader), ptr, count);
LogDumpBp(LogDEBUG, "FsmOutput", bp);
- HdlcOutput(fp->physical, PRI_LINK, fp->proto, bp);
+ HdlcOutput(fp->link, PRI_LINK, fp->proto, bp);
}
static void
@@ -655,8 +657,9 @@ FsmRecvCodeRej(struct fsm * fp, struct fsmheader * lhp, struct mbuf * bp)
}
static void
-FsmRecvProtoRej(struct fsm * fp, struct fsmheader * lhp, struct mbuf * bp)
+FsmRecvProtoRej(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp)
{
+ struct physical *p = link2physical(fp->link);
u_short *sp, proto;
sp = (u_short *) MBUF_CTOP(bp);
@@ -665,7 +668,10 @@ FsmRecvProtoRej(struct fsm * fp, struct fsmheader * lhp, struct mbuf * bp)
switch (proto) {
case PROTO_LQR:
- StopLqr(fp->physical, LQM_LQR);
+ if (p)
+ StopLqr(p, LQM_LQR);
+ else
+ LogPrintf(LogERROR, "FsmRecvProtoRej: Not a physical link !\n");
break;
case PROTO_CCP:
fp = &CcpFsm;
@@ -758,7 +764,7 @@ FsmRecvResetReq(struct fsm * fp, struct fsmheader * lhp, struct mbuf * bp)
* output queue.... dump 'em to the priority queue so that they arrive
* at the peer before our ResetAck.
*/
- SequenceQueues(fp->physical);
+ link_SequenceQueue(fp->link);
LogPrintf(fp->LogLevel, "SendResetAck(%d)\n", lhp->id);
FsmOutput(fp, CODE_RESETACK, lhp->id, NULL, 0);
pfree(bp);
diff --git a/usr.sbin/ppp/fsm.h b/usr.sbin/ppp/fsm.h
index 347b451079b3..44b0a95745d3 100644
--- a/usr.sbin/ppp/fsm.h
+++ b/usr.sbin/ppp/fsm.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: fsm.h,v 1.16 1998/01/21 02:15:15 brian Exp $
+ * $Id: fsm.h,v 1.16.2.1 1998/01/29 00:49:21 brian Exp $
*
* TODO:
*/
@@ -70,8 +70,8 @@ struct fsm {
struct pppTimer StoppedTimer;
int LogLevel;
- /* The physical layer active with this FSM. */
- struct physical *physical;
+ /* The link layer active with this FSM. */
+ struct link *link;
void (*LayerUp) (struct fsm *);
void (*LayerDown) (struct fsm *);
@@ -126,7 +126,7 @@ extern u_char *rejp;
extern char const *StateNames[];
-extern void FsmInit(struct fsm *, struct physical *);
+extern void FsmInit(struct fsm *, struct link *);
extern void FsmOutput(struct fsm *, u_int, u_int, u_char *, int);
extern void FsmOpen(struct fsm *);
extern void FsmUp(struct fsm *);
diff --git a/usr.sbin/ppp/hdlc.c b/usr.sbin/ppp/hdlc.c
index b5f77d3aaedc..942ba316ca76 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.28.2.1 1998/01/29 00:49:21 brian Exp $
+ * $Id: hdlc.c,v 1.28.2.2 1998/01/29 23:11:34 brian Exp $
*
* TODO:
*/
@@ -50,6 +50,7 @@
#include "vars.h"
#include "modem.h"
#include "ccp.h"
+#include "link.h"
#include "physical.h"
static struct hdlcstat {
@@ -63,25 +64,6 @@ static int ifOutPackets;
static int ifOutOctets;
static int ifOutLQRs;
-static struct protostat {
- u_short number;
- const char *name;
- u_long in_count;
- u_long out_count;
-} ProtocolStat[] = {
- { PROTO_IP, "IP" },
- { PROTO_VJUNCOMP, "VJ_UNCOMP" },
- { PROTO_VJCOMP, "VJ_COMP" },
- { PROTO_COMPD, "COMPD" },
- { PROTO_LCP, "LCP" },
- { PROTO_IPCP, "IPCP" },
- { PROTO_CCP, "CCP" },
- { PROTO_PAP, "PAP" },
- { PROTO_LQR, "LQR" },
- { PROTO_CHAP, "CHAP" },
- { 0, "Others" }
-};
-
static u_short const fcstab[256] = {
/* 00 */ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
/* 08 */ 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
@@ -160,21 +142,32 @@ HdlcFcsBuf(u_short fcs, struct mbuf *m)
}
void
-HdlcOutput(struct physical *physical,
- int pri, u_short proto, struct mbuf * bp)
+HdlcOutput(struct link *l, int pri, u_short proto, struct mbuf *bp)
{
+ struct physical *p = link2physical(l);
struct mbuf *mhp, *mfcs;
- struct protostat *statp;
struct lqrdata *lqr;
u_char *cp;
u_short fcs;
if ((proto & 0xfff1) == 0x21) /* Network Layer protocol */
if (CcpFsm.state == ST_OPENED)
- if (CcpOutput(physical, pri, proto, bp))
+ if (CcpOutput(l, pri, proto, bp))
return;
- if (Physical_IsSync(physical))
+ if (!p) {
+ /*
+ * This is where we multiplex the data over our available physical
+ * links. We don't frame our logical link data. Instead we wait
+ * for the logical link implementation to chop our data up and pile
+ * it into the physical links by re-calling this function with the
+ * encapsulated fragments.
+ */
+ link_Output(l, pri, bp);
+ return;
+ }
+
+ if (Physical_IsSync(p))
mfcs = NULL;
else
mfcs = mballoc(2, MB_HDLCOUT);
@@ -199,6 +192,7 @@ HdlcOutput(struct physical *physical,
*cp = proto & 0377;
mhp->cnt += 2;
}
+
mhp->next = bp;
while (bp->next != NULL)
bp = bp->next;
@@ -224,7 +218,8 @@ HdlcOutput(struct physical *physical,
LqrDump("LqrOutput", lqr);
LqrChangeOrder(lqr, (struct lqrdata *) (MBUF_CTOP(bp)));
}
- if (!Physical_IsSync(physical)) {
+
+ if (mfcs) {
mfcs->cnt = 0;
fcs = HdlcFcsBuf(INITFCS, mhp);
fcs = ~fcs;
@@ -233,18 +228,16 @@ HdlcOutput(struct physical *physical,
*cp++ = fcs >> 8;
mfcs->cnt = 2;
}
+
LogDumpBp(LogHDLC, "HdlcOutput", mhp);
- for (statp = ProtocolStat; statp->number; statp++)
- if (statp->number == proto)
- break;
- statp->out_count++;
+ link_ProtocolRecord(l, proto, PROTO_OUT);
LogPrintf(LogDEBUG, "HdlcOutput: proto = 0x%04x\n", proto);
- if (Physical_IsSync(physical))
- ModemOutput(physical, pri, mhp);
+ if (Physical_IsSync(p))
+ link_Output(l, pri, mhp); /* Send it raw */
else
- AsyncOutput(pri, mhp, proto, physical);
+ AsyncOutput(pri, mhp, proto, l);
}
/* Check out the latest ``Assigned numbers'' rfc (rfc1700.txt) */
@@ -374,8 +367,9 @@ Protocol2Nam(u_short proto)
}
static void
-DecodePacket(u_short proto, struct mbuf * bp, struct physical *physical)
+DecodePacket(u_short proto, struct mbuf * bp, struct link *l)
{
+ struct physical *p = link2physical(l);
u_char *cp;
LogPrintf(LogDEBUG, "DecodePacket: proto = 0x%04x\n", proto);
@@ -396,21 +390,35 @@ DecodePacket(u_short proto, struct mbuf * bp, struct physical *physical)
LcpInput(bp);
break;
case PROTO_PAP:
- PapInput(bp, physical);
+ if (p)
+ PapInput(bp, p);
+ else {
+ LogPrintf(LogERROR, "DecodePacket: PAP: Not a physical link !\n");
+ pfree(bp);
+ }
break;
case PROTO_LQR:
HisLqrSave.SaveInLQRs++;
- LqrInput(physical, bp);
+ if (p)
+ LqrInput(p, bp);
+ else {
+ LogPrintf(LogERROR, "DecodePacket: LQR: Not a physical link !\n");
+ pfree(bp);
+ }
break;
case PROTO_CHAP:
- ChapInput(bp, physical);
+ if (p)
+ ChapInput(bp, p);
+ else {
+ LogPrintf(LogERROR, "DecodePacket: CHAP: Not a physical link !\n");
+ pfree(bp);
+ }
break;
case PROTO_VJUNCOMP:
case PROTO_VJCOMP:
bp = VjCompInput(bp, proto);
- if (bp == NULL) {
+ if (bp == NULL)
break;
- }
/* fall down */
case PROTO_IP:
IpInput(bp);
@@ -436,30 +444,6 @@ DecodePacket(u_short proto, struct mbuf * bp, struct physical *physical)
}
int
-ReportProtStatus(struct cmdargs const *arg)
-{
- struct protostat *statp;
- int cnt;
-
- statp = ProtocolStat;
- statp--;
- cnt = 0;
- fprintf(VarTerm, " Protocol in out Protocol in out\n");
- do {
- statp++;
- fprintf(VarTerm, " %-9s: %8lu, %8lu",
- statp->name, statp->in_count, statp->out_count);
- if (++cnt == 2) {
- fprintf(VarTerm, "\n");
- cnt = 0;
- }
- } while (statp->number);
- if (cnt)
- fprintf(VarTerm, "\n");
- return (0);
-}
-
-int
ReportHdlcStatus(struct cmdargs const *arg)
{
struct hdlcstat *hp = &HdlcStat;
@@ -493,7 +477,6 @@ HdlcInput(struct mbuf * bp, struct physical *physical)
{
u_short fcs, proto;
u_char *cp, addr, ctrl;
- struct protostat *statp;
LogDumpBp(LogHDLC, "HdlcInput:", bp);
if (Physical_IsSync(physical))
@@ -570,11 +553,8 @@ HdlcInput(struct mbuf * bp, struct physical *physical)
bp->cnt -= 2;
}
- for (statp = ProtocolStat; statp->number; statp++)
- if (statp->number == proto)
- break;
- statp->in_count++;
+ link_ProtocolRecord(physical2link(physical), proto, PROTO_IN);
HisLqrSave.SaveInPackets++;
- DecodePacket(proto, bp, physical);
+ DecodePacket(proto, bp, physical2link(physical));
}
diff --git a/usr.sbin/ppp/hdlc.h b/usr.sbin/ppp/hdlc.h
index 2bcace512556..953242450ebc 100644
--- a/usr.sbin/ppp/hdlc.h
+++ b/usr.sbin/ppp/hdlc.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: hdlc.h,v 1.14 1998/01/21 02:15:15 brian Exp $
+ * $Id: hdlc.h,v 1.14.2.1 1998/01/29 00:49:22 brian Exp $
*
* TODO:
*/
@@ -54,15 +54,17 @@
#define PRI_NORMAL 0 /* Normal priority */
#define PRI_FAST 1 /* Fast (interractive) */
#define PRI_LINK 1 /* Urgent (LQR packets) */
+#define PRI_MAX 1
extern u_char EscMap[33];
struct physical;
+struct link;
extern void HdlcInit(void);
extern void HdlcErrorCheck(void);
extern void HdlcInput(struct mbuf *, struct physical *);
-extern void HdlcOutput(struct physical *, int, u_short, struct mbuf *bp);
+extern void HdlcOutput(struct link *, int, u_short, struct mbuf *bp);
extern u_short HdlcFcs(u_short, u_char *, int);
extern int ReportHdlcStatus(struct cmdargs const *);
extern int ReportProtStatus(struct cmdargs const *);
diff --git a/usr.sbin/ppp/ip.c b/usr.sbin/ppp/ip.c
index bf354f1d43eb..ca63b84c22ab 100644
--- a/usr.sbin/ppp/ip.c
+++ b/usr.sbin/ppp/ip.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: ip.c,v 1.38.2.1 1998/01/29 00:49:22 brian Exp $
+ * $Id: ip.c,v 1.38.2.2 1998/01/29 23:11:35 brian Exp $
*
* TODO:
* o Return ICMP message for filterd packet
@@ -516,7 +516,7 @@ IsIpEnqueued()
#endif
void
-IpStartOutput(struct physical *physical)
+IpStartOutput(struct link *l)
{
struct mqueue *queue;
struct mbuf *bp;
@@ -529,7 +529,7 @@ IpStartOutput(struct physical *physical)
bp = Dequeue(queue);
if (bp) {
cnt = plength(bp);
- SendPppFrame(physical, bp);
+ SendPppFrame(l, bp);
RestartIdleTimer();
IpcpAddOutOctets(cnt);
break;
diff --git a/usr.sbin/ppp/ip.h b/usr.sbin/ppp/ip.h
index a2cdcb20f1cd..598dd2c81e2d 100644
--- a/usr.sbin/ppp/ip.h
+++ b/usr.sbin/ppp/ip.h
@@ -17,13 +17,11 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: ip.h,v 1.8 1997/12/29 22:23:11 brian Exp $
+ * $Id: ip.h,v 1.8.2.1 1998/01/29 00:49:23 brian Exp $
*
*/
-struct physical;
-
-extern void IpStartOutput(struct physical *);
+extern void IpStartOutput(struct link *);
extern int PacketCheck(char *, int, int);
extern void IpEnqueue(int, char *, int);
extern void IpInput(struct mbuf *);
diff --git a/usr.sbin/ppp/ipcp.c b/usr.sbin/ppp/ipcp.c
index d12189f1407d..77eea63a7021 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.50.2.1 1998/01/29 00:49:23 brian Exp $
+ * $Id: ipcp.c,v 1.50.2.2 1998/01/29 23:11:36 brian Exp $
*
* TODO:
* o More RFC1772 backwoard compatibility
@@ -55,6 +55,8 @@
#include "ip.h"
#include "route.h"
#include "filter.h"
+#include "hdlc.h"
+#include "link.h"
#include "physical.h"
struct compreq {
@@ -223,11 +225,11 @@ ShowInitVJ(struct cmdargs const *args)
}
void
-IpcpInit(struct physical *physical)
+IpcpInit(struct link *l)
{
if (iplist_isvalid(&IpcpInfo.DefHisChoice))
iplist_setrandpos(&IpcpInfo.DefHisChoice);
- FsmInit(&IpcpFsm, physical);
+ FsmInit(&IpcpFsm, l);
IpcpInfo.his_compproto = 0;
IpcpInfo.his_reject = IpcpInfo.my_reject = 0;
@@ -270,14 +272,15 @@ IpcpInitRestartCounter(struct fsm * fp)
}
static void
-IpcpSendConfigReq(struct fsm * fp)
+IpcpSendConfigReq(struct fsm *fp)
{
+ struct physical *p = link2physical(fp->link);
u_char *cp;
struct lcp_opt o;
cp = ReqBuff;
LogPrintf(LogIPCP, "IpcpSendConfigReq\n");
- if (!Physical_IsSync(fp->physical) || !REJECTED(&IpcpInfo, TY_IPADDR)) {
+ if ((p && !Physical_IsSync(p)) || !REJECTED(&IpcpInfo, TY_IPADDR)) {
o.id = TY_IPADDR;
o.len = 6;
*(u_long *)o.data = IpcpInfo.want_ipaddr.s_addr;
@@ -327,7 +330,6 @@ IpcpLayerFinish(struct fsm * fp)
LogPrintf(LogIPCP, "IpcpLayerFinish.\n");
reconnect(RECON_FALSE);
LcpClose(&LcpFsm);
- NewPhase(fp->physical, PHASE_TERMINATE);
}
static void
diff --git a/usr.sbin/ppp/ipcp.h b/usr.sbin/ppp/ipcp.h
index 0bbc979bad64..f55677331d17 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.18.2.3 1998/01/30 01:28:35 brian Exp $
+ * $Id: ipcp.h,v 1.18.2.4 1998/01/30 01:32:55 brian Exp $
*
* TODO:
*/
@@ -73,7 +73,7 @@ struct ipcpstate {
extern struct ipcpstate IpcpInfo;
extern struct fsm IpcpFsm;
-extern void IpcpInit(struct physical *physical);
+extern void IpcpInit(struct link *l);
extern void IpcpDefAddress(void);
extern void IpcpUp(void);
extern void IpcpOpen(void);
diff --git a/usr.sbin/ppp/lcp.c b/usr.sbin/ppp/lcp.c
index 1ee4414f92e2..feaf0b0bccc9 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.55.2.2 1998/01/29 23:11:38 brian Exp $
+ * $Id: lcp.c,v 1.55.2.3 1998/01/30 01:33:45 brian Exp $
*
* TODO:
* o Limit data field length by MRU
@@ -65,6 +65,7 @@
#include "ip.h"
#include "modem.h"
#include "tun.h"
+#include "link.h"
#include "physical.h"
/* for received LQRs */
@@ -202,7 +203,7 @@ GenerateMagic(void)
void
LcpInit(struct physical *physical)
{
- FsmInit(&LcpFsm, physical);
+ FsmInit(&LcpFsm, physical2link(physical));
HdlcInit();
memset(&LcpInfo, '\0', sizeof LcpInfo);
LcpInfo.want_mru = VarMRU;
@@ -310,14 +311,20 @@ do { \
#define PUTMSCHAP() PUTCHAP(0x80)
static void
-LcpSendConfigReq(struct fsm * fp)
+LcpSendConfigReq(struct fsm *fp)
{
+ struct physical *p = link2physical(fp->link);
u_char *cp;
struct lcp_opt o;
+ if (!p) {
+ LogPrintf(LogERROR, "LcpSendConfigReq: Not a physical link !\n");
+ return;
+ }
+
LogPrintf(LogLCP, "LcpSendConfigReq\n");
cp = ReqBuff;
- if (!Physical_IsSync(fp->physical)) {
+ if (!Physical_IsSync(p)) {
if (LcpInfo.want_acfcomp && !REJECTED(&LcpInfo, TY_ACFCOMP))
PUTN(TY_ACFCOMP);
@@ -377,10 +384,15 @@ LcpSendTerminateAck(struct fsm * fp)
}
static void
-LcpLayerStart(struct fsm * fp)
+LcpLayerStart(struct fsm *fp)
{
+ struct physical *p = link2physical(fp->link);
+
LogPrintf(LogLCP, "LcpLayerStart\n");
- NewPhase(fp->physical, PHASE_ESTABLISH);
+ if (p)
+ NewPhase(p, PHASE_ESTABLISH);
+ else
+ LogPrintf(LogERROR, "LcpLayerStart: Not a physical link !\n");
}
static void
@@ -394,29 +406,38 @@ StopAllTimers(void)
}
static void
-LcpLayerFinish(struct fsm * fp)
+LcpLayerFinish(struct fsm *fp)
{
+ struct physical *p = link2physical(fp->link);
+
LogPrintf(LogLCP, "LcpLayerFinish\n");
- HangupModem(fp->physical, 0);
+ link_Close(fp->link, 0);
StopAllTimers();
/* We're down at last. Lets tell background and direct mode to get out */
- NewPhase(fp->physical, PHASE_DEAD);
- LcpInit(fp->physical);
- IpcpInit(fp->physical);
- CcpInit(fp->physical);
+ if (p) {
+ NewPhase(p, PHASE_DEAD);
+ LcpInit(p);
+ } else
+ LogPrintf(LogERROR, "LcpLayerFinish: Not a physical link !\n");
+ IpcpInit(fp->link);
+ CcpInit(fp->link);
Prompt();
}
static void
-LcpLayerUp(struct fsm * fp)
+LcpLayerUp(struct fsm *fp)
{
+ struct physical *p = link2physical(fp->link);
+
LogPrintf(LogLCP, "LcpLayerUp\n");
- tun_configure(LcpInfo.his_mru, ModemSpeed(fp->physical));
SetLinkParams(&LcpInfo);
- NewPhase(fp->physical, PHASE_AUTHENTICATE);
+ if (p) {
+ NewPhase(p, PHASE_AUTHENTICATE);
+ StartLqm(p);
+ } else
+ LogPrintf(LogERROR, "LcpLayerUp: Not a physical link !\n");
- StartLqm(fp->physical);
StopTimer(&LcpInfo.ReportTimer);
LcpInfo.ReportTimer.state = TIMER_STOPPED;
LcpInfo.ReportTimer.load = 60 * SECTICKS;
@@ -464,7 +485,13 @@ LcpOpen(int open_mode)
void
LcpClose(struct fsm *fp)
{
- NewPhase(fp->physical, PHASE_TERMINATE);
+ struct physical *p = link2physical(fp->link);
+
+ if (p)
+ NewPhase(p, PHASE_TERMINATE);
+ else
+ LogPrintf(LogERROR, "LcpClose: Not a physical link !\n");
+
OsInterfaceDown(0);
FsmClose(fp);
LcpInfo.LcpFailedMagic = 0;
diff --git a/usr.sbin/ppp/link.c b/usr.sbin/ppp/link.c
new file mode 100644
index 000000000000..af5052bc5aa2
--- /dev/null
+++ b/usr.sbin/ppp/link.c
@@ -0,0 +1,196 @@
+/*-
+ * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include <sys/param.h>
+#include <netinet/in.h>
+
+#include <stdio.h>
+
+#include "command.h"
+#include "mbuf.h"
+#include "log.h"
+#include "defs.h"
+#include "hdlc.h"
+#include "timer.h"
+#include "throughput.h"
+#include "lcpproto.h"
+#include "loadalias.h"
+#include "vars.h"
+#include "link.h"
+
+void
+link_AddInOctets(struct link *l, int n)
+{
+ throughput_addin(&l->throughput, n);
+}
+
+void
+link_AddOutOctets(struct link *l, int n)
+{
+ throughput_addout(&l->throughput, n);
+}
+
+void
+link_SequenceQueue(struct link *l)
+{
+ LogPrintf(LogDEBUG, "link_SequenceQueue\n");
+ while (l->Queue[PRI_NORMAL].qlen)
+ Enqueue(l->Queue + PRI_LINK, Dequeue(l->Queue + PRI_NORMAL));
+}
+
+int
+link_QueueLen(struct link *l)
+{
+ int i, len;
+
+ for (i = 0, len = 0; i < LINK_QUEUES; i++)
+ len += l->Queue[i].qlen;
+
+ return len;
+}
+
+struct mbuf *
+link_Dequeue(struct link *l)
+{
+ int pri;
+ struct mbuf *bp;
+
+ for (bp = (struct mbuf *)0, pri = LINK_QUEUES - 1; pri >= 0; pri--)
+ if (l->Queue[pri].qlen) {
+ bp = Dequeue(l->Queue + pri);
+ if (pri > PRI_NORMAL)
+ LogPrintf(LogDEBUG, "link_Dequeue: Output from queue %d,"
+ " containing %d packets\n", pri, l->Queue[pri].qlen);
+ LogPrintf(LogDEBUG, "link_Dequeue: Dequeued from %d\n", pri);
+ break;
+ }
+
+ return bp;
+}
+
+/*
+ * Write to the link. Actualy, requested packets are queued, and go out
+ * at some later time depending on the physical link implementation.
+ */
+void
+link_Write(struct link *l, int pri, const char *ptr, int count)
+{
+ struct mbuf *bp;
+
+ if(pri < 0 || pri >= LINK_QUEUES)
+ pri = 0;
+
+ bp = mballoc(count, MB_LINK);
+ memcpy(MBUF_CTOP(bp), ptr, count);
+
+ Enqueue(l->Queue + pri, bp);
+}
+
+void
+link_StartOutput(struct link *l)
+{
+ (*l->StartOutput)(l);
+}
+
+void
+link_Output(struct link *l, int pri, struct mbuf *bp)
+{
+ struct mbuf *wp;
+ int len;
+
+ if(pri < 0 || pri >= LINK_QUEUES)
+ pri = 0;
+
+ len = plength(bp);
+ wp = mballoc(len, MB_LINK);
+ mbread(bp, MBUF_CTOP(wp), len);
+ Enqueue(l->Queue + pri, wp);
+ link_StartOutput(l);
+}
+
+int
+link_IsActive(struct link *l)
+{
+ return (*l->IsActive)(l);
+}
+
+void
+link_Close(struct link *l, int dedicated_force)
+{
+ (*l->Close)(l, dedicated_force);
+}
+
+static struct protostatheader {
+ u_short number;
+ const char *name;
+} ProtocolStat[NPROTOSTAT] = {
+ { PROTO_IP, "IP" },
+ { PROTO_VJUNCOMP, "VJ_UNCOMP" },
+ { PROTO_VJCOMP, "VJ_COMP" },
+ { PROTO_COMPD, "COMPD" },
+ { PROTO_LCP, "LCP" },
+ { PROTO_IPCP, "IPCP" },
+ { PROTO_CCP, "CCP" },
+ { PROTO_PAP, "PAP" },
+ { PROTO_LQR, "LQR" },
+ { PROTO_CHAP, "CHAP" },
+ { 0, "Others" }
+};
+
+void
+link_ProtocolRecord(struct link *l, u_short proto, int type)
+{
+ int i;
+
+ for (i = 0; i < NPROTOSTAT; i++)
+ if (ProtocolStat[i].number == proto)
+ break;
+
+ if (type == PROTO_IN)
+ l->proto_in[i]++;
+ else
+ l->proto_out[i]++;
+}
+
+void
+link_ReportProtocolStatus(struct link *l)
+{
+ int i;
+
+ fprintf(VarTerm,
+ " Protocol in out Protocol in out\n");
+ for (i = 0; i < NPROTOSTAT; i++) {
+ fprintf(VarTerm, " %-9s: %8lu, %8lu",
+ ProtocolStat[i].name, l->proto_in[i], l->proto_out[i]);
+ if ((i % 2) == 0)
+ fprintf(VarTerm, "\n");
+ }
+ if (i % 2)
+ fprintf(VarTerm, "\n");
+}
diff --git a/usr.sbin/ppp/link.h b/usr.sbin/ppp/link.h
new file mode 100644
index 000000000000..411b106c09a4
--- /dev/null
+++ b/usr.sbin/ppp/link.h
@@ -0,0 +1,70 @@
+/*-
+ * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+
+#define PHYSICAL_LINK 1
+#define MP_LINK 2
+
+#define LINK_QUEUES (PRI_MAX + 1)
+#define NPROTOSTAT 11
+
+struct link {
+ int type; /* _LINK type */
+ const char *name; /* unique id per link type */
+ int len; /* full size of parent struct */
+ struct pppThroughput throughput; /* Link throughput statistics */
+ struct pppTimer Timer; /* inactivity timeout */
+ struct mqueue Queue[LINK_QUEUES]; /* Our output queue of mbufs */
+
+ u_long proto_in[NPROTOSTAT]; /* outgoing protocol stats */
+ u_long proto_out[NPROTOSTAT]; /* incoming protocol stats */
+
+ /* Implementation routines for use by link_ routines */
+ void (*StartOutput)(struct link *); /* send the queued data */
+ int (*IsActive)(struct link *); /* Are we active ? */
+ void (*Close)(struct link *, int); /* Close the link */
+};
+
+extern void link_AddInOctets(struct link *, int);
+extern void link_AddOutOctets(struct link *, int);
+
+extern void link_SequenceQueue(struct link *);
+extern int link_QueueLen(struct link *);
+extern struct mbuf *link_Dequeue(struct link *);
+extern void link_Write(struct link *, int, const char *, int);
+extern void link_StartOutput(struct link *);
+extern void link_Output(struct link *, int, struct mbuf *);
+
+#define PROTO_IN 1 /* third arg to link_ProtocolRecord */
+#define PROTO_OUT 2
+extern void link_ProtocolRecord(struct link *, u_short, int);
+extern void link_ReportProtocolStatus(struct link *);
+
+extern int link_IsActive(struct link *);
+extern void link_Close(struct link *, int);
diff --git a/usr.sbin/ppp/lqr.c b/usr.sbin/ppp/lqr.c
index f0e226b336d3..b0fc9b5d116c 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.22.2.1 1998/01/29 00:49:25 brian Exp $
+ * $Id: lqr.c,v 1.22.2.2 1998/01/30 01:33:46 brian Exp $
*
* o LQR based on RFC1333
*
@@ -37,6 +37,7 @@
#include "timer.h"
#include "fsm.h"
#include "lcpproto.h"
+#include "physical.h"
#include "lqr.h"
#include "hdlc.h"
#include "lcp.h"
@@ -128,7 +129,7 @@ SendLqrReport(void *v)
LcpClose(&LcpFsm);
} else {
bp = mballoc(sizeof(struct lqrdata), MB_LQR);
- HdlcOutput(physical, PRI_LINK, PROTO_LQR, bp);
+ HdlcOutput(physical2link(physical), PRI_LINK, PROTO_LQR, bp);
lqrsendcnt++;
}
} else if (lqmmethod & LQM_ECHO) {
@@ -221,7 +222,7 @@ StartLqm(struct physical *physical)
LqrTimer.state = TIMER_STOPPED;
LqrTimer.load = period * SECTICKS / 100;
LqrTimer.func = SendLqrReport;
- LqrTimer.arg = physical;
+ LqrTimer.arg = physical;
SendLqrReport(physical);
StartTimer(&LqrTimer);
LogPrintf(LogLQM, "Will send LQR every %d.%d secs\n",
diff --git a/usr.sbin/ppp/main.c b/usr.sbin/ppp/main.c
index 7fc7415d7550..4dd5992f09b0 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.121.2.1 1998/01/29 00:49:26 brian Exp $
+ * $Id: main.c,v 1.121.2.2 1998/01/29 23:11:39 brian Exp $
*
* TODO:
* o Add commands for traffic summary, version display, etc.
@@ -75,6 +75,7 @@
#include "pathnames.h"
#include "tun.h"
#include "route.h"
+#include "link.h"
#include "physical.h"
#ifndef O_NONBLOCK
@@ -183,8 +184,8 @@ Cleanup(int excode)
DropClient(1);
ServerClose();
OsInterfaceDown(1);
- HangupModem(pppVars.physical, 1); /* XXX must be expanded to
- take all modems */
+ link_Close(physical2link(pppVars.physical), 1); /* XXX gotta get a handle on
+ * the logical link */
nointr_sleep(1);
DeleteIfRoutes(1);
ID0unlink(pid_filename);
@@ -575,8 +576,8 @@ PacketMode(int delay)
AsyncInit();
VjInit(15);
LcpInit(pppVars.physical);
- IpcpInit(pppVars.physical);
- CcpInit(pppVars.physical);
+ IpcpInit(physical2link(pppVars.physical));
+ CcpInit(physical2link(pppVars.physical));
LcpUp();
LcpOpen(delay);
@@ -773,7 +774,7 @@ DoLoop(void)
LogPrintf(LogPHASE, "Packet mode enabled\n");
PacketMode(VarOpenMode);
} else if (mode & MODE_DEDICATED) {
- if (!Physical_IsActive(pppVars.physical))
+ if (!link_IsActive(physical2link(pppVars.physical)))
while (OpenModem(pppVars.physical) < 0)
nointr_sleep(VarReconnectTimer);
}
@@ -885,13 +886,14 @@ DoLoop(void)
}
}
}
- qlen = ModemQlen(pppVars.physical);
+ qlen = link_QueueLen(physical2link(pppVars.physical));
if (qlen == 0) {
- IpStartOutput(pppVars.physical);
- qlen = ModemQlen(pppVars.physical);
+ IpStartOutput(physical2link(pppVars.physical));
+ qlen = link_QueueLen(physical2link(pppVars.physical));
}
- if (Physical_IsActive(pppVars.physical)) {
+
+ if (link_IsActive(physical2link(pppVars.physical))) {
/* XXX-ML this should probably be abstracted */
if (Physical_GetFD(pppVars.physical) + 1 > nfds)
nfds = Physical_GetFD(pppVars.physical) + 1;
@@ -1011,8 +1013,8 @@ DoLoop(void)
ReadTty();
if (Physical_FD_ISSET(pppVars.physical, &wfds)) {
/* ready to write into modem */
- ModemStartOutput(pppVars.physical);
- if (!Physical_IsActive(pppVars.physical))
+ link_StartOutput(physical2link(pppVars.physical));
+ if (!link_IsActive(physical2link(pppVars.physical)))
dial_up = 1;
}
if (Physical_FD_ISSET(pppVars.physical, &rfds)) {
diff --git a/usr.sbin/ppp/mbuf.c b/usr.sbin/ppp/mbuf.c
index 0b1c2df5c110..7edc9067f0a2 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.12 1997/12/28 02:56:42 brian Exp $
+ * $Id: mbuf.c,v 1.13 1998/01/21 02:15:21 brian Exp $
*
*/
#include <sys/param.h>
@@ -173,3 +173,35 @@ LogMemory()
LogPrintf(LogDEBUG, "LogMemory: 5: %d 6: %d 7: %d 8: %d\n",
MemMap[5].count, MemMap[6].count, MemMap[7].count, MemMap[8].count);
}
+
+struct mbuf *
+Dequeue(struct mqueue *q)
+{
+ struct mbuf *bp;
+
+ LogPrintf(LogDEBUG, "Dequeue: len = %d\n", q->qlen);
+ bp = q->top;
+ if (bp) {
+ q->top = q->top->pnext;
+ q->qlen--;
+ if (q->top == NULL) {
+ q->last = q->top;
+ if (q->qlen)
+ LogPrintf(LogERROR, "Dequeue: Not zero (%d)!!!\n", q->qlen);
+ }
+ }
+
+ return bp;
+}
+
+void
+Enqueue(struct mqueue *queue, struct mbuf *bp)
+{
+ if (queue->last) {
+ queue->last->pnext = bp;
+ queue->last = bp;
+ } else
+ queue->last = queue->top = bp;
+ queue->qlen++;
+ LogPrintf(LogDEBUG, "Enqueue: len = %d\n", queue->qlen);
+}
diff --git a/usr.sbin/ppp/mbuf.h b/usr.sbin/ppp/mbuf.h
index da6255ca04ab..121190f44656 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.10 1997/12/03 10:23:50 brian Exp $
+ * $Id: mbuf.h,v 1.11 1998/01/21 02:15:21 brian Exp $
*
* TODO:
*/
@@ -44,7 +44,7 @@ struct mqueue {
#define MB_IPIN 4
#define MB_ECHO 5
#define MB_LQR 6
-#define MB_MODEM 7
+#define MB_LINK 7
#define MB_VJCOMP 8
#define MB_LOG 9
#define MB_IPQ 10
@@ -58,3 +58,5 @@ extern void mbwrite(struct mbuf *, u_char *, int);
extern struct mbuf *mbread(struct mbuf *, u_char *, int);
extern void LogMemory(void);
extern int ShowMemMap(struct cmdargs const *);
+extern void Enqueue(struct mqueue *, struct mbuf *);
+extern struct mbuf *Dequeue(struct mqueue *);
diff --git a/usr.sbin/ppp/modem.c b/usr.sbin/ppp/modem.c
index 9e20d712d6f0..a1fb97a33ca7 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.77 1998/01/29 00:42:05 brian Exp $
+ * $Id: modem.c,v 1.77.2.1 1998/01/29 00:49:26 brian Exp $
*
* TODO:
*/
@@ -27,7 +27,6 @@
#include <arpa/inet.h>
#include <netdb.h>
-#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <paths.h>
@@ -66,6 +65,7 @@
/* We're defining a physical device, and thus need the real
headers. */
#define PHYSICAL_DEVICE
+#include "link.h"
#include "physical.h"
@@ -75,8 +75,25 @@
#endif
#endif
+static void ModemStartOutput(struct link *);
+static int ModemIsActive(struct link *);
+static void ModemHangup(struct link *, int);
+
struct physical phys_modem = {
- -1
+ {
+ PHYSICAL_LINK,
+ "modem",
+ sizeof(struct physical),
+ { 0 }, /* throughput */
+ { 0 }, /* timer */
+ { { 0 } }, /* queues */
+ { 0 }, /* proto_in */
+ { 0 }, /* proto_out */
+ ModemStartOutput,
+ ModemIsActive,
+ ModemHangup
+ },
+ -1
};
/* XXX-ML this should probably change when we add support for other
@@ -85,45 +102,6 @@ struct physical phys_modem = {
static void CloseLogicalModem(struct physical *);
-void
-Enqueue(struct mqueue * queue, struct mbuf * bp)
-{
- if (queue->last) {
- queue->last->pnext = bp;
- queue->last = bp;
- } else
- queue->last = queue->top = bp;
- queue->qlen++;
- LogPrintf(LogDEBUG, "Enqueue: len = %d\n", queue->qlen);
-}
-
-struct mbuf *
-Dequeue(struct mqueue *queue)
-{
- struct mbuf *bp;
-
- LogPrintf(LogDEBUG, "Dequeue: len = %d\n", queue->qlen);
- bp = queue->top;
- if (bp) {
- queue->top = queue->top->pnext;
- queue->qlen--;
- if (queue->top == NULL) {
- queue->last = queue->top;
- if (queue->qlen)
- LogPrintf(LogERROR, "Dequeue: Not zero (%d)!!!\n", queue->qlen);
- }
- }
- return (bp);
-}
-
-void
-SequenceQueues(struct physical *phys)
-{
- LogPrintf(LogDEBUG, "SequenceQueues\n");
- while (phys->OutputQueues[PRI_NORMAL].qlen)
- Enqueue(&phys->OutputQueues[PRI_LINK], Dequeue(&phys->OutputQueues[PRI_NORMAL]));
-}
-
static struct speeds {
int nspeed;
speed_t speed;
@@ -250,8 +228,8 @@ ModemTimeout(void *data)
int ombits = modem->mbits;
int change;
- StopTimer(&modem->DeviceTimer);
- StartTimer(&modem->DeviceTimer);
+ StopTimer(&modem->link.Timer);
+ StartTimer(&modem->link.Timer);
if (modem->dev_is_modem) {
if (modem->fd >= 0) {
@@ -297,7 +275,7 @@ StartModemTimer(struct physical *modem)
{
struct pppTimer *ModemTimer;
- ModemTimer = &modem->DeviceTimer;
+ ModemTimer = &modem->link.Timer;
StopTimer(ModemTimer);
ModemTimer->state = TIMER_STOPPED;
@@ -463,7 +441,7 @@ UnlockModem(struct physical *modem)
static void
HaveModem(struct physical *modem)
{
- throughput_start(&modem->throughput);
+ throughput_start(&modem->link.throughput);
modem->connect_count++;
LogPrintf(LogPHASE, "Connected!\n");
}
@@ -721,42 +699,32 @@ UnrawModem(struct physical *modem)
}
}
-void
-ModemAddInOctets(struct physical *modem, int n)
-{
- throughput_addin(&modem->throughput, n);
-}
-
-void
-ModemAddOutOctets(struct physical *modem, int n)
-{
- throughput_addout(&modem->throughput, n);
-}
-
static void
ClosePhysicalModem(struct physical *modem)
{
LogPrintf(LogDEBUG, "ClosePhysicalModem\n");
close(modem->fd);
modem->fd = -1;
- throughput_log(&modem->throughput, LogPHASE, "Modem");
+ throughput_log(&modem->link.throughput, LogPHASE, "Modem");
}
-void
-HangupModem(struct physical *modem, int flag)
+static void
+ModemHangup(struct link *l, int dedicated_force)
{
struct termios tio;
+ struct physical *modem = (struct physical *)l;
- LogPrintf(LogDEBUG, "Hangup modem (%s)\n", modem >= 0 ? "open" : "closed");
+ LogPrintf(LogDEBUG, "Hangup modem (%s)\n",
+ modem->fd >= 0 ? "open" : "closed");
if (modem->fd < 0)
return;
- StopTimer(&modem->DeviceTimer);
- throughput_stop(&modem->throughput);
+ StopTimer(&modem->link.Timer);
+ throughput_stop(&modem->link.throughput);
if (TermMode) {
- LogPrintf(LogDEBUG, "HangupModem: Not in 'term' mode\n");
+ LogPrintf(LogDEBUG, "ModemHangup: Not in 'term' mode\n");
return;
}
@@ -781,8 +749,8 @@ HangupModem(struct physical *modem, int flag)
strncpy(ScriptBuffer, VarHangupScript, sizeof ScriptBuffer - 1);
ScriptBuffer[sizeof ScriptBuffer - 1] = '\0';
- LogPrintf(LogDEBUG, "HangupModem: Script: %s\n", ScriptBuffer);
- if (flag ||
+ LogPrintf(LogDEBUG, "ModemHangup: Script: %s\n", ScriptBuffer);
+ if (dedicated_force ||
#ifdef notyet
!modem->is_dedicated
#else
@@ -826,89 +794,25 @@ CloseLogicalModem(struct physical *modem)
}
}
-/*
- * Write to modem. Actualy, requested packets are queued, and goes out
- * to the line when ModemStartOutput() is called.
- */
-void
-WriteModem(struct physical *modem, int pri, const char *ptr, int count)
-{
- struct mbuf *bp;
-
- assert(pri == PRI_NORMAL || pri == PRI_LINK);
-
- bp = mballoc(count, MB_MODEM);
- memcpy(MBUF_CTOP(bp), ptr, count);
-
- /*
- * Should be NORMAL and LINK only. All IP frames get here marked NORMAL.
- */
- Enqueue(&modem->OutputQueues[pri], bp);
-}
-
-void
-ModemOutput(struct physical *modem, int pri, struct mbuf * bp)
-{
- struct mbuf *wp;
- int len;
-
- assert(pri == PRI_NORMAL || pri == PRI_LINK);
-
- len = plength(bp);
- wp = mballoc(len, MB_MODEM);
- mbread(bp, MBUF_CTOP(wp), len);
- Enqueue(&modem->OutputQueues[pri], wp);
- ModemStartOutput(modem);
-}
-
-int
-ModemQlen(struct physical *phys)
-{
- struct mqueue *queue;
- int len = 0;
- int i;
-
- for (i = PRI_NORMAL; i <= PRI_LINK; i++) {
- queue = &phys->OutputQueues[i];
- len += queue->qlen;
- }
- return (len);
-
-}
-
-void
-ModemStartOutput(struct physical *modem)
+static void
+ModemStartOutput(struct link *l)
{
- struct mqueue *queue;
+ struct physical *modem = (struct physical *)l;
int nb, nw;
- int i;
if (modem->out == NULL) {
- if (ModemQlen(modem) == 0)
- IpStartOutput(modem);
- i = PRI_LINK;
- for (queue = &modem->OutputQueues[PRI_LINK]; queue >= &modem->OutputQueues[0]; queue--) {
- if (queue->top) {
- modem->out = Dequeue(queue);
- if (LogIsKept(LogDEBUG)) {
- if (i > PRI_NORMAL) {
- struct mqueue *q;
+ if (link_QueueLen(l) == 0)
+ IpStartOutput(l);
- q = &modem->OutputQueues[0];
- LogPrintf(LogDEBUG, "ModemStartOutput: Output from queue %d,"
- " normal has %d\n", i, q->qlen);
- }
- LogPrintf(LogDEBUG, "ModemStartOutput: Dequeued %d\n", i);
- }
- break;
- }
- i--;
- }
+ modem->out = link_Dequeue(l);
}
+
if (modem->out) {
nb = modem->out->cnt;
+/* Eh ? Removed 980130
if (nb > 1600)
nb = 1600;
+*/
nw = write(modem->fd, MBUF_CTOP(modem->out), nb);
LogPrintf(LogDEBUG, "ModemStartOutput: wrote: %d(%d)\n", nw, nb);
LogDumpBuff(LogDEBUG, "ModemStartOutput: modem write",
@@ -931,6 +835,12 @@ ModemStartOutput(struct physical *modem)
}
}
+static int
+ModemIsActive(struct link *l)
+{
+ return ((struct physical *)l)->fd >= 0;
+}
+
int
DialModem(struct physical *modem)
{
@@ -961,7 +871,7 @@ DialModem(struct physical *modem)
LogPrintf(LogWARN, "DialModem: dial failed.\n");
excode = EX_NODIAL;
}
- HangupModem(modem, 0);
+ ModemHangup(&modem->link, 0);
return (excode);
}
@@ -1013,14 +923,21 @@ ShowModemStatus(struct cmdargs const *arg)
else
fprintf(VarTerm, "outq: ioctl probe failed: %s\n", strerror(errno));
#endif
- fprintf(VarTerm, "outqlen: %d\n", ModemQlen(modem));
+ fprintf(VarTerm, "outqlen: %d\n", link_QueueLen(&modem->link));
fprintf(VarTerm, "DialScript = %s\n", VarDialScript);
fprintf(VarTerm, "LoginScript = %s\n", VarLoginScript);
fprintf(VarTerm, "PhoneNumber(s) = %s\n", VarPhoneList);
fprintf(VarTerm, "\n");
- throughput_disp(&modem->throughput, VarTerm);
+ throughput_disp(&modem->link.throughput, VarTerm);
+
+ return 0;
+}
+int
+ReportProtocolStatus(struct cmdargs const *arg)
+{
+ link_ReportProtocolStatus(&phys_modem.link);
return 0;
}
diff --git a/usr.sbin/ppp/modem.h b/usr.sbin/ppp/modem.h
index be0e31a3261a..8b40d078e5af 100644
--- a/usr.sbin/ppp/modem.h
+++ b/usr.sbin/ppp/modem.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: modem.h,v 1.16 1998/01/21 02:15:23 brian Exp $
+ * $Id: modem.h,v 1.16.2.1 1998/01/29 00:49:27 brian Exp $
*
* TODO:
*/
@@ -23,22 +23,12 @@
struct physical;
extern int RawModem(struct physical *);
-extern void WriteModem(struct physical *, int, const char *, int);
-extern void ModemStartOutput(struct physical *);
extern int OpenModem(struct physical *);
extern int ModemSpeed(struct physical *);
-extern int ModemQlen(struct physical *);
extern int DialModem(struct physical *);
extern speed_t IntToSpeed(int);
extern void ModemTimeout(void *);
extern void DownConnection(void);
-extern void ModemOutput(struct physical *modem, int, struct mbuf *);
extern int ChangeParity(struct physical *, const char *);
-extern void HangupModem(struct physical *, int);
extern int ShowModemStatus(struct cmdargs const *);
-extern void Enqueue(struct mqueue *, struct mbuf *);
-extern struct mbuf *Dequeue(struct mqueue *);
-extern void SequenceQueues(struct physical *physical);
-extern void ModemAddInOctets(struct physical *modem, int);
-extern void ModemAddOutOctets(struct physical *modem, int);
-
+extern int ReportProtocolStatus(struct cmdargs const *arg);
diff --git a/usr.sbin/ppp/pap.c b/usr.sbin/ppp/pap.c
index 8ee21ce2dc2c..8655e9e54194 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.20.2.1 1998/01/29 00:49:27 brian Exp $
+ * $Id: pap.c,v 1.20.2.2 1998/01/30 01:33:46 brian Exp $
*
* TODO:
*/
@@ -84,7 +84,7 @@ SendPapChallenge(int papid, struct physical *physical)
*cp++ = keylen;
memcpy(cp, VarAuthKey, keylen);
- HdlcOutput(physical, PRI_LINK, PROTO_PAP, bp);
+ HdlcOutput(physical2link(physical), PRI_LINK, PROTO_PAP, bp);
}
struct authinfo AuthPapInfo = {
@@ -110,7 +110,7 @@ SendPapCode(int id, int code, const char *message, struct physical *physical)
*cp++ = mlen;
memcpy(cp, message, mlen);
LogPrintf(LogPHASE, "PapOutput: %s\n", papcodes[code]);
- HdlcOutput(physical, PRI_LINK, PROTO_PAP, bp);
+ HdlcOutput(physical2link(physical), PRI_LINK, PROTO_PAP, bp);
}
/*
diff --git a/usr.sbin/ppp/phase.c b/usr.sbin/ppp/phase.c
index 1e9bde621be3..23ed999c966b 100644
--- a/usr.sbin/ppp/phase.c
+++ b/usr.sbin/ppp/phase.c
@@ -23,13 +23,14 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: phase.c,v 1.6.4.2 1998/01/29 23:11:41 brian Exp $
+ * $Id: phase.c,v 1.6.4.3 1998/01/30 01:33:46 brian Exp $
*/
#include <sys/param.h>
#include <netinet/in.h>
#include <stdio.h>
+#include <termios.h>
#include "command.h"
#include "mbuf.h"
@@ -43,11 +44,15 @@
#include "defs.h"
#include "iplist.h"
#include "throughput.h"
+#include "hdlc.h"
+#include "link.h"
#include "ipcp.h"
#include "ccp.h"
#include "main.h"
#include "loadalias.h"
#include "vars.h"
+#include "modem.h"
+#include "tun.h"
#include "phase.h"
int phase = 0; /* Curent phase */
@@ -90,12 +95,15 @@ NewPhase(struct physical *physical, int new)
} else
NewPhase(physical, PHASE_NETWORK);
break;
+
case PHASE_NETWORK:
+ tun_configure(LcpInfo.his_mru, ModemSpeed(physical));
IpcpUp();
IpcpOpen();
CcpUp();
CcpOpen();
break;
+
case PHASE_DEAD:
if (mode & MODE_DIRECT)
Cleanup(EX_DEAD);
diff --git a/usr.sbin/ppp/physical.c b/usr.sbin/ppp/physical.c
index 7bb8ff02389d..035c13f32558 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$
+ * $Id: physical.c,v 1.1.2.1 1998/01/29 00:49:29 brian Exp $
*
*/
@@ -44,6 +44,7 @@
#include "hdlc.h"
#include "timer.h"
#include "throughput.h"
+#include "link.h"
#define PHYSICAL_DEVICE
#include "physical.h"
@@ -66,11 +67,6 @@ Physical_IsATTY(struct physical *phys) {
}
int
-Physical_IsActive(struct physical *phys) {
- return phys->fd >= 0;
-}
-
-int
Physical_IsSync(struct physical *phys) {
return phys->speed == 0;
}
diff --git a/usr.sbin/ppp/physical.h b/usr.sbin/ppp/physical.h
index 12c2af049080..048a533f86ae 100644
--- a/usr.sbin/ppp/physical.h
+++ b/usr.sbin/ppp/physical.h
@@ -16,44 +16,41 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id$
+ * $Id: physical.h,v 1.1.2.1 1998/01/29 00:49:30 brian Exp $
*
*/
-struct physical;
-
#ifdef PHYSICAL_DEVICE
struct physical {
- int fd; /* File descriptor for this device */
- int mbits; /* Current DCD status */
- unsigned dev_is_modem : 1; /* Is the device an actual modem?
- Faked for sync devices, though...
- (Possibly this should be
- dev_is_not_tcp?) XXX-ML */
-
- unsigned is_dedicated : 1; /* Dedicated mode? XXX-ML - not yet initialized */
- unsigned is_direct : 1; /* Direct mode? XXX-ML - not yet initialized */
- struct pppThroughput throughput;
- struct mbuf *out;
- int connect_count;
- struct pppTimer DeviceTimer; /* Was ModemTimer */
+ struct link link;
+ int fd; /* File descriptor for this device */
+ int mbits; /* Current DCD status */
+ unsigned dev_is_modem : 1; /* Is the device an actual modem?
+ Faked for sync devices, though...
+ (Possibly this should be
+ dev_is_not_tcp?) XXX-ML */
+ unsigned is_dedicated : 1; /* Dedicated mode? XXX-ML - not yet initialized */
+ unsigned is_direct : 1; /* Direct mode? XXX-ML - not yet initialized */
+ struct mbuf *out;
+ int connect_count;
- /* XXX Shouldn't be tied up to a specific number like this. -EE. */
- struct mqueue OutputQueues[PRI_LINK + 1];
-
- /* XXX-ML Most of the below is device specific, and probably do not
+ /* XXX-ML Most of the below is device specific, and probably do not
belong in the generic physical struct. It comes from modem.c. */
- unsigned rts_cts : 1; /* Is rts/cts enabled? */
- unsigned int parity; /* What parity is enabled? (TTY flags) */
- unsigned int speed; /* Modem speed */
- struct termios ios; /* To be able to reset from raw mode */
+ unsigned rts_cts : 1; /* Is rts/cts enabled? */
+ unsigned int parity; /* What parity is enabled? (TTY flags) */
+ unsigned int speed; /* Modem speed */
+ struct termios ios; /* To be able to reset from raw mode */
};
+#else
+struct physical;
#endif
+#define physical2link(p) ((struct link *)p)
+#define link2physical(l) (l->type == PHYSICAL_LINK ? (struct physical *)l : 0)
+
int Physical_GetFD(struct physical *);
int Physical_IsATTY(struct physical *);
-int Physical_IsActive(struct physical *);
int Physical_IsSync(struct physical *);
int Physical_IsDedicated(struct physical *phys);
int Physical_IsDirect(struct physical *phys);
@@ -68,8 +65,8 @@ Physical_SetSpeed(struct physical *phys, int speed);
can solve that later. */
void Physical_SetSync(struct physical *phys);
-int /* Can this be set? (Might not be a relevant attribute for this
- device, for instance) */
+int /* Can this be set? (Might not be a relevant attribute for this
+ device, for instance) */
Physical_SetRtsCts(struct physical *phys, int enable);
void Physical_SetDedicated(struct physical *phys, int enable);
diff --git a/usr.sbin/ppp/pred.c b/usr.sbin/ppp/pred.c
index 019fc02a3462..3ab8dcbdf022 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 1998/01/14 01:47:50 brian Exp $
+ * $Id: pred.c,v 1.20.2.1 1998/01/29 00:49:30 brian Exp $
*/
#include <sys/param.h>
@@ -48,6 +48,8 @@
#include "lcpproto.h"
#include "lcp.h"
#include "ccp.h"
+#include "throughput.h"
+#include "link.h"
#include "pred.h"
/* The following hash code is the heart of the algorithm:
@@ -182,8 +184,7 @@ Pred1InitOutput(void)
}
static int
-Pred1Output(struct physical *physical, int pri, u_short proto,
- struct mbuf * bp)
+Pred1Output(struct link *l, int pri, u_short proto, struct mbuf * bp)
{
struct mbuf *mwp;
u_char *cp, *wp, *hp;
@@ -219,7 +220,7 @@ Pred1Output(struct physical *physical, int pri, u_short proto,
*wp++ = fcs & 0377;
*wp++ = fcs >> 8;
mwp->cnt = wp - MBUF_CTOP(mwp);
- HdlcOutput(physical, PRI_NORMAL, PROTO_COMPD, mwp);
+ HdlcOutput(l, PRI_NORMAL, PROTO_COMPD, mwp);
return 1;
}
diff --git a/usr.sbin/ppp/route.c b/usr.sbin/ppp/route.c
index 1a63bd18c00c..052ce028a4ff 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.42 1998/01/21 02:15:26 brian Exp $
+ * $Id: route.c,v 1.42.2.1 1998/01/29 23:11:42 brian Exp $
*
*/
@@ -51,6 +51,8 @@
#include "iplist.h"
#include "timer.h"
#include "throughput.h"
+#include "hdlc.h"
+#include "link.h"
#include "ipcp.h"
#include "route.h"
diff --git a/usr.sbin/ppp/vjcomp.c b/usr.sbin/ppp/vjcomp.c
index 5bc59dd91860..45c4ff081c66 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.16.2.1 1998/01/29 00:49:32 brian Exp $
+ * $Id: vjcomp.c,v 1.16.2.2 1998/01/29 23:11:44 brian Exp $
*
* TODO:
*/
@@ -54,7 +54,7 @@ VjInit(int max_state)
}
void
-SendPppFrame(struct physical *physical, struct mbuf * bp)
+SendPppFrame(struct link *l, struct mbuf * bp)
{
int type;
u_short proto;
@@ -83,7 +83,7 @@ SendPppFrame(struct physical *physical, struct mbuf * bp)
}
} else
proto = PROTO_IP;
- HdlcOutput(physical, PRI_NORMAL, proto, bp);
+ HdlcOutput(l, PRI_NORMAL, proto, bp);
}
static struct mbuf *
diff --git a/usr.sbin/ppp/vjcomp.h b/usr.sbin/ppp/vjcomp.h
index eb2abcbb6815..3428a0deb844 100644
--- a/usr.sbin/ppp/vjcomp.h
+++ b/usr.sbin/ppp/vjcomp.h
@@ -23,12 +23,10 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: vjcomp.h,v 1.5 1998/01/11 17:50:49 brian Exp $
+ * $Id: vjcomp.h,v 1.5.4.1 1998/01/29 00:49:32 brian Exp $
*/
-struct physical;
-
extern void VjInit(int);
-extern void SendPppFrame(struct physical *physical, struct mbuf *);
+extern void SendPppFrame(struct link *, struct mbuf *);
extern struct mbuf *VjCompInput(struct mbuf *, int);
extern const char *vj2asc(u_int32_t);