* OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
*
- * $Id: ppp_ahdlc.c,v 1.2 1996/06/26 00:54:01 paulus Exp $
+ * $Id: ppp_ahdlc.c,v 1.11 1999/09/15 23:49:05 masputra Exp $
*/
/*
#include <sys/ddi.h>
#else
#include <sys/user.h>
+#ifdef __osf__
+#include <sys/cmn_err.h>
+#endif
#endif /* SVR4 */
#include <net/ppp_defs.h>
#define PPP_AHDL_ID 0x7d23
static struct module_info minfo = {
+#ifdef PRIOQ
+ PPP_AHDL_ID, "ppp_ahdl", 0, INFPSZ, 640, 512
+#else
PPP_AHDL_ID, "ppp_ahdl", 0, INFPSZ, 4096, 128
+#endif PRIOQ
};
static struct qinit rinit = {
ahdlc_wput, NULL, NULL, NULL, NULL, &minfo, NULL
};
+#if defined(SVR4) && !defined(SOL2)
+int phdldevflag = 0;
+#define ppp_ahdlcinfo phdlinfo
+#endif
struct streamtab ppp_ahdlcinfo = {
&rinit, &winit, NULL, NULL
};
WR(q)->q_ptr = (caddr_t) sp;
sp->xaccm[0] = ~0;
sp->xaccm[3] = 0x60000000;
- sp->mru = 1500;
+ sp->mru = PPP_MRU;
++ppp_ahdlc_count;
qprocson(q);
}
state->cur_frame = 0;
}
FREE(q->q_ptr, sizeof(ahdlc_state_t));
+ q->q_ptr = NULL;
+ OTHERQ(q)->q_ptr = NULL;
--ppp_ahdlc_count;
}
return 0;
struct ppp_stats *psp;
state = (ahdlc_state_t *) q->q_ptr;
+ if (state == 0) {
+ DPRINT("state == 0 in ahdlc_wput\n");
+ freemsg(mp);
+ return 0;
+ }
+
switch (mp->b_datap->db_type) {
case M_DATA:
/*
if (iop->ioc_count < sizeof(u_int32_t)
|| iop->ioc_count > sizeof(ext_accm))
break;
+ if (mp->b_cont == 0) {
+ DPRINT1("ahdlc_wput/%d: PPPIO_XACCM b_cont = 0!\n", state->unit);
+ break;
+ }
bcopy((caddr_t)mp->b_cont->b_rptr, (caddr_t)state->xaccm,
iop->ioc_count);
- state->xaccm[2] &= 0x40000000; /* don't escape 0x5e */
+ state->xaccm[2] &= ~0x40000000; /* don't escape 0x5e */
state->xaccm[3] |= 0x60000000; /* do escape 0x7d, 0x7e */
iop->ioc_count = 0;
error = 0;
case PPPIO_RACCM:
if (iop->ioc_count != sizeof(u_int32_t))
break;
+ if (mp->b_cont == 0) {
+ DPRINT1("ahdlc_wput/%d: PPPIO_RACCM b_cont = 0!\n", state->unit);
+ break;
+ }
bcopy((caddr_t)mp->b_cont->b_rptr, (caddr_t)&state->raccm,
sizeof(u_int32_t));
iop->ioc_count = 0;
default:
putnext(q, mp);
}
+
return 0;
}
queue_t *q;
mblk_t *mp;
{
- mblk_t *np;
- uchar_t *cp;
ahdlc_state_t *state;
+ state = (ahdlc_state_t *) q->q_ptr;
+ if (state == 0) {
+ DPRINT("state == 0 in ahdlc_rput\n");
+ freemsg(mp);
+ return 0;
+ }
+
switch (mp->b_datap->db_type) {
case M_DATA:
unstuff_chars(q, mp);
break;
case M_HANGUP:
- state = (ahdlc_state_t *) q->q_ptr;
if (state->cur_frame != 0) {
/* XXX would like to send this up for debugging */
freemsg(state->cur_frame);
mblk_t *mp;
{
ahdlc_state_t *state;
- int ilen, olen, c, extra, i, code;
+ int ilen, olen, c, extra, code;
mblk_t *omsg, *op, *np;
uchar_t *sp, *sp0, *dp, *dp0, *spend;
ushort_t fcs;
u_int32_t *xaccm, lcp_xaccm[8];
- static uchar_t lcphdr[PPP_HDRLEN] = { 0xff, 0x03, 0xc0, 0x21 };
- uchar_t ppphdr[PPP_HDRLEN];
state = (ahdlc_state_t *) q->q_ptr;
ilen = msgdsize(mp);
goto bomb;
/*
- * Put in an initial flag for now. We'll remove it later
- * if we decide we don't need it.
+ * Put in an initial flag, unless the serial driver currently has
+ * packets still to be transmitted in its queue.
*/
dp = op->b_wptr;
- *dp++ = PPP_FLAG;
- --olen;
+ if (qsize(q->q_next) == 0) {
+ *dp++ = PPP_FLAG;
+ --olen;
+ }
/*
* For LCP packets with code values between 1 and 7 (Conf-Req
*dp++ = PPP_FLAG;
op->b_wptr = dp;
- /*
- * Remove the initial flag, if possible.
- */
- if (qsize(q->q_next) > 0)
- ++omsg->b_rptr;
-
/*
* Update statistics.
*/
ahdlc_state_t *state;
mblk_t *om;
uchar_t *cp, *cpend, *dp, *dp0;
- int c, len, extra, offset;
+ int c, len, extra;
ushort_t fcs;
state = (ahdlc_state_t *) q->q_ptr;