X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=modules%2Fppp.c;h=3717afc59b75f1a4af20b212250dbd8923814164;hp=97c40ddef5e407a28ee61901f99cb2a8ae62fe7f;hb=be9ecce3c61067bd22186fc1e2cd4355e0f0747d;hpb=ce773fec27f115f665ac7d9630eeb5f5484d5eb7 diff --git a/modules/ppp.c b/modules/ppp.c index 97c40dd..3717afc 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.4 1996/04/04 02:45:29 paulus Exp $ + * $Id: ppp.c,v 1.7 1996/08/28 06:35:30 paulus Exp $ */ /* - * This file is used under Solaris 2, SVR4, and SunOS 4. + * This file is used under Solaris 2, SVR4, SunOS 4, and Digital UNIX. */ #include @@ -37,7 +37,13 @@ #include #include #include +#ifdef __osf__ +#include +#include +#define queclass(mp) ((mp)->b_band & QPCTL) +#else #include +#endif #include #ifdef SVR4 #include @@ -58,7 +64,6 @@ #endif /* SVR4 */ #include #include -#include #include "ppp_mod.h" #ifdef __STDC__ @@ -107,8 +112,6 @@ typedef struct upperstr { struct pppstat stats; /* statistics */ time_t last_sent; /* time last NP packet sent */ time_t last_recv; /* time last NP packet rcvd */ - struct bpf_program active_f;/* filter for active packets */ - struct bpf_program pass_f; /* filter for packets to pass */ #ifdef SOL2 kstat_t *kstats; /* stats for netstat */ #endif /* SOL2 */ @@ -157,8 +160,9 @@ static upperstr_t *find_dest __P((upperstr_t *, int)); static int putctl2 __P((queue_t *, int, int, int)); static int putctl4 __P((queue_t *, int, int, int)); +#define PPP_ID 0xb1a6 static struct module_info ppp_info = { - 0xb1a6, "ppp", 0, 512, 512, 128 + PPP_ID, "ppp", 0, 512, 512, 128 }; static struct qinit pppurint = { @@ -381,15 +385,6 @@ pppclose(q, flag) kstat_delete(up->kstats); #endif - if (up->active_f.bf_insns) { - kmem_free(up->active_f.bf_insns, up->active_f.bf_len); - up->active_f.bf_insns = 0; - } - if (up->pass_f.bf_insns) { - kmem_free(up->pass_f.bf_insns, up->pass_f.bf_len); - up->pass_f.bf_insns = 0; - } - q->q_ptr = NULL; WR(q)->q_ptr = NULL; @@ -399,7 +394,7 @@ pppclose(q, flag) break; } } - kmem_free(up, sizeof(upperstr_t)); + FREE(up, sizeof(upperstr_t)); --ppp_count; return 0; @@ -428,8 +423,6 @@ pppuwput(q, mp) mblk_t *mq; struct ppp_idle *pip; int len; - struct bpf_insn *ip; - struct bpf_program *dest; us = (upperstr_t *) q->q_ptr; switch (mp->b_datap->db_type) { @@ -637,8 +630,11 @@ pppuwput(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); @@ -669,34 +665,6 @@ pppuwput(q, mp) 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; - #ifdef LACHTCP case SIOCSIFNAME: printf("SIOCSIFNAME\n"); @@ -864,7 +832,7 @@ dlpi_request(q, mp, us) 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: @@ -939,7 +907,6 @@ 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; - DPRINT1("ppp bind %x\n", sap); if (sap == ETHERTYPE_IP) sap = PPP_IP; if (sap < 0x21 || sap > 0x3fff || (sap & 0x101) != 1) { @@ -1023,9 +990,9 @@ dlpi_request(q, mp, us) mp->b_rptr[1] = PPP_UI; mp->b_rptr[2] = us->sap >> 8; mp->b_rptr[3] = us->sap; - if (!pass_packet(ppa, mp, 1)) + if (!pass_packet(ppa, mp, 1)) { freemsg(mp); - else { + } else { if (!send_data(mp, us)) putq(q, mp); } @@ -1125,25 +1092,15 @@ pass_packet(ppa, mp, outbound) mblk_t *mp; int outbound; { - int len, adr, pass; - - if (PPP_PROTOCOL(mp->b_rptr) >= 0x8000 - || (ppa->pass_f.bf_insns == 0 && ppa->active_f.bf_insns == 0)) - return 1; - len = msgdsize(mp); - adr = *mp->b_rptr; - *mp->b_rptr = outbound; - pass = ppa->pass_f.bf_insns == 0 - || bpf_filter(ppa->pass_f.bf_insns, mp, len, 0); - if (pass && (ppa->active_f.bf_insns == 0 - || bpf_filter(ppa->active_f.bf_insns, mp, len, 0))) { - if (outbound) - ppa->last_sent = time; - else - ppa->last_recv = time; - } - *mp->b_rptr = adr; - return pass; + /* + * 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 @@ -1154,17 +1111,26 @@ send_data(mp, us) 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; } if ((q = ppa->lowerq) == 0) { /* try to send it up the control stream */ if (canputnext(ppa->q)) { - putnext(ppa->q, mp); + /* + * The message seems to get corrupted for some reason if + * we just send the message up as it is, so we send a copy. + */ + mblk_t *np = copymsg(mp); + freemsg(mp); + if (np != 0) + putnext(ppa->q, np); return 1; } } else { @@ -1504,6 +1470,22 @@ ppplrput(q, mp) putnext(us->q, mp); break; + case M_HANGUP: + /* + * The serial device has hung up. We don't want to send + * the M_HANGUP message up to pppd because that will stop + * us from using the control stream any more. Instead we + * send a zero-length message as an end-of-file indication. + */ + freemsg(mp); + mp = allocb(1, BPRI_HI); + if (mp == 0) { + DPRINT1("ppp/%d: couldn't allocate eof message!\n", ppa->mn); + break; + } + putnext(ppa->q, mp); + break; + default: if (mp->b_datap->db_type == M_DATA) { len = msgdsize(mp);