Add throughput logging (disabled by default).

Use "enable throughput" to see modem & IPCP throughput.
Removed an extraneous prompt()
This commit is contained in:
Brian Somers 1997-11-18 14:52:08 +00:00
parent f041a9bdfc
commit 9a0b991f97
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=31272
12 changed files with 329 additions and 234 deletions

View File

@ -1,11 +1,11 @@
# $Id: Makefile,v 1.29 1997/11/09 06:22:37 brian Exp $
# $Id: Makefile,v 1.30 1997/11/16 22:15:02 brian Exp $
PROG= ppp
SRCS= alias_cmd.c arp.c async.c auth.c ccp.c chap.c chat.c \
command.c defs.c filter.c fsm.c hdlc.c id.c ip.c ipcp.c lcp.c \
loadalias.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 timer.c tun.c \
vars.c vjcomp.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 -Wmissing-prototypes
LDADD+= -lmd -lcrypt -lutil
DPADD+= ${LIBMD} ${LIBCRYPT} ${LIBUTIL}

View File

@ -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.29 1997/11/12 21:04:21 brian Exp $
* $Id: ip.c,v 1.30 1997/11/16 22:15:03 brian Exp $
*
* TODO:
* o Return ICMP message for filterd packet
@ -251,7 +251,7 @@ IcmpError(struct ip * pip, int code)
memcpy(MBUF_CTOP(bp), ptr, cnt);
SendPppFrame(bp);
RestartIdleTimer();
ipOutOctets += cnt;
IpcpAddOutOctets(cnt);
}
#endif
}
@ -405,7 +405,7 @@ IpInput(struct mbuf * bp)
pfree(bp);
return;
}
ipInOctets += nb;
IpcpAddInOctets(nb);
nb = ntohs(((struct ip *) tun.data)->ip_len);
nb += sizeof(tun)-sizeof(tun.data);
@ -450,7 +450,7 @@ IpInput(struct mbuf * bp)
pfree(bp);
return;
}
ipInOctets += nb;
IpcpAddInOctets(nb);
nb += sizeof(tun)-sizeof(tun.data);
nw = write(tun_out, &tun, nb);
if (nw != nb)
@ -509,7 +509,7 @@ IpStartOutput()
cnt = plength(bp);
SendPppFrame(bp);
RestartIdleTimer();
ipOutOctets += cnt;
IpcpAddOutOctets(cnt);
break;
}
}

View File

@ -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.35 1997/11/11 22:58:11 brian Exp $
* $Id: ipcp.c,v 1.36 1997/11/14 15:39:14 brian Exp $
*
* TODO:
* o More RFC1772 backwoard compatibility
@ -33,6 +33,7 @@
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "mbuf.h"
@ -51,6 +52,7 @@
#include "vars.h"
#include "vjcomp.h"
#include "ip.h"
#include "throughput.h"
#ifndef NOMSEXT
struct in_addr ns_entries[2];
@ -62,7 +64,6 @@ struct in_range DefMyAddress;
struct in_range DefHisAddress;
struct in_addr TriggerAddress;
int HaveTriggerAddress;
struct pppTimer IpcpReportTimer;
static void IpcpSendConfigReq(struct fsm *);
static void IpcpSendTerminateAck(struct fsm *);
@ -73,11 +74,6 @@ static void IpcpLayerFinish(struct fsm *);
static void IpcpLayerUp(struct fsm *);
static void IpcpLayerDown(struct fsm *);
static void IpcpInitRestartCounter(struct fsm *);
static int IpcpOctetsIn(void);
static int IpcpOctetsOut(void);
static int lastInOctets, lastOutOctets;
static int StartingIpIn, StartingIpOut;
#define REJECTED(p, x) (p->his_reject & (1<<x))
@ -126,32 +122,18 @@ static char *cftypes128[] = {
#define NCFTYPES128 (sizeof(cftypes)/sizeof(char *))
/*
* Function called every second. Updates connection period and idle period,
* also update LQR information.
*/
static void
IpcpReportFunc()
struct pppThroughput throughput;
void
IpcpAddInOctets(int n)
{
ipConnectSecs++;
if (lastInOctets == ipInOctets && lastOutOctets == ipOutOctets)
ipIdleSecs++;
lastInOctets = ipInOctets;
lastOutOctets = ipOutOctets;
StopTimer(&IpcpReportTimer);
IpcpReportTimer.state = TIMER_STOPPED;
StartTimer(&IpcpReportTimer);
throughput_addin(&throughput, n);
}
static void
IpcpStartReport()
void
IpcpAddOutOctets(int n)
{
ipIdleSecs = ipConnectSecs = 0;
StopTimer(&IpcpReportTimer);
IpcpReportTimer.state = TIMER_STOPPED;
IpcpReportTimer.load = SECTICKS;
IpcpReportTimer.func = IpcpReportFunc;
StartTimer(&IpcpReportTimer);
throughput_addout(&throughput, n);
}
int
@ -167,10 +149,6 @@ ReportIpcpStatus()
inet_ntoa(icp->his_ipaddr), icp->his_compproto);
fprintf(VarTerm, " my side: %s, %lx\n",
inet_ntoa(icp->want_ipaddr), icp->want_compproto);
fprintf(VarTerm, "Connected: %d secs, idle: %d secs\n\n",
ipConnectSecs, ipIdleSecs);
fprintf(VarTerm, " %d octets in, %d octets out\n",
IpcpOctetsIn(), IpcpOctetsOut());
fprintf(VarTerm, "Defaults:\n");
fprintf(VarTerm, " My Address: %s/%d\n",
@ -182,6 +160,9 @@ ReportIpcpStatus()
else
fprintf(VarTerm, " Negotiation(trigger): MYADDR\n");
fprintf(VarTerm, "\n");
throughput_disp(&throughput, VarTerm);
return 0;
}
@ -232,8 +213,7 @@ IpcpInit()
icp->want_compproto = 0;
icp->heis1172 = 0;
IpcpFsm.maxconfig = 10;
StartingIpIn = ipInOctets;
StartingIpOut = ipOutOctets;
throughput_init(&throughput);
}
static void
@ -292,30 +272,12 @@ IpcpLayerFinish(struct fsm * fp)
NewPhase(PHASE_TERMINATE);
}
static int
IpcpOctetsIn()
{
return ipInOctets < StartingIpIn ?
INT_MAX - StartingIpIn + ipInOctets - INT_MIN + 1 :
ipInOctets - StartingIpIn;
}
static int
IpcpOctetsOut()
{
return ipOutOctets < StartingIpOut ?
INT_MAX - StartingIpOut + ipOutOctets - INT_MIN + 1 :
ipOutOctets - StartingIpOut;
}
static void
IpcpLayerDown(struct fsm * fp)
{
LogPrintf(LogIPCP, "IpcpLayerDown.\n");
LogPrintf(LogIPCP, "%d octets in, %d octets out\n",
IpcpOctetsIn(), IpcpOctetsOut());
StopTimer(&IpcpReportTimer);
Prompt();
throughput_stop(&throughput);
throughput_log(&throughput, LogIPCP, NULL);
}
/*
@ -344,9 +306,7 @@ IpcpLayerUp(struct fsm * fp)
if (mode & MODE_ALIAS)
VarPacketAliasSetAddress(IpcpInfo.want_ipaddr);
OsLinkup();
StartingIpIn = ipInOctets;
StartingIpOut = ipOutOctets;
IpcpStartReport();
throughput_start(&throughput);
StartIdleTimer();
}

View File

@ -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.11 1997/10/26 01:02:55 brian Exp $
* $Id: ipcp.h,v 1.12 1997/10/26 12:42:11 brian Exp $
*
* TODO:
*/
@ -76,3 +76,5 @@ extern void IpcpUp(void);
extern void IpcpOpen(void);
extern int ReportIpcpStatus(void);
extern void IpcpInput(struct mbuf *);
extern void IpcpAddInOctets(int);
extern void IpcpAddOutOctets(int);

View File

@ -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.45 1997/11/14 15:39:15 brian Exp $
* $Id: lcp.c,v 1.46 1997/11/16 22:15:04 brian Exp $
*
* TODO:
* o Validate magic number received from peer.
@ -332,7 +332,6 @@ static void
StopAllTimers()
{
StopTimer(&LcpReportTimer);
StopTimer(&IpcpReportTimer);
StopIdleTimer();
StopTimer(&AuthPapInfo.authtimer);
StopTimer(&AuthChapInfo.authtimer);

View File

@ -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.64 1997/11/09 14:18:48 brian Exp $
* $Id: modem.c,v 1.65 1997/11/18 08:49:03 brian Exp $
*
* TODO:
*/
@ -55,6 +55,7 @@
#include "vars.h"
#include "main.h"
#include "chat.h"
#include "throughput.h"
#ifdef __OpenBSD__
#include <util.h>
#else
@ -76,6 +77,7 @@ static struct pppTimer ModemTimer;
static struct mbuf *modemout;
static struct mqueue OutputQueues[PRI_LINK + 1];
static int dev_is_modem;
static struct pppThroughput throughput;
static void CloseLogicalModem(void);
@ -116,130 +118,80 @@ static struct speeds {
} speeds[] = {
#ifdef B50
{
50, B50,
},
{ 50, B50, },
#endif
#ifdef B75
{
75, B75,
},
{ 75, B75, },
#endif
#ifdef B110
{
110, B110,
},
{ 110, B110, },
#endif
#ifdef B134
{
134, B134,
},
{ 134, B134, },
#endif
#ifdef B150
{
150, B150,
},
{ 150, B150, },
#endif
#ifdef B200
{
200, B200,
},
{ 200, B200, },
#endif
#ifdef B300
{
300, B300,
},
{ 300, B300, },
#endif
#ifdef B600
{
600, B600,
},
{ 600, B600, },
#endif
#ifdef B1200
{
1200, B1200,
},
{ 1200, B1200, },
#endif
#ifdef B1800
{
1800, B1800,
},
{ 1800, B1800, },
#endif
#ifdef B2400
{
2400, B2400,
},
{ 2400, B2400, },
#endif
#ifdef B4800
{
4800, B4800,
},
{ 4800, B4800, },
#endif
#ifdef B9600
{
9600, B9600,
},
{ 9600, B9600, },
#endif
#ifdef B19200
{
19200, B19200,
},
{ 19200, B19200, },
#endif
#ifdef B38400
{
38400, B38400,
},
{ 38400, B38400, },
#endif
#ifndef _POSIX_SOURCE
#ifdef B7200
{
7200, B7200,
},
{ 7200, B7200, },
#endif
#ifdef B14400
{
14400, B14400,
},
{ 14400, B14400, },
#endif
#ifdef B28800
{
28800, B28800,
},
{ 28800, B28800, },
#endif
#ifdef B57600
{
57600, B57600,
},
{ 57600, B57600, },
#endif
#ifdef B76800
{
76800, B76800,
},
{ 76800, B76800, },
#endif
#ifdef B115200
{
115200, B115200,
},
{ 115200, B115200, },
#endif
#ifdef B230400
{
230400, B230400,
},
{ 230400, B230400, },
#endif
#ifdef EXTA
{
19200, EXTA,
},
{ 19200, EXTA, },
#endif
#ifdef EXTB
{
38400, EXTB,
},
{ 38400, EXTB, },
#endif
#endif /* _POSIX_SOURCE */
{
0, 0
}
{ 0, 0 }
};
static int
@ -268,9 +220,6 @@ IntToSpeed(int nspeed)
return B0;
}
static time_t uptime;
u_long OctetsIn, OctetsOut;
void
DownConnection()
{
@ -478,8 +427,7 @@ UnlockModem()
static void
HaveModem()
{
time(&uptime);
OctetsIn = OctetsOut = 0;
throughput_start(&throughput);
connect_count++;
LogPrintf(LogPHASE, "Connected!\n");
}
@ -497,7 +445,6 @@ OpenModem()
LogPrintf(LogDEBUG, "OpenModem: Modem is already open!\n");
/* We're going back into "term" mode */
else if (mode & MODE_DIRECT) {
HaveModem();
if (isatty(0)) {
LogPrintf(LogDEBUG, "OpenModem(direct): Modem is a tty\n");
cp = ttyname(0);
@ -507,10 +454,12 @@ OpenModem()
return -1;
}
modem = 0;
HaveModem();
} else {
LogPrintf(LogDEBUG, "OpenModem(direct): Modem is not a tty\n");
SetVariable(0, 0, 0, VAR_DEVICE);
/* We don't call ModemTimeout() with this type of connection */
HaveModem();
return modem = 0;
}
} else {
@ -599,7 +548,6 @@ OpenModem()
if (ioctl(modem, TIOCMGET, &mbits)) {
LogPrintf(LogERROR, "OpenModem: Cannot get modem status: %s\n",
strerror(errno));
uptime = 0;
CloseLogicalModem();
return (-1);
}
@ -609,7 +557,6 @@ OpenModem()
if (oldflag < 0) {
LogPrintf(LogERROR, "OpenModem: Cannot get modem flags: %s\n",
strerror(errno));
uptime = 0;
CloseLogicalModem();
return (-1);
}
@ -674,28 +621,25 @@ UnrawModem()
}
}
void ModemAddInOctets(int n)
void
ModemAddInOctets(int n)
{
OctetsIn += n;
throughput_addin(&throughput, n);
}
void ModemAddOutOctets(int n)
void
ModemAddOutOctets(int n)
{
OctetsOut += n;
throughput_addout(&throughput, n);
}
static void
ClosePhysicalModem()
{
LogPrintf(LogDEBUG, "ClosePhysicalModem\n");
close(modem);
if (uptime) {
LogPrintf(LogPHASE, "Connect time: %d secs\n", time(NULL) - uptime);
LogPrintf(LogPHASE, "Modem: %d octets in, %d octets out\n",
OctetsIn, OctetsOut);
OctetsIn = OctetsOut = 0;
uptime = 0;
}
modem = -1; /* Mark modem as closed */
modem = -1;
throughput_log(&throughput, LogPHASE, "Modem");
}
void
@ -703,13 +647,14 @@ HangupModem(int flag)
{
struct termios tio;
LogPrintf(LogDEBUG, "Hangup modem (%s), uptime %ld\n",
modem >= 0 ? "open" : "closed", (long)uptime);
StopTimer(&ModemTimer);
LogPrintf(LogDEBUG, "Hangup modem (%s)\n", modem >= 0 ? "open" : "closed");
if (modem < 0)
return;
StopTimer(&ModemTimer);
throughput_stop(&throughput);
if (TermMode) {
LogPrintf(LogDEBUG, "HangupModem: Not in 'term' mode\n");
return;
@ -735,6 +680,7 @@ HangupModem(int flag)
char ScriptBuffer[SCRIPT_LEN];
strcpy(ScriptBuffer, VarHangupScript); /* arrays are the same size */
LogPrintf(LogDEBUG, "HangupModem: Script: %s\n", ScriptBuffer);
if (flag || !(mode & MODE_DEDICATED)) {
DoChat(ScriptBuffer);
tcflush(modem, TCIOFLUSH);
@ -755,6 +701,7 @@ HangupModem(int flag)
static void
CloseLogicalModem()
{
LogPrintf(LogDEBUG, "CloseLogicalModem\n");
if (modem >= 0) {
ClosePhysicalModem();
if (Utmp) {
@ -958,5 +905,8 @@ ShowModemStatus()
fprintf(VarTerm, "LoginScript = %s\n", VarLoginScript);
fprintf(VarTerm, "PhoneNumber(s) = %s\n", VarPhoneList);
fprintf(VarTerm, "\n");
throughput_disp(&throughput, VarTerm);
return 0;
}

View File

@ -1,4 +1,4 @@
.\" $Id: ppp.8,v 1.78 1997/11/11 22:58:12 brian Exp $
.\" $Id: ppp.8,v 1.79 1997/11/14 20:07:39 brian Exp $
.Dd 20 September 1995
.Os FreeBSD
.Dt PPP 8
@ -1548,16 +1548,10 @@ means that the option will not be requested by us.
may be one of the following:
.Bl -tag -width 20
.It vjcomp
Default: Enabled and Accepted. This option decides if Van Jacobson
header compression will be used.
.It lqr
Default: Disabled and Accepted. This option decides if Link Quality
Requests will be sent. LQR is a protocol that allows
.Nm
to determine that the link is down without relying on the modems
carrier detect.
.It acfcomp
Default: Enabled and Accepted. ACFComp stands for Address and Control
Field Compression. Non LCP packets usually have very similar address
and control fields - making them easily compressible.
.It chap
Default: Disabled and Accepted. CHAP stands for Challenge Handshake
@ -1593,6 +1587,20 @@ challenge. Refer to the description of the
.Dq set encrypt
command for further details.
.It lqr
Default: Disabled and Accepted. This option decides if Link Quality
Requests will be sent. LQR is a protocol that allows
.Nm
to determine that the link is down without relying on the modems
carrier detect.
.It msext
Default: Disabled. This option allows the use of Microsoft's
.Em PPP
extensions, supporting the negotiation of the DNS and the NetBIOS NS.
Enabling this allows us to pass back the values given in "set ns"
and "set nbns".
.It pap
Default: Disabled and Accepted. PAP stands for Password Authentication
Protocol. Only one of PAP and CHAP (above) may be negotiated. With
@ -1619,37 +1627,25 @@ in
.Pa /etc/ppp/ppp.conf .
PAP is accepted by default.
.It acfcomp
Default: Enabled and Accepted. ACFComp stands for Address and Control
Field Compression. Non LCP packets usually have very similar address
and control fields - making them easily compressible.
.It pred1
Default: Enabled and Accepted. This option decides if Predictor 1
compression will be used.
.It protocomp
Default: Enabled and Accepted. This option is used to negotiate
PFC (Protocol Field Compression), a mechanism where the protocol
field number is reduced to one octet rather than two.
.It pred1
Default: Enabled and Accepted. This option decides if Predictor 1
compression will be used.
.It msext
Default: Disabled. This option allows the use of Microsoft's
.Em PPP
extensions, supporting the negotiation of the DNS and the NetBIOS NS.
Enabling this allows us to pass back the values given in "set ns"
and "set nbns".
.It vjcomp
Default: Enabled and Accepted. This option decides if Van Jacobson
header compression will be used.
.El
.Pp
The following options are not actually negotiated with the peer.
Therefore, accepting or denying them makes no sense.
.Bl -tag -width 20
.It proxy
Default: Disabled. Enabling this option will tell
.Nm
to proxy ARP for the peer.
.It passwdauth
Default: Disabled. Enabling this option will tell the PAP authentication
code to use the password file (see
@ -1658,6 +1654,26 @@ to authenticate the caller rather than the
.Pa /etc/ppp/ppp.secret
file.
.It proxy
Default: Disabled. Enabling this option will tell
.Nm
to proxy ARP for the peer.
.It throughput
Default: Disabled. Enabling this option will tell
.Nm
to gather thoroughput statistics. Input and output is sampled over
a rolling 5 second window, and current, best and total figures are
retained. This data is output when the relevent
.Em PPP
layer shuts down, and is also available using the
.Dq show
command. Troughput statistics are available at the
.Dq IPCP
and
.Dq modem
levels.
.It utmp
Default: Enabled. Normally, when a user is authenticated using PAP or
CHAP, and when

View File

@ -1,4 +1,4 @@
.\" $Id: ppp.8,v 1.78 1997/11/11 22:58:12 brian Exp $
.\" $Id: ppp.8,v 1.79 1997/11/14 20:07:39 brian Exp $
.Dd 20 September 1995
.Os FreeBSD
.Dt PPP 8
@ -1548,16 +1548,10 @@ means that the option will not be requested by us.
may be one of the following:
.Bl -tag -width 20
.It vjcomp
Default: Enabled and Accepted. This option decides if Van Jacobson
header compression will be used.
.It lqr
Default: Disabled and Accepted. This option decides if Link Quality
Requests will be sent. LQR is a protocol that allows
.Nm
to determine that the link is down without relying on the modems
carrier detect.
.It acfcomp
Default: Enabled and Accepted. ACFComp stands for Address and Control
Field Compression. Non LCP packets usually have very similar address
and control fields - making them easily compressible.
.It chap
Default: Disabled and Accepted. CHAP stands for Challenge Handshake
@ -1593,6 +1587,20 @@ challenge. Refer to the description of the
.Dq set encrypt
command for further details.
.It lqr
Default: Disabled and Accepted. This option decides if Link Quality
Requests will be sent. LQR is a protocol that allows
.Nm
to determine that the link is down without relying on the modems
carrier detect.
.It msext
Default: Disabled. This option allows the use of Microsoft's
.Em PPP
extensions, supporting the negotiation of the DNS and the NetBIOS NS.
Enabling this allows us to pass back the values given in "set ns"
and "set nbns".
.It pap
Default: Disabled and Accepted. PAP stands for Password Authentication
Protocol. Only one of PAP and CHAP (above) may be negotiated. With
@ -1619,37 +1627,25 @@ in
.Pa /etc/ppp/ppp.conf .
PAP is accepted by default.
.It acfcomp
Default: Enabled and Accepted. ACFComp stands for Address and Control
Field Compression. Non LCP packets usually have very similar address
and control fields - making them easily compressible.
.It pred1
Default: Enabled and Accepted. This option decides if Predictor 1
compression will be used.
.It protocomp
Default: Enabled and Accepted. This option is used to negotiate
PFC (Protocol Field Compression), a mechanism where the protocol
field number is reduced to one octet rather than two.
.It pred1
Default: Enabled and Accepted. This option decides if Predictor 1
compression will be used.
.It msext
Default: Disabled. This option allows the use of Microsoft's
.Em PPP
extensions, supporting the negotiation of the DNS and the NetBIOS NS.
Enabling this allows us to pass back the values given in "set ns"
and "set nbns".
.It vjcomp
Default: Enabled and Accepted. This option decides if Van Jacobson
header compression will be used.
.El
.Pp
The following options are not actually negotiated with the peer.
Therefore, accepting or denying them makes no sense.
.Bl -tag -width 20
.It proxy
Default: Disabled. Enabling this option will tell
.Nm
to proxy ARP for the peer.
.It passwdauth
Default: Disabled. Enabling this option will tell the PAP authentication
code to use the password file (see
@ -1658,6 +1654,26 @@ to authenticate the caller rather than the
.Pa /etc/ppp/ppp.secret
file.
.It proxy
Default: Disabled. Enabling this option will tell
.Nm
to proxy ARP for the peer.
.It throughput
Default: Disabled. Enabling this option will tell
.Nm
to gather thoroughput statistics. Input and output is sampled over
a rolling 5 second window, and current, best and total figures are
retained. This data is output when the relevent
.Em PPP
layer shuts down, and is also available using the
.Dq show
command. Troughput statistics are available at the
.Dq IPCP
and
.Dq modem
levels.
.It utmp
Default: Enabled. Normally, when a user is authenticated using PAP or
CHAP, and when

126
usr.sbin/ppp/throughput.c Normal file
View File

@ -0,0 +1,126 @@
/*
* $Id$
*/
#include <sys/param.h>
#include <stdio.h>
#include <time.h>
#include <netinet/in.h>
#include "timer.h"
#include "throughput.h"
#include "defs.h"
#include "loadalias.h"
#include "command.h"
#include "vars.h"
#include "mbuf.h"
#include "log.h"
void
throughput_init(struct pppThroughput *t)
{
int f;
t->OctetsIn = t->OctetsOut = 0;
for (f = 0; f < SAMPLE_PERIOD; f++)
t->SampleOctets[f] = 0;
t->OctetsPerSecond = t->BestOctetsPerSecond = t->nSample = 0;
throughput_stop(t);
}
void
throughput_disp(struct pppThroughput *t, FILE *f)
{
int secs_up;
secs_up = time(NULL) - t->uptime;
fprintf(f, "Connect time: %d secs\n", secs_up);
if (secs_up == 0)
secs_up = 1;
fprintf(f, "%ld octets in, %ld octets out\n", t->OctetsIn, t->OctetsOut);
if (Enabled(ConfThroughput)) {
fprintf(f, " overall %5ld bytes/sec\n",
(t->OctetsIn+t->OctetsOut)/secs_up);
fprintf(f, " currently %5d bytes/sec\n", t->OctetsPerSecond);
fprintf(f, " peak %5d bytes/sec\n", t->BestOctetsPerSecond);
} else
fprintf(f, "Overall %ld bytes/sec\n", (t->OctetsIn+t->OctetsOut)/secs_up);
}
void
throughput_log(struct pppThroughput *t, int level, const char *title)
{
if (t->uptime) {
int secs_up;
secs_up = time(NULL) - t->uptime;
if (title)
LogPrintf(level, "%s: Connect time: %d secs: %ld octets in, %ld octets"
" out\n", title, secs_up, t->OctetsIn, t->OctetsOut);
else
LogPrintf(level, "Connect time: %d secs: %ld octets in, %ld octets out\n",
secs_up, t->OctetsIn, t->OctetsOut);
if (secs_up == 0)
secs_up = 1;
if (Enabled(ConfThroughput))
LogPrintf(level, " total %ld bytes/sec, peak %d bytes/sec\n",
(t->OctetsIn+t->OctetsOut)/secs_up, t->BestOctetsPerSecond);
else
LogPrintf(level, " total %ld bytes/sec\n",
(t->OctetsIn+t->OctetsOut)/secs_up);
}
}
static void
throughput_sampler(struct pppThroughput *t)
{
u_long old;
StopTimer(&t->Timer);
t->Timer.state = TIMER_STOPPED;
old = t->SampleOctets[t->nSample];
t->SampleOctets[t->nSample] = t->OctetsIn + t->OctetsOut;
t->OctetsPerSecond = (t->SampleOctets[t->nSample] - old) / SAMPLE_PERIOD;
if (t->BestOctetsPerSecond < t->OctetsPerSecond)
t->BestOctetsPerSecond = t->OctetsPerSecond;
if (++t->nSample == SAMPLE_PERIOD)
t->nSample = 0;
StartTimer(&t->Timer);
}
void
throughput_start(struct pppThroughput *t)
{
throughput_init(t);
time(&t->uptime);
if (Enabled(ConfThroughput)) {
t->Timer.state = TIMER_STOPPED;
t->Timer.load = SECTICKS;
t->Timer.func = throughput_sampler;
t->Timer.arg = t;
StartTimer(&t->Timer);
}
}
void
throughput_stop(struct pppThroughput *t)
{
if (Enabled(ConfThroughput))
StopTimer(&t->Timer);
}
void
throughput_addin(struct pppThroughput *t, int n)
{
t->OctetsIn += n;
}
void
throughput_addout(struct pppThroughput *t, int n)
{
t->OctetsOut += n;
}

24
usr.sbin/ppp/throughput.h Normal file
View File

@ -0,0 +1,24 @@
/*
* $Id$
*/
#define SAMPLE_PERIOD 5
struct pppThroughput {
time_t uptime;
u_long OctetsIn;
u_long OctetsOut;
u_long SampleOctets[SAMPLE_PERIOD];
int OctetsPerSecond;
int BestOctetsPerSecond;
int nSample;
struct pppTimer Timer;
};
extern void throughput_init(struct pppThroughput *);
extern void throughput_disp(struct pppThroughput *, FILE *);
extern void throughput_log(struct pppThroughput *, int, const char *);
extern void throughput_start(struct pppThroughput *);
extern void throughput_stop(struct pppThroughput *);
extern void throughput_addin(struct pppThroughput *, int);
extern void throughput_addout(struct pppThroughput *, int);

View File

@ -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.33 1997/11/09 22:07:29 brian Exp $
* $Id: vars.c,v 1.34 1997/11/11 22:58:14 brian Exp $
*
*/
#include <sys/param.h>
@ -40,7 +40,7 @@
#include "defs.h"
char VarVersion[] = "PPP Version 1.4";
char VarLocalVersion[] = "$Date: 1997/11/09 22:07:29 $";
char VarLocalVersion[] = "$Date: 1997/11/11 22:58:14 $";
int Utmp = 0;
int ipInOctets = 0;
int ipOutOctets = 0;
@ -65,6 +65,7 @@ struct confdesc pppConfs[] = {
{"msext", CONF_DISABLE, CONF_NONE},
{"passwdauth", CONF_DISABLE, CONF_NONE},
{"utmp", CONF_ENABLE, CONF_NONE},
{"throughput", CONF_DISABLE, CONF_NONE},
{NULL},
};

View File

@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* $Id: vars.h,v 1.32 1997/11/09 14:18:55 brian Exp $
* $Id: vars.h,v 1.33 1997/11/09 22:07:29 brian Exp $
*
* TODO:
*/
@ -43,7 +43,8 @@ struct confdesc {
#define ConfMSExt 8
#define ConfPasswdAuth 9
#define ConfUtmp 10
#define MAXCONFS 11
#define ConfThroughput 11
#define MAXCONFS 12
#define Enabled(x) (pppConfs[x].myside & CONF_ENABLE)
#define Acceptable(x) (pppConfs[x].hisside & CONF_ACCEPT)