X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=aix4%2Fppp_async.c;h=d079e3f87037d806dc18ae33d7ec909b8c11b5e6;hp=c932fd3c2b6dbcd2c41add20be14f4f3019a142c;hb=4420a694ac374773a6a4b5cce81a5d953b775658;hpb=c1a66729914c44d5171da98ef4e2f73332457518 diff --git a/aix4/ppp_async.c b/aix4/ppp_async.c index c932fd3..d079e3f 100644 --- a/aix4/ppp_async.c +++ b/aix4/ppp_async.c @@ -5,7 +5,7 @@ fcstab and some ideas nicked from if_ppp.c from cmu. See copyright notice in if_ppp.h and NOTES - $Id: ppp_async.c,v 1.1 1994/12/05 00:29:21 paulus Exp $ + $Id: ppp_async.c,v 1.3 1995/04/26 04:15:48 paulus Exp $ */ #include @@ -117,7 +117,7 @@ struct ppp_async_info { mblk_t *pai_buffer; /* pointer to the current buffer list */ mblk_t *pai_bufftail; /* pointer to the current input block */ ext_accm pai_asyncmap; /* current outgoing asyncmap */ - u_long pai_rasyncmap; /* current receive asyncmap */ + u_int32_t pai_rasyncmap; /* current receive asyncmap */ }; /* Values for pai_flags */ @@ -244,7 +244,18 @@ ppp_async_wput(q, mp) int x, flags; switch (mp->b_datap->db_type) { - + + case M_CTL: + switch (*(u_char *)mp->b_rptr) { + case IF_GET_CSTATS: + /* trap this and remove it */ + freemsg(mp); + break; + default: + putnext(q, mp); + } + break; + case M_FLUSH : if (*mp->b_rptr & FLUSHW) flushq(q, FLUSHDATA); @@ -320,9 +331,9 @@ ppp_async_wput(q, mp) goto iocnak; case SIOCGIFASYNCMAP : - if ((mp->b_cont = allocb(sizeof(u_long), BPRI_MED)) != NULL) { - *(u_long *) mp->b_cont->b_wptr = p->pai_asyncmap[0]; - mp->b_cont->b_wptr += i->ioc_count = sizeof(u_long); + if ((mp->b_cont = allocb(sizeof(u_int32_t), BPRI_MED)) != NULL) { + *(u_int32_t *) mp->b_cont->b_wptr = p->pai_asyncmap[0]; + mp->b_cont->b_wptr += i->ioc_count = sizeof(u_int32_t); goto iocack; } i->ioc_error = ENOSR; @@ -330,19 +341,19 @@ ppp_async_wput(q, mp) case SIOCSIFASYNCMAP : if ((i->ioc_count != TRANSPARENT) && - (i->ioc_count != sizeof(u_long))) { + (i->ioc_count != sizeof(u_int32_t))) { i->ioc_error = EINVAL; goto iocnak; /* ugh, goto */ } - p->pai_asyncmap[0] = *(u_long *) mp->b_cont->b_rptr; + p->pai_asyncmap[0] = *(u_int32_t *) mp->b_cont->b_rptr; DLOG("ppp_async: SIFASYNCMAP %lx\n", p->pai_asyncmap[0]); i->ioc_count = 0; goto iocack; case SIOCGIFRASYNCMAP : - if ((mp->b_cont = allocb(sizeof(u_long), BPRI_MED)) != NULL) { - *(u_long *) mp->b_cont->b_wptr = p->pai_rasyncmap; - mp->b_cont->b_wptr += i->ioc_count = sizeof(u_long); + if ((mp->b_cont = allocb(sizeof(u_int32_t), BPRI_MED)) != NULL) { + *(u_int32_t *) mp->b_cont->b_wptr = p->pai_rasyncmap; + mp->b_cont->b_wptr += i->ioc_count = sizeof(u_int32_t); goto iocack; } i->ioc_error = ENOSR; @@ -350,11 +361,11 @@ ppp_async_wput(q, mp) case SIOCSIFRASYNCMAP : if ((i->ioc_count != TRANSPARENT) && - (i->ioc_count != sizeof(u_long))) { + (i->ioc_count != sizeof(u_int32_t))) { i->ioc_error = EINVAL; goto iocnak; /* ugh, goto */ } - p->pai_rasyncmap = *(u_long *) mp->b_cont->b_rptr; + p->pai_rasyncmap = *(u_int32_t *) mp->b_cont->b_rptr; DLOG("ppp_async: SIFRASYNCMAP %lx\n", p->pai_rasyncmap); i->ioc_count = 0; goto iocack; @@ -482,7 +493,7 @@ ppp_async_wsrv(q) * to allow for escaped characters. If this isn't enough, we * allocate another buffer later. */ - olen = len + (len >> 8) + 5; + olen = len + (len >> 2) + 5; if (olen < 32) olen = 32; else if (olen > 2048) @@ -611,7 +622,7 @@ ppp_async_rput(q, mp) } } -static u_long paritytab[8] = { +static u_int32_t paritytab[8] = { 0x96696996, 0x69969669, 0x69969669, 0x96696996, 0x69969669, 0x96696996, 0x96696996, 0x69969669, }; @@ -808,15 +819,19 @@ ppp_async_rsrv(q) STUFF_CHAR(p, c); p->pai_fcs = PPP_FCS(p->pai_fcs, c); - while (cp < mp->b_wptr - && wptr < p->pai_bufftail->b_datap->db_lim - && (c = *cp) != PPP_FLAG && c != PPP_ESCAPE) { - if (c >= 0x20 || (p->pai_rasyncmap & (1 << c)) == 0) { - STUFF_CHAR(p, c); - p->pai_fcs = PPP_FCS(p->pai_fcs, c); + + if (p->pai_buffcount >= PPP_HDRLEN) { + while (cp < mp->b_wptr + && wptr < p->pai_bufftail->b_datap->db_lim + && (c = *cp) != PPP_FLAG && c != PPP_ESCAPE) { + if (c >= 0x20 || (p->pai_rasyncmap & (1 << c)) == 0) { + STUFF_CHAR(p, c); + p->pai_fcs = PPP_FCS(p->pai_fcs, c); + } + ++cp; } - ++cp; } + p->pai_bufftail->b_wptr = wptr; } /* end while cp < wptr */