+ case PPPIO_NPMODE:
+ if (iop->ioc_count != 2 * sizeof(int))
+ break;
+ if ((us->flags & US_CONTROL) == 0)
+ break;
+ sap = ((int *)mp->b_cont->b_rptr)[0];
+ for (nps = us->next; nps != 0; nps = nps->next)
+ if (nps->sap == sap)
+ break;
+ if (nps == 0)
+ 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);
+ else if (nps->npmode == NPMODE_PASS && qsize(WR(nps->q)) > 0
+ && (nps->flags & US_BLOCKED) == 0)
+ qenable(WR(nps->q));
+ iop->ioc_count = 0;
+ error = 0;
+ 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;
+
+ case PPPIO_PASSFILT:
+ case PPPIO_ACTIVEFILT:
+ if ((us->flags & US_CONTROL) == 0)
+ break;
+ len = iop->ioc_count;
+ if (len > BPF_MAXINSNS * sizeof(struct bpf_insn)
+ || len % sizeof(struct bpf_insn) != 0)
+ break;
+ if (len > 0) {
+ if (!bpf_validate((struct bpf_insn *) mp->b_cont->b_rptr,
+ len / sizeof(struct bpf_insn)))
+ break;
+ ip = (struct bpf_insn *) ALLOC_NOSLEEP(len);
+ if (ip == 0) {
+ error = ENOSR;
+ break;
+ }
+ bcopy((caddr_t)mp->b_cont->b_rptr, (caddr_t)ip, len);
+ } else
+ ip = 0;
+ dest = iop->ioc_cmd == PPPIO_ACTIVEFILT?
+ &us->active_f: &us->pass_f;
+ if (dest->bf_insns != 0)
+ kmem_free((caddr_t) dest->bf_insns, dest->bf_len);
+ dest->bf_len = len;
+ dest->bf_insns = ip;
+ break;
+