* OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
*
- * $Id: ppp.c,v 1.3 1996/01/01 22:48:39 paulus Exp $
+ * $Id: ppp.c,v 1.5 1996/05/28 00:56:18 paulus Exp $
*/
/*
int error, n, sap;
mblk_t *mq;
struct ppp_idle *pip;
+ int len;
us = (upperstr_t *) q->q_ptr;
switch (mp->b_datap->db_type) {
break;
}
#ifdef NO_DLPI
- if ((us->flags & US_CONTROL) == 0)
- us->ppa->last_sent = time;
+ if (!pass_packet(us->ppa, mp, 1)) {
+ freemsg(mp);
+ break;
+ }
#endif
if (!send_data(mp, us))
putq(q, mp);
for (nps = us->next; nps != 0; nps = nps->next)
if (nps->sap == sap)
break;
- if (nps == 0)
+ if (nps == 0) {
+ if (us->flags & US_DBGLOG)
+ DPRINT2("ppp/%d: no stream for sap %x\n", us->mn, sap);
break;
+ }
nps->npmode = (enum NPmode) ((int *)mp->b_cont->b_rptr)[1];
if (nps->npmode == NPMODE_DROP || nps->npmode == NPMODE_ERROR)
flushq(WR(nps->q), FLUSHDATA);
dl_bind_ack_t *ackp;
if (us->flags & US_DBGLOG)
- cmn_err(CE_CONT, "ppp/%d: dlpi prim %x len=%d\n", us->mn,
+ DPRINT3("ppp/%d: dlpi prim %x len=%d\n", us->mn,
d->dl_primitive, size);
switch (d->dl_primitive) {
case DL_INFO_REQ:
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);
mp->b_rptr[1] = PPP_UI;
mp->b_rptr[2] = us->sap >> 8;
mp->b_rptr[3] = us->sap;
- if (!send_data(mp, us))
- putq(q, mp);
+ if (!pass_packet(ppa, mp, 1)) {
+ freemsg(mp);
+ } else {
+ if (!send_data(mp, us))
+ putq(q, mp);
+ }
return;
#if DL_CURRENT_VERSION >= 2
}
#endif /* NO_DLPI */
+static int
+pass_packet(ppa, mp, outbound)
+ upperstr_t *ppa;
+ mblk_t *mp;
+ int outbound;
+{
+ /*
+ * Here is where we might, in future, decide whether to pass
+ * or drop the packet, and whether it counts as link activity.
+ */
+ if (outbound)
+ ppa->last_sent = time;
+ else
+ ppa->last_recv = time;
+ return 1;
+}
+
static int
send_data(mp, us)
mblk_t *mp;
queue_t *q;
upperstr_t *ppa;
- if (us->flags & US_BLOCKED || us->npmode == NPMODE_QUEUE)
+ if ((us->flags & US_BLOCKED) || us->npmode == NPMODE_QUEUE)
return 0;
ppa = us->ppa;
if (ppa == 0 || us->npmode == NPMODE_DROP || us->npmode == NPMODE_ERROR) {
+ if (us->flags & US_DBGLOG)
+ DPRINT2("ppp/%d: dropping pkt (npmode=%d)\n", us->mn, us->npmode);
freemsg(mp);
return 1;
}
#ifdef INCR_IPACKETS
INCR_IPACKETS(ppa);
#endif
+ if (!pass_packet(ppa, mp, 0)) {
+ freemsg(mp);
+ break;
+ }
proto = PPP_PROTOCOL(mp->b_rptr);
if (proto < 0x8000 && (us = find_dest(ppa, proto)) != 0) {
/*
putq(us->q, mp);
else
putq(q, mp);
- ppa->last_recv = time;
break;
}
}