From: Paul Mackerras Date: Mon, 18 Dec 1995 03:57:27 +0000 (+0000) Subject: added idle time measurement X-Git-Tag: RELEASE_2_3_6~559 X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=commitdiff_plain;h=cf60450944c3bbb85f452c3d07dc6803d355f068 added idle time measurement --- diff --git a/modules/ppp.c b/modules/ppp.c index b3d78a3..bbef69c 100644 --- a/modules/ppp.c +++ b/modules/ppp.c @@ -24,11 +24,11 @@ * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * - * $Id: ppp.c,v 1.1 1995/12/11 05:06:40 paulus Exp $ + * $Id: ppp.c,v 1.2 1995/12/18 03:57:27 paulus Exp $ */ /* - * This file is used under Solaris 2 and SunOS 4. + * This file is used under Solaris 2, SVR4, and SunOS 4. */ #include @@ -38,6 +38,7 @@ #include #include #include +#include #ifdef SVR4 #include #include @@ -66,7 +67,7 @@ #endif /* - * The IP module uses this SAP value for IP packets. + * The IP module may use this SAP value for IP packets. */ #ifndef ETHERTYPE_IP #define ETHERTYPE_IP 0x800 @@ -76,6 +77,8 @@ #define PPP_MAXMTU 65535 #endif +extern time_t time; + /* * Private information; one per upper stream. */ @@ -100,6 +103,8 @@ typedef struct upperstr { int mru; int mtu; struct pppstat stats; /* statistics */ + time_t last_sent; /* time last NP packet sent */ + time_t last_recv; /* time last NP packet rcvd */ #ifdef SOL2 kstat_t *kstats; /* stats for netstat */ #endif /* SOL2 */ @@ -282,6 +287,7 @@ pppopen(q, dev, oflag, sflag) up->ifflags = IFF_UP | IFF_POINTOPOINT; #endif up->sap = -1; + up->last_sent = up->last_recv = time; q->q_ptr = (caddr_t) up; WR(q)->q_ptr = (caddr_t) up; noenable(WR(q)); @@ -406,6 +412,7 @@ pppuwput(q, mp) queue_t *lq; int error, n; mblk_t *mq; + struct ppp_idle *pip; us = (upperstr_t *) q->q_ptr; switch (mp->b_datap->db_type) { @@ -429,6 +436,10 @@ pppuwput(q, mp) freemsg(mp); break; } +#ifdef NO_DLPI + if ((us->flags & US_CONTROL) == 0) + us->ppa->last_sent = time; +#endif if (!send_data(mp, us)) putq(q, mp); break; @@ -598,6 +609,26 @@ pppuwput(q, mp) } break; + case PPPIO_GIDLE: + if ((ppa = us->ppa) == 0) + break; + mq = allocb(sizeof(struct ppp_idle), BPRI_HI); + if (mq == 0) { + error = ENOSR; + break; + } + if (mp->b_cont != 0) + freemsg(mp->b_cont); + mp->b_cont = mq; + mq->b_cont = 0; + pip = (struct ppp_idle *) mq->b_wptr; + pip->xmit_idle = time - ppa->last_sent; + pip->recv_idle = time - ppa->last_recv; + mq->b_wptr += sizeof(struct ppp_idle); + iop->ioc_count = sizeof(struct ppp_idle); + error = 0; + break; + #ifdef LACHTCP case SIOCSIFNAME: printf("SIOCSIFNAME\n"); @@ -840,9 +871,7 @@ dlpi_request(q, mp, us) except that we accept ETHERTYPE_IP in place of PPP_IP. */ sap = d->bind_req.dl_sap; us->req_sap = sap; -#if DEBUG - cmn_err(CE_CONT, "ppp bind %x\n", sap); -#endif + DPRINT1("ppp bind %x\n", sap); if (sap == ETHERTYPE_IP) sap = PPP_IP; if (sap < 0x21 || sap > 0x3fff || (sap & 0x101) != 1) { @@ -899,17 +928,16 @@ dlpi_request(q, mp, us) dlpi_error(q, DL_UNITDATA_REQ, DL_OUTSTATE, 0); break; } - if (us->ppa == 0) { + if ((ppa = us->ppa) == 0) { cmn_err(CE_CONT, "ppp: in state dl_idle but ppa == 0?\n"); break; } len = mp->b_cont == 0? 0: msgdsize(mp->b_cont); - if (len > us->ppa->mtu) { -#if DEBUG - cmn_err(CE_CONT, "dlpi data too large (%d > %d)\n", len, us->mtu); -#endif + if (len > ppa->mtu) { + DPRINT2("dlpi data too large (%d > %d)\n", len, ppa->mtu); break; } + ppa->last_sent = time; /* this assumes PPP_HDRLEN <= sizeof(dl_unitdata_req_t) */ if (mp->b_datap->db_ref > 1) { np = allocb(PPP_HDRLEN, BPRI_HI); @@ -1402,6 +1430,7 @@ ppplrput(q, mp) putq(us->q, mp); else putq(q, mp); + ppa->last_recv = time; break; } }