summaryrefslogtreecommitdiff
path: root/usr.sbin/ppp/lqr.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/ppp/lqr.c')
-rw-r--r--usr.sbin/ppp/lqr.c281
1 files changed, 0 insertions, 281 deletions
diff --git a/usr.sbin/ppp/lqr.c b/usr.sbin/ppp/lqr.c
deleted file mode 100644
index 2ccd99cf0be..00000000000
--- a/usr.sbin/ppp/lqr.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * PPP Line Quality Monitoring (LQM) Module
- *
- * Written by Toshiharu OHNO (tony-o@iij.ad.jp)
- *
- * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the Internet Initiative Japan, Inc. The name of the
- * IIJ may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id: lqr.c,v 1.7 1998/06/28 09:41:41 brian Exp $
- *
- * o LQR based on RFC1333
- *
- * TODO:
- * o LQM policy
- * o Allow user to configure LQM method and interval.
- */
-#include <sys/param.h>
-#include <netinet/in.h>
-
-#include <stdio.h>
-#include <string.h>
-
-#include "command.h"
-#include "mbuf.h"
-#include "log.h"
-#include "defs.h"
-#include "timer.h"
-#include "fsm.h"
-#include "lcpproto.h"
-#include "lqr.h"
-#include "hdlc.h"
-#include "lcp.h"
-#include "loadalias.h"
-#include "vars.h"
-
-struct lqrdata MyLqrData, HisLqrData;
-struct lqrsave HisLqrSave;
-
-static struct pppTimer LqrTimer;
-
-static u_int32_t lastpeerin = (u_int32_t) - 1;
-
-static int lqmmethod;
-static u_int32_t echoseq;
-static u_int32_t gotseq;
-static int lqrsendcnt;
-
-struct echolqr {
- u_int32_t magic;
- u_int32_t signature;
- u_int32_t sequence;
-};
-
-#define SIGNATURE 0x594e4f54
-
-static void
-SendEchoReq(void)
-{
- struct fsm *fp = &LcpFsm;
- struct echolqr *lqr, lqrdata;
-
- if (fp->state == ST_OPENED) {
- lqr = &lqrdata;
- lqr->magic = htonl(LcpInfo.want_magic);
- lqr->signature = htonl(SIGNATURE);
- LogPrintf(LogLQM, "Send echo LQR [%d]\n", echoseq);
- lqr->sequence = htonl(echoseq++);
- FsmOutput(fp, CODE_ECHOREQ, fp->reqid++,
- (u_char *) lqr, sizeof(struct echolqr));
- }
-}
-
-void
-RecvEchoLqr(struct mbuf * bp)
-{
- struct echolqr *lqr;
- u_int32_t seq;
-
- if (plength(bp) == sizeof(struct echolqr)) {
- lqr = (struct echolqr *) MBUF_CTOP(bp);
- if (htonl(lqr->signature) == SIGNATURE) {
- seq = ntohl(lqr->sequence);
- LogPrintf(LogLQM, "Got echo LQR [%d]\n", ntohl(lqr->sequence));
- /* careful not to update gotseq with older values */
- if ((gotseq > (u_int32_t)0 - 5 && seq < 5) ||
- (gotseq <= (u_int32_t)0 - 5 && seq > gotseq))
- gotseq = seq;
- }
- }
-}
-
-void
-LqrChangeOrder(struct lqrdata * src, struct lqrdata * dst)
-{
- u_int32_t *sp, *dp;
- int n;
-
- sp = (u_int32_t *) src;
- dp = (u_int32_t *) dst;
- for (n = 0; n < sizeof(struct lqrdata) / sizeof(u_int32_t); n++)
- *dp++ = ntohl(*sp++);
-}
-
-static void
-SendLqrReport(void *v)
-{
- struct mbuf *bp;
-
- StopTimer(&LqrTimer);
-
- if (lqmmethod & LQM_LQR) {
- if (lqrsendcnt > 5) {
- /*
- * XXX: Should implement LQM strategy
- */
- LogPrintf(LogPHASE, "** Too many LQR packets lost **\n");
- LogPrintf(LogLQM, "LqrOutput: Too many LQR packets lost\n");
- lqmmethod = 0; /* Prevent recursion via LcpClose() */
- reconnect(RECON_TRUE);
- LcpClose();
- } else {
- bp = mballoc(sizeof(struct lqrdata), MB_LQR);
- HdlcOutput(PRI_LINK, PROTO_LQR, bp);
- lqrsendcnt++;
- }
- } else if (lqmmethod & LQM_ECHO) {
- if ((echoseq > 5 && echoseq - 5 > gotseq) ||
- (echoseq <= 5 && echoseq > gotseq + 5)) {
- LogPrintf(LogPHASE, "** Too many ECHO LQR packets lost **\n");
- LogPrintf(LogLQM, "LqrOutput: Too many ECHO LQR packets lost\n");
- lqmmethod = 0; /* Prevent recursion via LcpClose() */
- reconnect(RECON_TRUE);
- LcpClose();
- } else
- SendEchoReq();
- }
- if (lqmmethod && LqrTimer.load)
- StartTimer(&LqrTimer);
-}
-
-void
-LqrInput(struct mbuf * bp)
-{
- int len;
- u_char *cp;
- struct lqrdata *lqr;
-
- len = plength(bp);
- if (len != sizeof(struct lqrdata)) {
- pfree(bp);
- return;
- }
- if (!Acceptable(ConfLqr)) {
- bp->offset -= 2;
- bp->cnt += 2;
-
- cp = MBUF_CTOP(bp);
- LcpSendProtoRej(cp, bp->cnt);
- } else {
- cp = MBUF_CTOP(bp);
- lqr = (struct lqrdata *) cp;
- if (ntohl(lqr->MagicNumber) != LcpInfo.his_magic) {
- LogPrintf(LogERROR, "LqrInput: magic %x != expecting %x\n",
- ntohl(lqr->MagicNumber), LcpInfo.his_magic);
- pfree(bp);
- return;
- }
-
- /*
- * Convert byte order and save into our strage
- */
- LqrChangeOrder(lqr, &HisLqrData);
- LqrDump("LqrInput", &HisLqrData);
- lqrsendcnt = 0; /* we have received LQR from peer */
-
- /*
- * Generate an LQR response to peer we're not running LQR timer OR
- * two successive LQR's PeerInLQRs are same OR we're not going to
- * send our next one before the peers max timeout.
- */
- if (LqrTimer.load == 0 || lastpeerin == HisLqrData.PeerInLQRs ||
- (LqrTimer.arg &&
- LqrTimer.rest * 100 / SECTICKS > (u_long)LqrTimer.arg)) {
- lqmmethod |= LQM_LQR;
- SendLqrReport(LqrTimer.arg);
- }
- lastpeerin = HisLqrData.PeerInLQRs;
- }
- pfree(bp);
-}
-
-/*
- * When LCP is reached to opened state, We'll start LQM activity.
- */
-void
-StartLqm()
-{
- struct lcpstate *lcp = &LcpInfo;
-
- lqrsendcnt = 0; /* start waiting all over for ECHOs */
- echoseq = 0;
- gotseq = 0;
- memset(&HisLqrData, '\0', sizeof HisLqrData);
-
- lqmmethod = LQM_ECHO;
- if (Enabled(ConfLqr) && !REJECTED(lcp, TY_QUALPROTO))
- lqmmethod |= LQM_LQR;
- StopTimer(&LqrTimer);
-
- if (lcp->his_lqrperiod)
- LogPrintf(LogLQM, "Expecting LQR every %d.%02d secs\n",
- lcp->his_lqrperiod / 100, lcp->his_lqrperiod % 100);
-
- if (lcp->want_lqrperiod) {
- LogPrintf(LogLQM, "Will send %s every %d.%02d secs\n",
- lqmmethod & LQM_LQR ? "LQR" : "ECHO LQR",
- lcp->want_lqrperiod / 100, lcp->want_lqrperiod % 100);
- LqrTimer.state = TIMER_STOPPED;
- LqrTimer.load = lcp->want_lqrperiod * SECTICKS / 100;
- LqrTimer.func = SendLqrReport;
- LqrTimer.arg = (void *)(u_long)lcp->his_lqrperiod;
- SendLqrReport(LqrTimer.arg);
- } else {
- LqrTimer.load = 0;
- if (!lcp->his_lqrperiod)
- LogPrintf(LogLQM, "LQR/ECHO LQR not negotiated\n");
- }
-}
-
-void
-StopLqrTimer()
-{
- StopTimer(&LqrTimer);
-}
-
-void
-StopLqr(int method)
-{
- LogPrintf(LogLQM, "StopLqr method = %x\n", method);
-
- if (method == LQM_LQR)
- LogPrintf(LogLQM, "Stop sending LQR, Use LCP ECHO instead.\n");
- if (method == LQM_ECHO)
- LogPrintf(LogLQM, "Stop sending LCP ECHO.\n");
- lqmmethod &= ~method;
- if (lqmmethod)
- SendLqrReport(LqrTimer.arg);
- else
- StopTimer(&LqrTimer);
-}
-
-void
-LqrDump(const char *message, const struct lqrdata * lqr)
-{
- if (LogIsKept(LogLQM)) {
- LogPrintf(LogLQM, "%s:\n", message);
- LogPrintf(LogLQM, " Magic: %08x LastOutLQRs: %08x\n",
- lqr->MagicNumber, lqr->LastOutLQRs);
- LogPrintf(LogLQM, " LastOutPackets: %08x LastOutOctets: %08x\n",
- lqr->LastOutPackets, lqr->LastOutOctets);
- LogPrintf(LogLQM, " PeerInLQRs: %08x PeerInPackets: %08x\n",
- lqr->PeerInLQRs, lqr->PeerInPackets);
- LogPrintf(LogLQM, " PeerInDiscards: %08x PeerInErrors: %08x\n",
- lqr->PeerInDiscards, lqr->PeerInErrors);
- LogPrintf(LogLQM, " PeerInOctets: %08x PeerOutLQRs: %08x\n",
- lqr->PeerInOctets, lqr->PeerOutLQRs);
- LogPrintf(LogLQM, " PeerOutPackets: %08x PeerOutOctets: %08x\n",
- lqr->PeerOutPackets, lqr->PeerOutOctets);
- }
-}